<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>The Dan MacKinlay stable of variably-well-consider’d enterprises</title>
<link>https://danmackinlay.name/</link>
<atom:link href="https://danmackinlay.name/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<image>
<url>https://danmackinlay.name/generated_thumbnails/site_previews/images/punch_index.thumbnail.avif</url>
<title>The Dan MacKinlay stable of variably-well-consider’d enterprises</title>
<link>https://danmackinlay.name/</link>
</image>
<generator>quarto-1.9.37</generator>
<lastBuildDate>Mon, 04 May 2026 02:36:57 GMT</lastBuildDate>
<item>
  <title>Intergenerational game theory</title>
  <link>https://danmackinlay.name/notebook/game_theory_intergenerational.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-skeletal-2x2" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-skeletal-2x2-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/skeletal_2x2_RP-P-1896-A-19368-193.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/skeletal_2x2_RP-P-1896-A-19368-193.avif" id="fig-skeletal-2x2" class="figure illustration right img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-skeletal-2x2-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Most game theory assumes the players exist at the same time and can interact: observe each other’s moves, retaliate against defections, form coalitions, bargain over outcomes. Intergenerational games break all of this, in favour of the actually-existing.</p>
<p>Future generations cannot retaliate against past ones; they do not exist when the moves are made. They cannot enter coalitions; they have no preferences yet to voice. They cannot reject offers; the bargain arrives as a <em>fait accompli</em> for them to inherit. So the standard equilibrium prediction of self-interested rational play promises nothing good for the unborn — and indeed delivers expropriation: environmental depletion, sovereign debt, exhausted commons, accumulated tail risk. These are not coordination failures <em>between</em> present-day parties; they are first-mover advantages against people who cannot yet object <span class="citation" data-cites="Kotlikoff1993Inefficiency">(Kotlikoff and Rosenthal 1993)</span>.</p>
<p>This is the <em>inter-personal</em> counterpart of <a href="../notebook/intertemporal_decisions.html">intertemporal decisions</a>, where I treat the <em>intra-personal</em> version (different selves of the same person, across time). Same structural shape — present moves bind future agents who could not participate — but here the future agents are entirely different people. Maybe these cash out into the same problem under <a href="../notebook/multi_level_agency.html">multi-level agency</a>.</p>
<section id="why-iterated-game-theory-does-not-save-us" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="why-iterated-game-theory-does-not-save-us"><span class="header-section-number">1</span> Why iterated game theory does not save us</h2>
<p>The Tit-for-Tat insight from <a href="../notebook/game_theory_iterated.html">iterated games</a> — mutual cooperation sustained by the threat of retaliation in repeated play — depends on retaliation being available. The shadow of the future, in Axelrod’s phrase, has to fall on a player who exists. When the players never meet, the shadow falls on no one.</p>
<p>The same goes for the bargaining-set / class-emergence dynamics from <span class="citation" data-cites="Axtell2001Emergence">Axtell, Epstein, and Young (2001)</span>’s multi-agent bargaining model: those require iterated negotiation between the two parties to the bargain. With future generations, only one party is present in any given negotiation.</p>
</section>
<section id="overlapping-generations" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="overlapping-generations"><span class="header-section-number">2</span> Overlapping generations</h2>
<p>The standard formal device for getting <em>some</em> purchase on the problem is the <em>Overlapping Generations</em> (OLG) model — <span class="citation" data-cites="Samuelson1958Exact">Samuelson (1958)</span>’s consumption-loan paper introduces the basic structure, and <span class="citation" data-cites="Diamond1965National">Diamond (1965)</span> adds capital to the model. Generations are not point-events but cohorts with finite lifespans, and at any moment several cohorts coexist. A grandparent, parent, and child can interact directly. They have overlapping interests with neighbouring cohorts, who have overlapping interests with theirs. This gives a transitive chain of reciprocal interactions linking the present to the distant future, without requiring any single agent to bargain with someone unborn.</p>
<p>OLG is enough to recover <em>some</em> intergenerational cooperation under the right preference structures — altruism toward children, social-norm enforcement, public-pension institutions, family-firm continuity. But it does not give a fairness theorem for distant generations. The cooperation chain attenuates with each link: future-future-future agents are weighted only as much as their immediate ancestors cared about their children’s children’s children, which is generally not very much.</p>
</section>
<section id="axiomatic-intergenerational-equity" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="axiomatic-intergenerational-equity"><span class="header-section-number">3</span> Axiomatic intergenerational equity</h2>
<p>Most of the <em>formal</em> work on intergenerational fairness is not game theory; it is axiomatic social choice over infinite streams of well-being. Each generation gets a well-being level <img src="https://latex.codecogs.com/png.latex?x_t">, and the question is which orderings of infinite streams <img src="https://latex.codecogs.com/png.latex?(x_1,%20x_2,%20%5Cdots)"> are consistent with two minimal-seeming axioms:</p>
<ul>
<li><strong>Strong Pareto</strong> (sensitivity): if one generation is strictly better off and none worse, prefer the new stream.</li>
<li><strong>Finite Anonymity</strong> (equal treatment): permuting finitely many generations leaves the ranking unchanged.</li>
</ul>
<p>There are various impossibility results — Basu–Mitra <span class="citation" data-cites="Basu2003Aggregating">(Basu and Mitra 2003)</span>, Lauwers, Zame, and others — blocking us from jointly satisfying these axioms <span class="citation" data-cites="Asheim2010Intergenerational">(Asheim 2010)</span>. There is no numerically representable social welfare function that satisfies both (Diamond–Basu–Mitra), and if we drop numerical representability and just ask for an <em>explicitly definable</em> complete ordering, that fails too (Lauwers–Zame). One of the axioms has to weaken or go.</p>
<p>The literature has taken two paths through this.</p>
<p><em>Keep both axioms, give up completeness.</em> Incomplete orderings like utilitarian or leximin “overtaking” criteria can compare some pairs of infinite streams but not all. Some intergenerational dilemmas come out unrankable, which is awkward for policy advice but at least flagged rather than fudged.</p>
<p><em>Keep completeness, give up equal treatment.</em> Discounted utilitarianism — the standard policy-economics workhorse — applies a discount factor <img src="https://latex.codecogs.com/png.latex?%5Cdelta%20%3C%201"> each period, weighting future generations less. <span class="citation" data-cites="Chichilnisky1996Axiomatic">Chichilnisky (1996)</span> names this a <em>Dictatorship of the Present</em>, since beyond some finite time the future stops mattering for the ranking. The Stern–Nordhaus debate over climate policy is largely a debate over how much of this dictatorship to accept.</p>
<p>A third path tries to weaken the axioms in the right direction rather than throwing one out. Asheim’s <em>Hammond Equity for the Future</em> (HEF) is one such weakening. Standard Hammond equity says any transfer from a better-off generation to a worse-off one improves the social ranking, provided the ordering is preserved. HEF restricts this to one specific case — when the <em>present</em> is better off than an infinite number of <em>future</em> generations, and a present sacrifice would benefit all of them while keeping the present better off than the future. My understanding of the intuition here is that a small present sacrifice is worth it if it benefits an infinite number of unambiguously-worse-off future cohorts, while we should not demand maximal sacrifice from a barely-worse-off present to benefit a barely-worse-off future. Asheim, Mitra, and Tungodden show that HEF combined with weakened Pareto and continuity axioms gives a class of <em>sustainable recursive social welfare functions</em>, orderings that allow present sacrifice when the future is worse off but not when the future is already better off <span class="citation" data-cites="Asheim2010Sustainable">(Asheim, Mitra, and Tungodden 2012)</span>.</p>
<p>In productive technological environments — Asheim, Buchholz, and Tungodden’s “immediate productivity” condition — Strong Pareto and Finite Anonymity together imply that only non-decreasing well-being streams are undominated <span class="citation" data-cites="Asheim2001Justifying">(Asheim, Buchholz, and Tungodden 2001)</span>. So sustainability is what the minimal-equity axioms imply when the technology can in fact produce things, not an additional normative add-on but a <em>consequence</em> of equality + sensitivity once productivity is in the picture.</p>
<p>The methodological frame across all of this is Rawls’s <em>reflective equilibrium</em> <span class="citation" data-cites="Rawls1971Theory">(Rawls 1971)</span>. Criteria for intergenerational equity should be judged on the ethical axioms they build on, and also on their consequences in concrete technological environments. If a criterion says we should sacrifice everything for any-positive-gain-by-the-future, or never sacrifice anything no matter how much the future gains, our intuition that <em>both</em> are wrong is itself evidence to revise the axioms. Picking axioms in the abstract and applying them blindly is bad methodology; we iterate between axioms and downstream implications until both feel right.</p>
<p>I started with Asheim’s <em>Annual Review</em> survey <span class="citation" data-cites="Asheim2010Intergenerational">(Asheim 2010)</span>.</p>
</section>
<section id="veto-power-formalism" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="veto-power-formalism"><span class="header-section-number">4</span> Veto-power formalism</h2>
<p>A bargaining-flavoured strand of the axiomatic literature models the game <em>as if</em> future generations could refuse. Suppose each generation has a Rubinstein-style alternating-offers position <span class="citation" data-cites="Rubinstein1982Perfect">(Rubinstein 1982)</span> with a credible veto over others’ resource decisions <span class="citation" data-cites="Manzini2010Intergenerational">(Manzini 2010)</span>. Even when future cohorts cannot in fact participate, asking “what allocation would they accept under bargaining parity?” gives a well-defined Social Welfare Relation that excludes the worst expropriations.</p>
<p>Such a veto is more a normative device than a positive one. It tells us what fairness <em>would</em> require if the unborn could speak; it does not predict what self-interested play <em>will</em> produce.</p>
</section>
<section id="proxy-mechanisms-in-practice" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="proxy-mechanisms-in-practice"><span class="header-section-number">5</span> Proxy mechanisms in practice</h2>
<p>Closer to political economy: institutions that artificially weight the bargaining power of those representing future interests.</p>
<p><em>Youth quotas</em> in legislative bodies. Younger voters and legislators have longer remaining horizons and internalise more of the long-term consequences; their interests partially overlap with the unborn. The argument is roughly: youths are the next-best proxy for those who cannot yet vote — see <a href="https://www.if.org.uk/wp-content/uploads/2015/12/151201_IGJR_final.pdf?ref=danmackinlay.name">the 2015 <em>Intergenerational Justice Review</em> issue</a> for several treatments.</p>
<p><em>Future-generations tribunals or commissioners</em>, with explicit review or veto powers over policies that bind the long term. Hungary, Wales, Israel, and others have variants; their bite varies enormously by jurisdiction and political will. See <span class="citation" data-cites="Basson2025Commentary">Basson et al. (2025)</span> on the human-rights framing.</p>
<p><em>Constitutional limits</em> on the actions of a present majority — debt ceilings, environmental amendments, supermajority requirements for long-term commitments. The constitutional framing serves as a proxy commitment device — see <a href="../notebook/commitment.html">commitment</a> — that binds future selves of the polity.</p>
<p>These are all imperfect. Youths are not the unborn; commissioners have their own interests; constitutions can be amended. But they are practical institutions trying to do the work the formal models say is needed.</p>
</section>
<section id="discounting-problems" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="discounting-problems"><span class="header-section-number">6</span> Discounting problems</h2>
<p>A deep open question is how <em>I</em> should rationally discount future utility when other people will experience it than me, because I will be dead. A positive discount rate — the empirical norm in cost-benefit analysis — heavily reduces the present-day weight on far-future welfare; this is what allows current generations to rationalise expropriation in policy documents. A zero or near-zero rate produces unbounded numbers (any benefit that compounds forever has infinite present value), forcing modellers to introduce extinction probabilities or other regularisations whose values are themselves contestable.</p>
<p>One area where people have though long and hard about this is <a href="../notebook/climate_change.html">climate change</a>. The Stern–Nordhaus debate on climate-change policy is largely a debate about discounting: the formal cost-benefit models produce wildly different recommendations depending on a parameter that game theory itself does not pin down. There is no equilibrium-style answer. Famous treatments such as DeCanio’s <em>Game Theory and Climate Change</em> <span class="citation" data-cites="DeCanio2013Game">(DeCanio and Fremstad 2013)</span> frame it as multi-objective optimisation under deep uncertainty, with the discount rate as a normative input rather than a derivable feature.</p>
</section>
<section id="dont-die" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="dont-die"><span class="header-section-number">7</span> Don’t die</h2>
<p>One way to ameliorate intergenerational games is to not have any generations. If we can achieve indefinite lifespans, then the future is no longer a different generation; it’s just a later self. OTOH, <a href="../notebook/intertemporal_decisions.html">humans can also suck at helping out their future selves</a>.</p>
</section>
<section id="connections" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="connections"><span class="header-section-number">8</span> Connections</h2>
<p>Adjacent to: <a href="../notebook/cooperation.html">cooperation</a> (mechanisms generally), <a href="../notebook/coalition_games.html">coalition games</a> (when “the future generation” is itself heterogeneous), <a href="../notebook/commitment.html">commitment</a> (intertemporal commitment as the dual problem), <a href="../notebook/collective_action.html">collective action</a> (climate and commons specifically), <a href="../notebook/game_complexity.html">game complexity</a> (computing fair allocations in OLG with many cohorts is its own complexity story), and economics of growth (the standard growth models — Solow, Ramsey, Dasgupta–Heal–Solow — are doing intergenerational welfare analysis under a particular axiom set, usually discounted utilitarianism, often without flagging the choice).</p>
<p><strong>Longtermism</strong> (the EA / x-risk strand) sits inside this axiomatic space — typically a near-zero discount rate plus expected-total-utility aggregation, which is one specific resolution of the SP + FA tension. Whether longtermists engage with the impossibility results explicitly, or just smuggle in their preferred resolution via expected utility, varies a lot.`</p>
<p><strong>AI successionism</strong> — that AI systems should or will succeed humanity, and that this is acceptable or even desirable — fits inside the same frame. The problem is sharpened, though, because the “future generations” might have radically different utility functions and need not be biologically continuous with us at all. I am noodling on this elsewhere; the axiomatic frame is one tool for asking which axioms successionism implicitly endorses or rejects.</p>
</section>
<section id="references" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="references"><span class="header-section-number">9</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Asheim2010Intergenerational" class="csl-entry">
Asheim. 2010. <span>“<a href="https://doi.org/10.1146/annurev.economics.102308.124440">Intergenerational Equity</a>.”</span> <em>Annual Review of Economics</em>.
</div>
<div id="ref-Asheim2021How" class="csl-entry">
Asheim, Banerjee, and Mitra. 2021. <span>“<a href="https://doi.org/10.1007/s00199-020-01296-8">How Stationarity Contradicts Intergenerational Equity</a>.”</span> <em>Economic Theory</em>.
</div>
<div id="ref-Asheim2001Justifying" class="csl-entry">
Asheim, Buchholz, and Tungodden. 2001. <span>“<a href="https://doi.org/10.1006/jeem.2000.1136">Justifying Sustainability</a>.”</span> <em>Journal of Environmental Economics and Management</em>.
</div>
<div id="ref-Asheim2010Sustainable" class="csl-entry">
Asheim, Mitra, and Tungodden. 2012. <span>“<a href="https://doi.org/10.1007/s00199-010-0573-7">Sustainable Recursive Social Welfare Functions</a>.”</span> <em>Economic Theory</em>.
</div>
<div id="ref-Auerbach1991Generational" class="csl-entry">
Auerbach, Gokhale, and Kotlikoff. 1991. <span>“Generational Accounts: A Meaningful Alternative to Deficit Accounting.”</span> In <em>Tax Policy and the Economy</em>.
</div>
<div id="ref-Axtell2001Emergence" class="csl-entry">
Axtell, Epstein, and Young. 2001. <span>“<a href="https://doi.org/10.7551/mitpress/6294.003.0009">The Emergence of Classes in a Multi-Agent Bargaining Model</a>.”</span> In <em>Social Dynamics</em>.
</div>
<div id="ref-Basson2025Commentary" class="csl-entry">
Basson, Liebenberg, Wewerinke-Singh, et al. 2025. <span>“<a href="https://muse.jhu.edu/pub/1/article/972482">Commentary to the Maastricht Principles on the Human Rights of Future Generations</a>.”</span> <em>Human Rights Quarterly</em>.
</div>
<div id="ref-Basu2003Aggregating" class="csl-entry">
Basu, and Mitra. 2003. <span>“<a href="https://doi.org/10.1111/1468-0262.00458">Aggregating Infinite Utility Streams with Intergenerational Equity: The Impossibility of Being Paretian</a>.”</span> <em>Econometrica</em>.
</div>
<div id="ref-Chander2018Game" class="csl-entry">
Chander. 2018. <em>Game Theory and Climate Change</em>.
</div>
<div id="ref-Chichilnisky1996Axiomatic" class="csl-entry">
Chichilnisky. 1996. <span>“<a href="https://doi.org/10.1007/BF00183353">An Axiomatic Approach to Sustainable Development</a>.”</span> <em>Social Choice and Welfare</em>.
</div>
<div id="ref-DeCanio2013Game" class="csl-entry">
DeCanio, and Fremstad. 2013. <span>“<a href="https://doi.org/10.1016/j.ecolecon.2011.04.016">Game Theory and Climate Diplomacy</a>.”</span> <em>Ecological Economics</em>, New Climate Economics,.
</div>
<div id="ref-Diamond1965National" class="csl-entry">
Diamond. 1965. <span>“National Debt in a Neoclassical Growth Model.”</span> <em>The American Economic Review</em>.
</div>
<div id="ref-Greaves2019Case" class="csl-entry">
Greaves, and MacAskill. 2019. <span>“<a href="https://globalprioritiesinstitute.org/wp-content/uploads/The-Case-for-Strong-Longtermism-GPI-Working-Paper-June-2021-2-2.pdf">The Case for Strong Longtermism</a>.”</span> In <em>Essays on Longtermism: Present Action for the Distant Future</em>.
</div>
<div id="ref-Kotlikoff1992Generational" class="csl-entry">
Kotlikoff. 1992. <em>Generational Accounting: Knowing Who Pays, and When, for What We Spend</em>.
</div>
<div id="ref-Kotlikoff1993Inefficiency" class="csl-entry">
Kotlikoff, and Rosenthal. 1993. <span>“<a href="https://doi.org/10.3386/w3354">Some Inefficiency Implications of Generational Politics and Exchange</a>.”</span> <em>Economics &amp; Politics</em>.
</div>
<div id="ref-MacAskill2023What" class="csl-entry">
MacAskill. 2023. <em>What We Owe The Future</em>.
</div>
<div id="ref-Manzini2010Intergenerational" class="csl-entry">
Manzini. 2010. <span>“<a href="https://doi.org/10.7275/3317861">Intergenerational Justice in the Hobbesian State of Nature</a>.”</span>
</div>
<div id="ref-Rawls1971Theory" class="csl-entry">
Rawls. 1971. <em>A Theory of Justice</em>.
</div>
<div id="ref-Rubinstein1982Perfect" class="csl-entry">
Rubinstein. 1982. <span>“<a href="https://doi.org/10.2307/1912531">Perfect Equilibrium in a Bargaining Model</a>.”</span> <em>Econometrica</em>.
</div>
<div id="ref-Samuelson1958Exact" class="csl-entry">
Samuelson. 1958. <span>“<a href="https://doi.org/10.1086/258100">An Exact Consumption-Loan Model of Interest with or Without the Social Contrivance of Money</a>.”</span> <em>Journal of Political Economy</em>.
</div>
<div id="ref-Serrano2005Fifty" class="csl-entry">
Serrano. 2005. <span>“Fifty Years of the Nash Program, 1953–2003.”</span> <em>Investigaciones Económicas</em>.
</div>
</div>


</section>

 ]]></description>
  <category>agents</category>
  <category>cooperation</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>incentive mechanisms</category>
  <category>intertemporal</category>
  <category>mind</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/game_theory_intergenerational.html</guid>
  <pubDate>Mon, 04 May 2026 02:36:57 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/skeletal_2x2_RP-P-1896-A-19368-193.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Vibecoding Apple apps</title>
  <link>https://danmackinlay.name/notebook/vibecoding_apple.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>I want my phone to do small useful things for me— Tally a thing I notice. Nag me when I haven’t stretched. Watch a sensor and remind me when something changes. The kind of automation that ought to be a 50-line shell script, except the phone does not run shell scripts and it is annoying to get shellscript to render UI on the desktop, so it has to be an <em>app</em>.</p>
<p>I have not learned Swift, and I am not going to. iOS development looks, from the outside, like a stack of arbitrary ceremony around what should be a small program. The App Store and the various fights about App Review are also irrelevant to me, since the apps I am writing are for me. Traditionally people rant at this point about how Apple development is expensive. I don’t care about that? I am resigned to paying Apple their USD $99/year for the privilege of running my own code on my own phone —In fact I do not <em>technically</em> need to pay for just running code, but it gets tedious fast without signing the binaries, so whatever. It is more expensive than $0, but the time saving dwarfs it so, like, whatever. When Apple gets too creepy, I will switch to linux and then I will have another long list of annoyances to complain about.</p>
<p>So! What is the apple-optimised <a href="../notebook/automatic_coding.html">vibe-coding</a> pipeline?</p>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>tl;dr</strong> Two MCP servers, I run both which seems to work.</p>
<ul>
<li><strong>XcodeBuildMCP</strong> — headless wrapper around <code>xcodebuild</code>/<code>simctl</code>/LLDB. Builds, tests, runs, debugs. Works with Xcode closed.</li>
<li><strong><code>xcrun mcpbridge</code></strong> — Apple’s own bridge into the <em>running</em> Xcode IDE. Live diagnostics, Apple docs lookup, SwiftUI Preview capture.</li>
</ul>
<p>They do not AFAICT overlap, or at least Claude seems to wknow which to use. The first is the build engine; the second is the IDE eyes-and-ears.</p>
</div>
</div>
</div>
<section id="it-works-now" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="it-works-now"><span class="header-section-number">1</span> It works now</h2>
<div id="fig-appley-eve" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-appley-eve-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/appley_eve_RP-P-OB-10.708.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/appley_eve_RP-P-OB-10.708.avif" id="fig-appley-eve" class="figure illustration right img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-appley-eve-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>The xcode build kinda worked for ages, but it was pretty noisy and slow. Recent Xode updates (I think 26.3) made it way better. LLM no longer needs to parse <code>xcodebuild</code> log spew to figure out what went wrong. It calls a tool, gets back JSON with the file, line, column, and message of each error, and acts. The same shift previously made <code>gopls</code>, <code>pyright</code>, <code>tsc --watch</code> etc. workable inside agent loops. iOS got there later, partly because Apple, and partly because <code>xcodebuild</code> is famously verbose.<sup>1</sup></p>
</section>
<section id="xcodebuildmcp" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="xcodebuildmcp"><span class="header-section-number">2</span> XcodeBuildMCP</h2>
<p>An open-source workhorse MCP with ~80 tools. All of this assumes <code>xcode-select</code> and the underlying CLI tools are behaving themselves on the day. They frequently are not; see <a href="../notebook/macos_hacks.html#xcode">macos_hacks</a> for the standing repair manual.</p>
<p>Install:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">claude</span> mcp add xcodebuildmcp <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--</span> npx <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-y</span> xcodebuildmcp@latest</span></code></pre></div></div>
<p>It covers structured builds, test runs with per-method results, simulator boot/shutdown/install, real-device deployment, LLDB-driven debugging, and SwiftPM in addition to <code>.xcodeproj</code>/<code>.xcworkspace</code>. All returning tidy JSON.</p>
<p>The repo is at <a href="https://github.com/cameroncooke/XcodeBuildMCP?ref=danmackinlay.name">cameroncooke/XcodeBuildMCP</a>. The clearest write-up I’ve found is <a href="https://blakecrosley.com/blog/xcode-mcp-claude-code?ref=danmackinlay.name">Blake Crosley’s setup post</a>, which is also where I cribbed most of my mental model.</p>
<p>Even if I never open Xcode-the-IDE, this MCP gets me from “Claude wrote some Swift” to “Claude built it, ran it on the simulator, ran the tests, and saw which ones failed”.</p>
</section>
<section id="apples-mcp-bridge" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="apples-mcp-bridge"><span class="header-section-number">3</span> Apple’s MCP bridge</h2>
<p>Ships with Xcode 26 — no separate install, only an enable step:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">claude</span> mcp add xcode <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--</span> xcrun mcpbridge</span></code></pre></div></div>
<p>Around 20 tools, all interfacing with a <em>running</em> Xcode GUI IDE File ops in the editor, real-time diagnostics from the live build context, Apple documentation search, a Swift REPL, and <em>SwiftUI Preview capture</em>. The agent gets to see the rendered preview of a view, not just the code that produced it, and can iterate visually. <a href="https://www.anthropic.com/news/apple-xcode-claude-agent-sdk?ref=danmackinlay.name">Anthropic’s announcement post</a> has more detail.</p>
<p>This one only works with Xcode running, so it is no use for headless CI. For the kind of work I’m doing — sitting at the laptop, iterating on a small app — having Xcode open is not a hardship.</p>
</section>
<section id="division-of-labour" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="division-of-labour"><span class="header-section-number">4</span> Division of labour</h2>
<p>XcodeBuildMCP owns the build–test–debug loop. Apple’s MCP owns IDE-layer awareness — diagnostics, docs, previews. Run both. The author of the <a href="https://blakecrosley.com/blog/xcode-mcp-claude-code?ref=danmackinlay.name">setup write-up</a> does, I copied that, and it works.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th></th>
<th>XcodeBuildMCP</th>
<th><code>xcrun mcpbridge</code></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Install</td>
<td><code>npx xcodebuildmcp@latest</code></td>
<td>bundled with Xcode 26</td>
</tr>
<tr class="even">
<td>Xcode open?</td>
<td>not required</td>
<td>required</td>
</tr>
<tr class="odd">
<td>Build / test / run</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr class="even">
<td>SwiftUI Previews</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr class="odd">
<td>Apple docs</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr class="even">
<td>LLDB</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr class="odd">
<td>CI / headless</td>
<td>✅</td>
<td>❌</td>
</tr>
</tbody>
</table>
</section>
<section id="project-claude.md" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="project-claude.md"><span class="header-section-number">5</span> Project CLAUDE.md</h2>
<p>A short hint at the top of the project’s <code>CLAUDE.md</code> keeps the agent from rediscovering the toolchain on every turn. Mine looks roughly like:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource markdown number-lines code-with-copy"><code class="sourceCode markdown"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">## XcodeBuildMCP integration</span></span>
<span id="cb3-2"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Build: mcp__xcodebuildmcp__build_sim_name_proj</span>
<span id="cb3-3"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Test:  mcp__xcodebuildmcp__test_sim_name_proj</span>
<span id="cb3-4"><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">- </span>Platform: iOS, Swift 6, SwiftUI, MVVM + @Observable</span></code></pre></div></div>
<p>Enough for the agent to default to the right tool without me re-hinting it on every prompt.</p>
</section>
<section id="in-ide-claude" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="in-ide-claude"><span class="header-section-number">6</span> In-IDE Claude</h2>
<p>Xcode 26.3+ also ships with a Claude Agent panel built into the IDE, using the same Agent SDK and roughly the same ~20 tools as <code>xcrun mcpbridge</code>. Settings → Intelligence, drop in an Anthropic API key, done.<sup>2</sup></p>
<p>I do not use this. I live in the terminal, and Claude Code is where my prompts, my <a href="../notebook/git.html">git worktree workflow</a>, and my muscle memory live. Also I spent about 15 seconds looking for the agent panel and didn’t find it, so I left, bored. For somebody whose centre of gravity is Xcode itself, might be worthwhile?</p>
</section>
<section id="loose-ends" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="loose-ends"><span class="header-section-number">7</span> Loose ends</h2>
<p>A scattered list of things I have not yet figured out, or have figured out and disliked.</p>
<ul>
<li><p><strong>Signing and provisioning.</strong> Even with the developer account paid up, the rituals around personal devices, free/paid teams, provisioning profiles, capabilities, and the keychain are exactly as user-hostile as everyone says. I have not yet found an MCP that abstracts this away. I suspect there is no abstraction over it because Apple would rather a human was somewhere in the loop to sign off on their nonsense.</p></li>
<li><p><strong>Sideload vs.&nbsp;dev-install.</strong> For my own apps on my own phone, the dev-account install with a 1-year cert is fine. For apps I might want to give to one or two friends, the answer is less clear. AltStore? TestFlight? I have not committed. Probably TestFlight.</p></li>
<li><p><strong>Does SwiftUI Preview capture actually close the loop?</strong> In principle, the agent sees the preview and iterates. In practice I am not yet sure how well this scales past a single isolated view. View hierarchies, state, mock data, navigation contexts — all of these complicate the preview. Currently I plan to avoid ever finding this out by just not building anything complicated enough to need it.</p></li>
<li><p><strong>Non-trivial system integrations.</strong> Core Data, HealthKit, Shortcuts intents, WidgetKit — the bits I actually want to use, since they are what makes the phone useful as an automation target. The simple-Swift-app-with-a-button pattern is well-trodden in LLM-generated examples. The “talk to HealthKit and surface a daily nudge” pattern… maybe? TODO</p></li>
</ul>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>I am told the <code>xcodebuild</code> log volume on a clean build of a non-trivial app is measured in megabytes. Certainly if I leave debug logging on, my iPhone storage goes to 0 fast.↩︎</p></li>
<li id="fn2"><p>See <a href="https://www.youtube.com/watch?v=t8UXKifcLXQ&amp;ref=danmackinlay.name">a walkthrough on YouTube</a>.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>faster pussycat</category>
  <category>making things</category>
  <category>diy</category>
  <category>code</category>
  <category>apple</category>
  <category>workflow</category>
  <guid>https://danmackinlay.name/notebook/vibecoding_apple.html</guid>
  <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/appley_eve_RP-P-OB-10.708.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Agency under bounded compute and information</title>
  <link>https://danmackinlay.name/notebook/agency_bounded_compute.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div class="callout callout-style-simple callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Adjacent run-ups
</div>
</div>
<div class="callout-body-container callout-body">
<p>One of several notebooks I started on the same underlying problem. The others are <a href="../notebook/homunculi.html">homunculi</a> (compute split across self, other, and reflective sub-models) and <a href="../notebook/ai_economics_of_cognition.html">economics of cognition</a> (compute as a substitutable factor of production). That I keep failing to merge them is, I think, telling me something about the shape of the question.</p>
</div>
</div>
<div id="fig-giant-factotum" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-giant-factotum-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/giant_factotum_RP-P-1985-65.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/giant_factotum_RP-P-1985-65.avif" id="fig-giant-factotum" class="figure illustration right img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-giant-factotum-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Here’s where I wish to start, for context: If we have complete information about the initial conditions of the universe, and unlimited compute, then it is not natural to classify anything as possessing “agency”; we can see the whole of the universe, up to quantum fluctuations, by stepping our perfect simulator forward in time. There are no decisions to be made, merely consequences to be observed.</p>
<p>But we might also find that thinking of ourselves as horologists to the clockwork universe is unsatisfactory as a model for us doing the modelling. I will never be this omniscient being. Knowing all of this universe would need me to have another, much larger, universe to store the information in, to build the computer to do the simulation, and so on. I mean <a href="../notebook/this_is_a_simulation.html">maybe that happened and I am the simulation of some omniscient agent</a>? But that omniscient agent is not a great model for me.</p>
<p><a href="../notebook/aixi.html">AIXI</a> relaxes the first assumption (we don’t know where the universe started, we just arrived in it with an effectively infinite computer and need to work out what it is). That still doesn’t feel like enough of a relaxation. More generally, “agency” seems like it might accrue to entities which need to learn to act with both bounded information and bounded compute. Let us explore some ideas.</p>
<p>The two axes are <em>information about the world</em> (complete vs bounded) and <em>compute available</em> (unlimited vs bounded).</p>
<ul>
<li><em>Complete information, unlimited compute.</em> A Laplacean demon. Step the perfect simulator forward in time. There is nothing here we would want to call agency; the universe just runs.</li>
<li><em>Bounded information, unlimited compute.</em> <a href="../notebook/aixi.html">AIXI</a> and friends. We grant ourselves an environment hypothesis class weighted by Kolmogorov complexity and let the agent solve it in closed form. Computationally troubling, but a background against which much form <a href="../notebook/agent_foundations.html">agent foundations</a> theory plays out.</li>
<li><em>Complete information, bounded compute.</em> An oracle that computes too slowly to act in time. This seems relevant to maybe weather forecasting and replay buffers, but not to agency proper, so I won’t talk about it much.</li>
<li><em>Bounded information, bounded compute.</em> Where we and large language models and bacteria and politicians can be found. The thesis of this notebook is that this combination is the <em>primary</em> one we need to understand to “know about agents like ourselves”, and that the other three are idealisations that probably do not have much useful to say about people.</li>
</ul>
<section id="the-good-regulator-in-the-big-world" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="the-good-regulator-in-the-big-world"><span class="header-section-number">1</span> The good regulator in the big world</h2>
<p>The <a href="../notebook/internal_models.html">internal model principle</a>, AKA the “good regulator theorem”, says: any agent that does well in an environment must contain a model of that environment.<sup>1</sup> So the agent contains a model.</p>
<p>The big-world hypothesis says: the environment is strictly bigger than the agent — there is no fixed point at which the agent has “solved” the world. (A formal version is the Lewandowski et al.&nbsp;setup below — an agent embedded as a finite automaton inside a universal computer, interacting with a POMDP over a countably infinite state space.)</p>
<p>Together, these suggest that we need to think about <em>lossy compression</em> of the world, by construction. What kind of compression is the agent’s internal model? Which features survive? What is it sufficient for? When does the residual look like noise, and when does it look like the world ambushing us?</p>
<p>Somewhere in here there is a bridge between <a href="../notebook/internal_models.html">internal models</a> and <a href="../notebook/bounded_rationality.html">bounded rationality</a>. The internal model principle says we need a model. Bounded rationality says we cannot afford the naïve one, the territory-as-map. The technical question is what we <em>can</em> afford that still works.</p>
</section>
<section id="prior-art" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="prior-art"><span class="header-section-number">2</span> Prior art</h2>
<p>Short notes on each. Future-me, do not be alarmed by the count — these are mostly variations on a single optimisation problem, viewed from different traditions.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Entry</th>
<th>Operates on</th>
<th>What it does</th>
<th>Where bound enters</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Resource-rational analysis</td>
<td>cognitive strategies</td>
<td>picks the optimum</td>
<td>soft cost on cognitive operations</td>
</tr>
<tr class="even">
<td>Bounded optimality</td>
<td>programs for architecture <img src="https://latex.codecogs.com/png.latex?M"></td>
<td>picks the optimum</td>
<td>hard feasibility</td>
</tr>
<tr class="odd">
<td>Rational metareasoning</td>
<td>computations, online</td>
<td>picks the next one to run</td>
<td>per-step VOC cost</td>
</tr>
<tr class="even">
<td>Information-theoretic bounded rationality</td>
<td>policies</td>
<td>picks the KL-constrained optimum</td>
<td>KL budget vs prior</td>
</tr>
<tr class="odd">
<td>Bounded inductive rationality</td>
<td>logical beliefs over time</td>
<td>characterizes calibrated paths</td>
<td>no-arbitrage in the limit</td>
</tr>
<tr class="even">
<td>Computationally tractable choice</td>
<td>decision rules</td>
<td>rules out intractable ones</td>
<td>polynomial-time axiom</td>
</tr>
<tr class="odd">
<td>POMDP-as-agent</td>
<td>system interpretations</td>
<td>characterizes POMDP-shaped ones</td>
<td>state-space capacity</td>
</tr>
<tr class="even">
<td>Computationally-embedded big world</td>
<td>agent automata in computable worlds</td>
<td>picks interactivity-maintaining ones</td>
<td>agent fits inside the world</td>
</tr>
</tbody>
</table>
<p>NARS is somehow philosophically nearby but is not formalised tightly enough to fit a row.</p>
<section id="resource-rational-analysis" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="resource-rational-analysis"><span class="header-section-number">2.1</span> Resource-rational analysis</h3>
<p>Lieder &amp; Griffiths <span class="citation" data-cites="Lieder2020Resourcerational">(Lieder and Griffiths 2020)</span> frame human cognition as the optimal use of finite computational resources. The procedure: define the agent’s task, the cognitive operations available, and their costs; derive the heuristic that maximises expected utility under the budget. The heuristic that comes out is the prediction; observed cognitive biases are the right answer to the constrained problem.</p>
<p>LLM summary follows:</p>
<p>The optimisation has the same shape as the bounded-rationality entries above but at a different grain:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi%5E*%20=%20%5Carg%5Cmax_%7B%5Cpi%20%5C,%5Cin%5C,%20%5Ctext%7Bstrategies%7D%7D%20%5Cmathbb%7BE%7D%5Cbigl%5B%5C,U(%5Cpi)%20-%20%5Cmathrm%7Bcost%7D(%5Cpi)%5C,%5Cbigr%5D,%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5Cpi"> is a <em>cognitive strategy</em> — an algorithm parameterised by how much compute it spends — and <img src="https://latex.codecogs.com/png.latex?%5Cmathrm%7Bcost%7D(%5Cpi)"> is a cost on cognitive operations (search expansions, posterior samples, working-memory loads). This sits between BO and RM in granularity: BO optimises whole programs offline, RM optimises individual computations online, and RRA optimises the heuristic itself — a strategy with an internal compute knob — treating it as a unit.</p>
<p>The interpretive move that makes RRA distinctive in the cognitive-science direction is reading observed biases as <img src="https://latex.codecogs.com/png.latex?%5Cpi%5E*"> for some plausible cost model, not as failures of rationality. Anchoring-style adjustment and availability-based estimation have been derived in this framework as resource-rational under specific costs on sample count and inference depth. The inferential arrow runs in the unusual direction: from observed heuristic, infer the brain’s implicit cost structure.</p>
<p>What it gives us: an explicit machinery for “best affordable model”. If the world is bigger than the agent, this is the framework that tells us <em>which</em> compression to keep.</p>
</section>
<section id="bounded-optimality" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="bounded-optimality"><span class="header-section-number">2.2</span> Bounded optimality</h3>
<p>Russell &amp; Subramanian <span class="citation" data-cites="Russell1995Provably">(S. J. Russell and Subramanian 1995)</span> define a program as bounded-optimal for a given architecture if no other program for that architecture does better in the environment. The optimisation moves from “best action” to “best algorithm-on-the-hardware”. Resource-rational analysis is its descendant in the cognitive-science direction; Gershman, Horvitz &amp; Tenenbaum’s <em>computational rationality</em> <span class="citation" data-cites="Gershman2015Computational">(Gershman, Horvitz, and Tenenbaum 2015)</span> is the umbrella name.</p>
<p>LLM summary follows:</p>
<p>Fix an architecture <img src="https://latex.codecogs.com/png.latex?M"> — a machine model with bounded memory and per-step compute, plus a clock. Bounded optimality is the program <img src="https://latex.codecogs.com/png.latex?%5Cpi%5E*"> that maximises expected utility <em>subject to running on <img src="https://latex.codecogs.com/png.latex?M"></em>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi%5E*%20=%20%5Carg%5Cmax_%7B%5Cpi%20%5C,%5Cin%5C,%20%5Cmathrm%7Bprograms%7D(M)%7D%20%5Cmathbb%7BE%7D%5Cbigl%5BU%20%5Cmid%20%5Cpi,%5C,%5Ctext%7Benvironment%7D%5Cbigr%5D.%0A"></p>
<p>So the agent is no longer choosing actions; it is choosing the algorithm that will, in turn, choose actions on its hardware. This is a meta-level optimization over policies-as-programs, with the architecture’s resource constraints baked into the feasible set rather than tacked on as a soft penalty — which is what distinguishes BO from the KL-regularized, free-energy framing above.</p>
<p>Russell &amp; Subramanian also propose <em>asymptotic</em> bounded optimality (ABO), a weakening that requires the program to approach optimality only as the architecture is scaled up, because strict per-architecture optimality is itself intractable to analyse. cf <a href="../notebook/large_sample_theory.html">large sample theory</a> — Infinite asymptotics are more tractable to analyse. ABO is a softer cousin of AIXI’s compute-to-infinity move — when “best on <img src="https://latex.codecogs.com/png.latex?M">” is too hard to characterise, the analysis retreats to “best as <img src="https://latex.codecogs.com/png.latex?M"> grows”. Sticking to bounded compute seems to be really hard, based on what smart people do when they try to stick to it.</p>
<p>What it gives us: an insistence that the budget is a property of the <em>implementation</em>, not a vague hand-wave. Future me, if I am tempted to talk about “the agent’s budget” without specifying the architecture, see above.</p>
</section>
<section id="rational-metareasoning" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="rational-metareasoning"><span class="header-section-number">2.3</span> Rational metareasoning</h3>
<p><span class="citation" data-cites="Russell1991Principles">S. Russell and Wefald (1991)</span> model each unit of computation as a decision: expected value of running the computation minus its cost.<sup>2</sup> The agent decides which inferences to run as a planning problem one level up.</p>
<p>LLM summary follows:</p>
<p>Two questions distinguish RM from the BO entry above (also a Russell programme): <em>what</em> is being optimised and <em>when</em>. BO optimises <em>programs</em>, offline — a designer picks the best program for a fixed architecture, once, and the program then just runs. RM optimises <em>computation choices</em>, online — at runtime the agent itself decides, step by step, which inference to run next. The two framings are complementary rather than competing: RM is the technique a bounded-optimal program might use internally to allocate its compute, and BO is the criterion under which the program-plus-RM-policy bundle as a whole should be assessed.</p>
<p>The decision-theoretic content is the <em>value of computation</em> (VOC). Let <img src="https://latex.codecogs.com/png.latex?b"> be the agent’s current belief state and <img src="https://latex.codecogs.com/png.latex?c"> a candidate computation — expanding a node in a search tree, sampling another rollout, refining a posterior. Then</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathrm%7BVOC%7D(c%20%5Cmid%20b)%20=%20%5Cmathbb%7BE%7D%5Cbigl%5B%5C,U%20%5C,%5Cbig%7C%5C,%20%5Ctext%7Bact%20after%20%7D%20c,%5C,%20b%5C,%5Cbigr%5D%20-%20%5Cmathbb%7BE%7D%5Cbigl%5B%5C,U%20%5C,%5Cbig%7C%5C,%20%5Ctext%7Bact%20now%7D,%5C,%20b%5C,%5Cbigr%5D%20-%20%5Cmathrm%7Bcost%7D(c).%0A"></p>
<p>Run <img src="https://latex.codecogs.com/png.latex?c"> if its VOC is positive; act otherwise. The Hay-Russell-Tolpin-Shimony meta-MDP turns this into a proper Markov decision process whose states are <em>beliefs over the underlying MDP</em> and whose actions include both external actions and computation actions, with optimal policies given by Bellman equations on the meta level.</p>
<p>Notice the regress: estimating <img src="https://latex.codecogs.com/png.latex?%5Cmathrm%7BVOC%7D(c)"> before running <img src="https://latex.codecogs.com/png.latex?c"> is itself a computation, and deciding whether <em>that</em> is worth running is another. Practical RM truncates the recursion — usually at one level (myopic VOC, “is this single next step worth it?”), occasionally deeper. The truncation is what lets the framework run; whether the truncated VOC is itself bounded-optimal in any tight sense is the question that makes RM and BO need each other.</p>
<p>What it gives us: a decision-theoretically explicit story about <em>when to compute</em>, which is the question posed by the good-regulator-meets-big-world tension. The agent cannot run the full simulation; the metareasoner picks the slice.</p>
</section>
<section id="information-theoretic-bounded-rationality" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="information-theoretic-bounded-rationality"><span class="header-section-number">2.4</span> Information-theoretic bounded rationality</h3>
<p>Ortega &amp; Braun <span class="citation" data-cites="Ortega2011Information Ortega2013Thermodynamics">(Pedro Alejandro Ortega and Braun 2011; Pedro A. Ortega and Braun 2013)</span> formalise a bounded-rational policy as the KL-divergence-constrained optimum of expected utility.</p>
<p>LLM summary follows:</p>
<p>Pick a <em>reference</em> or <em>prior</em> policy <img src="https://latex.codecogs.com/png.latex?%5Cpi_0"> — what the agent does cheaply, without deliberating — and constrain the deliberated policy <img src="https://latex.codecogs.com/png.latex?%5Cpi"> to stay close to it in KL. So the budget is on the KL divergence, not on FLOPs, and the optimisation is</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi%5E*%20=%20%5Carg%5Cmax_%5Cpi%20%5C;%5Cmathbb%7BE%7D_%5Cpi%5BU(a)%5D%0A%5Cquad%5Ctext%7Bs.t.%7D%5Cquad%0A%5Cmathrm%7BKL%7D(%5Cpi%20%5C,%5C%7C%5C,%20%5Cpi_0)%20%5Cle%20B,%0A"></p>
<p>equivalently, with <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> the Lagrange multiplier on the constraint,</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi%5E*%20=%20%5Carg%5Cmax_%5Cpi%20%5C;%5Cmathbb%7BE%7D_%5Cpi%5BU(a)%5D%20-%20%5Ctfrac%7B1%7D%7B%5Cbeta%7D%5C,%5Cmathrm%7BKL%7D(%5Cpi%20%5C,%5C%7C%5C,%20%5Cpi_0).%0A"></p>
<p>The thermodynamic flavour comes from reading <img src="https://latex.codecogs.com/png.latex?%5Cmathrm%7BKL%7D(%5Cpi%20%5C,%5C%7C%5C,%20%5Cpi_0)"> as the <em>work done against the prior</em>: every nat of divergence from <img src="https://latex.codecogs.com/png.latex?%5Cpi_0"> has to be extracted from somewhere, by the same Landauer-style accounting that prices erasure. That is the argument that this functional counts as a model of compute cost and not just a regularizer.</p>
<p>The functional that drops out is a free energy, <img src="https://latex.codecogs.com/png.latex?F%5B%5Cpi%5D%20=%20%5Cmathbb%7BE%7D_%5Cpi%5BU%5D%20-%20%5Ctfrac%7B1%7D%7B%5Cbeta%7D%5C,%5Cmathrm%7BKL%7D(%5Cpi%20%5C,%5C%7C%5C,%20%5Cpi_0)">, whose maximizer is the Boltzmann-tilted policy <img src="https://latex.codecogs.com/png.latex?%5Cpi%5E*(a)%20%5Cpropto%20%5Cpi_0(a)%5C,%5Cexp(%5Cbeta%5C,U(a))">. The convenient consequence is that we can sample from <img src="https://latex.codecogs.com/png.latex?%5Cpi%5E*"> by importance-weighting draws from <img src="https://latex.codecogs.com/png.latex?%5Cpi_0"> against <img src="https://latex.codecogs.com/png.latex?%5Cexp(%5Cbeta%20U)"> — no need to enumerate actions to find the argmax, because the optimum is an integral over <img src="https://latex.codecogs.com/png.latex?%5Cpi_0"> that a Monte Carlo planner approximates without bias.</p>
<p>What it gives us: a formal stand-in for “compute budget” inside decision theory. It is also the bridge to thermodynamics, since the same functional reappears in the substrate principle section. Hafner et al. <span class="citation" data-cites="Hafner2022Action">(Hafner et al. 2022)</span> cast action and perception as joint divergence minimisation in this lineage.</p>
</section>
<section id="nars-assumption-of-insufficient-knowledge-and-resources" class="level3" data-number="2.5">
<h3 data-number="2.5" class="anchored" data-anchor-id="nars-assumption-of-insufficient-knowledge-and-resources"><span class="header-section-number">2.5</span> NARS / Assumption of Insufficient Knowledge and Resources</h3>
<p>Pei Wang’s NARS programme defines intelligence as adaptation under insufficient knowledge and resources. Already covered in <a href="../notebook/ai_economics_of_cognition.html">the economics of cognition notebook</a>; flagging here because it is philosophically closest to the “intelligence <em>is</em> boundedness” argument. It is also vague enough that I cannot work out exactly what they mean.</p>
</section>
<section id="bounded-inductive-rationality" class="level3" data-number="2.6">
<h3 data-number="2.6" class="anchored" data-anchor-id="bounded-inductive-rationality"><span class="header-section-number">2.6</span> Bounded inductive rationality</h3>
<p>Oesterheld, Demski &amp; Conitzer <span class="citation" data-cites="Oesterheld2023Theory">(Oesterheld, Demski, and Conitzer 2023)</span> explicitly drop logical omniscience.</p>
<p>LLM summary follows:</p>
<p><em>Logical omniscience</em> is the standard Bayesian assumption that an agent assigns probability 1 to every theorem and probability 0 to every contradiction the moment those are stated. Classical decision theory needs that assumption to make consequences of beliefs cash out: if a finite reasoner believes Peano arithmetic and PA proves <img src="https://latex.codecogs.com/png.latex?%5Cvarphi">, then classically the reasoner <em>already</em> believes <img src="https://latex.codecogs.com/png.latex?%5Cvarphi">. In any practical sense it does not, because nobody has run the proof. Until the agent spends compute to derive <img src="https://latex.codecogs.com/png.latex?%5Cvarphi">, the sentence’s truth-value is just a probability strictly between 0 and 1 — and the agent needs a coherent way to reason with that probability while the proof is still in flight.</p>
<p>The machinery is the logical-induction stuff: a market of <em>traders</em> who bet on whether sentences will be proved, refuted, or remain undecided by a given deductive horizon, and the agent’s beliefs are the market prices. Coherence is not a constraint at any single moment but a no-arbitrage criterion <em>over time</em> — no efficiently-computable trader should be able to extract unbounded money from the agent’s prices as the deductive horizon expands. The agent ends up with calibrated logical beliefs in the limit without ever having been classically coherent on any particular day. ODC’s contribution over the precursor logical-induction work is a clean axiomatisation: the trader-market construction was the existence proof; ODC characterise the property class.</p>
<p>A consequence we will need later: the agent never has to <em>commit</em> to what it will prove. It has prices on its own future actions and inferences, which is the move that dissolves the Löbian / 5-and-10 / spurious-counterfactual traps in <a href="../notebook/agency_embedded.html">embedded agency</a>. A coherent agent that is required to know now what it will do later runs into diagonal arguments; an inductively-rational agent answers “I will give you a probability, and update it as the proof comes in”.</p>
<p>This gives us a story close to the <a href="../notebook/agency_embedded.html">embedded agency</a> problem, but still with bounded compute. This might be the most direct response to the Löbian-paradox stuff without leaving for AIXI’s infinity.</p>
</section>
<section id="computationally-tractable-choice" class="level3" data-number="2.7">
<h3 data-number="2.7" class="anchored" data-anchor-id="computationally-tractable-choice"><span class="header-section-number">2.7</span> Computationally tractable choice</h3>
<p>Camara <span class="citation" data-cites="Camara2021Computationally">(Camara 2021)</span> adds an axiom of computational tractability to decision theory: rule out behaviours that are fundamentally hard.</p>
<p>LLM summary follows:</p>
<p>Camara messes with axioms. Take whatever set of decision-theory axioms you like — rationalizability, transitivity, independence — and add one more, that the agent’s choice function admits a polynomial-time implementation. Choice rules that fail this axiom are not admissible models of choosing agents.</p>
<p>So what does CTC rule out? Not <em>agents</em> — the framework takes for granted that agents exist and make choices. What it rules out are <em>theories</em> of choice. Camara identifies particular preference structures whose induced choice rules cannot be computed in polynomial time, and concludes that those structures cannot describe how any tractable computer chooses. If observed behaviour can only be rationalised by a super-polynomial decision rule, the verdict is that the rationalisation is the wrong account — the right move is to find a tractable rule that also fits the data, not to credit the agent with running an intractable algorithm in its head.</p>
<p>This sits differently from BO. Bounded optimality picks the best program <em>for a given architecture</em>; CTC rules decision <em>theories</em> out <em>for any architecture at all</em>. The two are complementary — BO tells us how to optimise inside the admissible class of theories; CTC tells us what the admissible class is.</p>
<p>What it gives us: a decision-theoretic analogue of bounded optimality, more axiomatic in flavour, easier to plug into <a href="../notebook/ai_economics_of_cognition.html">economics-of-cognition</a> arguments.</p>
</section>
<section id="pomdp-as-agent" class="level3" data-number="2.8">
<h3 data-number="2.8" class="anchored" data-anchor-id="pomdp-as-agent"><span class="header-section-number">2.8</span> POMDP-as-agent</h3>
<p>Biehl &amp; Virgo <span class="citation" data-cites="Biehl2023Interpreting">(Biehl and Virgo 2023)</span> interpret a system as a <a href="../notebook/pomdp.html">POMDP</a> solver: the internal state of the system maps to a belief state about the outside world, and the system’s actions are optimal given that belief.</p>
<p>LLM summary follows:</p>
<p>A system <img src="https://latex.codecogs.com/png.latex?S"> is <em>interpretable</em> as a POMDP solver if its internal states map to belief states and its outputs map to policy actions under some POMDP — i.e.&nbsp;its dynamics factor as Bayesian belief-update composed with a value-optimising policy. The interpretation need not be unique: a single physical system can admit multiple POMDP readings, each with its own implied utility, observation model, and hidden-world structure. The criterion is structural — does the system’s behaviour factor in a POMDP shape — without committing to <em>which</em> POMDP it solves.</p>
<p>This is the formal version of the good-regulator claim that a well-performing agent contains a model. Biehl &amp; Virgo make “contains a model” a checkable explicit property, and they do it without first committing to a utility function — the system is generically agenty, not necessarily a particular agent. Bounded compute enters as a restriction on which POMDPs admit interpretations: a finite system can only realise belief-updates and policies whose state spaces fit its capacity.</p>
<p>What it gives us: a candidate formal substrate. The good regulator theorem and bounded rationality both translate into statements about which POMDP solutions a finite agent can realise.</p>
</section>
<section id="computationally-embedded-big-world" class="level3" data-number="2.9">
<h3 data-number="2.9" class="anchored" data-anchor-id="computationally-embedded-big-world"><span class="header-section-number">2.9</span> Computationally-embedded big world</h3>
<p>Lewandowski et al. <span class="citation" data-cites="Lewandowski2025World">(Lewandowski et al. 2025)</span> is the spine of the tension stated above. An automaton inside a universal computer is <em>implicitly</em> constrained — there is no need to bolt the bound on. Their proposed objective, <em>interactivity</em>, measures the agent’s continuing ability to adapt and learn new predictions. Empirically, deep nonlinear networks struggle to maintain interactivity; deep linear networks do better as capacity grows. I expect this paper to be load-bearing for our agenda.</p>
<p>LLM summary follows:</p>
<p>The agent is a finite-state automaton with bounded memory and per-step compute. The world is the state of a universal computer evolving under some computable rule. They exchange symbols across an interface. The agent’s boundedness is a consequence of its automaton fitting inside the world’s automaton, not a separately-imposed budget — we are invited to consider this “agent inside a bigger computer” framing, maybe relevant to <a href="../notebook/boundaries_blankets.html">boundaries</a> and <a href="../notebook/multi_level_agency.html">multi-level agency</a> and all that.</p>
<p><em>Interactivity</em>, their proposed objective, measures the agent’s continuing capacity to acquire useful new predictions about the world’s dynamics as time goes on. This is the Big-World twist: there is no terminal “I have learned the environment” state, and the right objective is <em>sustained</em> learnability rather than convergence to a stationary optimum. RL’s usual maximise-and-stop framing is the wrong shape for an agent in this regime.</p>
<p>They even have an empirical finding! Expressive nonlinear networks, despite their nominal capacity advantage, lose interactivity as they scale — their representations collapse onto fixed features and they stop generating new predictions. Linear networks scale more gracefully on the same metric. Architectural choices that look like “more capability” under maximise-and-stop may be exactly the wrong choices for an agent that has to keep learning. Whatever bounded agency ends up requiring, “scale up the most expressive network you can afford” is not it.</p>
</section>
<section id="god-help-us-predictive-coding" class="level3" data-number="2.10">
<h3 data-number="2.10" class="anchored" data-anchor-id="god-help-us-predictive-coding"><span class="header-section-number">2.10</span> God help us, predictive coding</h3>
<p>The Friston-style <a href="../notebook/predictive_coding.html">free-energy / predictive-coding</a> tradition is in this neighbourhood and I want to mark it as such without inheriting its commitments. Active inference is, viewed from outside, a particular package of internal-model + KL-constrained policy + thermodynamic substrate; the ingredients line up with what we are assembling here. From the outside it looks like a natural approach, but observationally, I think something must be wrong with the definitions or framing or something because no one can agree what this theory is “about”. I am hopeful that I will accidentally rediscover the “good bits” of the free-energy principle by proceeding without it.</p>
</section>
</section>
<section id="substrate-principle-cantor-trap" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="substrate-principle-cantor-trap"><span class="header-section-number">3</span> Substrate principle, Cantor trap</h2>
<p>The thought experiment in the opening — <em>give the demon complete information and unlimited compute and let it simulate the universe</em> — articulates a weird bias in the literature that I had not found words for before. We ignore that the demon needs <em>somewhere to put the simulation.</em></p>
<p>Wolpert’s stochastic thermodynamics of computation <span class="citation" data-cites="Wolpert2019Stochastic Wolpert2026What">(David H. Wolpert 2019; David H. Wolpert and Korbel 2026)</span> is one attempt to price the substrate. Any logical operation has a thermodynamic cost; any physical computer is itself a dynamical system whose computation we identify by mapping its dynamics onto an abstract machine. A simulator of the entire universe is, at minimum, a physical system as complex as the universe being simulated — the exact lower bound depends on the dynamics, but it is not zero. So a Laplacian demon needs a <em>bigger</em> universe to live in. There is no infinite-compute thought experiment that is internally coherent without dragging in another, larger, world.</p>
<p>Call this the <em>substrate principle</em>. I’m sure there is a better term of art for this. Landauer talked about this kind of thing, although thinking specifically of thermodynamic costs, which might be the right way to frame it, but this does not seem trivial to me. Any agent — including the one we use to motivate the unbounded-compute limit — is a physical system competing for the same resources as the world it models. Bounded-information, bounded compute is not one option of four; it is the only combination that obtains. The other three are interesting idealisations — <em>projections</em> of bounded agents in which we let things grow to infinity. They are not realisable, and moreover it is not clear to me that we ever get close to any of them that they are even a good approximation.</p>
<p>The bias in the <a href="../notebook/agency_embedded.html">embedded agency</a> and broader <a href="../notebook/agent_foundations.html">agent foundations</a> literature is what I like to call a <em>Cantor trap</em>: treating an unrealisable combination of compute or data as a place where one can stand and reason, and then “approximating down” from it. The trap looks like progress because Cantorian objects — countably-infinite hypothesis classes, ω-limits, transfinite hierarchies of agents — are mathematically clean and aesthetically seductive (Hilbert’s paradise from which no one shall expel us!). In practice the infinite limit seems to be a vanishing point. The diagonalisation puzzles flagged in bounded inductive rationality — Löb, 5-and-10, spurious counterfactuals — are symptoms of the same trap: what happens when one tries to make an agent’s reasoning span its own infinite compute. It is worth being aware of the dangers of this trap. Infinities are cool, ngl, but we need to know how informative they are about finite agents before we use ‘em.</p>
<p>A particular annoyance: my <a href="../notebook/agency_embedded.html">embedded agency</a> notebook was my attempt to understand careful, technically polished work on reflective stability, logical counterfactuals over the agent’s own actions, and value-stability under self-modification — exactly the problems the Cantor trap generates. From the bounded agents perspective, the same questions look different: some dissolve, others survive but in milder versions, about <em>capacity</em> and <em>prices on uncertainty</em> rather than impossible self-knowledge. AFAICT a tradition with this much technical care has produced surprisingly little to help us reason about agents that are “like us” in this important way.</p>
<p><span class="citation" data-cites="Sole2024Fundamental">Solé et al. (2024)</span> line up adjacent constraints from the biology side — what living systems can and cannot be, given their thermodynamic and informational budgets. Useful as a sanity check that the substrate principle shows up empirically in the systems we already call agents.</p>
<p>Future-me, have you read all these papers yet? One tempting next step is a <em>specific</em> lower bound on a model’s complexity in terms of the agent’s thermodynamic budget. Is that done?</p>
</section>
<section id="where-next" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="where-next"><span class="header-section-number">4</span> Where next</h2>
<p>Chatbot suggests:</p>
<ol type="1">
<li>Read <span class="citation" data-cites="Lewandowski2025World">Lewandowski et al. (2025)</span> and <span class="citation" data-cites="Baltieri2025Bayesian">Baltieri et al. (2025)</span> carefully and write the diff. Both are about embedded agents containing models; one is information-theoretic and asymptotic, the other categorical and structural. There may be a tidy correspondence.</li>
<li>Pick one toy problem — a satisficing LQR, or a tree-search agent with anytime stopping — and run the resource-rational, bounded-optimal, and KL-constrained derivations side-by-side. Verify that they tell the same story, or notice where they diverge.</li>
<li>Promote the substrate principle (and the Cantor trap with it) to a standalone post; the ingredients above are enough for one.</li>
<li>Sketch what a “good regulator theorem under a thermodynamic budget” would look like, even at one page. Surely this must be done? I have not read All the Things yet.</li>
</ol>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Credit
</div>
</div>
<div class="callout-body-container callout-body">
<p>This notebook didn’t come from nowhere; I have been writing this to process ideas that I have been discussing with my colleagues. I am especially indebted to Martin Biehl, <a href="https://artemyk.github.io?ref=danmackinlay.name">Artemy Kolchinsky</a>, <a href="https://aclevername.substack.com?ref=danmackinlay.name">Chris Pang</a>, <a href="https://boundedlyrational.substack.com?ref=danmackinlay.name">Jan Kulveit</a> and <a href="https://www.tomeveritt.se?ref=danmackinlay.name">Tom Everitt</a>.</p>
</div>
</div>
</section>
<section id="incoming" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="incoming"><span class="header-section-number">5</span> Incoming</h2>
<ul>
<li>Tishby &amp; Polani’s information theory of the perception–action cycle <span class="citation" data-cites="Tishby2011Information">(Tishby and Polani 2011)</span> — close to Ortega-Braun, but starts from the cycle.</li>
<li>Ho et al.&nbsp;on simplified mental representations for planning <span class="citation" data-cites="Ho2022People">(Ho et al. 2022)</span> — empirical evidence that humans plan with a deliberately impoverished model.</li>
<li>Gigerenzer &amp; Goldstein on fast-and-frugal heuristics <span class="citation" data-cites="Gigerenzer1996Reasoning">(Gigerenzer and Goldstein 1996)</span> — anchor for the descriptive bounded-rationality literature based on humans.</li>
</ul>
</section>
<section id="references" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="references"><span class="header-section-number">6</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Baltieri2025Bayesian" class="csl-entry">
Baltieri, Biehl, Capucci, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.00511">A Bayesian Interpretation of the Internal Model Principle</a>.”</span>
</div>
<div id="ref-Biehl2023Interpreting" class="csl-entry">
Biehl, and Virgo. 2023. <span>“<a href="https://doi.org/10.1007/978-3-031-28719-0_2">Interpreting Systems as Solving POMDPs: A Step Towards a Formal Understanding of Agency</a>.”</span> In.
</div>
<div id="ref-Camara2021Computationally" class="csl-entry">
Camara. 2021. <span>“Computationally Tractable Choice.”</span>
</div>
<div id="ref-Conant1970Every" class="csl-entry">
Conant, and Ashby. 1970. <span>“<a href="https://doi.org/10.1080/00207727008920220">Every Good Regulator of a System Must Be a Model of That System</a>.”</span> <em>International Journal of Systems Science</em>.
</div>
<div id="ref-Francis1976Internal" class="csl-entry">
Francis, and Wonham. 1976. <span>“<a href="https://doi.org/10.1016/0005-1098(76)90006-6">The Internal Model Principle of Control Theory</a>.”</span> <em>Automatica</em>.
</div>
<div id="ref-Gershman2015Computational" class="csl-entry">
Gershman, Horvitz, and Tenenbaum. 2015. <span>“<a href="https://doi.org/10.1126/science.aac6076">Computational Rationality: A Converging Paradigm for Intelligence in Brains, Minds, and Machines</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Gigerenzer1996Reasoning" class="csl-entry">
Gigerenzer, and Goldstein. 1996. <span>“<a href="https://doi.org/10.1037/0033-295X.103.4.650">Reasoning the Fast and Frugal Way: Models of Bounded Rationality</a>.”</span> <em>Psychological Review</em>.
</div>
<div id="ref-Hafner2022Action" class="csl-entry">
Hafner, Ortega, Ba, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2009.01791">Action and Perception as Divergence Minimization</a>.”</span>
</div>
<div id="ref-Hay2012Selecting" class="csl-entry">
Hay, Russell, Tolpin, et al. 2012. <span>“<a href="https://doi.org/10.48550/arXiv.1408.2048">Selecting Computations: Theory and Applications</a>.”</span> In <em>Proceedings of the Twenty-Eighth Conference on Uncertainty in Artificial Intelligence</em>.
</div>
<div id="ref-Ho2022People" class="csl-entry">
Ho, Abel, Correa, et al. 2022. <span>“<a href="https://doi.org/10.1038/s41586-022-04743-9">People Construct Simplified Mental Representations to Plan</a>.”</span> <em>Nature</em>.
</div>
<div id="ref-Huang2018Internal" class="csl-entry">
Huang, Isidori, Marconi, et al. 2018. <span>“<a href="https://doi.org/10.1109/CDC.2018.8619624">Internal Models in Control, Biology and Neuroscience</a>.”</span> In <em>2018 IEEE Conference on Decision and Control (CDC)</em>.
</div>
<div id="ref-Lewandowski2025World" class="csl-entry">
Lewandowski, Ramesh, Meyer, et al. 2025. <span>“<a href="https://openreview.net/forum?id=gJclyLFSdU">The World Is Bigger: A Computationally-Embedded Perspective on the Big World Hypothesis</a>.”</span> In.
</div>
<div id="ref-Lieder2020Resourcerational" class="csl-entry">
Lieder, and Griffiths. 2020. <span>“<a href="https://doi.org/10.1017/S0140525X1900061X">Resource-Rational Analysis: Understanding Human Cognition as the Optimal Use of Limited Computational Resources</a>.”</span> <em>Behavioral and Brain Sciences</em>.
</div>
<div id="ref-Oesterheld2023Theory" class="csl-entry">
Oesterheld, Demski, and Conitzer. 2023. <span>“<a href="https://doi.org/10.4204/EPTCS.379.33">A Theory of Bounded Inductive Rationality</a>.”</span> <em>Electronic Proceedings in Theoretical Computer Science</em>.
</div>
<div id="ref-Ortega2011Information" class="csl-entry">
Ortega, Pedro Alejandro, and Braun. 2011. <span>“<a href="https://doi.org/10.1007/978-3-642-22887-2_28">Information, Utility and Bounded Rationality</a>.”</span> In <em>Proceedings of the 4th International Conference on Artificial General Intelligence</em>. AGI’11.
</div>
<div id="ref-Ortega2013Thermodynamics" class="csl-entry">
Ortega, Pedro A., and Braun. 2013. <span>“<a href="https://doi.org/10.1098/rspa.2012.0683">Thermodynamics as a Theory of Decision-Making with Information-Processing Costs</a>.”</span> <em>Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences</em>.
</div>
<div id="ref-Russell1995Provably" class="csl-entry">
Russell, S. J., and Subramanian. 1995. <span>“<a href="https://doi.org/10.1613/jair.133">Provably Bounded-Optimal Agents</a>.”</span> <em>Journal of Artificial Intelligence Research</em>.
</div>
<div id="ref-Russell1991Principles" class="csl-entry">
Russell, Stuart, and Wefald. 1991. <span>“<a href="https://doi.org/10.1016/0004-3702(91)90015-C">Principles of Metareasoning</a>.”</span> <em>Artificial Intelligence</em>.
</div>
<div id="ref-Sole2024Fundamental" class="csl-entry">
Solé, Kempes, Corominas-Murtra, et al. 2024. <span>“<a href="https://doi.org/10.1098/rsfs.2024.0010">Fundamental Constraints to the Logic of Living Systems</a>.”</span> <em>Interface Focus</em>.
</div>
<div id="ref-Tishby2011Information" class="csl-entry">
Tishby, and Polani. 2011. <span>“Information Theory of Decisions and Actions.”</span> In <em>PERCEPTION-ACTION CYCLE</em>.
</div>
<div id="ref-Wolpert2019Stochastic" class="csl-entry">
Wolpert, David H. 2019. <span>“<a href="https://doi.org/10.1088/1751-8121/ab0850">Stochastic Thermodynamics of Computation</a>.”</span>
</div>
<div id="ref-Wolpert2026What" class="csl-entry">
Wolpert, David H, and Korbel. 2026. <span>“<a href="https://doi.org/10.1088/2632-072X/ae3af8">What Does It Mean for a System to Compute?</a>”</span> <em>Journal of Physics: Complexity</em>.
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Conant &amp; Ashby <span class="citation" data-cites="Conant1970Every">(Conant and Ashby 1970)</span> is the original cybernetics flavour; Francis &amp; Wonham <span class="citation" data-cites="Francis1976Internal">(Francis and Wonham 1976)</span> gives the control-theoretic version; Huang et al. <span class="citation" data-cites="Huang2018Internal">(Huang et al. 2018)</span> is a recent tutorial; Baltieri, Biehl, Capucci &amp; Virgo <span class="citation" data-cites="Baltieri2025Bayesian">(Baltieri et al. 2025)</span> is a Bayesian / categorical reformulation with fewer assumptions. Longer notes in <a href="../notebook/internal_models.html">internal model principles</a>.↩︎</p></li>
<li id="fn2"><p>Briefly summarised in <a href="../notebook/ai_economics_of_cognition.html">the economics of cognition notebook</a> under “rational metareasoning”. The <span class="citation" data-cites="Hay2012Selecting">Hay et al. (2012)</span> meta-MDP is the operationalisation.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>AI safety</category>
  <category>bounded compute</category>
  <category>compsci</category>
  <category>economics</category>
  <category>extended self</category>
  <category>machine learning</category>
  <category>mind</category>
  <category>statmech</category>
  <category>when to compute</category>
  <guid>https://danmackinlay.name/notebook/agency_bounded_compute.html</guid>
  <pubDate>Wed, 29 Apr 2026 10:15:24 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/giant_factotum_RP-P-1985-65.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>So you’ve joined a union</title>
  <link>https://danmackinlay.name/post/so_youve_joined_a_union.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>tl;dr</strong> Australian unions are flawed — affiliated to the political parties, biased toward incumbents, institutionally tired. IMO they are still worth joining, and being a workplace delegate is high-leverage: it opens up points of intervention that are hard to come by otherwise (inside gossip, colleague ties, negotiating room, a widened range of sayable things at work). Simply having a second centre of power in an organisation can be valuable, for the workers for sure, but even for the organisation itself. These notes come from my tour as a delegate with the CSIRO Staff Association at Data61, but draw from the experiences of my colleagues and comrades in the CPSU more broadly.</p>
</div>
</div>
</div>
<div id="fig-opstand" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-opstand-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/opstand_RP-P-OB-78.391.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/opstand_RP-P-OB-78.391.avif" id="fig-opstand" class="full figure illustration img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-opstand-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Context on me: I was a workplace delegate for the CSIRO Staff Association — which is a section of the <a href="https://www.cpsu.org.au/?ref=danmackinlay.name">CPSU</a>, the public-service mega-union — at <a href="https://www.data61.csiro.au/?ref=danmackinlay.name">Data61</a>, CSIRO’s digital research division, during a stretch when Data61 was being systematically under-resourced. My field of view is therefore specific. This is a guide to being a member or delegate in a professional-staff union in Australia, not a guide to unionism in the abstract. People should write guides for meatpacking or wharves, and for other professional unions too. And they have. But this one is mine.</p>
<section id="the-australian-context" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="the-australian-context"><span class="header-section-number">1</span> The Australian context</h2>
<p>Union density in Australia is about <a href="https://www.abs.gov.au/statistics/labour/earnings-and-working-conditions/trade-union-membership/latest-release?ref=danmackinlay.name">13.1% of employees as of August 2024</a> — up from 12.5% in 2022, the first recorded increase since 2011. Over the longer term the trend is down: in 1992, density was 40%. That is to say, the movement has been dying for three decades, and recently it, uh, stopped dying. Something interesting is happening at the margin, driven mostly by young workers, but from a low base.</p>
<p>Inside those averages, professionals are overrepresented (around 20% density) and education-and-training workers more so (27%). So if you are a white-collar knowledge worker reading this, you are not colonising a strange industry — there are plenty of us already.</p>
<p>The Australian union system is unusual in a few ways.</p>
<p><em>Enterprise bargaining</em> is the central mechanism for negotiating conditions. Pay and conditions for most workplaces are set by an <em>enterprise agreement</em> negotiated between the employer and a bargaining representative — usually the union — at the level of the single workplace or company. Since the <a href="https://www.legislation.gov.au/C2009A00028/latest/text?ref=danmackinlay.name">Fair Work Act 2009</a>, this is how a modern Australian pay rise gets made. Our union’s main job, most of the time, is to negotiate this instrument.</p>
<p><em>Protected industrial action</em> is only legal during bargaining for a new agreement, and only after a secret ballot via the <a href="https://www.fwc.gov.au/?ref=danmackinlay.name">Fair Work Commission</a>, and only with three working days’ notice (for most workplaces). Striking in sympathy with another workplace is not protected, which is to say, it is effectively illegal. So, don’t be bringing to mind militant historical or european unionism when you think about the modern Australian version.<sup>1</sup></p>
<p><em>Most big unions affiliate to the ALP.</em> “Affiliate” means something specific: the union’s President and Secretary sign a pledge to the Labor platform, pay a per-member affiliation fee, and the union’s members are thereby entitled to 50% of delegate positions at Labor state and national conferences. The <a href="https://www.actu.org.au/?ref=danmackinlay.name">ACTU</a> itself does not affiliate — it is a peak body — but most of its largest member unions do. In practice, this means some fraction of our dues is helping to elect a particular political party, and that the union’s political stances will be calibrated against not upsetting Labor. We can think this is fine or not fine. IMO it is a narrow kind of politics — not obviously better or worse than the available alternatives, but I am personally not a fan.</p>
</section>
<section id="the-flaws" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="the-flaws"><span class="header-section-number">2</span> The flaws</h2>
<section id="incumbency-bias" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="incumbency-bias"><span class="header-section-number">2.1</span> Incumbency bias</h3>
<p>This one is obvious when you think about it. Unions are disproportionately composed of, and run by, indefinite-tenure staff. The consequences cascade.</p>
<p>In enterprise bargaining, the people who turn up to the member meetings, write submissions, and stress-test the employer’s offer are overwhelmingly indefinite staff. They know how it works because they have been through a round before. The fixed-term, casual, and labour-hire workforce — which in research is often the majority — frequently doesn’t know bargaining is happening, or doesn’t know they can participate, or rationally does not invest in a process whose outputs they may not be around to enjoy. So the agreement gets tuned for the people in the room.</p>
<p>A large fraction of delegate time goes into redundancy negotiation. That is not a criticism of delegates — redundancies are harrowing and someone has to fight them — it is a description of where the effort flows. It also reveals the shape of the service: a union that spends most of its crisis capacity defending tenured jobs is, implicitly, a service for people who have tenured jobs to defend.</p>
<p>For young workers, on a fixed-term contract, or otherwise outside the incumbent class, we feel this as a kind of quiet irrelevance by default. The union is still worth joining. Just go in expecting to push.</p>
</section>
<section id="operational-conservatism" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="operational-conservatism"><span class="header-section-number">2.2</span> Operational conservatism</h3>
<p>Unions per default do not take the operational needs of the employer seriously, or at least make ambit claims that imply they don’t. There is no sense in negotiating a gold-plated employment contract that causes the entire organisation to tank. This is not what they are for, I suppose, but the consequences show up in the agreement. In bargaining I have watched clauses land which would, I could see, make some internal workflow I care about more cumbersome. The classic example is that by making it hard to sack people and hard to hire people on short-term contracts, the union starves the organisation of the ability to experiment with short-term contracts for new skills and capabilities.</p>
<p>A related failure: unions rarely favour creative or radical approaches. “We got this last round, let’s get a bit more of it this round” is the default. Arguments for novel structures — more flexible project-based teams, different modes of career progression, profit-sharing arrangements for commercialisable work — tend to fall outside the union’s Overton window. Part of this is presumably institutional memory (those structures have been used as thin ends of anti-worker wedges before). Part of it is organisational inertia.</p>
<p>For the kind of person who likes working on hard interesting problems inside a functional organisation, the union’s default policy stance can feel like being in a 1950s time tunnel, aimed at a very different, less dynamic world of work. Again, this is not what the union is for, but it is a consequence of the institutional setup.</p>
</section>
<section id="the-professional-organiser-problem" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="the-professional-organiser-problem"><span class="header-section-number">2.3</span> The professional-organiser problem</h3>
<p>Big unions employ professional organisers and officials. These are often good, dedicated people. They are also incumbents in their own sense — they have career paths, personal influence, factional alliances, and a durable stake in the union’s continuing to be run the way it has been run. In the worst cases this produces performative, communications-hoarding, process-heavy unionism that does not scale with the membership’s engagement.</p>
<p>The tell I watch for is the communications architecture. If the union does not host a chat channel where members can talk to <em>each other</em> — if all communication is union-to-member broadcast from the officials, with no lateral member-to-member channel — then that is a union whose professionals are more comfortable talking <em>to</em> members than enabling members to talk to one another. We can draw our own conclusions about why. My guess: an engaged, talkative membership is harder to steer.</p>
<p>I don’t think this is malice. I think it’s an equilibrium that is comfortable for professional staff who are only shallowly engaged with any given workplace’s problems, and that persists because nobody with the power to change it has much incentive to.</p>
</section>
<section id="the-enervating-fair-work-settlement" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="the-enervating-fair-work-settlement"><span class="header-section-number">2.4</span> The enervating Fair Work settlement</h3>
<p>The Fair Work Act gives Australian workers a floor of rights (minimum wages, leave, unfair dismissal protection, an enterprise-level bargaining mechanism) that is better than nothing. It also gives Australian unions a narrow, procedural, Commission-mediated menu of things they can do. Protected action is protected only within tightly drawn conditions. Pattern bargaining across an industry is largely forbidden. Sympathy strikes are forbidden. The whole apparatus assumes that industrial conflict should be rare, procedural, and bounded.</p>
<p>This produces a curiously enervated unionism. The union rarely needs to mobilise its membership at scale — the Commission is <em>right there</em>, the processes are what they are, and the union’s comparative advantage is procedural expertise rather than mass pressure. Compared to what one reads of unionism in, say, the US or continental Europe, the Australian version can feel strangely administrative. I find this both a relief (nobody is getting arrested) and a limitation (nobody is winning very much, either).</p>
</section>
</section>
<section id="why-its-worth-it-anyway" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="why-its-worth-it-anyway"><span class="header-section-number">3</span> Why it’s worth it anyway</h2>
<p>Given all the above, why did I sign up as a delegate, and why would I do it again? Because the leverage is huge. Being a delegate got me:</p>
<p><em>Inside gossip.</em> The delegates’ meetings are where one learns what management is telling the union, which is often a truer signal than what management is telling staff. One sees drafts of redundancy proposals before they become announcements. One hears which divisions are being quietly wound down. Going the other way, the delegate carries back useful information about the workforce that the management chain on its own would not have heard.</p>
<p>The more underrated form of this, IMO, is <em>lateral</em> gossip — what peers know about each other that a hierarchical organisation aggressively filters out. Our formal view of colleagues in other teams is mediated almost entirely by those teams’ managers, who have career incentives to present their units as competent, well-run, and indispensable. The union is one of the few structures in a big organisation where frontline staff from different teams compare notes, and discover: which empire-building manager is winning headcount they don’t have work for, which team is quietly drowning, which senior technical lead is the bottleneck nobody can work around, which department’s nominal stars are coasting, which quiet group does the good work that never shows up in the monthly report. This stuff matters for a lot of mid-career decisions — internal transfers, whether a cross-team dependency is safe to rely on, which up-chain promises are worth trusting — and in an excessively hierarchical organisation almost none of it is available through any other channel. People seriously underestimate how much of their picture of their workplace has been composed for them by interested parties. The union cuts across that.</p>
<p><em>Strong relationships with colleagues across silos.</em> Research organisations partition into teams that rarely talk to each other, and that compete for resources. The union is one of very few structures where a data scientist talks to a comms officer talks to a facilities manager as peers with a shared interest. This defangs a lot of internal resource competition simply by putting faces on the “other” side of it. The employer benefits from this too, even if they rarely notice: a less siloed workforce wastes less energy on internal turf wars.</p>
<p><em>Esprit de corps.</em> Not nothing. Knowing that one has a dozen colleagues whose numbers are in one’s phone, and who will pick up, is a psychic resource in a way that is hard to describe until one has had it.</p>
<p><em>A widened range of sayable things at work.</em> Delegates, by convention and by the adverse-action provisions of the Fair Work Act, have more protection for speaking publicly about workplace issues than ordinary staff do.<sup>2</sup> We can say things a rank-and-file employee would be nervous to say, because we are saying them in our delegate capacity. This is not absolute — we can still be sacked for many things — but it widens the range of sayable things considerably. I used this a lot.</p>
<p><em>A direct line to powerful people when it mattered.</em> At bargaining time, at redundancy time, at restructure time, delegates are in the room with the CEO, or the DG, or their direct deputies. One gets to negotiate with the people actually making the decisions. For a mid-career professional this is an unusual amount of face time with senior leadership, and the skills one builds — reading the room, finding the pressure points, knowing when to escalate — are portable.</p>
<p><em>Friends.</em> I left the delegate role with more friends at CSIRO than I had before I took it. I don’t know a better return on my time.</p>
</section>
<section id="a-second-centre-of-power" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="a-second-centre-of-power"><span class="header-section-number">4</span> A second centre of power</h2>
<p>Most of the above is about what the delegate gets. The less obvious side is what the <em>employer</em> gets from having a functioning union on the premises. IMO a sensible leadership team treats the union as a cheap source of information and a cheap source of accountability that would otherwise be unavailable to it — which is the core of what having a second centre of power inside an organisation buys you.</p>
<p><em>A back-channel past toxic managers.</em> Every formal complaints mechanism I have encountered routes upward through the chain of command. Which fails at exactly the case that matters most: when the problem <em>is</em> the chain of command. A staff member being ground down by their manager has almost nowhere to go internally — the next rung up is the bully’s mate, or their delegate of authority, or someone institutionally invested in not seeing the bully as a problem. The union is a parallel chain that does not route through the bully. A well-run HR function treats this as a useful signal, because it surfaces problems the formal channel would have swallowed. A badly run one resents it. The ones that resent it tend, in my experience, to be the ones whose formal channel is broken in ways they would rather not admit.</p>
<p><em>Risk identification.</em> Frontline staff know things that never make it onto a dashboard: safety hazards, project-failure signals, mis-scoped deliverables, customer-abuse patterns, strategies that will not survive contact with reality. A lot of this information is uncomfortable, which is precisely why it gets filtered out as it moves upward through layers of people whose performance reviews depend on appearing to have things in hand. The union is one channel by which those signals can bypass the incentive structures that suppress bad news going up the chain. Same logic as whistleblower protection, operating at lower stakes, more often, on smaller problems — which means the organisation finds out about them while they are still small.</p>
<p><em>A commitment device.</em> An enterprise agreement, together with an organised workforce that will notice breaches of it, is a way for senior leadership to credibly commit to things. Promises management would like to make but cannot otherwise guarantee — about workload, about career paths, about fair treatment of a category of worker — become more durable when backed by a bargaining process. In principle, the employer gets a more motivated, lower-turnover workforce in exchange for being bound to its own stated intentions.</p>
<p>None of this is free. The union is also, sometimes, the thing that negotiates an inflexible clause into our enterprise agreement that makes something we want to do hard. But on balance — for an organisation that can tolerate being told uncomfortable things by people it cannot easily fire — a functioning union looks closer to an internal audit function than to a hostile external force.</p>
<p>This is not to pretend away structural conflict. Interests do diverge sometimes — about wages, about job security, and above all, who carries the risk when things fail. Conflict, when it arrives, is an important mechanism: the bargaining apparatus is built around exactly those divergences. But most decisions, at least in my workplaces, most of the time, do not need to be zero-sum wars. Some zero-sum fights I was involved in were made to be zero-sum to keep people busy, and those could have been turned into collaborative problem solving. When a bad manager stokes conflict to distract attention from their own failings, this is a power play, not an inevitable state of affairs.</p>
<p>Neither “side” is a monolith. “Workers” and “employers” are each coalitions — junior and senior staff, contractors and indefinite, technical and administrative; shareholders, executives, line managers, finance, operations — with partially overlapping and partially competing interests. Some worker factions are at odds with other worker factions more than with any employer faction. Cross-line alliances — this technical team and the CTO, this cohort of staff and the CFO’s cost-containment agenda — are common and often stable. The two-team framing is convenient shorthand, not an accurate map.</p>
<p>Leaning on the adversarial frame as the default identity of unionism — worker-vs-boss as our core brand — is great for recruiting — people love a fight with the Other. But it has costs: it alienates the moderates on both sides, and leaves win-wins on the table that would otherwise have been obvious. It is important, but it is not the only game.</p>
<p>Most executive teams <em>don’t</em> want union pushback. IMO they should want all the union engagement they can get. A second centre of power inside a dysfunctional organization can be one of the few ways management gets the information and accountability needed to stop making predictable, avoidable mistakes — which is a case of the <a href="../notebook/institutional_alignment.html">institutional alignment</a> problem. The union, or at least many unions I have been involved with, can be a flawed instance of that second centre: too procedural, too political, too disengaged, for all the reasons I listed above. But those flaws are not, mostly, irreducible features of unionism. They are habits that unions can fall into, and which we can change by joining the damn union and making it work better.</p>
<p>Members are within their rights to ask that unions be better. Hell, managers are within their rights to want that too. But the union is us. If we want a second centre of power in our organisation that is not captured, not incumbency-biased, and not hoarding communications, the mechanism by which it comes to exist is: we join, and we show up, we pay 0.7% of our salary, we invest our time and sweat equity in making everything else better. The price of admission is unusually low.</p>
</section>
<section id="advice-i-wish-i-had-on-day-one" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="advice-i-wish-i-had-on-day-one"><span class="header-section-number">5</span> Advice I wish I had on day one</h2>
<p>A few things I had to work out the hard way.</p>
<p><em>Turn up.</em> A startling fraction of the influence in the delegate body accrues simply to the people who turn up to every meeting. This is unglamorous and correct. Showing up is 80% of the job. If there are literally too many meetings to attend, ramp it back. If the union insists on stupid held-over structures (e.g.&nbsp;place-based organising for an online organisation with distributed teams, looking at you CSIRO Staff Association) we could make it a project to try to modernise.</p>
<p><em>Ask for the bargaining log of claims early.</em> Every round of enterprise bargaining starts with a list of things the union is asking for. If you are not on the bargaining committee you may not see it until it is near-final. Ask for it. If there are claims we care about, we have to fight for them early in the process, not at the end.</p>
<p><em>Cultivate union communications the union staff cannot control.</em> Ideally you want to trust your organiser (for the record, I have always trusted my organiser’s intent and competence). But baking too much control into the union staff’s roles sets up bad incentives for them to hoard power just like the bosses. If the union doesn’t run a members’ chat, start a group chat among the delegates you trust. If the union’s email list is one-way, the ground truth of what members want must reach decision-makers through some other channel.</p>
<p><em>Learn the instrument.</em> So easy these days that there is no excuse. Load the current enterprise agreement into an LLM. The last one too. Also, Part 2-4 of the Fair Work Act. Ask questions. Read specific passages. Learn the stupid terms of art. We become much more useful to our colleagues the moment we can answer basic questions about the instrument instead of referring them upward.</p>
<p><em>Practise <a href="../notebook/how_to_communicate.html">communication skills</a>.</em> Delegate work is the best-calibrated training environment I have found for the workplace-communication skills that white-collar work otherwise hides from us until we are mid-career and already expected to have them: writing a clear update for members, chairing a meeting where people disagree and we need a decision at the end of it, negotiating with a senior executive who has lawyers (we don’t), delivering hard news to a colleague, pushing back on a bad idea without burning the relationship. The stakes are high enough that sloppiness has consequences, and low enough that we get to try again next meeting. Take the opportunity.</p>
<p><em>Do not let this become your whole life, or even your whole job.</em> Union work is high-leverage precisely because the baseline engagement of everybody else is so low. Which means there is infinite demand for your time. Decide in advance what fraction of your working week you will spend on it, and stick to it. Extension projects are good, but don’t pick too many.</p>
<p><em>Recruit more delegates.</em> The more delegates we have, the more influence we have, and the less work each delegate has to do. Don’t solve everything yourself; solve one thing and use that as a recruiting pitch for the next delegate. Showing people they can make life better is hugely encouraging.</p>
<p><em>You get so much love for doing this.</em> People, mostly, value and appreciate the work of delegates. I got given so much respect from my colleagues when I’d shown up for a tough time, but they would make sure the line manager was not around. Then the line manager would also thank me, when their direct reports were not around. Double thanks!</p>
</section>
<section id="if-we-were-starting-from-scratch" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="if-we-were-starting-from-scratch"><span class="header-section-number">6</span> If we were starting from scratch</h2>
<p>A sceptical reader will have noticed that almost everything in this post is a second-best argument. The union is a patch on a firm shape that has employees and shareholders on opposing sides of an ownership boundary, with managers in between. A lot of what the union does — surfacing risks, piercing silos, keeping managers accountable, sometimes even committing the enterprise to its stated intentions — is only necessary because the firm is designed the way it is.</p>
<p>Other shapes are possible. Let me get galaxy-brained for a second: Worker-owned firms, consumer cooperatives, and various flavours of co-determination redistribute the ownership boundary and fold the “second centre of power” into the first. I have <a href="../notebook/founders_workers.html">written separately</a> about how one might divide equity in a firm being built along those lines. More broadly, this sits inside the frame of <a href="../notebook/institutional_alignment.html">institutional alignment</a>: any institution we build is, in effect, a trained system whose incentives and reporting structures have to be tuned for the work we want out of it, and most organisations have simply never been tuned for the work of <a href="../notebook/collective_care.html">collectively caring for the people inside them</a>.</p>
<p>A ground-up redesign is not on the menu for most employees of most organisations. But the frame is useful for explaining <em>why</em> even a flawed union is high-leverage: unions are one of the viable ways to retrofit a power distribution into an organisation that was not designed with one. If we could start over, we might build the distribution in at the foundation. We mostly can’t, so we patch.</p>
</section>
<section id="resources" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="resources"><span class="header-section-number">7</span> Resources</h2>
<p>Background and statistics</p>
<ul>
<li><a href="https://www.abs.gov.au/statistics/labour/earnings-and-working-conditions/trade-union-membership/latest-release?ref=danmackinlay.name">ABS Trade Union Membership, August 2024</a> — primary source for density figures.</li>
<li><a href="https://www.rba.gov.au/publications/rdp/2019/2019-02/full.html?ref=danmackinlay.name">RBA RDP 2019-02: Is Declining Union Membership Contributing to Low Wages Growth?</a> — careful empirical work on the wage effects of union decline.</li>
</ul>
<p>The legal instruments</p>
<ul>
<li><a href="https://www.fairwork.gov.au/employment-conditions/agreements/bargaining-for-an-agreement?ref=danmackinlay.name">Fair Work Ombudsman: Enterprise agreements and bargaining</a></li>
<li><a href="https://www.fwc.gov.au/workplace-disputes/other-workplace-disputes/industrial-action?ref=danmackinlay.name">Fair Work Commission: Industrial action</a></li>
<li><a href="https://www.legislation.gov.au/C2009A00028/latest/text?ref=danmackinlay.name">Fair Work Act 2009 (text)</a></li>
</ul>
<p>Peak bodies and some relevant unions</p>
<ul>
<li><a href="https://www.actu.org.au/?ref=danmackinlay.name">Australian Council of Trade Unions (ACTU)</a></li>
<li><a href="https://www.cpsu.org.au/?ref=danmackinlay.name">CPSU (PSU Group)</a> — federal public sector</li>
<li><a href="https://csirostaff.org.au/?ref=danmackinlay.name">CSIRO Staff Association</a> — a section of the CPSU; my own alma mater</li>
<li><a href="https://www.nteu.org.au/?ref=danmackinlay.name">NTEU</a> — tertiary education</li>
<li><a href="https://www.professionalsaustralia.org.au/?ref=danmackinlay.name">Professionals Australia</a> — engineers, scientists, managers</li>
</ul>
</section>
<section id="things-i-am-less-sure-about" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="things-i-am-less-sure-about"><span class="header-section-number">8</span> Things I am less sure about</h2>
<p>I don’t know how much of the communications-hoarding phenomenon is specific to CPSU-style professional unions versus a general feature of mid-sized Australian unions. Anecdotes from other delegates suggest the latter; I haven’t confirmed.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p><a href="https://en.wikipedia.org/wiki/Australian_labour_movement?ref=danmackinlay.name">The history</a> is pretty cool though, esp.&nbsp;<a href="https://en.wikipedia.org/wiki/Paddy_Troy?ref=danmackinlay.name">Paddy Troy</a>↩︎</p></li>
<li id="fn2"><p>Strictly, the Fair Work Act’s general protections (Part 3-1) are what actually do the legal work; the constitutional “implied freedom of political communication” is a much narrower doctrine that rarely maps cleanly onto workplace speech. Conflating the two is sloppy but a useful shorthand for the lived experience of being a delegate.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>economics</category>
  <category>ethics</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>politics</category>
  <category>work</category>
  <guid>https://danmackinlay.name/post/so_youve_joined_a_union.html</guid>
  <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/opstand_RP-P-OB-78.391.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Returns to scale in technological society</title>
  <link>https://danmackinlay.name/notebook/returns_to_leviathan.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-wall-scaling-sm" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-wall-scaling-sm-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/wall_scaling_sm_RP-P-1909-6331.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/wall_scaling_sm_RP-P-1909-6331.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-wall-scaling-sm-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Consider the scaling laws across <a href="../notebook/urbanism.html">cities</a>, economies, <a href="../notebook/nn_scaling_laws.html">neural nets</a>… Does it follow that in a competitive selection environment, ultimately, the world converges upon one leviathan? One giant system? Is the attracting state a single, gigantic economy? In AI safety people wonder about the singleton, the ultimate mega agent. Should we think about the singleton economy, the singleton nation state?</p>
<p>Is there any leverage to being small and idiosyncratic where there is such obvious gain in being strong, powerful, and all-encompassing? Does the world converge to unipolarity? Do we grind out all the small states, the tiny coalitions, the middle powers? Or is there some kind of stable polycentricity, where there are niches for small and medium-sized entities to thrive? I would like to know.</p>
<section id="urban-scaling" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="urban-scaling"><span class="header-section-number">1</span> Urban scaling laws</h2>
<p>The urban scaling results are the empirical anchor for all of this. <span class="citation" data-cites="Bettencourt2013Origins">Bettencourt (2013)</span> provides the theoretical derivation: cities are social reactors, and the superlinear scaling emerges from the increasing number of social interactions per capita as density grows. <span class="citation" data-cites="Bettencourt2007Growth">Bettencourt et al. (2007)</span> established the empirical regularities — wealth creation and innovation scale with exponent <img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Capprox%201.2">, infrastructure with <img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Capprox%200.8">.</p>
<p>Methodological critique of the naive approach may be found in <span class="citation" data-cites="Cottineau2017Diverse">Cottineau et al. (2017)</span> — the measured exponent is sensitive to how we define city boundaries, which indicators we use, and which countries we look at. <span class="citation" data-cites="Arcaute2015Constructing">Arcaute et al. (2015)</span> show that for England and Wales, many scaling results vanish or change sign when city boundaries are defined differently. This matters: if the exponent is an artefact of the boundary definition, the whole edifice wobbles.</p>
<p>There is much more <span class="citation" data-cites="Arcaute2015Constructing Balland2020Complex Bettencourt2016Urban Cottineau2017Diverse Kuhnert2006Scaling Leishman2021Relationships PrietoCuriel2022Scaling Rybski2019Urban">(Arcaute et al. 2015; Balland et al. 2020; Bettencourt and Lobo 2016; Cottineau et al. 2017; Kühnert, Helbing, and West 2006; Leishman et al. 2021; Prieto Curiel, Cabrera-Arnau, and Bishop 2022; Rybski, Arcaute, and Batty 2019)</span></p>
</section>
<section id="economic-scaling-laws" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="economic-scaling-laws"><span class="header-section-number">2</span> Economic scaling laws</h2>
<p>The literature on returns to scale is enormous and old, but I want to slice it by the <em>unit of analysis</em>: firms, nations, cities. The scaling exponents turn out to be different in each case, and the reasons why are the interesting part.</p>
<section id="firms" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="firms"><span class="header-section-number">2.1</span> Firms</h3>
<p>Geoffrey West’s Santa Fe Institute group found that companies scale <em>sublinearly</em> — more like biological organisms than cities <span class="citation" data-cites="West2017Scale">(West 2017)</span>. Sales scale roughly linearly with employee count (exponent <img src="https://latex.codecogs.com/png.latex?%5Capprox%201">), but profitability and innovation per capita do not increase with firm size the way they do in cities. The implication is that firms, like organisms, are bounded growers: they slow down, stop growing, and die. The average lifespan of a publicly traded company is about 10 years.</p>
<p>Why? Coase proposed a reason in 1937 <span class="citation" data-cites="Coase1937Nature">(Coase 1937)</span>: firms exist because they reduce transaction costs below what the market would charge, but they expand only until the cost of organising one more internal transaction equals the cost of doing it on the market. There are “decreasing returns to the entrepreneur function” — management overhead, communication pathways (<img src="https://latex.codecogs.com/png.latex?O(n%5E2)"> in the number of interacting units), errors of coordination. Which is to say, firms hit diseconomies of scale because internal coordination is expensive.</p>
<p>This is the Coasean boundary, and it’s the reason we don’t see a single firm absorbing the whole economy — or didn’t, before at least. This might change.</p>
<p>There is a suggestive parallel with the declining labour share of income <span class="citation" data-cites="Grossman2022Elusive">(Grossman and Oberfield 2022)</span>. If capital’s share of output is rising and labour’s is falling, that is consistent with the returns accruing to the <em>infrastructure</em> side of the scaling relation (sublinear, capital-intensive) rather than the <em>social interaction</em> side (superlinear, labour-intensive). Firms might be drifting further into the organism-like regime — more capital, less interaction, lower <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> — which would make them even more bounded and mortal. Or it might mean that the Coasean boundary is shifting in ways that decouple the firm from its workforce without decoupling it from scale economies in capital. I am not sure which.</p>
</section>
<section id="nations" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="nations"><span class="header-section-number">2.2</span> Nations</h3>
<p><span class="citation" data-cites="Alesina2003Size">Alesina and Spolaore (2003)</span> model national boundaries as an equilibrium between economies of scale in public goods provision and the costs of preference heterogeneity. Bigger nations amortize the cost of armies, courts, infrastructure, and monetary systems over more taxpayers. But larger populations mean more diverse preferences, languages, cultures — harder to govern democratically, harder to produce public goods that satisfy everyone.</p>
<p>Their framework predicts that the optimal size of nations depends on the international environment. Under free trade, small nations can capture scale economies through markets rather than territory, so the equilibrium shifts toward smaller states — which is roughly what we observe since 1945, with the number of internationally recognised states roughly tripling. Under autarky, size matters more, and empires make economic sense.</p>
<p>Empirically, GDP scales sublinearly with national population — an exponent around 0.8, meaning doubling population gives less than double output <span class="citation" data-cites="PrietoCuriel2022Scaling">(Prieto Curiel, Cabrera-Arnau, and Bishop 2022)</span>. This is the opposite of the urban scaling result (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Capprox%201.15"> for socioeconomic variables in cities). Nations are not cities. The density of social interaction that drives superlinear urban scaling is diluted across a national territory.</p>
<p>Now, the stability of any polycentric equilibrium depends on the security environment. <span class="citation" data-cites="Sekeris2012Tragedy">Sekeris (2012)</span> models a common-pool resource game with violence, and finds that as the resource shrinks, conflict becomes cheap, and the cooperative equilibrium unravels. Small states can coexist under free trade and relative peace, but resource scarcity or a shift to autarky changes the payoff matrix, and the large predatory state becomes viable again. Alesina and Spolaore’s “size depends on openness” result and Sekeris’s “cooperation unravels under scarcity” result are two views of the same mechanism: polycentricity is a <em>conditional</em> equilibrium, not an attractor.</p>
</section>
<section id="some-puzzles" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="some-puzzles"><span class="header-section-number">2.3</span> Some puzzles</h3>
<p>We have three different systems with three different scaling regimes:</p>
<ul>
<li><strong>Cities</strong> scale superlinearly (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Capprox%201.15">) for socioeconomic output — innovation, wealth, crime. This is driven by the density of social interactions <span class="citation" data-cites="Bettencourt2007Growth">(Bettencourt et al. 2007)</span>.</li>
<li><strong>Firms</strong> scale roughly linearly to sublinearly. Internal coordination costs impose a ceiling. They behave more like organisms <span class="citation" data-cites="West2017Scale">(West 2017)</span>.</li>
<li><strong>Nations</strong> scale sublinearly (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Capprox%200.8">). Heterogeneity costs and governance overhead eat the returns to public goods provision <span class="citation" data-cites="Alesina2003Size PrietoCuriel2022Scaling">(Alesina and Spolaore 2003; Prieto Curiel, Cabrera-Arnau, and Bishop 2022)</span>.</li>
</ul>
<p>This gives us a hierarchy: cities are the engine of increasing returns, but both the organisational containers we put around economic activity (firms) and the political containers we put around territory (states) exhibit diminishing returns to scale. The superlinearity of cities is embedded in, and constrained by, sublinear envelopes.</p>
<p>This is a <a href="../notebook/multi_level_agency.html">multi-level agency</a> problem dressed in scaling exponents. The city, the firm, the nation — these are not just different units of analysis, they are <em>nested levels of organisation</em> with different dynamics at each level. The scaling exponent <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> is, in a sense, a summary statistic for the kind of agent a system is at a given level of coarse-graining. Organisms (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%3C%201">): bounded, mortal, efficient. Cities (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%3E%201">): open-ended, accelerating, crisis-prone. The question “at what level do we model agency?” and the question “what is the scaling exponent?” turn out to be the same question asked in different vocabularies.</p>
</section>
</section>
<section id="the-cosmic-version" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="the-cosmic-version"><span class="header-section-number">3</span> The cosmic version</h2>
<p><span class="citation" data-cites="Wong2022Asymptotic">Wong and Bartlett (2022)</span> push this question to its most cosmic limit. They take the urban scaling exponent <img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%3E%201"> from Bettencourt <em>et al.</em> <span class="citation" data-cites="Bettencourt2007Growth">(Bettencourt et al. 2007)</span> and ask what happens when the entire planetary civilisation becomes, in effect, one city — one densely networked informational superorganism connected through the dataome.<sup>1</sup> The growth equation</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cfrac%7BdN(t)%7D%7Bdt%7D%20=%20%5Cleft(%5Cfrac%7BY_0%7D%7BE%7D%5Cright)%20N(t)%5E%5Cbeta%20-%20%5Cleft(%5Cfrac%7BR%7D%7BE%7D%5Cright)%20N(t)%0A"></p>
<p>predicts singularities — moments when population and energy demand tend to infinity in finite time — which must be averted by innovations that reset the system’s trajectory. But the interval between resets, <img src="https://latex.codecogs.com/png.latex?t_%7B%5Ctext%7Bcycle%7D%7D">, shrinks as the population grows. Eventually <img src="https://latex.codecogs.com/png.latex?t_%7B%5Ctext%7Bcycle%7D%7D"> drops below the timescale on which innovation can actually occur (<img src="https://latex.codecogs.com/png.latex?t_%7B%5Ctext%7Binnovate%7D%7D">), and the system faces what they call <em>asymptotic burnout</em>: collapse driven by the superlinear dynamics that previously drove growth.</p>
<p>Their proposed resolution is <em>homeostatic awakening</em> — the civilization consciously reorienting away from unbounded growth toward persistence and well-being. Which is to say, the civilization invents a new objective function. This is presented as a resolution to the Fermi paradox: either civilizations burn out (short-lived), or they pivot to homeostasis and become quiet (long-lived but difficult to detect). Either way, no galaxy-spanning Type III civilizations.</p>
<p>There is an older version of this argument, without the scaling-law formalism. <span class="citation" data-cites="Tainter2003Resource">Tainter et al. (2003)</span> (and Tainter’s earlier <em>Collapse of Complex Societies</em>) propose that complex societies face diminishing marginal returns to <em>complexity itself</em>: each additional layer of coordination, bureaucracy, or infrastructure costs more and delivers less, until the society can no longer sustain its own overhead and simplifies — voluntarily or otherwise. Wong and Bartlett’s burnout is the superlinear-dynamics version of Tainter’s complexity trap: the system does not merely stagnate (as in Tainter) but actively accelerates into crisis. Both end in simplification; the mechanism differs.</p>
<p>I find this idea interesting as a <em>question organizer</em> even if the quantitative model is schematic. The key variable is <img src="https://latex.codecogs.com/png.latex?%5Cbeta">: whether the scaling exponent for a given system sits above or below 1 determines whether it exhibits increasing returns (and eventual crisis) or diminishing returns (and eventual stagnation). And the value of <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> is not the same for all systems.</p>
</section>
<section id="ai-coase" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="ai-coase"><span class="header-section-number">4</span> AI and the Coasean boundary</h2>
<div id="fig-hungry-leviathan" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-hungry-leviathan-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/hungry_leviathan_RP-P-BI-128.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="Figure&nbsp;2: "><img src="https://danmackinlay.name/images/hungry_leviathan_RP-P-BI-128.avif" id="fig-hungry-leviathan" class="figure illustration right img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-hungry-leviathan-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2
</figcaption>
</figure>
</div>
<p>If the Coasean boundary of the firm is set by the cost of internal coordination relative to market transaction costs, and if AI agents radically reduce <em>both</em>, what happens to the equilibrium firm size?</p>
<p>There are at least two competing effects. <span class="citation" data-cites="Korinek2025Concentrating">Korinek and Vipra (2025)</span> argue that AI itself exhibits enormous economies of scale — training frontier models requires billions of dollars in compute, and the resulting capabilities can be deployed at near-zero marginal cost. This pushes toward concentration: a few firms with the best models capture most of the value.</p>
<p>But there is a countervailing force. If AI agents can handle complex contracting, negotiation, and monitoring at scale — <a href="../notebook/delegated_agent_governance.html">Coasean bargaining at scale</a>, as it were — then transaction costs on the <em>market</em> side also collapse. The “Headless Firm” model <span class="citation" data-cites="Harre2025Coasean">(Harré and Ormerod 2025)</span> proposes that agentic AI changes how coordination costs scale: from <img src="https://latex.codecogs.com/png.latex?O(n%5E2)"> in human-managed organisations to <img src="https://latex.codecogs.com/png.latex?O(n)"> in protocol-mediated agent systems. If so, we might see a simultaneous <em>expansion</em> of what large organisations can coordinate and <em>shrinkage</em> of what needs to be inside an organisation at all.<sup>2</sup> Which effect dominates?</p>
<p><span class="citation" data-cites="Wolpert2025Computational">Wolpert and Harper (2025)</span> model societies as computers, where the computational power available depends on how agents are organised. If AI lets us reorganise the <em>topology</em> of economic interaction — not just doing the same coordination faster, but enabling coordination structures that were previously impossible — then the scaling exponent itself might change. We might move the boundary between the firm-like regime (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%5Cleq%201">) and the city-like regime (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%3E%201">).</p>
<p>I don’t know which effect wins. Possibly both at once, in different domains. But the stakes are those of <span class="citation" data-cites="Wong2022Asymptotic">Wong and Bartlett (2022)</span>: if we push <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> high enough, we push <img src="https://latex.codecogs.com/png.latex?t_%7B%5Ctext%7Bcycle%7D%7D"> down, and we accelerate the approach toward burnout — or toward the moment we have to decide whether homeostatic awakening is something we can actually do.</p>
</section>
<section id="leviathan" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="leviathan"><span class="header-section-number">5</span> Where does this leave the Singleton?</h2>
<p>The scaling laws give us a tentative answer to the opening question. The world probably does <em>not</em> converge on one system, because the scaling exponents differ across levels of organisation. Cities generate superlinear returns, but the containers that govern cities — firms and states — face diminishing returns to scale. The Leviathan is bounded.</p>
<p>But that conclusion rests on current coordination technology. If AI changes the exponents — if it makes large-scale coordination cheap enough that firms or states start exhibiting city-like superlinear scaling — then the attractor shifts. The singleton becomes more plausible, or at least the threshold for “too big” moves upward.</p>
<p>There is a flavour of <a href="../notebook/technological_determinism.html">technological determinism</a> to excavate here — the idea that coordination technology <em>determines</em> the viable scale of organisation, and therefore the shape of political and economic life. If the printing press enabled the nation state, and if the internet enabled global supply chains and platform monopolies, then AI-mediated coordination might enable — or force? — another jump in the viable scale of collective action. The scaling exponents are not constants of nature; they are artefacts of the coordination technology available. Change the technology, change <img src="https://latex.codecogs.com/png.latex?%5Cbeta">, change the equilibrium size of everything.</p>
<p>This is not quite hard technological determinism — we are not claiming the technology <em>uniquely</em> determines outcomes. <span class="citation" data-cites="Alesina2003Size">Alesina and Spolaore (2003)</span> already argues that the equilibrium depends on the international security environment, trade openness, and democratic norms, not just coordination costs. But the scaling exponents set the <em>envelope</em> of what is possible, and the technology moves the envelope. Soft determinism, maybe. The tools constrain the menu; the polity still orders from it.</p>
<p>Then we are back to Wong and Bartlett’s question: a civilization with a sufficiently high <img src="https://latex.codecogs.com/png.latex?%5Cbeta"> will face accelerating singularities. Is homeostatic awakening something that can be engineered? Or is it the kind of thing a civilization only stumbles into after a sufficiently frightening brush with burnout? And — the <a href="../notebook/multi_level_agency.html">multi-level agency</a> angle — <em>who</em> does the awakening? The civilization, the nation, the firm? A single God-like uploaded CEO? Roco’s basilisk? If the scaling exponents differ across levels, the incentive to keep growing differs across levels too. The firm-level agents face sublinear returns and might happily plateau; the city-level dynamics keep accelerating regardless of what any individual agent wants. The homeostatic awakening, if it happens, has to happen at the level where <img src="https://latex.codecogs.com/png.latex?%5Cbeta%20%3E%201"> — which may not be the level at which anyone has decision-making authority.</p>
<p>TODO: dig into <span class="citation" data-cites="Wolpert2025Computational">Wolpert and Harper (2025)</span> — their “society as computer” model feels relevant.</p>
<p>TODO: the <a href="../notebook/thermodynamics_of_life.html">biological scaling literature</a> deserves its own subsection. Kleiber’s law (<img src="https://latex.codecogs.com/png.latex?%5Cbeta%20=%203/4"> for metabolic rate) and the West-Brown-Enquist model are the template that Wong and Bartlett are generalising.</p>
<p>TODO: chase Anderson’s <em>Imagined Communities</em> — there’s a history-of-coordination-technology story here that connects the printing press → nation state → telegraph → empire → internet → platform monopoly → AI → ??? sequence. Each technology changes something — the coordination exponent? — for a different level of organisation.</p>
</section>
<section id="references" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="references"><span class="header-section-number">6</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Alesina2003Size" class="csl-entry">
Alesina, and Spolaore. 2003. <em>The Size of Nations</em>.
</div>
<div id="ref-Arcaute2015Constructing" class="csl-entry">
Arcaute, Hatna, Ferguson, et al. 2015. <span>“<a href="https://doi.org/10.1098/rsif.2014.0745">Constructing Cities, Deconstructing Scaling Laws</a>.”</span> <em>Journal of the Royal Society Interface</em>.
</div>
<div id="ref-Balland2020Complex" class="csl-entry">
Balland, Jara-Figueroa, Petralia, et al. 2020. <span>“<a href="https://doi.org/10.1038/s41562-019-0803-3">Complex Economic Activities Concentrate in Large Cities</a>.”</span> <em>Nature Human Behaviour</em>.
</div>
<div id="ref-Bettencourt2013Origins" class="csl-entry">
Bettencourt. 2013. <span>“<a href="https://doi.org/10.1126/science.1235823">The Origins of Scaling in Cities</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Bettencourt2016Urban" class="csl-entry">
Bettencourt, and Lobo. 2016. <span>“<a href="https://doi.org/10.1098/rsif.2016.0005">Urban Scaling in Europe</a>.”</span> <em>Journal of the Royal Society Interface</em>.
</div>
<div id="ref-Bettencourt2007Growth" class="csl-entry">
Bettencourt, Lobo, Helbing, et al. 2007. <span>“<a href="https://doi.org/10.1073/pnas.0610172104">Growth, Innovation, Scaling, and the Pace of Life in Cities</a>.”</span> <em>Proceedings of the National Academy of Sciences</em>.
</div>
<div id="ref-Bettencourt2010Urban" class="csl-entry">
Bettencourt, Lobo, Strumsky, et al. 2010. <span>“<a href="https://doi.org/10.1371/journal.pone.0013541">Urban Scaling and Its Deviations: Revealing the Structure of Wealth, Innovation and Crime Across Cities</a>.”</span> <em>PLOS ONE</em>.
</div>
<div id="ref-Bowles2011Liberal" class="csl-entry">
Bowles. 2011. <span>“Is Liberal Society a Parasite on Tradition?”</span> <em>Philosophy and Public Affairs</em>.
</div>
<div id="ref-Bowles1998Efficient" class="csl-entry">
Bowles, and Gintis. 1998. <span>“Efficient Redistribution: New Rules for Markets, States and Communities.”</span> <em>Recasting Egalitarianism: New Rules for Communities, States and Markets</em>.
</div>
<div id="ref-Brill2024Neural" class="csl-entry">
Brill. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2412.07942">Neural Scaling Laws Rooted in the Data Distribution</a>.”</span>
</div>
<div id="ref-Coase1937Nature" class="csl-entry">
Coase. 1937. <span>“<a href="https://doi.org/10.1111/j.1468-0335.1937.tb00002.x">The Nature of the Firm</a>.”</span> <em>Economica</em>.
</div>
<div id="ref-Cottineau2017Diverse" class="csl-entry">
Cottineau, Hatna, Arcaute, et al. 2017. <span>“<a href="https://doi.org/10.1016/j.compenvurbsys.2016.04.006">Diverse Cities or the Systematic Paradox of Urban Scaling Laws</a>.”</span> <em>Computers, Environment and Urban Systems</em>, Spatial analysis with census data: emerging issues and innovative approaches,.
</div>
<div id="ref-Douglas2025Progress" class="csl-entry">
Douglas, and Verstyuk. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.17894">Progress in Artificial Intelligence and Its Determinants</a>.”</span>
</div>
<div id="ref-Grace2013Algorithmic" class="csl-entry">
Grace. 2013. <span>“<a href="https://intelligence.org/files/AlgorithmicProgress.pdf">Algorithmic Progress in Six Domains</a>.”</span>
</div>
<div id="ref-Grossman2022Elusive" class="csl-entry">
Grossman, and Oberfield. 2022. <span>“<a href="https://doi.org/10.1146/annurev-economics-080921-103046">The Elusive Explanation for the Declining Labor Share</a>.”</span> <em>Annual Review of Economics</em>.
</div>
<div id="ref-Harre2025Coasean" class="csl-entry">
Harré, and Ormerod. 2025. <span>“<a href="https://doi.org/10.2139/ssrn.6503058">The Coasean Reversal: AI and the Boundaries of the Firm — a Theoretical Framework Synthesising Marshall, Coase, Aoki, and Kauffman</a>.”</span>
</div>
<div id="ref-Hoffmann2022Training" class="csl-entry">
Hoffmann, Borgeaud, Mensch, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2203.15556">Training Compute-Optimal Large Language Models</a>.”</span>
</div>
<div id="ref-Hooker2020Hardware" class="csl-entry">
Hooker. 2020. <span>“<a href="http://arxiv.org/abs/2009.06489">The Hardware Lottery</a>.”</span> <em>arXiv:2009.06489 [Cs]</em>.
</div>
<div id="ref-Jorda2019Rate" class="csl-entry">
Jordà, Knoll, Kuvshinov, et al. 2019. <span>“<a href="https://doi.org/10.1093/qje/qjz012">The Rate of Return on Everything, 1870–2015</a>.”</span> <em>The Quarterly Journal of Economics</em>.
</div>
<div id="ref-Kaplan2020Scaling" class="csl-entry">
Kaplan, McCandlish, Henighan, et al. 2020. <span>“<a href="http://arxiv.org/abs/2001.08361">Scaling Laws for Neural Language Models</a>.”</span> <em>arXiv:2001.08361 [Cs, Stat]</em>.
</div>
<div id="ref-Korinek2025Concentrating" class="csl-entry">
Korinek, and Vipra. 2025. <span>“<a href="https://doi.org/10.1093/epolic/eiae057">Concentrating Intelligence: Scaling and Market Structure in Artificial Intelligence</a>.”</span> <em>Economic Policy</em>.
</div>
<div id="ref-Kuhnert2006Scaling" class="csl-entry">
Kühnert, Helbing, and West. 2006. <span>“<a href="https://doi.org/10.1016/j.physa.2006.01.058">Scaling Laws in Urban Supply Networks</a>.”</span> <em>Physica A: Statistical Mechanics and Its Applications</em>, Information and Material Flows in Complex Networks,.
</div>
<div id="ref-Lehner2024Monopsony" class="csl-entry">
Lehner, Parolin, Pignatti, et al. 2024. <span>“<a href="https://doi.org/10.2139/ssrn.4975258">Monopsony Power and Poverty: The Consequences of Walmart Supercenter Openings</a>.”</span> <em>SSRN Electronic Journal</em>.
</div>
<div id="ref-Leishman2021Relationships" class="csl-entry">
Leishman, Bond-Smith, Liang, et al. 2021. <span>“<a href="https://www.ahuri.edu.au/research/final-reports/357">Relationships Between Metropolitan, Satellite and Regional City Size, Spatial Context and Economic Productivity</a>.”</span> <em>AHURI Final Report</em>.
</div>
<div id="ref-MacLeod1999Cassini" class="csl-entry">
MacLeod. 1999. <em>The Cassini division</em>.
</div>
<div id="ref-Moore1993Social" class="csl-entry">
Moore. 1993. <em>Social Origins of Dictatorship and Democracy: Lord and Peasant in the Making of the Modern World</em>.
</div>
<div id="ref-Pollard2021Rise" class="csl-entry">
Pollard. 2021. <span>“<a href="https://prospect.org/api/content/e8a23c4c-7b8d-11eb-9b74-1244d5f7c7c6/">The Rise of the Private Police</a>.”</span> <em>The American Prospect</em>.
</div>
<div id="ref-PrietoCuriel2022Scaling" class="csl-entry">
Prieto Curiel, Cabrera-Arnau, and Bishop. 2022. <span>“<a href="https://doi.org/10.3389/fphy.2022.858307">Scaling Beyond Cities</a>.”</span> <em>Frontiers in Physics</em>.
</div>
<div id="ref-Rybski2019Urban" class="csl-entry">
Rybski, Arcaute, and Batty. 2019. <span>“<a href="https://doi.org/10.1177/2399808319886125">Urban Scaling Laws</a>.”</span> <em>Environment and Planning B: Urban Analytics and City Science</em>.
</div>
<div id="ref-Scharf2021Ascent" class="csl-entry">
Scharf. 2021. <em>The Ascent of Information: Books, Bits, Genes, Machines, and Life’s Unending Algorithm</em>.
</div>
<div id="ref-Sekeris2012Tragedy" class="csl-entry">
Sekeris. 2012. <span>“<a href="http://petros.sekeris.org/violentcommons.pdf">The Tragedy of the Commons in a Violent World</a>.”</span> Working Paper 1213.
</div>
<div id="ref-Stross2006Accelerando" class="csl-entry">
Stross, Charles. 2006. <em>Accelerando</em>.
</div>
<div id="ref-Stross2014Neptunes" class="csl-entry">
Stross, Charles. 2014. <em>Neptune’s brood: a space opera</em>.
</div>
<div id="ref-Tainter2003Resource" class="csl-entry">
Tainter, Allen, Little, et al. 2003. <span>“<a href="http://www.ecologyandsociety.org/vol7/iss3/art4/">Resource Transitions and Energy Gain: Contexts of Organization</a>.”</span> <em>Conservation Ecology</em>.
</div>
<div id="ref-Watts2006Blindsight" class="csl-entry">
Watts. 2006. <em>Blindsight</em>.
</div>
<div id="ref-West2017Scale" class="csl-entry">
West. 2017. <em>Scale: The Universal Laws of Growth, Innovation, Sustainability, and the Pace of Life in Organisms, Cities, Economies, and Companies</em>.
</div>
<div id="ref-Wolpert2025Computational" class="csl-entry">
Wolpert, and Harper. 2025. <span>“<a href="https://doi.org/10.31219/osf.io/qj83z">The Computational Power of a Human Society: A New Model of Social Evolution</a>.”</span>
</div>
<div id="ref-Wong2022Asymptotic" class="csl-entry">
Wong, and Bartlett. 2022. <span>“<a href="https://doi.org/10.1098/rsif.2022.0029">Asymptotic Burnout and Homeostatic Awakening: A Possible Solution to the Fermi Paradox?</a>”</span> <em>Journal of The Royal Society Interface</em>.
</div>
<div id="ref-Xexeo2024Economic" class="csl-entry">
Xexéo, Braida, Parreiras, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2405.17637">The Economic Implications of Large Language Model Selection on Earnings and Return on Investment: A Decision Theoretic Model</a>.”</span>
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>The “dataome” being the accumulated information layer outside biological organisms — books, architecture, computers, the internet. A coinage from <span class="citation" data-cites="Scharf2021Ascent">Scharf (2021)</span>.↩︎</p></li>
<li id="fn2"><p>Stross’s <em>Accelerando</em> <span class="citation" data-cites="Stross2006Accelerando">(Charles. Stross 2006)</span> is the science-fictional limit case: articles of incorporation go Turing-complete, firms become autonomous agents recursively spawning subsidiaries, and the distinction between firm and market dissolves into a computational froth. Silly? Maybe. But “AI agents negotiate contracts at scale” is a less colourful description of the same dynamic.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>buzzword</category>
  <category>cooperation</category>
  <category>culture</category>
  <category>design</category>
  <category>diy</category>
  <category>economics</category>
  <category>housing</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>insurgency</category>
  <category>making things</category>
  <category>policy</category>
  <category>spatial</category>
  <category>straya</category>
  <category>the rather superior sort of city</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/returns_to_leviathan.html</guid>
  <pubDate>Mon, 20 Apr 2026 11:32:16 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/wall_scaling_sm_RP-P-1909-6331.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Czechia</title>
  <link>https://danmackinlay.name/notebook/czechia.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-defenestration" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-defenestration-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/Prager.Fenstersturz.1618.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/Prager.Fenstersturz.1618.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-defenestration-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I <del>am about to visit</del> <del>am visiting</del> <sub></sub> visited<sub></sub> Czechia. I would like to write something worthy of the country, in the form of a slapdash, idiosyncratic, mildly contrarian take on a place I know poorly, while avoiding the hubris of crafting a <a href="https://www.gleech.org/tallinn?ref=danmackinlay.name">gleech-tier take</a>. I cannot afford to set my standard for quality that high any more than I can set my standards for time-management so low.</p>
<p>So! A slapdash, idiosyncratic, mildly contrarian one for you.</p>
<section id="people-and-things-from-czechia-i-knew-before" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="people-and-things-from-czechia-i-knew-before"><span class="header-section-number">1</span> People and things from Czechia I knew before</h2>
<p>Experimental conditition: I primed myself before I arrived, writing down everyone and everything I have heard of that is Czech.</p>
<p>At time of writing I wonder: What will I miss? Which prejudices will I be demonstrating thereby? I am greatly curious.</p>
<p>I am attempting to triangulate the country from its more famous children. Such a method has obvious shortcomings— Children rarely resemble their parents, and famous children least of all.</p>
<p>Read down below this section for a post-arrival addendum of whom I missed.</p>
<section id="jan-hus" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="jan-hus"><span class="header-section-number">1.1</span> Jan Hus</h3>
<p>Religious reformer, fifteenth century. The Hussites are history heroes of mine, in that special way that long-dead people can be, where everything they did right was awesome and everything they did wrong was excusabel, them being <em>of their time</em>. Jan Hus got the project of redoing Christianity decades before Luther; was rewarded for it by being duplicitously burned at the stake at Constance in 1415. The Hussite Wars that followed managed the impressive feat of inventing a folk-Protestant peasant army that beat back several Holy Roman crusades using armoured war-wagons and early handguns. The Protestant Reformation, and some kind of peasant uprising, ahead of its time, was a Czech thing. If they had waited for the printing press as well as handguns, history might have been different.</p>
<p>Also, <a href="https://english.radio.cz/what-does-jan-hus-have-do-czech-spelling-8754833?ref=danmackinlay.name">Hus is often credited with inventing modern Czech orthography</a>.</p>
</section>
<section id="karel-iv" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="karel-iv"><span class="header-section-number">1.2</span> Karel IV</h3>
<p>The Holy Roman Emperor we Anglophones call Charles IV. Made Prague the imperial capital in the fourteenth century, commissioned various things that make towns serious: the bridge, the cathedral, founded the university (1348) that still bears his name. For who came before and after, see the HRE timeline below.</p>
</section>
<section id="charles-university-univerzita-karlova" class="level3" data-number="1.3">
<h3 data-number="1.3" class="anchored" data-anchor-id="charles-university-univerzita-karlova"><span class="header-section-number">1.3</span> Charles University / Univerzita Karlova</h3>
<p>Founded by Karel IV in 1348 as the first university in central Europe, and possessed of a bonkers institutional biography ever since. I confess I did actually look this biography up when I was applying to work there, but that was in 2025, so I’ll put it on this page as received knowledge.</p>
<p>Originally the four student “nations” (Bohemian, Bavarian, Saxon, Polish) each had one vote in university affairs. In 1409 Wenceslaus IV decreed that the Bohemian nation should have three votes and the rest one between them; the German masters and students promptly walked out and founded the University of Leipzig, which is also still going. Jan Hus had been rector shortly before he was burned in 1415, after which the Hussites took over and the theology faculty was effectively closed for the next two centuries.</p>
<p>After the Habsburgs won the Battle of White Mountain in 1620, the Jesuits were handed the keys; in 1654 they merged the Carolinum with the Jesuit Clementinum to form the Charles-Ferdinand University, and the place was Catholicised by force.</p>
<p>In 1882 the institution was split into a Czech-language university and a German-language university, both called Charles-Ferdinand, sharing some libraries but not apparently much else. In 1939 the Nazis closed the Czech university and sent over a thousand of its students to concentration camps; in 1945 the German half was abolished in turn. The Communists purged the survivors in 1948. The students of Charles University were on the front line of 1989.</p>
<p>Language/religion of instruction across seven hundred years runs, more or less: Latin, Latin (Hussite), Latin (Jesuit), German, Czech-and-German-in-parallel, Reich-German, Czech. The medieval-university brand has not been done many favours, but it has survived.</p>
</section>
<section id="various-wenceslases" class="level3" data-number="1.4">
<h3 data-number="1.4" class="anchored" data-anchor-id="various-wenceslases"><span class="header-section-number">1.4</span> Various Wenceslases</h3>
<p>Mostly as an English speaker I know Wenceslaus I, Duke of Bohemia (907–935): the “Good King” of the Christmas carol, who was strictly a duke not a king (I confess I did need to look that up) and who was knifed by his brother. Thereafter there was a confusing line-up of Kings Wenceslas (I to IV). The fourth one was Charles IV’s son and the would-be Holy Roman Emperor of the family; he turns up in the HRE timeline below. The <a href="https://en.wikipedia.org/wiki/Wenceslas_Square?ref=danmackinlay.name">largest square in Prague</a> is named for the first-mentioned, who became the patron saint of Bohemia.</p>
</section>
<section id="defenestration" class="level3" data-number="1.5">
<h3 data-number="1.5" class="anchored" data-anchor-id="defenestration"><span class="header-section-number">1.5</span> Defenestration</h3>
<p>Throwing political opponents out of windows — the Czech contribution to constitutional procedure. The First Defenestration of Prague (1419) launched the Hussite Wars; the Second Defenestration (1618) launched the Thirty Years’ War. A non-canonical mini-defenestration occurred in between. The foreign minister Jan Masaryk fell out of a window in 1948 in a manner that was officially suicide and unofficially a third-to-fourth defenestration. I for one think it speaks to a strong progressive streak, that there was such a ready supply of tall buildings to throw people from at a time when the typical peasant <a href="https://janeaustensworld.com/2011/12/05/a-short-history-of-floors/?ref=danmackinlay.name">didn’t have a floor</a>. Either that or an architectural flex?</p>
</section>
<section id="sudetenland" class="level3" data-number="1.6">
<h3 data-number="1.6" class="anchored" data-anchor-id="sudetenland"><span class="header-section-number">1.6</span> Sudetenland</h3>
<p>The German-speaking border regions of Bohemia, Moravia, and Czech Silesia. Most Anglophones (me included) know the word from WWII history class as the bit Hitler announced in 1938 he would invade in order to “protect” the Germans living there, which Britain and France then let him have at Munich, after which he promptly invaded the rest of the country anyway. What WWII history class did not tell me is what happened next: in 1945–1946 Czechoslovakia expelled around three million ethnic Germans from these same regions under the Beneš decrees, in one of the larger forced population transfers in European history.</p>
<p>The Sudetenland was depopulated, partially resettled by Czechs and Slovaks, and the German-Bohemian and German-Moravian cultures, in place since the medieval <em>Ostsiedlung</em>, just… ended? One of those weirdnesses, like South Tyrol, that I didn’t have in my mental historical population-displacement map.</p>
<p>UPDATE: The post war Polish displacement into <a href="https://en.wikipedia.org/wiki/Recovered_Territories?ref=danmackinlay.name">Recovered Territories</a> was even bigger. Not that this is a competition, now folks, don’t start trying to <a href="../notebook/ml_benchmarks.html">climb this leaderboard</a>.</p>
</section>
<section id="milan-kundera" class="level3" data-number="1.7">
<h3 data-number="1.7" class="anchored" data-anchor-id="milan-kundera"><span class="header-section-number">1.7</span> Milan Kundera</h3>
<p>Novelist. <em>The Unbearable Lightness of Being</em> is the famous one that I am <a href="../notebook/timeless_works_of_art.html#kundera-on-kitsch">vaguely annoyed how much I like</a>. Kundera defected to France in the 1970s, was stripped of citizenship by the Communist government, declined to come back after 1989, eventually wrote in French, fell out with the Czech literary scene, and got accused of having informed on a fellow citizen as a young man in 1950.</p>
</section>
<section id="václav-havel" class="level3" data-number="1.8">
<h3 data-number="1.8" class="anchored" data-anchor-id="václav-havel"><span class="header-section-number">1.8</span> Václav Havel</h3>
<p>Playwright, dissident, jailed, then president — first of Czechoslovakia, then of the new Czech Republic after the country split with Slovakia in 1993 (the “Velvet Divorce”, which sounds polite enough). The model intellectual-as-statesman that the post-Soviet Eastern European liberal moment offered up before that moment ended.</p>
</section>
<section id="viktor-koženy" class="level3" data-number="1.9">
<h3 data-number="1.9" class="anchored" data-anchor-id="viktor-koženy"><span class="header-section-number">1.9</span> Viktor Koženy</h3>
<p><a href="https://www.blanchard-house.com/releases/nwfei4clq9mes1v8n3hacvrt3tkpi0?ref=danmackinlay.name">The Pirate of Prague</a>. Made off with several hundred million dollars of Czech voucher-privatisation money in the 1990s, had disastrous adventures in Colorado and Azerbaijan, fled to the Bahamas, and has since been wanted in several jurisdictions for variations of fraud. The yang end of the post-1989 spectrum from Havel’s yin.</p>
</section>
<section id="václav-smil" class="level3" data-number="1.10">
<h3 data-number="1.10" class="anchored" data-anchor-id="václav-smil"><span class="header-section-number">1.10</span> Václav Smil</h3>
<p>Polymath of energy, materials, agriculture. Czech-born, emigrated to Canada (Manitoba) and writes from there. Bill Gates says he reads everything Smil writes; given Smil’s output, it is credible that the valuation of his time runs to a hundred million dollars at Bill’s hourly rate. I have complicated feelings about Smil, whose books were a major part of my undergraduate studies but I did not at the time feel really nailed the human dimension of energy transition. Enough time has passed that I cannot recall specific complaints though.</p>
</section>
<section id="franz-kafka" class="level3" data-number="1.11">
<h3 data-number="1.11" class="anchored" data-anchor-id="franz-kafka"><span class="header-section-number">1.11</span> Franz Kafka</h3>
<p>A German-speaking Jewish insurance clerk in Prague who happened also to be the writer who tells us how it feels to live inside a bureaucratic empire that has lost the thread. Published almost nothing in his lifetime; asked his executor to burn the manuscripts; the executor, Max Brod, did not.</p>
</section>
<section id="jan-švankmajer" class="level3" data-number="1.12">
<h3 data-number="1.12" class="anchored" data-anchor-id="jan-švankmajer"><span class="header-section-number">1.12</span> Jan Švankmajer</h3>
<p>Surrealist animator. The 1988 <em>Alice</em> (<em>Něco z Alenky</em>) is the version of Alice in Wonderland that still gives me intrusive thoughts years afterwards: tactile, dreadful, made of dust and meat. There is a tradition of Czech stop-motion that runs deep and dark. I still send people animated GIFs grabbed from this nightmare.</p>
</section>
<section id="karel-zeman" class="level3" data-number="1.13">
<h3 data-number="1.13" class="anchored" data-anchor-id="karel-zeman"><span class="header-section-number">1.13</span> Karel Zeman</h3>
<p>“The Czech Méliès” — live-action and animation hybrid films, particularly the Jules Verne adaptations. They are, like, really good. <a href="https://karelzemanmuseum.org/karel-zeman-museum/karel-zeman-films/?ref=danmackinlay.name">Annoying they are only on DVD</a>.</p>
</section>
<section id="antonín-dvořák" class="level3" data-number="1.14">
<h3 data-number="1.14" class="anchored" data-anchor-id="antonín-dvořák"><span class="header-section-number">1.14</span> Antonín Dvořák</h3>
<p>Composer, nineteenth century. We played <em>New World Symphony</em> (1893) in my family home when I was a child. He wrote other music, but I do not know what, so I looked him up. I learned he spent three years running the National Conservatory of Music in New York, during which he told the Americans they should build a national music on Black spirituals and Native American melodies; this turned out to be unwelcome advice that the country eventually took.</p>
</section>
<section id="karel-čapek-and-robots" class="level3" data-number="1.15">
<h3 data-number="1.15" class="anchored" data-anchor-id="karel-čapek-and-robots"><span class="header-section-number">1.15</span> Karel Čapek and Robots</h3>
<p>Playwright and journalist. His play <em>R.U.R.</em> (1920) introduced the word <em>robot</em> to the world, and <em>War with the Newts</em> (1936) is on my to-read list as one of the better satires-with-amphibians ever written.<sup>1</sup></p>
</section>
<section id="pilsner" class="level3" data-number="1.16">
<h3 data-number="1.16" class="anchored" data-anchor-id="pilsner"><span class="header-section-number">1.16</span> Pilsner</h3>
<p>The pale lager style invented in Plzeň in 1842, when a Bavarian brewer named Josef Groll got the local brewery to combine bottom-fermenting yeast, very pale Moravian malt, and the local soft water. The result was a beer so popular it took over the world: every <em>lager</em> in a green or clear bottle anywhere is a descendant. Pilsner Urquell still exists; opinions on whether it has held up vary. I do not drink though, so I do not care either way.</p>
</section>
<section id="amanita-design" class="level3" data-number="1.17">
<h3 data-number="1.17" class="anchored" data-anchor-id="amanita-design"><span class="header-section-number">1.17</span> Amanita design</h3>
<p><a href="https://amanita-design.net?ref=danmackinlay.name">Amanita design</a>: The studio behind the <em>Machinarium</em> and <em>Samorost</em> series of point-and-click puzzle adventure games with achingly <a href="https://amanita-design.net/games/samorost3.html?ref=danmackinlay.name">lovely</a> and/or <a href="https://amanita-design.net/games/happy.html?ref=danmackinlay.name">upsetting</a> hand-made art. Relatedly, employee <a href="https://floex.cz/?ref=danmackinlay.name">Floex</a> is a musician I rather enjoy.</p>
</section>
<section id="yuku" class="level3" data-number="1.18">
<h3 data-number="1.18" class="anchored" data-anchor-id="yuku"><span class="header-section-number">1.18</span> YUKU</h3>
<p><a href="https://yukumusic.bandcamp.com/?ref=danmackinlay.name">YUKU</a>: Cult hipster record label.</p>
</section>
<section id="mendels-pea-garden" class="level3" data-number="1.19">
<h3 data-number="1.19" class="anchored" data-anchor-id="mendels-pea-garden"><span class="header-section-number">1.19</span> Mendel’s pea garden</h3>
<p>Gregor Mendel, an Augustinian friar at the abbey in Brno, spent the 1850s and 1860s growing tens of thousands of pea plants and counting their offspring’s traits. He published a paper that was ignored for thirty years and then, around 1900, became the foundation of genetics. The mathematics of inheritance was figured out, more or less correctly, in a monastery vegetable patch. Except it was fabricated <span class="citation" data-cites="Fisher1936Has">(Fisher 1936)</span>! Or was it <span class="citation" data-cites="Ellis2019Mendels">(Ellis et al. 2019)</span>?</p>
</section>
<section id="jetbrains" class="level3" data-number="1.20">
<h3 data-number="1.20" class="anchored" data-anchor-id="jetbrains"><span class="header-section-number">1.20</span> JetBrains</h3>
<p>Developer-tools company originally headquartered in Prague since 2000. Makes IntelliJ IDEA, PyCharm, WebStorm, and the rest of the IDE bestiary; created Kotlin, which Google eventually decided was the right way to write Android apps. I just looked them up and they are now domiciled in the Netherlands; not sure if this still counts.</p>
</section>
<section id="atheism" class="level3" data-number="1.21">
<h3 data-number="1.21" class="anchored" data-anchor-id="atheism"><span class="header-section-number">1.21</span> Atheism</h3>
<p>Depending on how you count it, Czechia is the least religious country in Europe <a href="https://ourworldindata.org/religion?ref=danmackinlay.name">cf OurWorldInData</a>. We can tweak our criteria and find that Estonia is less religious, depending on what kind of irreligiosity race we are running. Definitely up in the godless major leagues, either way.</p>
</section>
</section>
<section id="people-and-things-from-czechia-i-missed" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="people-and-things-from-czechia-i-missed"><span class="header-section-number">2</span> People and things from Czechia I missed</h2>
<section id="tycho-brahe" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="tycho-brahe"><span class="header-section-number">2.1</span> Tycho Brahe</h3>
<p><a href="https://en.wikipedia.org/wiki/Tycho_Brahe?ref=danmackinlay.name">Tycho Brahe</a>: Danish nobleman and astronomer whose observations of the heavens were the basis for Kepler’s laws of planetary motion. Emperor Rudolf II made him imperial mathematician in 1601 in Prague and he died here. (HT Jan Kulveit.)</p>
</section>
<section id="oh-damn-johannes-kepler-too" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="oh-damn-johannes-kepler-too"><span class="header-section-number">2.2</span> Oh damn Johannes Kepler too</h3>
<p><a href="https://en.wikipedia.org/wiki/Johannes_Kepler?ref=danmackinlay.name">Johannes Kepler</a>, the guy who inspired Newton to do the gravity thing, spent 12 years of his career in Prague. I did not know that.</p>
</section>
<section id="rabbi-judah-loew-ben-bezalel-and-the-golem" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="rabbi-judah-loew-ben-bezalel-and-the-golem"><span class="header-section-number">2.3</span> Rabbi Judah Loew ben Bezalel and the Golem</h3>
<p><a href="https://en.wikipedia.org/wiki/Judah_Loew_ben_Bezalel?ref=danmackinlay.name">Rabbi Judah Loew ben Bezalel</a>: Rabbi of Prague, often associated with the creation of the Golem, a mythical creature made from clay and early metaphor for loss of control in AI. The good Rabbi was a real person who actually died here. Embarrassing that I did not know about this. (HT Jan Kulveit.)</p>
</section>
<section id="mikuláš-of-kadaň-jan-šindel-and-pragues-astronomical-clock" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="mikuláš-of-kadaň-jan-šindel-and-pragues-astronomical-clock"><span class="header-section-number">2.4</span> Mikuláš of Kadaň, Jan Šindel and Prague’s Astronomical Clock</h3>
<p><a href="https://www.czechcenter.org/blog/prague-astronomical-clock?ref=danmackinlay.name">That famous clock</a> also has a twisted history. (HT Jan Kulveit.)</p>
</section>
<section id="jan-patočka" class="level3" data-number="2.5">
<h3 data-number="2.5" class="anchored" data-anchor-id="jan-patočka"><span class="header-section-number">2.5</span> Jan Patočka</h3>
<p><a href="https://en.wikipedia.org/wiki/Jan_Pato%C4%8Dka?ref=danmackinlay.name">Jan Patočka</a> was a philosopher, dissident, and <a href="https://en.wikipedia.org/wiki/Charter_77?ref=danmackinlay.name">Charter 77</a> signatory who died in police custody in 1977, and whose library I am currently working from. (HT Jan Kulveit.)</p>
</section>
<section id="jena-codex" class="level3" data-number="2.6">
<h3 data-number="2.6" class="anchored" data-anchor-id="jena-codex"><span class="header-section-number">2.6</span> Jena Codex</h3>
<div id="fig-jenska-kodex" class="right figure illustration quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-jenska-kodex-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/Jensky_kodex_satan_prodava_odpustky.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="Figure&nbsp;2: Demon priest dispensing indulgences"><img src="https://danmackinlay.name/images/Jensky_kodex_satan_prodava_odpustky.avif" class="right figure illustration img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-jenska-kodex-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Demon priest dispensing indulgences
</figcaption>
</figure>
</div>
<p>The Jena Codex, also called the <em>Jenský kodex</em> or <em>Antithesis Christi et Antichristi</em>, is badass Figure&nbsp;2. It is, I am told <a href="https://cs.wikipedia.org/wiki/Jensk%C3%BD_kodex?ref=danmackinlay.name">by Czech wikipedia</a> an illuminated Hussite manuscript from around 1500, commissioned by the Utraquist (i.e.&nbsp;Hussite-flavoured) Bohuslav of Čechtice. I cannot read it, but apparently it is full of theological and polemical texts that contrast the early Christian Church with the Church of Jan Hus’s time. Here are three online versions of it:</p>
<ul>
<li><a href="https://www.manuscriptorium.com/hub/browser/default/detail?url=https:%2F%2Fcollectiones.manuscriptorium.com%2Fassorted%2FAIPDIG%2FNMP___%2FE%2FAIPDIG-NMP___IV_B_24_____3TQMIOE-cs%2F&amp;ref=danmackinlay.name">Manuscriptorium</a></li>
<li><a href="https://www.esbirky.cz/predmet/180453?ref=danmackinlay.name">eSbirky.cz - Antithesis Christi et Antichristi</a></li>
<li><a href="https://commons.wikimedia.org/wiki/Category:Jensk%C3%BD_kodex_(whole_pages)?uselang=de&amp;ref=danmackinlay.name">Category:Jenský kodex (whole pages) – Wikimedia Commons</a></li>
</ul>
</section>
<section id="jan-žižka" class="level3" data-number="2.7">
<h3 data-number="2.7" class="anchored" data-anchor-id="jan-žižka"><span class="header-section-number">2.7</span> Jan Žižka</h3>
<p>If I think the Hussites are so impressive I should probably have credited <a href="https://en.wikipedia.org/wiki/Jan_%C5%BDi%C5%BEka?ref=danmackinlay.name">Jan Žižka</a>, the general who led the radical, peasant-filled Hussite armies in the wars that followed Jan Hus’s death, while blind.</p>
</section>
<section id="other-musicians-of-note" class="level3" data-number="2.8">
<h3 data-number="2.8" class="anchored" data-anchor-id="other-musicians-of-note"><span class="header-section-number">2.8</span> Other musicians of note</h3>
<ul>
<li><a href="https://www.clarinet-factory.cz/?ref=danmackinlay.name">Clarinet Factory</a></li>
<li><a href="https://www.maok.sk/?ref=danmackinlay.name">Home - Maok</a></li>
</ul>
</section>
</section>
<section id="when-was-prague-the-capital-of-the-holy-roman-empire" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="when-was-prague-the-capital-of-the-holy-roman-empire"><span class="header-section-number">3</span> When was Prague the capital of the Holy Roman Empire?</h2>
<p>Turns out that five rulers of the Holy Roman Empire — or its elected German kingship — had, or nearly had, their court in Prague between 1346 and 1612. Sometimes <em>Holy Roman Emperor</em> or <em>court in Prague</em> is a matter of considerable freedom of interpretation.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Court in Prague</th>
<th>Ruler</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>1346–1378</td>
<td><strong>Charles IV</strong> / Karel IV</td>
<td>The textbook case (above). Made Prague the imperial seat, built the bridge, the cathedral, the university.</td>
</tr>
<tr class="even">
<td>1378–1419</td>
<td><strong><a href="https://en.wikipedia.org/wiki/Wenceslaus_IV_of_Bohemia?ref=danmackinlay.name">Wenceslaus IV</a></strong> / Václav IV</td>
<td>Charles IV’s son. King of the Romans 1376–1400, deposed; never crowned Emperor by the pope. Reorganised Charles University in 1409. Tried to protect Jan Hus. Weakly Holy, somewhat Roman, briefly Empire.</td>
</tr>
<tr class="odd">
<td>(none, then 1436–1437)</td>
<td><strong><a href="https://en.wikipedia.org/wiki/Sigismund,_Holy_Roman_Emperor?ref=danmackinlay.name">Sigismund</a></strong> of Luxembourg</td>
<td>HRE 1433–1437, brother of Wenceslaus IV. The Sigismund who duplicitously had Jan Hus burned at Constance in 1415. The Hussite Wars (1419–1436) were in significant part a war against him; the Bohemians would not have him as king and he kept his court in Buda. Got into Prague only at the very end, after recognising the Compact of Prague.</td>
</tr>
<tr class="even">
<td>1583–1611</td>
<td><strong><a href="https://en.wikipedia.org/wiki/Rudolf_II,_Holy_Roman_Emperor?ref=danmackinlay.name">Rudolf II</a></strong></td>
<td>Habsburg. Moved the imperial court Vienna → Prague in 1583 and kept it there about thirty years. Patron of Tycho Brahe, Kepler, assorted alchemists. Pushed off the throne by his brother Matthias in 1611.</td>
</tr>
<tr class="odd">
<td>1611–1612</td>
<td><strong><a href="https://en.wikipedia.org/wiki/Matthias,_Holy_Roman_Emperor?ref=danmackinlay.name">Matthias</a></strong></td>
<td>Inherited Rudolf’s Prague court and moved it back to Vienna within a year at his wife Anna of Tyrol’s urging. End of Prague-as-imperial-capital.</td>
</tr>
</tbody>
</table>
<p>Six years after Matthias left, the Second Defenestration of Prague (1618) launched the Thirty Years’ War; the Habsburgs won the Battle of White Mountain in 1620 and Catholicised Bohemia by force. Czech politics (at least as <em>national</em> politics) then went into hibernation until 1918.</p>
</section>
<section id="language" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="language"><span class="header-section-number">4</span> Language</h2>
<section id="survival-kit" class="level3" data-number="4.1">
<h3 data-number="4.1" class="anchored" data-anchor-id="survival-kit"><span class="header-section-number">4.1</span> Survival kit</h3>
<dl>
<dt>Hello</dt>
<dd>
<em>Dobrý den</em> [ˈdobriː ˈdɛn] (roughly “DOB-ree den”; literally “good day”). Informal: <em>Ahoj</em> [ˈaɦoj], like sailors.
</dd>
<dt>Thank you</dt>
<dd>
<em>Děkuji</em> [ˈɟɛkujɪ] (roughly “DYEH-koo-yee”). Casual short form <em>Díky</em> [ˈɟiːkɪ].
</dd>
<dt>Please</dt>
<dd>
<em>Prosím</em> [ˈprosiːm]. The same word does multiple duty for “you’re welcome”, “pardon?” “here you are”, and “after you.”
</dd>
<dt>Excuse me / sorry</dt>
<dd>
<em>Promiňte</em> [ˈpromiɲtɛ] (formal). <em>Pardon</em> [ˈpardon] (yes, the French loan) is widely understood.
</dd>
<dt>Goodbye</dt>
<dd>
<em>Na shledanou</em> [na ˈsxlɛdanou̯] formally; <em>Ahoj</em> [ˈaɦoj] or <em>Čau</em> [ˈt͡ʃau̯] (like Italian <em>ciao</em>) informally.
</dd>
<dt>Do you speak English?</dt>
<dd>
<em>Mluvíte anglicky?</em> [ˈmluviːtɛ ˈaŋɡlit͡ski] (roughly “MLOO-vee-teh AHN-glits-ki”). The verb takes the adverbial form <em>anglicky</em>, in the same shape as <em>mluvím česky</em>, “I speak Czech-ly”. Cool.
</dd>
<dt>Sorry, I am an idiot foreigner who only speaks English</dt>
<dd>
<em>Promiňte, jsem hloupý cizinec a mluvím jenom anglicky</em> [ˈpromiɲtɛ jsɛm ˈɦloupiː ˈt͡sizinɛt͡s a ˈmluviːm ˈjɛnom ˈaŋɡlit͡ski] (roughly “PRO-min-teh, ysem HLOH-pee TSEE-zee-nets ah MLOO-veem YEH-nom AHN-glits-ki”). <em>Hloupá cizinka</em> for the female form, apparently. The terser retreat <em>Promiňte, neumím česky</em>, “Sorry, I don’t know Czech”, may also serve but that is not as funny. NB this is an AI-generated translation; How did we do, Czech speakers?
</dd>
<dt>Yes</dt>
<dd>
<em>Ano</em> [ˈano] (“AH-no”). Casually shortened to <em>jo</em> [jo], which is German <em>ja</em> in Czech orthography. Confusingly to English ears, the Czech word <em>no</em> is also a colloquial agreement particle (“well, yeah”) — never a negation.
</dd>
<dt>No</dt>
<dd>
<em>Ne</em> [nɛ] (“neh”). Repeat for emphasis: <em>Ne, ne, ne.</em>
</dd>
</dl>
<p>And of course, I love <a href="../notebook/flashcards.html">flashcards</a>. Here are some:</p>
<ul>
<li><a href="https://ankiweb.net/shared/info/1600445115?ref=danmackinlay.name">🇨🇿 The Ultimate Czech Deck – Languages on Fire (A1 to B1) - AnkiWeb</a></li>
<li><a href="https://ankiweb.net/shared/info/1320507125?ref=danmackinlay.name">Czech Core 100 - Basic words (EN CS with audio) - AnkiWeb</a> The author <em>really wants</em> you to know dates, days of the week etc before you learn how to say “Promiňte” and “Prosím”. I wonder what teh creato’s project was in Czechia? Very heavy on calendars, whatever it was. Anyway they have pronunciation audio, for everything, so I still recommend it even for people who do not want to start their Czech learning journey with “Tuesday the 12th of September”.</li>
</ul>
</section>
<section id="václav-and-wenceslaus" class="level3" data-number="4.2">
<h3 data-number="4.2" class="anchored" data-anchor-id="václav-and-wenceslaus"><span class="header-section-number">4.2</span> Václav and Wenceslaus</h3>
<p>Secretly the same. In modern English we use <em>Václav</em> for contemporary Czechs (Havel, Smil, Klaus) and reserve <em>Wenceslaus</em> (the Latin form) or <em>Wenceslas</em> (the slimmed-down English version) for medieval rulers — Wenceslaus I Duke of Bohemia, Wenceslaus IV who issued the 1409 reorganisation of Charles University, and so on.</p>
<p>AFAICT this distinction is not drawn in Czechia. <em>Václav</em> descends from an old Slavic <em>Vęceslavъ</em>, “greater glory”, which Latin took up as <em>Wenceslaus</em>; English kept the Latin form for kings even after dropping it for everyone else.</p>
</section>
<section id="prague-and-praha" class="level3" data-number="4.3">
<h3 data-number="4.3" class="anchored" data-anchor-id="prague-and-praha"><span class="header-section-number">4.3</span> Prague and Praha</h3>
<p>The city is <em>Praha</em> in Czech. English took the form <em>Prague</em> via Latin <em>Praga</em> and French. The same pattern by which Anglophones say Vienna, Munich, Warsaw, Cologne, Geneva instead of Wien, München, Warszawa, Köln, Genève — European cities each given a slightly shopworn English nickname.</p>
</section>
<section id="bohemians" class="level3" data-number="4.4">
<h3 data-number="4.4" class="anchored" data-anchor-id="bohemians"><span class="header-section-number">4.4</span> “Bohemians”</h3>
<p>Czechia used to more-or-less be called Bohemia by non-Czechs. It seems that the word was <a href="https://english.radio.cz/bohemia-czechia-8220362?ref=danmackinlay.name">always an exonym</a>. IIRC the reason that <em>bohemian</em> now means “artistic nonconformists” in English is not because the Czechs were especially artistic or nonconformist, but that the word was borrowed from French in the nineteenth century, and the French called Romani <em>bohémiens</em> as a kind of geographic origin story for Romani and romanticised their lifestyle as carefree and creative-looking. <a href="https://en.wikipedia.org/wiki/Romani_people?ref=danmackinlay.name">There are not especially many Romani people in Czechia now</a>, but maybe this made more sense before the war and communist repression etc.</p>
</section>
<section id="czechs" class="level3" data-number="4.5">
<h3 data-number="4.5" class="anchored" data-anchor-id="czechs"><span class="header-section-number">4.5</span> “Czechs”</h3>
<p>English has some fossilised spelling from before the 19th century. Czech = <em>Čech</em> (masc) or <em>Češka</em> (fem) in Czech. The language is <em>čeština</em>, the adjective is <em>český</em>, and the country is <em>Česko</em>. But I am going to stick to <em>Czechia</em>, since it is the official English name.</p>
</section>
</section>
<section id="is-czechia-in-central-europe-or-eastern-europe" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="is-czechia-in-central-europe-or-eastern-europe"><span class="header-section-number">5</span> Is Czechia in Central Europe or Eastern Europe?</h2>
<p>I vote Central.</p>
<p>Reasoning:</p>
<ul>
<li>It was in the Holy Roman Empire, the most central European institution there ever was</li>
<li>OK it was in the Soviet bloc, but like Poland and Hungary were as vassal states, not like Russia was</li>
<li>Speaks a Slavic language, which tends to code easternness (but then cf Romania, which speaks a non-Slavic langauge and is coded way more eastern). Also their script has been Latin since the Middle Ages.</li>
<li>More geographically west and less religiously Orthodox than Greece which is not eastern because they invented democracy and philosophy and stuff and the Mediterranean gets you a pass for some reason?</li>
<li>Godless, which is to say, has not joined the eastern trend to re-embrace religion as a marker of identity post communism</li>
<li>Successfully invaded by Hitler in 1938, but not successfully invaded by Stalin in 1948 (unlike Hungary and Poland)</li>
<li>They sauna naked (unlike the Russians, but like the Scandinavians)</li>
<li>Invented the protestant reformation 80 years before Luther and <a href="https://en.wikipedia.org/wiki/Hussite_Wars?ref=danmackinlay.name">fought a war about it</a>. What could be more central European than a war of protestant peasants against an oppressive church?</li>
<li>To paraphrase my Romanian colleague Teodora, “pfft you call this eastern? you should see Romania.”</li>
</ul>
<p>Conclusion: No more eastern than Slovenia, and more central than Hungary and Poland. Therefore: Central.</p>
<p>Now, a more interesting case is former partner state Slovakia. Are <em>they</em> central or eastern Europe? This question is left as an exercise for the reader.</p>
</section>
<section id="prague" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="prague"><span class="header-section-number">6</span> Prague</h2>
<p>OK, it is actually pretty. Decayed imperial grandeur, baroque churches, gothic cathedrals, Art Nouveau facades, and a river running through it. Overlaid soviet utilitarianism, low-budget 90s lowest-bidder capitalist renovation. Not quite as pretty as Venice, say, but way more lived-in and less museum-y. By which I mean, it is less museum-<em>like</em>.</p>
<p>It is probably more museum-<em>dense</em>. Wow, so many museums! Some really fancy-sounding ones, and a long tail of very random shit; Madame Tussaud’s franchise, chocolate shops with “chocolate museums” attached to them, and some really suspect Ripley-axis stuff, e.g.&nbsp;“Museum of Sex Machines”.</p>
<p>More tourists than I was expecting, but like, even in the old town, also some normal humans doing non-tourist lives in between the tourists. The mix of tourists, Habsburg cosplayers and philosophy students on their way to band practice seems fine?</p>
<section id="bikes" class="level3" data-number="6.1">
<h3 data-number="6.1" class="anchored" data-anchor-id="bikes"><span class="header-section-number">6.1</span> Bikes</h3>
<div id="fig-lol-no-prague-bikes" class="right figure quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-lol-no-prague-bikes-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/lol_no_prague_bikes.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-3" title="Figure&nbsp;3: Hahah don’t go the direct route, it will be more fun to go through this cobblestone mall full of ambling tourists"><img src="https://danmackinlay.name/images/lol_no_prague_bikes.avif" class="right figure img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-lol-no-prague-bikes-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;3: Hahah don’t go the direct route, it will be more fun to go through this cobblestone mall full of ambling tourists
</figcaption>
</figure>
</div>
<p>So far, Prague’s bike infrastructure is meh. I would describe it as being at the level of “90s in Australia but with more cobblestones”. Also the riding directions are aggressively bad on Apple Maps, like “Please ignore the bitumen road and take this much longer detour via some cobbled pedestrian walking street which is both more crowded and more difficult to ride on” Figure&nbsp;3.</p>
<p>To be fair, Apple Maps generally sucks here. Google Maps is the main game.</p>
</section>
<section id="workout-stations" class="level3" data-number="6.2">
<h3 data-number="6.2" class="anchored" data-anchor-id="workout-stations"><span class="header-section-number">6.2</span> Workout stations</h3>
<ul>
<li><a href="https://maps.apple.com/?q=Fitness+Park+RVL13+Riegrovy+Sady&amp;ll=50.0804018,14.443552&amp;ref=danmackinlay.name">Fitness Park RVL13 – Riegrovy Sady</a>. Inside the popular Riegrovy Sady park in Vinohrady (Prague 2). Full calisthenics setup with gym foam flooring, good shade, and a public toilet 12 metres away. I’ve been using this one.</li>
<li><a href="https://maps.apple.com/?q=Workout+Hriste+Viktoria+Zizkov&amp;ll=50.0846291,14.4448248&amp;ref=danmackinlay.name">Workout Hřiště u FK Viktoria Žižkov</a> — Prague 3, right next to a tram stop making it very easy to reach. Covers all muscle groups, good surface for ground-level exercises too.</li>
<li><a href="https://maps.apple.com/?q=Venkovni+Posilovna+Vinohrady&amp;ll=50.0725381,14.4445134&amp;ref=danmackinlay.name">Venkovní Posilovna Vinohrady</a> — Prague 10, solid pull-up and dip bar setup.</li>
<li><a href="https://maps.apple.com/?q=Workout+Place+V+Olsinach&amp;ll=50.0723383,14.495670&amp;ref=danmackinlay.name">Workout Place – V Olšinách</a> — Quieter spot in Prague 10 in a park setting.</li>
<li><a href="https://maps.apple.com/?q=Street+Workout+Hriste+Prosek&amp;ll=50.1197621,14.4925579&amp;ref=danmackinlay.name">Street Workout Hřiště Prosek</a> — Prague 9, pull-up bars, parallel bars, abs benches.</li>
</ul>
</section>
<section id="saunas" class="level3" data-number="6.3">
<h3 data-number="6.3" class="anchored" data-anchor-id="saunas"><span class="header-section-number">6.3</span> Saunas</h3>
<p>TBD. I had better return and find out.</p>
</section>
</section>
<section id="incoming" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="incoming"><span class="header-section-number">7</span> Incoming</h2>
<ul>
<li>TODO: get corrected on all of the above by someone who lives there.</li>
</ul>
</section>
<section id="references" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="references"><span class="header-section-number">8</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Ellis2019Mendels" class="csl-entry">
Ellis, Hofer, Swain, et al. 2019. <span>“<a href="https://doi.org/10.1186/s41065-019-0111-y">Mendel’s Pea Crosses: Varieties, Traits and Statistics</a>.”</span> <em>Hereditas</em>.
</div>
<div id="ref-Fisher1936Has" class="csl-entry">
Fisher. 1936. <span>“<a href="https://doi.org/10.1080/00033793600200111">Has Mendel’s Work Been Rediscovered?</a>”</span> <em>Annals of Science</em>.
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>A short list, admittedly.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Europe</category>
  <category>place</category>
  <guid>https://danmackinlay.name/notebook/czechia.html</guid>
  <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/Prager.Fenstersturz.1618.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Homunculi all the way down</title>
  <link>https://danmackinlay.name/notebook/homunculi.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>Research-background notes. I want to pin down what it would mean, formally, for a social entity to contain a reduced-rank model of another social entity — possibly even a reduced-rank model of <em>itself</em>. Here are the formalisms I’m aware of, drawing on LLM lit review, some PDFs I had in a folder, and some vibes-y dot points I sketched out at the <a href="../post/pibbss_x_iliad.html">PIBBS x ILIAD residency</a>.</p>
<div class="callout callout-style-simple callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Adjacent run-ups
</div>
</div>
<div class="callout-body-container callout-body">
<p>One of several notebooks I started on the same underlying problem. The others are <a href="../notebook/agency_bounded_compute.html">agency_bounded_compute</a> (the foundational why-must-the-agent-compress angle) and <a href="../notebook/ai_economics_of_cognition.html">ai_economics_of_cognition</a> (compute as a substitutable factor of production). I think that I have run into a dead end with this one. My current working hypothetis is that I have more success starting from <a href="../notebook/causality_mechanization_decisions.html">mechanised causal graphs</a>.</p>
</div>
</div>
<div id="fig-vanmuydenlaboratory" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-vanmuydenlaboratory-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/vanmuydenlaboratory.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/vanmuydenlaboratory.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-vanmuydenlaboratory-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<section id="a-phenomenon-of-note" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="a-phenomenon-of-note"><span class="header-section-number">1</span> A phenomenon of note</h2>
<p>A mind modelling another mind is an agent embedded in an environment that contains agents with comparable representational capacity to itself. If the only faithful model of Alice is Alice, then Bob cannot fit one in his head. A practical Bob must carry a <em>compressed</em> Alice: fewer parameters, coarser predictions, maybe with a cartoon-level ontology. Call this a <em>reduced-rank other-model</em>.<sup>1</sup></p>
<p>Bob must also act, and acting well might require that Bob predict <em>his own</em> future behaviour. If the only faithful model of Bob is Bob, he cannot fit one of those in his head either. So Bob carries a “reduced-rank” self-model. This self-model is what <a href="https://en.wikipedia.org/wiki/Thomas_Metzinger?ref=danmackinlay.name">Metzinger</a> calls the <em>phenomenal self-model</em> <span class="citation" data-cites="Metzinger2003Being">(Metzinger 2003)</span>, what Graziano’s <em>Attention Schema Theory</em> <span class="citation" data-cites="Graziano2013Consciousness">(Graziano 2013)</span> makes into a neural control-theoretic object, and what Schmidhuber-flavoured AI calls a <em>world-model-containing-self</em> <span class="citation" data-cites="Ha2018World">(Ha and Schmidhuber 2018)</span>.</p>
<p>The bicameral-mind literature <span class="citation" data-cites="Jaynes1976Origin">(Jaynes 1976)</span> sounds like it’s somewhat related — the sense that “I” am addressed by a voice that is also “I” — but it doesn’t seem formal enough to build on, so I will basically ignore it here.</p>
<p>I can think of three axes along which theories might vary:</p>
<ol type="1">
<li><strong>Other-modelling.</strong> How do formalisms represent nested belief (“I think that you think that I think…”)?</li>
<li><strong>Self-modelling.</strong> How do formalisms represent an agent that contains a compressed simulacrum of itself?</li>
<li><strong>Reduced rank.</strong> By <em>rank</em> I mean the computational fidelity of a sub-model — the bits or parameters devoted to it, equivalently the resolution at which it can discriminate the situations it cares about. How is this reduction made rigorous — rate-distortion, PAC bounds, etc.?</li>
</ol>
</section>
<section id="other-models" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="other-models"><span class="header-section-number">2</span> Other-models</h2>
<section id="interactive-pomdps" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="interactive-pomdps"><span class="header-section-number">2.1</span> Interactive POMDPs</h3>
<p>Gmytrasiewicz and Doshi’s <em>interactive partially observable Markov decision processes</em> (I-POMDPs) <span class="citation" data-cites="Gmytrasiewicz2005Framework">(Gmytrasiewicz and Doshi 2005)</span> provide one formulation of recursive belief. The state space of any one agent is augmented with <em>models of the other agents</em>, which themselves include models of <em>this</em> agent, and so on. A finitely-nested I-POMDP truncates the recursion at level <img src="https://latex.codecogs.com/png.latex?k"> — agents at level 0 treat others as noise; level 1 models level-0s; level 2 models level-1s; and so on. This is an operationalisation of “reduced rank”: the recursion is cut off, and the depth is tunable.</p>
<p>Suggestively related work in game theory:</p>
<ul>
<li><strong>Level-k / cognitive hierarchy</strong> models in behavioural game theory <span class="citation" data-cites="Camerer2004Cognitive">(Camerer, Ho, and Chong 2004)</span>, where players assume others are reasoning at a lower level than themselves. Humans reportedly cluster at <img src="https://latex.codecogs.com/png.latex?k%20%5Cin%20%5C%7B0,1,2%5C%7D">.</li>
<li><strong>Quantal response equilibrium</strong> <span class="citation" data-cites="McKelvey1995Quantal">(McKelvey and Palfrey 1995)</span>, where bounded rationality is modelled by stochastic best-response rather than a deeper recursion.</li>
<li><strong>Epistemic game theory</strong> <span class="citation" data-cites="Dekel2015Epistemic">(Dekel and Siniscalchi 2015)</span>, which formalises <a href="../notebook/common_knowledge.html">common knowledge</a>, common belief, and the belief hierarchies above.</li>
</ul>
</section>
<section id="bayesian-theory-of-mind" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="bayesian-theory-of-mind"><span class="header-section-number">2.2</span> Bayesian Theory of Mind</h3>
<p>Baker, Saxe, and Tenenbaum <span class="citation" data-cites="Baker2017Rational Baker2011Bayesian">(C. L. Baker et al. 2017; C. Baker, Saxe, and Tenenbaum 2011)</span> formalise human social cognition as inverse planning: observers invert a generative model of rational action to infer the latent goals and beliefs of others. The other-model here is the generative model — typically a small MDP or POMDP parameterised by a utility and belief — and inference is Bayesian. This gives us a concrete <em>posterior over other minds’ rationality and actions</em> that one can compute with and prove things about.</p>
</section>
<section id="machine-theory-of-mind" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="machine-theory-of-mind"><span class="header-section-number">2.3</span> Machine Theory of Mind</h3>
<p>Rabinowitz et al.’s <em>ToMnet</em> <span class="citation" data-cites="Rabinowitz2018Machine">(Rabinowitz et al. 2018)</span> is a deep-learning analogue: a meta-learning agent that, from a few observations of a target agent, infers an embedding which predicts the target’s future behaviour. The embedding <em>is</em> the reduced-rank other-model. ToMnet variants have been extended to false-belief tasks and inverse-RL settings <span class="citation" data-cites="Oguntola2023Theory">(Oguntola et al. 2023)</span>.</p>
<p>Oguntola and colleagues push ToMnet toward interpretability with Concept Bottleneck Models <span class="citation" data-cites="Oguntola2021Deep">(Oguntola, Hughes, and Sycara 2021)</span>: the network is forced to predict named mental-state concepts (the opponent <em>believes</em> the door is locked, <em>wants</em> the key) before producing an action, so the recursive belief-state is in principle inspectable by a human overseer. The catch, as ever, is concept leakage — the net routes information around the bottleneck through residual pathways and re-hides the mental states the bottleneck was meant to expose <span class="citation" data-cites="Margeloiu2021Do">(Margeloiu et al. 2021)</span>. The same pathology is plausibly what any <img src="https://latex.codecogs.com/png.latex?%5CPhi">-probe on a residual stream will face (below).</p>
</section>
<section id="opponent-modelling-in-multi-agent-rl" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="opponent-modelling-in-multi-agent-rl"><span class="header-section-number">2.4</span> Opponent-modelling in multi-agent RL</h3>
<p>This also has a game-theoretic shape if you squint at it, but with learning theory sprinkled on top.</p>
<ul>
<li><strong>LOLA</strong> (Learning with Opponent-Learning Awareness) <span class="citation" data-cites="Foerster2018Learning">(Foerster et al. 2018)</span> computes gradients <em>through</em> a model of the opponent’s learning dynamics. This is a differentiable other-model.</li>
<li><strong>COLA, POLA, M-FOS</strong> and successors refine LOLA with higher-order or policy-level models <span class="citation" data-cites="Willi2022COLA Zhao2022Proximal Lu2022ModelFree">(Willi et al. 2022; Zhao et al. 2022; Lu et al. 2022)</span>.</li>
<li><strong><a href="../notebook/opponent_shaping.html">Opponent shaping</a></strong> more generally treats the other agent as a learnable dynamical system, which is a particular operationalisation of “the other is a reduced-rank version of me”.</li>
<li><strong>Self Other-Modelling</strong> (SOM) <span class="citation" data-cites="Raileanu2018Modeling">(Raileanu et al. 2018)</span> takes the last bullet literally: the agent uses its <em>own</em> policy to predict the other agent’s actions, and online-updates a belief over the other’s hidden goal. A single generative model is reconfigured between egocentric and allocentric readings of the same observation. This is computational simulation theory — model the other by running your own machinery with the other’s sensors wired in — and it induces cooperation in imperfect-information resource-gathering without reward shaping or explicit communication. In the budget frame below it is the corner case where the self-model <em>is</em> the other-model and pays for both with the same bits.</li>
</ul>
</section>
<section id="llms-and-emergent-theory-of-mind" class="level3" data-number="2.5">
<h3 data-number="2.5" class="anchored" data-anchor-id="llms-and-emergent-theory-of-mind"><span class="header-section-number">2.5</span> LLMs and emergent theory of mind</h3>
<p>The question of whether transformer language models contain an implicit theory of mind has generated a cottage industry <span class="citation" data-cites="Kosinski2023Theory Ullman2023Large Sclar2023Minding Gandhi2023Understanding">(Kosinski 2023; Ullman 2023; Sclar et al. 2023; Gandhi et al. 2023)</span>. The answer seems to be that they carry shallow heuristics that look like ToM on canonical tasks and break on adversarial ones. Whatever they do have is, almost by construction, a reduced-rank model: compressed into attention patterns and residual-stream features.</p>
</section>
<section id="mechanised-causal-graphs" class="level3" data-number="2.6">
<h3 data-number="2.6" class="anchored" data-anchor-id="mechanised-causal-graphs"><span class="header-section-number">2.6</span> Mechanised causal graphs</h3>
<p>Causal games <span class="citation" data-cites="Hammond2023Reasoning">(Hammond et al. 2023)</span> and mechanised causal Bayesian networks <span class="citation" data-cites="MacDermott2023Characterising">(MacDermott, Everitt, and Belardinelli 2023)</span> supply the graph-theoretic vocabulary for the formalisms above. Each object variable <img src="https://latex.codecogs.com/png.latex?V"> acquires a <em>mechanism parent</em> <img src="https://latex.codecogs.com/png.latex?%5Ctilde%7BV%7D">: if <img src="https://latex.codecogs.com/png.latex?V"> is an agent’s decision <img src="https://latex.codecogs.com/png.latex?D">, then <img src="https://latex.codecogs.com/png.latex?%5Ctilde%7BD%7D"> is its decision rule. The strategic structure — who observes what, who chooses what — lives at the mechanism layer, and reasoning about an agent becomes reasoning over a graph of mechanism variables connected by edges of <em>strategic relevance</em>.</p>
<p>Two things matter for us.</p>
<p>One, what Bob carries of Alice has to be a model of Alice’s <em>mechanism</em>, not of Alice’s <em>output</em>. A pure action-predictor short-circuits the recursion: any Alice who outsmarts the predictor falsifies it, and the graph picks up a cycle <span class="citation" data-cites="MacDermott2023Characterising">(MacDermott, Everitt, and Belardinelli 2023)</span>. This is a graphical criterion for what counts as a model-of-another-agent in the first place, and it rhymes with the observer-relative construction in <span class="citation" data-cites="Virgo2025Good">Virgo et al. (2025)</span> at <a href="../notebook/internal_models.html">internal models</a>. Different formalisms, same shape of constraint — what Bob represents of Alice is a map to mechanism-space, not to action-space.</p>
<p>Two, one rung of mechanism-level modelling is native to the framework, but deeper recursion is not — there is no <img src="https://latex.codecogs.com/png.latex?%5Ctilde%7B%5Ctilde%7BD%7D%7D">. Hammond et al.&nbsp;recover depth by <em>unrolling</em> a mechanised MAID into an extensive-form game, with the familiar exponential blow-up in tree size. In the budget frame below that exponential is the cost of depth in this particular vocabulary — nodes rather than, say, bits.</p>
</section>
</section>
<section id="self-models-the-formal-landscape" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="self-models-the-formal-landscape"><span class="header-section-number">3</span> Self-models: the formal landscape</h2>
<section id="world-models-containing-self" class="level3" data-number="3.1">
<h3 data-number="3.1" class="anchored" data-anchor-id="world-models-containing-self"><span class="header-section-number">3.1</span> World models containing self</h3>
<div id="fig-wat-arse" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-wat-arse-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="images/wat_arse_D12976.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-2" title="Figure&nbsp;2: Knowing thyself through reflection"><img src="https://danmackinlay.name/notebook/images/wat_arse_D12976.avif" class="figure illustration right img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-wat-arse-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Knowing thyself through reflection
</figcaption>
</figure>
</div>
<p>A direct ML instantiation is Ha &amp; Schmidhuber’s <em>World Models</em> <span class="citation" data-cites="Ha2018World">(Ha and Schmidhuber 2018)</span>, where a recurrent latent model predicts both environment dynamics <em>and</em> the consequences of the agent’s own actions. The agent’s policy is trained inside this compressed dreamscape. The self here is a reduced-rank conditional — “what would my controller do, given this latent” — rather than an introspectable entity, but the “compression” part sounds well-posed.</p>
<p>The lineage continues through Dreamer <span class="citation" data-cites="Hafner2024Mastering">(Hafner et al. 2024)</span>, MuZero <span class="citation" data-cites="Schrittwieser2020Mastering">(Schrittwieser et al. 2020)</span>, and the larger world-model-RL programme.</p>
<p>See also <a href="../notebook/world_models.html">world models</a>.</p>
</section>
<section id="active-inference-and-the-self-as-generative-model" class="level3" data-number="3.2">
<h3 data-number="3.2" class="anchored" data-anchor-id="active-inference-and-the-self-as-generative-model"><span class="header-section-number">3.2</span> Active inference and the self as generative model</h3>
<p><a href="../notebook/predictive_coding.html">Active inference</a> <span class="citation" data-cites="Friston2017Active Parr2022Active">(Friston et al. 2017; Parr, Pezzulo, and Friston 2022)</span> treats the agent as a generative model of its own sensorium, including its own actions. Free-energy minimisation forces the self-model to be as compressed as is consistent with prediction — a direct rate-distortion pressure. The <em>self</em> here is a probabilistic model with the agent’s own observation-action trajectory as a latent.</p>
</section>
<section id="self-modelling-robots" class="level3" data-number="3.3">
<h3 data-number="3.3" class="anchored" data-anchor-id="self-modelling-robots"><span class="header-section-number">3.3</span> Self-modelling robots</h3>
<p>A concrete line: Bongard, Zykov, and Lipson’s <em>Resilient Machines Through Continuous Self-Modeling</em> <span class="citation" data-cites="Bongard2006Resilient">(Bongard, Zykov, and Lipson 2006)</span> — a quadruped robot that learns a forward model of its own body, then uses it to plan locomotion; when a limb is damaged, the model updates, and the robot recovers. The self-model is an explicit, parameterised, low-rank dynamical system. See the follow-up <span class="citation" data-cites="Kwiatkowski2019Taskagnostic">(Kwiatkowski and Lipson 2019)</span> for differentiable variants.</p>
</section>
<section id="attention-schema-theory" class="level3" data-number="3.4">
<h3 data-number="3.4" class="anchored" data-anchor-id="attention-schema-theory"><span class="header-section-number">3.4</span> Attention Schema Theory</h3>
<p>Graziano <span class="citation" data-cites="Graziano2013Consciousness Graziano2019Standard">(Graziano 2013; Graziano et al. 2019)</span> argues that consciousness <em>is</em> the brain’s (incomplete, schematic) model of its own attention. This is explicitly a reduced-rank model: the schema is coarser than the machinery it represents, because representing attention in full would require as much machinery as attention itself. Kaplan, Dolan, and colleagues have attempted to operationalise this in neural-network models <span class="citation" data-cites="Wilterson2021Attention">(Wilterson and Graziano 2021)</span>.</p>
</section>
<section id="schmidhuber-and-reflective-learners" class="level3" data-number="3.5">
<h3 data-number="3.5" class="anchored" data-anchor-id="schmidhuber-and-reflective-learners"><span class="header-section-number">3.5</span> Schmidhuber and reflective learners</h3>
<p>Schmidhuber’s early work on <em>self-referential neural networks</em> <span class="citation" data-cites="Schmidhuber1993SelfReferential">(Schmidhuber 1993)</span> and later <em>Gödel machines</em> <span class="citation" data-cites="Schmidhuber2003Godel">(Schmidhuber 2003)</span> formalises learners that inspect and modify their own code, subject to provability constraints. The Gödel-machine construction is where the <em>proof-theoretic</em> aspect of self-modelling seems to cause grief: self-modification is gated by a proof that the modification improves expected utility.</p>
</section>
<section id="predictive-coding-and-hierarchical-self" class="level3" data-number="3.6">
<h3 data-number="3.6" class="anchored" data-anchor-id="predictive-coding-and-hierarchical-self"><span class="header-section-number">3.6</span> Predictive coding and hierarchical self</h3>
<p>Hierarchical predictive coding architectures <span class="citation" data-cites="Rao1999Predictive Clark2013Whatever">(Rao and Ballard 1999; Clark 2013)</span> include top-down predictions that span the whole sensory hierarchy, including proprioceptive and interoceptive signals — i.e., representations <em>of</em> the organism. See <a href="../notebook/predictive_coding.html">predictive coding</a>, again. And harder.</p>
</section>
<section id="reflective-llm-agents" class="level3" data-number="3.7">
<h3 data-number="3.7" class="anchored" data-anchor-id="reflective-llm-agents"><span class="header-section-number">3.7</span> Reflective LLM agents</h3>
<p>A lighter ML lineage treats self-reflection as a control loop over the decoder rather than as a learnt world-model. <em>Reflexion</em> <span class="citation" data-cites="Shinn2023Reflexion">(Shinn et al. 2023)</span> keeps a log of past behaviour, self-critiques, and revised plans in the context window, so the agent adjusts across episodes without any gradient update — verbal reinforcement learning rather than the usual kind. <em>Language Agent Tree Search</em> <span class="citation" data-cites="Zhou2023Language">(Zhou et al. 2024)</span> extends this to a Monte-Carlo tree search over action paths, with an LLM-powered value function and self-reflection pruning unpromising branches. The self-model here is an in-context transcript and the reflection is a prompt — coarse compared with active inference or Dreamer, and with no mechanism for the self-model to outlive the context. I include them as an existence proof for a reduced-rank self-model whose entire cost lives at inference time rather than in training, which is a distinct point on the budget frontier from everything above.</p>
</section>
</section>
<section id="reducing-fidelity-of-representation" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="reducing-fidelity-of-representation"><span class="header-section-number">4</span> Reducing fidelity of representation</h2>
<p>Several toolkits formalise “reduced rank”:</p>
<ul>
<li><strong>Rate-distortion theory</strong> applied to cognition <span class="citation" data-cites="Sims2012Ideal Zenon2019Informationtheoretic Lai2021Policy">(Sims, Jacobs, and Knill 2012; Zénon, Solopchuk, and Pezzulo 2019; Lai and Gershman 2021)</span>: the cost of mental representation is an information-theoretic rate, the benefit is task performance, and optimal bounded agents sit on the rate-distortion frontier.</li>
<li><strong><a href="../notebook/nearly_sufficient_statistics_bottlenecks.html">Information bottleneck</a></strong> <span class="citation" data-cites="Tishby2000Information Alemi2019Deep">(Tishby, Pereira, and Bialek 2000; Alemi et al. 2019)</span>: compress inputs to a latent that is maximally informative about a downstream variable. When the downstream variable is “the other agent’s next action”, the bottleneck induces a reduced-rank other-model.</li>
<li><strong>Resource-rational analysis</strong> <span class="citation" data-cites="Lieder2020Resourcerational">(Lieder and Griffiths 2020)</span>: agents are optimal given bounded compute; the bound is the reduction.</li>
<li><strong>Successor representations / features</strong> <span class="citation" data-cites="Dayan1993Improving Barreto2017Successor">(Dayan 1993; Barreto et al. 2017)</span>: compressed future-prediction models that generalise well across reward functions. A kind of reduced-rank self-model of one’s own policy.</li>
<li><strong><a href="../notebook/bounded_rationality.html">Bounded rationality</a></strong> as a research programme <span class="citation" data-cites="Simon1955Behavioral Russell1995Provably Russell2016Rationality">(Simon 1955; S. J. Russell and Subramanian 1995; S. Russell 2016)</span>.</li>
<li><strong><a href="../notebook/computational_mechanics.html">Epsilon-machines / computational mechanics</a></strong> <span class="citation" data-cites="Crutchfield1989Inferring Shalizi2000Computational">(Crutchfield and Young 1989; Shalizi and Crutchfield 2000)</span>: minimal-sufficient-statistic models of a process. The <em>causal states</em> are the minimum-rank predictor.</li>
</ul>
<p>My research agent further recommends we look at <em>theory of mind as mutual information</em> <span class="citation" data-cites="JaraEttinger2019Theory">(Jara-Ettinger 2019)</span> and the recent graph-theoretic accounts of <em>social abstraction</em> <span class="citation" data-cites="Stolk2016Conceptual">(Stolk, Verhagen, and Toni 2016)</span>.</p>
</section>
<section id="multi-agent-self" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="multi-agent-self"><span class="header-section-number">5</span> Multi-agent self</h2>
<p>The bicameral intuition — “the mind is many minds talking” — turns up across Minsky’s <em>Society of Mind</em> <span class="citation" data-cites="Minsky1986Society">(Minsky 1986)</span>, Global Workspace Theory <span class="citation" data-cites="Baars1993Cognitive Dehaene2014Consciousness">(Baars 1993; Dehaene 2014)</span> and its neural-network and RL formalisations <span class="citation" data-cites="VanRullen2021Deep Goyal2021Coordination">(VanRullen and Kanai 2021; Goyal et al. 2021)</span>, mixture of experts <span class="citation" data-cites="Jacobs1991Adaptive Shazeer2017Outrageously">(Jacobs et al. 1991; Shazeer et al. 2017)</span>, and Dennett’s multiple drafts <span class="citation" data-cites="Dennett1993Consciousness">(Dennett 1993)</span>. They share an architectural claim: the “self” is what falls out of specialist modules competing for a low-capacity shared bottleneck, and that bottleneck is where the reduced-rank self- and other-models have to sit. Attention Schema Theory (above) fits here too. Fuller treatment at <a href="../notebook/multi_agent_self.html">multi-agent self</a>.</p>
</section>
<section id="self-referential-agents-and-the-proof-theoretic-frontier" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="self-referential-agents-and-the-proof-theoretic-frontier"><span class="header-section-number">6</span> Self-referential agents and the proof-theoretic frontier</h2>
<p>This is where <em>reflectivity</em> — the pressure for an agent’s beliefs about its own future beliefs to be consistent — becomes a first-class concern. If we want to <em>prove</em> things about minds that model themselves, we hit self-reference, and self-reference hits Löb’s theorem and friends if we’re not careful. As presaged, I am not super excited about the parts of this line of work that edge into unbounded compute.</p>
<p>Reflectivity is operationalised differently by each of the constructions below, and each buys self-consistency in a different coin — fixed-point iteration, market mixing, proof search — so its “cost” lives on a different axis depending on who you ask. I’ll treat its cost as real but construction-dependent.</p>
<ul>
<li><strong>The self-consistency cluster.</strong> Reflective oracles <span class="citation" data-cites="Fallenstein2015Reflective">(Fallenstein, Taylor, and Christiano 2015)</span> (a fixed-point construction of probability distributions closed under self-reference), logical induction <span class="citation" data-cites="Garrabrant2020Logical">(Garrabrant et al. 2020)</span> (a market-based learner whose beliefs about its own future beliefs converge), and the Löbian obstacle <span class="citation" data-cites="Yudkowsky2013Tiling">(Yudkowsky and Herreshoff 2013)</span> (the negative result that a self-modifying agent unwilling to endorse a weaker-or-equal successor runs into Löb’s theorem): three constructions attacking the same self-consistency problem in three different coins.</li>
<li><strong>Modal combat agents</strong> and <em>program equilibrium</em> <span class="citation" data-cites="Barasz2014Robust Critch2019Parametric">(Bárász et al. 2014; Critch 2019)</span>: agents that condition on source-code-level models of each other; admits bona fide equilibria in the one-shot prisoner’s dilemma.</li>
<li><strong>AIXI and approximations</strong> <span class="citation" data-cites="Hutter2005Universal Leike2016Thompson">(Hutter 2005; Leike et al. 2016)</span>: a formally optimal agent whose self-model is implicit in the universal prior; computable approximations (e.g., AIXI-tl, MC-AIXI) buy tractability at the cost of reducing the rank of the prior.</li>
</ul>
<p>MIRI’s <a href="../notebook/agent_foundations.html">Agent Foundations</a> programme is the main hub for this line of work.</p>
</section>
<section id="lets-attempt-synthesis" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="lets-attempt-synthesis"><span class="header-section-number">7</span> Let’s attempt synthesis!</h2>
<p>The three axes above — other-modelling, self-modelling, reduced-rank — are not independent knobs an architect sets arbitrarily. I’d argue they are three demands on the compute embedded in a single joint representation carried by a social agent — depth of recursion, rank of each sub-model, and reflectivity — competing for the same finite resources. This is of a piece with my general heuristic that we should always think about <a href="../notebook/ai_economics_of_cognition.html">where to spend our compute</a> to make sense of the AI landscape as it exists.</p>
<p>“Compute” here is a cover term: it lumps together bits of representation at rest, operations per decision, and data to fit the representation in the first place. These don’t fully interchange, and nobody defines a fungible unit that resolves the trade-offs cleanly AFAIK. For the argument that follows the weaker claim is enough — that the three axes all draw on a shared pool, and that each spends it through its own, largely unknown, return on investment. Rate-distortion theory gives a concave <img src="https://latex.codecogs.com/png.latex?R(D)"> for rank <span class="citation" data-cites="Sims2012Ideal">(Sims, Jacobs, and Knill 2012)</span>; the analogous curves for recursion depth and reflectivity are open problems.</p>
<p>On this reading the existing literature is a tour of <em>corner solutions</em>: each framework spends its compute on one or two axes and lets the rest go to zero.</p>
<ul>
<li><strong>I-POMDPs</strong> and <strong>level-<img src="https://latex.codecogs.com/png.latex?k"> / cognitive hierarchy</strong>: spend on depth; each level is a cartoon of the next. Humans clustering at <img src="https://latex.codecogs.com/png.latex?k%20%5Cin%20%5C%7B0,1,2%5C%7D"> is consistent with a small budget.</li>
<li><strong>Rate-distortion cognition</strong>, <strong>information bottleneck</strong>, <strong>successor features</strong>: spend on rank at fixed depth (<img src="https://latex.codecogs.com/png.latex?k=1">); reflectivity ignored.</li>
<li><strong>Reflective oracles</strong>, <strong>logical induction</strong>, <strong>Gödel machines</strong>: spend on reflectivity; other-structure kept simple enough that the construction survives.</li>
<li><strong>Active inference</strong>: allocation across self- and world-model; depth and reflectivity implicit.</li>
<li><strong>LOLA / opponent shaping</strong>: <img src="https://latex.codecogs.com/png.latex?k=2">; rank inherited from the opponent’s parameter count.</li>
<li><strong>World models</strong> (Ha/Schmidhuber, Dreamer, MuZero): storage in the latent dimension; <img src="https://latex.codecogs.com/png.latex?k=1">; reflectivity absent.</li>
<li><strong>ToMnet</strong> and <strong>I-POMDP-Net</strong> <span class="citation" data-cites="Han2019IPOMDPNet">(Han and Gmytrasiewicz 2019)</span>: learned reduced-rank other-models; <img src="https://latex.codecogs.com/png.latex?k%20%5Cle%202">; reflectivity absent.</li>
<li><strong>SOM</strong> <span class="citation" data-cites="Raileanu2018Modeling">(Raileanu et al. 2018)</span>: <img src="https://latex.codecogs.com/png.latex?k=1"> with self-model and other-model sharing bits; reflectivity absent. A case of the axes interacting rather than competing.</li>
<li><strong>Reflexion / LATS</strong> <span class="citation" data-cites="Shinn2023Reflexion Zhou2023Language">(Shinn et al. 2023; Zhou et al. 2024)</span>: inference-time reflectivity over an in-context self-model; no learnt other-model; rank bounded by the context window.</li>
</ul>
<section id="depth-as-a-profile" class="level3" data-number="7.1">
<h3 data-number="7.1" class="anchored" data-anchor-id="depth-as-a-profile"><span class="header-section-number">7.1</span> Depth as a profile</h3>
<p>The “depth” axis above reads as a single number <img src="https://latex.codecogs.com/png.latex?k"> in level-<img src="https://latex.codecogs.com/png.latex?k"> and I-POMDP treatments, but that collapses some structure worth pulling apart. Bob regulates a scene that contains Alice; there is a natural partial ordering on what kind of thing Alice can be inside Bob’s world-model.</p>
<ol start="0" type="1">
<li>Alice as noise — a draw from a distribution over behaviours. No agent-shaped variables in Bob’s ontology.</li>
<li>Alice as a stateful process — memory, non-Markovian dynamics, possibly a “type” Bob is inferring. Not intentional.</li>
<li>Alice as a belief-carrier whose model of Bob is type-0. She has goals, she is optimising against a world-model, but that world-model contains Bob only as noise.</li>
<li>Alice as a belief-carrier whose Bob-model is type-1. She conditions on Bob’s type but does not treat him as intentional.</li>
<li>Alice as a belief-carrier whose Bob-model is itself belief-carrying. Recursion; the same classification applies at the next rung.</li>
</ol>
<p>Scalar <img src="https://latex.codecogs.com/png.latex?k"> is the uniform case: every rung up to depth <img src="https://latex.codecogs.com/png.latex?k"> is type-4, and the chain terminates in type-0 at the bottom. What the scalar flattens is the <em>profile</em> — a sequence of (ontology type, rank) pairs along the chain, which in general need not be uniform. In particular it throws away <em>asymmetric drop-off</em>: “Alice thinks I am nearly noise” (type-2 terminal) and “Alice thinks I am stateful” (type-3 terminal) are both depth-2 in scalar terms, but play differently. In the first Bob has slack to act unpredictably; in the second Alice is already conditioning on his type, and only type-misrepresentation is exploitable. Budget-constrained agents probably allocate non-uniformly — most of their rank on the first rung or two, terminating early into type 0 or 1. The human plateau at <img src="https://latex.codecogs.com/png.latex?k%20%5Cin%20%5C%7B0,1,2%5C%7D"> is at least as consistent with this as with “humans can’t recurse further”, and the shallow-but-lopsided flavour of LLM-ToM failure <span class="citation" data-cites="Ullman2023Large">(Ullman 2023)</span> looks similar.</p>
<p>Two scalars suggest themselves in place of <img src="https://latex.codecogs.com/png.latex?k"> and they answer different questions: chain length (the traditional quantity), and total rank spent on reflection, <img src="https://latex.codecogs.com/png.latex?%5Csum_i%20R_i"> along the chain. The budget frame of this post is more naturally the second; the level-<img src="https://latex.codecogs.com/png.latex?k"> literature has mostly used the first.<sup>2</sup></p>
<p>Humans, LLMs, and the agents we would actually like to build do not sit at any corner. They are interior points, and the interior is where unwritten papers live.</p>
</section>
</section>
<section id="angles-of-attack" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="angles-of-attack"><span class="header-section-number">8</span> Angles of attack</h2>
<p>I got an LLM to ideate below ideas for me. Lightly edited for baseline sanity. The budget view suggests several angles of attack on what we actually care about — understanding how real cognition, human or machine, allocates its compute across world, self, and other. Two concrete ones, plus a brief aside on scaling the same calculus to collectives.</p>
<section id="finding-phi-in-a-transformer" class="level3" data-number="8.1">
<h3 data-number="8.1" class="anchored" data-anchor-id="finding-phi-in-a-transformer"><span class="header-section-number">8.1</span> Finding <img src="https://latex.codecogs.com/png.latex?%5CPhi"> in a transformer</h3>
<p>The synthesis above says a bounded social agent carries a structured latent — call it <img src="https://latex.codecogs.com/png.latex?%5CPhi"> — partitioned into world, self, each other, and reflective bookkeeping. The ToM-in-LLMs literature <span class="citation" data-cites="Kosinski2023Theory Ullman2023Large">(Kosinski 2023; Ullman 2023)</span> presently seems to treat these pieces as present-or-absent behavioural properties. If a frontier model has acquired any social competence under finite pretraining compute, there should be detectable structure in <img src="https://latex.codecogs.com/png.latex?%5CPhi"> tracking these pieces — not necessarily a neat partition, because superposition lets a learner share parameters across sparse features, but some signature visible to the right probe.</p>
<p>That is a mechanistic-interpretability problem. Run sparse-autoencoder or dictionary-learning analysis on the residual stream during ToM-style tasks, and look for:</p>
<ul>
<li>a low-rank subspace whose ablation selectively breaks co-agent prediction without breaking world-prediction;</li>
<li>a disjoint self-model subspace whose ablation breaks in-character behaviour but not factual recall;</li>
<li>approximately no reflective-bookkeeping subspace in base models, and a small one in post-RLHF models — which are rewarded for consistency with a remembered “I”, and so should be under pressure to allocate bits to reflective bookkeeping that a base model is not.</li>
</ul>
<p>If the structure is not there, one of three things is wrong: the framework, our assumption that representational storage is actually binding for this class of model, or our belief that the pretraining signal actually rewards social prediction rather than a confound. Each possibility is informative. If the structure <em>is</em> there, we have an interpretability handle on social cognition specifically, rather than features in general.</p>
</section>
<section id="a-value-of-reflectivity-calculation" class="level3" data-number="8.2">
<h3 data-number="8.2" class="anchored" data-anchor-id="a-value-of-reflectivity-calculation"><span class="header-section-number">8.2</span> A value-of-reflectivity calculation</h3>
<p>The MIRI tradition treats reflectivity as a correctness property: a reasoner that cannot consistently model its own reasoning has a bug, and the whole <a href="../notebook/agent_foundations.html">agent foundations</a> edifice is a search for bug-free constructions. The budget view recasts it as an economic question: when is it worth spending bits on reflective machinery, and when is it better to skip it?</p>
<p>An idea in this space is that reflectivity pays in proportion to the <em>reactivity</em> of the environment — the degree to which other agents, or future versions of oneself, condition on your <em>internal commitments</em> rather than just your past actions. Non-reactive one-shot stateless POMDPs: reflectivity is dispensable. Program-equilibrium and modal-combat settings <span class="citation" data-cites="Barasz2014Robust Critch2019Parametric">(Bárász et al. 2014; Critch 2019)</span>: reflectivity must be high, because opponents are literally reading your source. Open-ended self-modification (Gödel-machine style): Löbian obstacles arise exactly because reflectivity has to be preserved while the substrate is mutating underneath it.</p>
<p>A testable version of this, without the formalism: build toy environments in each regime — a non-reactive bandit, a modal-combat tournament, a self-modification sandbox — and train the same architecture across all three. The conjecture predicts that reflective structure (by whatever detector the <img src="https://latex.codecogs.com/png.latex?%5CPhi"> angle supplies) should emerge spontaneously in the second and third, and not the first. That is a scaling claim about spontaneous situational awareness under training pressure, and it falsifies in either direction.</p>
<p>Premakumar et al. <span class="citation" data-cites="Premakumar2024Unexpected">(Premakumar et al. 2024)</span> train networks with an auxiliary task of predicting their own internal activations and observe narrower weight distributions and reduced effective complexity — a “self-prediction-as-regularizer” effect. As a bonus the regularised networks are easier for <em>other</em> networks to model. If the effect replicates beyond their setting then reflectivity is paying for itself partly in rank elsewhere, which is the shape of trade-off the budget frame predicts. It also gives an interpretability-friendly story about alignment: agents incentivised to self-predict become more predictable to overseers, for free. <a href="https://www.lesswrong.com/posts/5se67gAcaExEYdCCg/self-prediction-acts-as-an-emergent-regularizer?ref=danmackinlay.name">The LessWrong writeup</a> makes the alignment spin explicit.</p>
</section>
<section id="aside-collectives-are-instrumentable" class="level3" data-number="8.3">
<h3 data-number="8.3" class="anchored" data-anchor-id="aside-collectives-are-instrumentable"><span class="header-section-number">8.3</span> Aside: collectives are instrumentable</h3>
<p>The same budget calculus should scale past individual minds. A firm, team, or agency is a social agent carrying compressed models of itself and its counterparties — self-model embodied in policy and narrative, other-models in competitor dossiers and customer segments, reflectivity in governance and audit. This complements the transformer angle above: organisations are, if anything, easier to instrument than LLMs — meeting notes, decision logs, communication graphs, and promotion criteria are legible in a way residual-stream activations are not. Mapping those proxies to rank, depth, and reflectivity is a separate project, but the framework commits to specific organisational over-allocations (governance theatre, regulatory capture, siloed product teams, academic insularity) being allocation failures of the same kind as the cognitive ones, which gives two independent scales at which to play with it.</p>
</section>
</section>
<section id="related" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="related"><span class="header-section-number">9</span> Related</h2>
<ul>
<li><a href="../notebook/agent_foundations.html">Agent foundations</a></li>
<li><a href="../notebook/causality_multi_agent.html">Causality in multi-agent systems</a></li>
<li><a href="../notebook/predictive_coding.html">Predictive coding</a></li>
<li><a href="../notebook/dunning_kruger_theory_of_mind.html">Dunning-Kruger theory of mind</a> — the failure modes of <em>human</em> other-models</li>
<li><a href="../notebook/iterated_social_games.html">Iterated social games</a></li>
</ul>
<div class="callout callout-style-simple callout-note callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Credit
</div>
</div>
<div class="callout-body-container callout-body">
<p>This notebook didn’t come from nowhere; I have been writing this to process ideas that I have been discussing with my colleagues. I am especially indebted to Martin Biehl, <a href="https://artemyk.github.io?ref=danmackinlay.name">Artemy Kolchinsky</a>, <a href="https://aclevername.substack.com?ref=danmackinlay.name">Chris Pang</a>, <a href="https://boundedlyrational.substack.com?ref=danmackinlay.name">Jan Kulveit</a> and <a href="https://www.tomeveritt.se?ref=danmackinlay.name">Tom Everitt</a>.</p>
</div>
</div>
</section>
<section id="incoming" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="incoming"><span class="header-section-number">10</span> Incoming</h2>
<ul>
<li>Dennett and Hofstadter’s <em>The Mind’s I</em> as a pre-formal reading list.</li>
<li>Hofstadter’s <em>strange loops</em> <span class="citation" data-cites="Hofstadter2008Am">(Hofstadter 2008)</span>: evocative, not formal, but a useful bridge.</li>
<li>Tononi’s IIT as a measure on self-models, if one is feeling brave.</li>
<li>Whether the “observer self” of contemplative traditions corresponds to an attention-schema-style reduced-rank self-model — this seems to be Metzinger’s read.</li>
</ul>
</section>
<section id="references" class="level2" data-number="11">
<h2 data-number="11" class="anchored" data-anchor-id="references"><span class="header-section-number">11</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Alemi2019Deep" class="csl-entry">
Alemi, Fischer, Dillon, et al. 2019. <span>“<a href="https://doi.org/10.48550/arXiv.1612.00410">Deep Variational Information Bottleneck</a>.”</span>
</div>
<div id="ref-Baars1993Cognitive" class="csl-entry">
Baars. 1993. <em>A Cognitive Theory of Consciousness</em>.
</div>
<div id="ref-Baker2017Rational" class="csl-entry">
Baker, Chris L., Jara-Ettinger, Saxe, et al. 2017. <span>“<a href="https://doi.org/10.1038/s41562-017-0064">Rational Quantitative Attribution of Beliefs, Desires and Percepts in Human Mentalizing</a>.”</span> <em>Nature Human Behaviour</em>.
</div>
<div id="ref-Baker2011Bayesian" class="csl-entry">
Baker, Chris, Saxe, and Tenenbaum. 2011. <span>“<a href="https://escholarship.org/uc/item/5rk7z59q">Bayesian Theory of Mind: Modeling Joint Belief-Desire Attribution</a>.”</span> <em>Proceedings of the Annual Meeting of the Cognitive Science Society</em>.
</div>
<div id="ref-Barasz2014Robust" class="csl-entry">
Bárász, Christiano, Fallenstein, et al. 2014. <span>“<a href="https://arxiv.org/abs/1401.5577">Robust Cooperation in the Prisoner’s Dilemma: Program Equilibrium via Provability Logic</a>.”</span> <em>arXiv.org</em>.
</div>
<div id="ref-Barreto2017Successor" class="csl-entry">
Barreto, Dabney, Munos, et al. 2017. <span>“<a href="http://arxiv.org/abs/1606.05312">Successor Features for Transfer in Reinforcement Learning</a>.”</span> In <em>Advances in Neural Information Processing Systems</em>.
</div>
<div id="ref-Berg2024Selfprediction" class="csl-entry">
Berg, Plumb, and Ganin. 2024. <span>“<a href="https://www.lesswrong.com/posts/5se67gAcaExEYdCCg/self-prediction-acts-as-an-emergent-regularizer">Self-Prediction Acts as an Emergent Regularizer</a>.”</span> <em>LessWrong</em>.
</div>
<div id="ref-Bilodeau2023Minimax" class="csl-entry">
Bilodeau, Foster, and Roy. 2023. <span>“<a href="https://doi.org/10.1214/23-AOS2270">Minimax Rates for Conditional Density Estimation via Empirical Entropy</a>.”</span> <em>The Annals of Statistics</em>.
</div>
<div id="ref-Bongard2006Resilient" class="csl-entry">
Bongard, Zykov, and Lipson. 2006. <span>“<a href="https://doi.org/10.1126/science.1133687">Resilient Machines Through Continuous Self-Modeling</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Camerer2004Cognitive" class="csl-entry">
Camerer, Ho, and Chong. 2004. <span>“<a href="https://doi.org/10.1162/0033553041502225">A Cognitive Hierarchy Model of Games</a>.”</span> <em>The Quarterly Journal of Economics</em>.
</div>
<div id="ref-Clark2013Whatever" class="csl-entry">
Clark. 2013. <span>“<a href="https://doi.org/10.1017/s0140525x12000477">Whatever Next? Predictive Brains, Situated Agents, and the Future of Cognitive Science</a>.”</span> <em>Behavioral and Brain Sciences</em>.
</div>
<div id="ref-Critch2019Parametric" class="csl-entry">
Critch. 2019. <span>“<a href="https://doi.org/10.1017/jsl.2017.42">A Parametric, Resource-Bounded Generalization of Löb’s Theorem, and a Robust Cooperation Criterion for Open-Source Game Theory</a>.”</span> <em>The Journal of Symbolic Logic</em>.
</div>
<div id="ref-Crutchfield1989Inferring" class="csl-entry">
Crutchfield, and Young. 1989. <span>“<a href="https://doi.org/10.1103/PhysRevLett.63.105">Inferring Statistical Complexity</a>.”</span> <em>Physical Review Letters</em>.
</div>
<div id="ref-Dayan1993Improving" class="csl-entry">
Dayan. 1993. <span>“<a href="https://doi.org/10.1162/neco.1993.5.4.613">Improving Generalization for Temporal Difference Learning: The Successor Representation</a>.”</span> <em>Neural Computation</em>.
</div>
<div id="ref-Dehaene2014Consciousness" class="csl-entry">
Dehaene. 2014. <em>Consciousness and the Brain: Deciphering How the Brain Codes Our Thoughts</em>.
</div>
<div id="ref-Dekel2015Epistemic" class="csl-entry">
Dekel, and Siniscalchi. 2015. <span>“<a href="https://doi.org/10.1016/b978-0-444-53766-9.00012-4">Epistemic Game Theory</a>.”</span> In.
</div>
<div id="ref-Dennett1993Consciousness" class="csl-entry">
Dennett. 1993. <em>Consciousness Explained</em>.
</div>
<div id="ref-Fallenstein2015Reflective" class="csl-entry">
Fallenstein, Taylor, and Christiano. 2015. <span>“<a href="https://doi.org/10.48550/arXiv.1508.04145">Reflective Oracles: A Foundation for Classical Game Theory</a>.”</span>
</div>
<div id="ref-Feng2020Online" class="csl-entry">
Feng, and Kirkley. 2020. <span>“<a href="https://arxiv.org/abs/2009.10461">Online Geolocalized Emotion Across US Cities During the COVID Crisis: Universality, Policy Response, and Connection with Local Mobility</a>.”</span> <em>arXiv.org</em>.
</div>
<div id="ref-Foerster2018Learning" class="csl-entry">
Foerster, Chen, Al-Shedivat, et al. 2018. <span>“<a href="http://arxiv.org/abs/1709.04326">Learning with Opponent-Learning Awareness</a>.”</span> In <em>Proceedings of the 17th International Conference on Autonomous Agents and MultiAgent Systems</em>. AAMAS ’18.
</div>
<div id="ref-Friston2017Active" class="csl-entry">
Friston, FitzGerald, Rigoli, et al. 2017. <span>“<a href="https://doi.org/10.1162/neco_a_00912">Active Inference: A Process Theory</a>.”</span> <em>Neural Computation</em>.
</div>
<div id="ref-Gandhi2023Understanding" class="csl-entry">
Gandhi, Franken, Gerstenberg, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2306.15448">Understanding Social Reasoning in Language Models with Language Models</a>.”</span> <em>Neural Information Processing Systems</em>.
</div>
<div id="ref-Garrabrant2020Logical" class="csl-entry">
Garrabrant, Benson-Tilsen, Critch, et al. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.1609.03543">Logical Induction</a>.”</span>
</div>
<div id="ref-Gmytrasiewicz2005Framework" class="csl-entry">
Gmytrasiewicz, and Doshi. 2005. <span>“<a href="https://doi.org/10.1613/jair.1579">A Framework for Sequential Planning in Multi-Agent Settings</a>.”</span> <em>Journal of Artificial Intelligence Research</em>.
</div>
<div id="ref-Goyal2021Coordination" class="csl-entry">
Goyal, Didolkar, Lamb, et al. 2021. <span>“<a href="https://arxiv.org/abs/2103.01197">Coordination Among Neural Modules Through a Shared Global Workspace</a>.”</span> <em>International Conference on Learning Representations</em>.
</div>
<div id="ref-Graziano2013Consciousness" class="csl-entry">
Graziano. 2013. <em>Consciousness and the Social Brain</em>.
</div>
<div id="ref-Graziano2019Standard" class="csl-entry">
Graziano, Guterstam, Bio, et al. 2019. <span>“<a href="https://doi.org/10.1080/02643294.2019.1670630">Toward a Standard Model of Consciousness: Reconciling the Attention Schema, Global Workspace, Higher-Order Thought, and Illusionist Theories</a>.”</span> <em>Cognitive Neuropsychology</em>.
</div>
<div id="ref-Hafner2024Mastering" class="csl-entry">
Hafner, Pasukonis, Ba, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2301.04104">Mastering Diverse Domains Through World Models</a>.”</span>
</div>
<div id="ref-Hammond2023Reasoning" class="csl-entry">
Hammond, Fox, Everitt, et al. 2023. <span>“<a href="https://doi.org/10.1016/j.artint.2023.103919">Reasoning about Causality in Games</a>.”</span> <em>Artificial Intelligence</em>.
</div>
<div id="ref-Han2019IPOMDPNet" class="csl-entry">
Han, and Gmytrasiewicz. 2019. <span>“<a href="https://doi.org/10.1609/AAAI.V33I01.33016062">IPOMDP-Net: A Deep Neural Network for Partially Observable Multi-Agent Planning Using Interactive POMDPs</a>.”</span> In <em>AAAI Conference on Artificial Intelligence</em>.
</div>
<div id="ref-Ha2018World" class="csl-entry">
Ha, and Schmidhuber. 2018. <span>“<a href="https://doi.org/10.5281/zenodo.1207631">World Models</a>.”</span> <em>arXiv.org</em>.
</div>
<div id="ref-Hofstadter2008Am" class="csl-entry">
Hofstadter. 2008. <em>I Am a Strange Loop: By Douglas R. Hofstadter: 0</em>.
</div>
<div id="ref-Hutter2005Universal" class="csl-entry">
Hutter. 2005. <em><a href="https://doi.org/10.1007/b138233">Universal Artificial Intelligence: Sequential Decisions Based on Algorithmic Probability</a></em>. Texts in Theoretical Computer Science.
</div>
<div id="ref-Jacobs1991Adaptive" class="csl-entry">
Jacobs, Jordan, Nowlan, et al. 1991. <span>“<a href="https://doi.org/10.1162/neco.1991.3.1.79">Adaptive Mixtures of Local Experts</a>.”</span> <em>Neural Computation</em>.
</div>
<div id="ref-JaraEttinger2019Theory" class="csl-entry">
Jara-Ettinger. 2019. <span>“<a href="https://doi.org/10.1016/j.cobeha.2019.04.010">Theory of Mind as Inverse Reinforcement Learning</a>.”</span> <em>Current Opinion in Behavioral Sciences</em>.
</div>
<div id="ref-Jaynes1976Origin" class="csl-entry">
Jaynes. 1976. <em>The Origin of Consciousness in the Breakdown of the Bicameral Mind</em>.
</div>
<div id="ref-Kosinski2023Theory" class="csl-entry">
Kosinski. 2023. <span>“<a href="http://arxiv.org/abs/2302.02083">Theory of Mind May Have Spontaneously Emerged in Large Language Models</a>.”</span> <em>Research Papers</em>, Research Papers,.
</div>
<div id="ref-Kosinski2024Evaluating" class="csl-entry">
———. 2024. <span>“<a href="https://doi.org/10.1073/pnas.2405460121">Evaluating Large Language Models in Theory of Mind Tasks</a>.”</span> <em>Proceedings of the National Academy of Sciences</em>.
</div>
<div id="ref-Kwiatkowski2019Taskagnostic" class="csl-entry">
Kwiatkowski, and Lipson. 2019. <span>“<a href="https://doi.org/10.1126/scirobotics.aau9354">Task-Agnostic Self-Modeling Machines</a>.”</span> <em>Science Robotics</em>.
</div>
<div id="ref-Lai2021Policy" class="csl-entry">
Lai, and Gershman. 2021. <span>“<a href="https://doi.org/10.1016/bs.plm.2021.02.004">Policy Compression: An Information Bottleneck in Action Selection</a>.”</span> In <em>Psychology of Learning and Motivation</em>.
</div>
<div id="ref-Leike2016Thompson" class="csl-entry">
Leike, Lattimore, Orseau, et al. 2016. <span>“Thompson Sampling Is Asymptotically Optimal in General Environments.”</span> In <em>Conference on Uncertainty in Artificial Intelligence</em>.
</div>
<div id="ref-Lieder2020Resourcerational" class="csl-entry">
Lieder, and Griffiths. 2020. <span>“<a href="https://doi.org/10.1017/S0140525X1900061X">Resource-Rational Analysis: Understanding Human Cognition as the Optimal Use of Limited Computational Resources</a>.”</span> <em>Behavioral and Brain Sciences</em>.
</div>
<div id="ref-Lu2022ModelFree" class="csl-entry">
Lu, Willi, Witt, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2205.01447">Model-Free Opponent Shaping</a>.”</span> In <em>Proceedings of the 39th International Conference on Machine Learning</em>.
</div>
<div id="ref-MacDermott2023Characterising" class="csl-entry">
MacDermott, Everitt, and Belardinelli. 2023. <span>“<a href="http://arxiv.org/abs/2307.10987">Characterising Decision Theories with Mechanised Causal Graphs</a>.”</span>
</div>
<div id="ref-Mao2024Review" class="csl-entry">
Mao, Liu, Ni, et al. 2024. <span>“<a href="https://doi.org/10.1109/TCSS.2024.3416707">A Review on Machine Theory of Mind</a>.”</span> <em>IEEE Transactions on Computational Social Systems</em>.
</div>
<div id="ref-Margeloiu2021Do" class="csl-entry">
Margeloiu, Ashman, Bhatt, et al. 2021. <span>“<a href="http://arxiv.org/abs/2105.04289">Do Concept Bottleneck Models Learn as Intended?</a>”</span> In <em>ICLR 2021 Workshop on Responsible AI</em>.
</div>
<div id="ref-McKelvey1995Quantal" class="csl-entry">
McKelvey, and Palfrey. 1995. <span>“<a href="https://doi.org/10.1006/game.1995.1023">Quantal Response Equilibria for Normal Form Games</a>.”</span> <em>Games and Economic Behavior</em>.
</div>
<div id="ref-Metzinger2003Being" class="csl-entry">
Metzinger. 2003. <em><a href="https://doi.org/10.7551/mitpress/1551.001.0001">Being No One: The Self-Model Theory of Subjectivity</a></em>.
</div>
<div id="ref-Minsky1986Society" class="csl-entry">
Minsky. 1986. <em>The Society of Mind</em>.
</div>
<div id="ref-Oguntola2023Theory" class="csl-entry">
Oguntola, Campbell, Stepputtis, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2307.01158">Theory of Mind as Intrinsic Motivation for Multi-Agent Reinforcement Learning</a>.”</span> <em>arXiv.org</em>.
</div>
<div id="ref-Oguntola2021Deep" class="csl-entry">
Oguntola, Hughes, and Sycara. 2021. <span>“<a href="https://doi.org/10.1109/RO-MAN50785.2021.9515505">Deep Interpretable Models of Theory of Mind</a>.”</span> In <em>IEEE International Symposium on Robot and Human Interactive Communication</em>.
</div>
<div id="ref-Parr2022Active" class="csl-entry">
Parr, Pezzulo, and Friston. 2022. <em>Active Inference: The Free Energy Principle in Mind, Brain, and Behavior</em>.
</div>
<div id="ref-Premakumar2024Unexpected" class="csl-entry">
Premakumar, Vaiana, Pop, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2407.10188">Unexpected Benefits of Self-Modeling in Neural Systems</a>.”</span>
</div>
<div id="ref-Rabinowitz2018Machine" class="csl-entry">
Rabinowitz, Perbet, Song, et al. 2018. <span>“Machine Theory of Mind.”</span> In <em>International Conference on Machine Learning</em>.
</div>
<div id="ref-Raileanu2018Modeling" class="csl-entry">
Raileanu, Denton, Szlam, et al. 2018. <span>“<a href="https://proceedings.mlr.press/v80/raileanu18a.html">Modeling Others Using Oneself in Multi-Agent Reinforcement Learning</a>.”</span> In <em>Proceedings of the 35th International Conference on Machine Learning</em>.
</div>
<div id="ref-Rao1999Predictive" class="csl-entry">
Rao, and Ballard. 1999. <span>“<a href="https://doi.org/10.1038/4580">Predictive Coding in the Visual Cortex: A Functional Interpretation of Some Extra-Classical Receptive-Field Effects</a>.”</span> <em>Nature Neuroscience</em>.
</div>
<div id="ref-Russell2016Rationality" class="csl-entry">
Russell, Stuart. 2016. <span>“<a href="https://doi.org/10.1007/978-3-319-26485-1_2">Rationality and Intelligence: A Brief Update</a>.”</span> In.
</div>
<div id="ref-Russell1995Provably" class="csl-entry">
Russell, S. J., and Subramanian. 1995. <span>“<a href="https://doi.org/10.1613/jair.133">Provably Bounded-Optimal Agents</a>.”</span> <em>Journal of Artificial Intelligence Research</em>.
</div>
<div id="ref-Schmidhuber1993SelfReferential" class="csl-entry">
Schmidhuber. 1993. <span>“<a href="https://doi.org/10.1007/978-1-4471-2063-6_107">A ‘Self-Referential’ Weight Matrix</a>.”</span> In.
</div>
<div id="ref-Schmidhuber2003Godel" class="csl-entry">
———. 2003. <span>“<a href="https://arxiv.org/abs/cs/0309048">Gödel Machines: Self-Referential Universal Problem Solvers Making Provably Optimal Self-Improvements</a>.”</span> <em>arXiv.org</em>.
</div>
<div id="ref-Schrittwieser2020Mastering" class="csl-entry">
Schrittwieser, Antonoglou, Hubert, et al. 2020. <span>“<a href="https://doi.org/10.1038/s41586-020-03051-4">Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model</a>.”</span> <em>Nature</em>.
</div>
<div id="ref-Sclar2023Minding" class="csl-entry">
Sclar, Kumar, West, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2306.00924">Minding Language Models’ (Lack of) Theory of Mind: A Plug-and-Play Multi-Character Belief Tracker</a>.”</span> In <em>Annual Meeting of the Association for Computational Linguistics</em>.
</div>
<div id="ref-Shalizi2000Computational" class="csl-entry">
Shalizi, and Crutchfield. 2000. <span>“<a href="https://arxiv.org/abs/cond-mat/9907176">Computational Mechanics: Pattern and Prediction, Structure and Simplicity</a>.”</span>
</div>
<div id="ref-Shazeer2017Outrageously" class="csl-entry">
Shazeer, Mirhoseini, Maziarz, et al. 2017. <span>“<a href="https://arxiv.org/abs/1701.06538v1">Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer</a>.”</span>
</div>
<div id="ref-Shinn2023Reflexion" class="csl-entry">
Shinn, Cassano, Berman, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2303.11366">Reflexion: Language Agents with Verbal Reinforcement Learning</a>.”</span> In <em>Advances in Neural Information Processing Systems 36 (NeurIPS 2023)</em>.
</div>
<div id="ref-Simon1955Behavioral" class="csl-entry">
Simon. 1955. <span>“<a href="https://doi.org/10.2307/1884852">A Behavioral Model of Rational Choice</a>.”</span> <em>The Quarterly Journal of Economics</em>.
</div>
<div id="ref-Sims2012Ideal" class="csl-entry">
Sims, Jacobs, and Knill. 2012. <span>“<a href="https://doi.org/10.1037/a0029856">An Ideal Observer Analysis of Visual Working Memory</a>.”</span> <em>Psychological Review</em>.
</div>
<div id="ref-Stolk2016Conceptual" class="csl-entry">
Stolk, Verhagen, and Toni. 2016. <span>“<a href="https://doi.org/10.1016/j.tics.2015.11.007">Conceptual Alignment: How Brains Achieve Mutual Understanding</a>.”</span> <em>Trends in Cognitive Sciences</em>.
</div>
<div id="ref-Tishby2000Information" class="csl-entry">
Tishby, Pereira, and Bialek. 2000. <span>“<a href="http://arxiv.org/abs/physics/0004057">The Information Bottleneck Method</a>.”</span>
</div>
<div id="ref-Ullman2023Large" class="csl-entry">
Ullman. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2302.08399">Large Language Models Fail on Trivial Alterations to Theory-of-Mind Tasks</a>.”</span>
</div>
<div id="ref-VanRullen2021Deep" class="csl-entry">
VanRullen, and Kanai. 2021. <span>“<a href="https://doi.org/10.1016/j.tins.2021.04.005">Deep Learning and the Global Workspace Theory</a>.”</span> <em>Trends in Neurosciences</em>.
</div>
<div id="ref-Virgo2025Good" class="csl-entry">
Virgo, Biehl, Baltieri, et al. 2025. <span>“<a href="https://doi.org/10.1162/ISAL.a.874">A “Good Regulator Theorem” for Embodied Agents</a>.”</span> In.
</div>
<div id="ref-Willi2022COLA" class="csl-entry">
Willi, Letcher, Treutlein, et al. 2022. <span>“<a href="http://arxiv.org/abs/2203.04098">COLA: Consistent Learning with Opponent-Learning Awareness</a>.”</span> In <em>Proceedings of the 39th International Conference on Machine Learning</em>.
</div>
<div id="ref-Wilterson2021Attention" class="csl-entry">
Wilterson, and Graziano. 2021. <span>“<a href="https://doi.org/10.1073/pnas.2102421118">The Attention Schema Theory in a Neural Network Agent: Controlling Visuospatial Attention Using a Descriptive Model of Attention</a>.”</span> <em>Proceedings of the National Academy of Sciences</em>.
</div>
<div id="ref-Yudkowsky2013Tiling" class="csl-entry">
Yudkowsky, and Herreshoff. 2013. <span>“<a href="https://intelligence.org/files/TilingAgentsDraft.pdf">Tiling Agents for Self-Modifying AI, and the Löbian Obstacle</a>.”</span> <em>Early Draft MIRI</em>.
</div>
<div id="ref-Zenon2019Informationtheoretic" class="csl-entry">
Zénon, Solopchuk, and Pezzulo. 2019. <span>“<a href="https://doi.org/10.1016/j.neuropsychologia.2018.09.013">An Information-Theoretic Perspective on the Costs of Cognition</a>.”</span> <em>Neuropsychologia</em>, Cognitive Effort,.
</div>
<div id="ref-Zhao2022Proximal" class="csl-entry">
Zhao, Lu, Grosse, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2210.10125">Proximal Learning With Opponent-Learning Awareness</a>.”</span> <em>Neural Information Processing Systems</em>.
</div>
<div id="ref-Zhou2023Language" class="csl-entry">
Zhou, Yan, Shlapentokh-Rothman, et al. 2024. <span>“<a href="http://arxiv.org/abs/2310.04406">Language Agent Tree Search Unifies Reasoning, Acting, and Planning in Language Models</a>.”</span> In <em>Proceedings of the 41st International Conference on Machine Learning (ICML 2024)</em>.
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Alternatively it could be a full-rank model, which gets very weird and makes people <a href="../notebook/agency_embedded.html">worry about</a> <a href="https://en.wikipedia.org/wiki/L%C3%B6b%27s_theorem?ref=danmackinlay.name">Löb’s theorem</a>. That is not the main focus here↩︎</p></li>
<li id="fn2"><p>An observer-relative formulation of what it means for Bob to have a model at all is in <span class="citation" data-cites="Virgo2025Good">Virgo et al. (2025)</span>, sitting alongside the internal-model-principle thread at <a href="../notebook/internal_models.html">internal models</a>. Their construction gives <em>a</em> floor on what counts as modelling — one among several plausible candidates, with differing divergence and ontology commitments.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>agent foundations</category>
  <category>bounded compute</category>
  <category>cooperation</category>
  <category>learning</category>
  <category>mind</category>
  <category>neural nets</category>
  <category>probability</category>
  <category>reinforcement learning</category>
  <category>quagmire</category>
  <category>theory of mind</category>
  <category>when to compute</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/homunculi.html</guid>
  <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/vanmuydenlaboratory.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Multi-agent RL tooling</title>
  <link>https://danmackinlay.name/notebook/marl_tooling.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>Environments and frameworks for <a href="../notebook/multi_agent_systems.html">multi-agent systems</a> research. See also the <a href="../notebook/opponent_shaping.html">opponent shaping</a> page for specific iterated-game setups.</p>
<div id="fig-bee-tattoo" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-bee-tattoo-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/bee_tattoo_RP-P-1905-5650.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/bee_tattoo_RP-P-1905-5650.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-bee-tattoo-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<section id="neural-mmo" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="neural-mmo"><span class="header-section-number">1</span> Neural MMO</h2>
<p>A large, open-world game environment for multi-agent research <span class="citation" data-cites="Suarez2019Neural Suarez2024Neural Suarez2023Neural">(Suárez et al. 2019; Suarez 2024; Suárez et al. 2023)</span>. Claim to fame: leveraging gaming-industry technology to provide a persistent, large-scale world for agent interaction, going beyond the typical matrix game or grid world.</p>
</section>
<section id="agentscope" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="agentscope"><span class="header-section-number">2</span> AgentScope</h2>
<p>See <span class="citation" data-cites="Pan2024Very">Pan et al. (2024)</span>.</p>
<p><a href="https://github.com/modelscope/agentscope/tree/main?ref=danmackinlay.name">modelscope/agentscope</a> / <a href="https://doc.agentscope.io/?ref=danmackinlay.name">documentation</a></p>
<p>A multi-agent platform oriented toward LLM-powered agents, with actor-based distribution and fault tolerance.</p>
</section>
<section id="pettingzoo" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="pettingzoo"><span class="header-section-number">3</span> PettingZoo</h2>
<p><a href="https://pettingzoo.farama.org/?ref=danmackinlay.name">PettingZoo</a> is the multi-agent extension of Gymnasium (formerly OpenAI Gym), providing a standard API for multi-agent environments. Covers classic games (chess, Go, connect four), Atari multiplayer, and MPE (multi-particle environments commonly used in cooperative/competitive MARL papers).</p>
</section>
<section id="melting-pot" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="melting-pot"><span class="header-section-number">4</span> Melting Pot</h2>
<p><a href="https://github.com/google-deepmind/meltingpot?ref=danmackinlay.name">DeepMind’s Melting Pot</a> is a suite of social dilemma environments for evaluating multi-agent cooperation and competition. Environments are designed to test generalisation: agents must cooperate with novel partners in scenarios inspired by the collective action literature.</p>
</section>
<section id="references" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="references"><span class="header-section-number">5</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Pan2024Very" class="csl-entry">
Pan, Gao, Xie, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2407.17789">Very Large-Scale Multi-Agent Simulation in AgentScope</a>.”</span>
</div>
<div id="ref-Suarez2024Neural" class="csl-entry">
Suarez. 2024. <span>“<a href="https://dspace.mit.edu/handle/1721.1/156586">Neural MMO: Massively Multiagent Simulation and Learning</a>.”</span>
</div>
<div id="ref-Suarez2019Neural" class="csl-entry">
Suárez, Du, Isola, et al. 2019. <span>“<a href="https://doi.org/10.48550/arXiv.1903.00784">Neural MMO: A Massively Multiagent Game Environment for Training and Evaluating Intelligent Agents</a>.”</span>
</div>
<div id="ref-Suarez2023Neural" class="csl-entry">
Suárez, Isola, Choe, et al. 2023. <span>“Neural MMO 2.0: A Massively Multi-Task Addition to Massively Multi-Agent Learning.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>agents</category>
  <category>distributed</category>
  <category>machine learning</category>
  <category>making things</category>
  <guid>https://danmackinlay.name/notebook/marl_tooling.html</guid>
  <pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/bee_tattoo_RP-P-1905-5650.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Local social platforms: a technical implementation guide</title>
  <link>https://danmackinlay.name/notebook/local_social_platform_technical.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-bantem-market" class="figure illustration full quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-bantem-market-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/Bantem_market_BI-1972-1043-8.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/Bantem_market_BI-1972-1043-8.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-bantem-market-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>This is the technical companion to <a href="../notebook/local_social_platforms.html">A social platform for your neighbourhood</a>, which lays out the social and institutional case for community-owned, local platforms. That post is the <em>why</em>. This one is the <em>how</em>—or at least a plausible <em>how</em>, since the right technical choices depend heavily on what the community actually wants to build.</p>
<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>As with the <a href="../notebook/aus_sovereign_llm_technical.html">sovereign compute technical post</a>, this is heavily AI-assisted research. Treat specific version numbers, pricing, and benchmarks as “serving suggestions”. In practice we’d design this in a more iterative way, starting with a simple prototype and evolving the architecture as we learn what the community actually needs. Here is… way more intense. I let the LLM spin out my minimal dotpoints into some seriously wargamed scenarios.</p>
</div>
</div>
</div>
<p>I’ll sketch two deployment paths: a <strong>cloud-hosted option</strong> that’s cheap and quick to stand up, and a <strong>local hardware option</strong> that gives the community full physical sovereignty over its data. These aren’t mutually exclusive—we’d likely start with cloud hosting and migrate to local hardware if the project proves viable.</p>
<p>Does this sound interesting? <a href="../contact.html">Get in touch</a>.</p>
<section id="build-or-buy" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="build-or-buy"><span class="header-section-number">1</span> Build or buy?</h2>
<p>The first decision is whether to customize an existing platform or build from scratch.</p>
<section id="off-the-shelf-bonfire" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="off-the-shelf-bonfire"><span class="header-section-number">1.1</span> Off-the-shelf: Bonfire</h3>
<p><a href="https://bonfirenetworks.org/?ref=danmackinlay.name">Bonfire</a> is the most interesting pre-built option for this use case. It’s a modular, federated social platform built in Elixir/Phoenix, explicitly designed for community self-governance. It speaks <a href="../notebook/fediverse.html">ActivityPub</a>, so it can interoperate with the Fediverse, and it’s built around “extensions”—pluggable modules for different social functions (discussion, coordination, economic exchange).</p>
<p>Pros:</p>
<ul>
<li>Real-time by default (Phoenix LiveView—no polling, no page reloads)</li>
<li>Federation built-in, so we can start local and open up later</li>
<li>Governance features designed in from the start (roles, boundaries, moderation)</li>
<li>Active development community, explicitly aligned with cooperative values</li>
<li>Elixir/BEAM runtime is famously good at handling many concurrent connections cheaply</li>
</ul>
<p>Cons:</p>
<ul>
<li>Relatively early-stage; documentation is patchy</li>
<li>The extension ecosystem is thin—we’d need to build or heavily customize extensions for marketplace, events calendar, and tool library functionality</li>
<li>Elixir is not a common skill; if our volunteer maintainers are Python or JavaScript people, the learning curve is steep</li>
<li>The modular architecture means deployment is more complex than “just run the Docker container”</li>
</ul>
</section>
<section id="off-the-shelf-other-options" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="off-the-shelf-other-options"><span class="header-section-number">1.2</span> Off-the-shelf: other options</h3>
<p><strong><a href="https://www.discourse.org/?ref=danmackinlay.name">Discourse</a></strong> is battle-tested forum software with a plugin ecosystem. It could handle discussion and events but would need significant customization for marketplace or tool-library functions. It runs on Ruby/Rails; hosting requirements are heavier than Bonfire (we recommend 2GB+ RAM minimum).</p>
<p><strong><a href="https://joinmobilizon.org/?ref=danmackinlay.name">Mobilizon</a></strong> is Framasoft’s federated events platform, written in Elixir. It does events well, but <em>only</em> events—it’s not a general social platform. It could be part of a multi-service stack rather than the whole thing.</p>
</section>
<section id="custom-build" class="level3" data-number="1.3">
<h3 data-number="1.3" class="anchored" data-anchor-id="custom-build"><span class="header-section-number">1.3</span> Custom build</h3>
<p>Given that AI coding assistants can now scaffold a full-stack web application in a weekend, building from scratch is less crazy than it sounds. The advantage is total control over the feature set and UX. The disadvantage is total responsibility for maintenance, security, and ongoing development.</p>
<p>A sensible custom stack for this kind of project in 2026:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Layer</th>
<th>Choice</th>
<th>Rationale</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Backend</td>
<td><strong>Python (Django)</strong> or <strong>Elixir (Phoenix)</strong></td>
<td>Django: enormous ecosystem, easy to find contributors, great ORM. Phoenix: real-time by default, better concurrency model, but smaller talent pool</td>
</tr>
<tr class="even">
<td>Frontend</td>
<td><strong>HTMX + server-rendered templates</strong> or <strong>SvelteKit</strong></td>
<td>HTMX keeps things simple and server-authoritative. SvelteKit if we want a richer client experience</td>
</tr>
<tr class="odd">
<td>Database</td>
<td><strong>PostgreSQL</strong> with <strong>PostGIS</strong></td>
<td>PostGIS gives us spatial queries for free—essential for “things near me” in a neighbourhood platform</td>
</tr>
<tr class="even">
<td>Search</td>
<td><strong>Meilisearch</strong> or <strong>PostgreSQL full-text</strong></td>
<td>Meilisearch is fast and typo-tolerant; Postgres FTS is simpler to deploy and good enough for our scale</td>
</tr>
<tr class="odd">
<td>Real-time</td>
<td><strong>WebSockets</strong> (built into Phoenix; Django Channels for Django)</td>
<td>For live chat, marketplace notifications, etc.</td>
</tr>
<tr class="even">
<td>Auth</td>
<td><strong>Passkeys</strong> + email magic links</td>
<td>No passwords to manage or leak. Passkeys are the future; magic links are the pragmatic fallback</td>
</tr>
<tr class="odd">
<td>Federation</td>
<td><strong>ActivityPub</strong> (optional, add later)</td>
<td>Don’t build this in v1. Add it when/if we want to connect to the Fediverse</td>
</tr>
</tbody>
</table>
<p>My instinct, given the audience for this project (community-minded people in Melbourne, likely to include a few developers but not a dedicated engineering team), is to start with <strong>Django + HTMX + PostgreSQL/PostGIS</strong>. It’s the most boring choice, and that’s the point—boring means the biggest pool of people who can maintain it, the most Stack Overflow answers, and the lowest risk the project dies because the one person who understood the framework moved to Tasmania.</p>
<p>We can scaffold the initial version with Claude or a similar coding assistant in a couple of dedicated weekends. A marketplace with listings, search, user profiles, reputation, and messaging is maybe 20–30 screens. An events calendar adds another 5–10. It’s not trivial, but it’s not a moonshot either.</p>
</section>
</section>
<section id="path-1-cloud-hosting" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="path-1-cloud-hosting"><span class="header-section-number">2</span> Path 1: Cloud hosting</h2>
<p>This is a sensible starting point. Low upfront cost, no hardware to maintain, easy to iterate.</p>
<section id="architecture" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="architecture"><span class="header-section-number">2.1</span> Architecture</h3>
<pre><code>┌─────────────────────────────────────────────┐
│              Reverse proxy (Caddy)           │
│         TLS termination, static files        │
├─────────────────────────────────────────────┤
│            App server (Django/Gunicorn       │
│               or Phoenix)                    │
├──────────────────┬──────────────────────────┤
│   PostgreSQL     │     Redis                │
│   + PostGIS      │   (cache, sessions,      │
│                  │    WebSocket broker)      │
└──────────────────┴──────────────────────────┘
│              Object storage (S3/R2)          │
│          (user uploads, listing images)      │
└─────────────────────────────────────────────┘</code></pre>
</section>
<section id="hosting-options-and-costs" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="hosting-options-and-costs"><span class="header-section-number">2.2</span> Hosting options and costs</h3>
<p>For ~1,000 active users with moderate traffic (maybe 10,000 page views/day at peak, much less most of the time), we need very little compute.</p>
<p><strong>Option A: Single VPS (simplest)</strong></p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Provider</th>
<th>Spec</th>
<th>Monthly cost</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="https://www.hetzner.com/cloud/?ref=danmackinlay.name">Hetzner</a> CX32</td>
<td>4 vCPU, 8GB RAM, 80GB NVMe</td>
<td>€8.50 (~$14 AUD)</td>
</tr>
<tr class="even">
<td><a href="https://www.digitalocean.com/pricing?ref=danmackinlay.name">DigitalOcean</a></td>
<td>4 vCPU, 8GB RAM, 160GB</td>
<td>$48 USD (~$75 AUD)</td>
</tr>
<tr class="odd">
<td><a href="https://www.vultr.com/pricing/?ref=danmackinlay.name">Vultr</a></td>
<td>4 vCPU, 8GB RAM, 128GB</td>
<td>$48 USD (~$75 AUD)</td>
</tr>
<tr class="even">
<td><a href="https://www.binarylane.com.au/?ref=danmackinlay.name">BinaryLane</a> (Australian)</td>
<td>4 vCPU, 8GB RAM</td>
<td>~$40 AUD</td>
</tr>
</tbody>
</table>
<p>Hetzner is cheap and seems reliable, but their nearest data centre is Singapore—latency from Melbourne is ~60 ms, which is fine for a web app but noticeable for real-time features. BinaryLane and similar Australian providers cost more but give sub-10 ms latency.</p>
<p>For the MVP, a single Hetzner CX32 at $14 AUD/month runs everything—app server, database, Redis, Caddy at under the a latte-a-week price point.</p>
<p><strong>Option B: Managed services (less ops burden)</strong></p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Service</th>
<th>What it does</th>
<th>Monthly cost</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="https://railway.com/pricing?ref=danmackinlay.name">Railway</a> or <a href="https://render.com/pricing?ref=danmackinlay.name">Render</a></td>
<td>App hosting</td>
<td>$7–25 USD</td>
</tr>
<tr class="even">
<td><a href="https://neon.tech/pricing?ref=danmackinlay.name">Neon</a> or <a href="https://supabase.com/pricing?ref=danmackinlay.name">Supabase</a></td>
<td>Managed PostgreSQL + PostGIS</td>
<td>Free tier → $25 USD</td>
</tr>
<tr class="odd">
<td><a href="https://www.cloudflare.com/products/r2/?ref=danmackinlay.name">Cloudflare R2</a></td>
<td>Object storage (images)</td>
<td>~$0–5 USD (generous free tier)</td>
</tr>
<tr class="even">
<td><a href="https://upstash.com/pricing?ref=danmackinlay.name">Upstash</a></td>
<td>Managed Redis</td>
<td>Free tier → $10 USD</td>
</tr>
</tbody>
</table>
<p>Total: <strong>$15–65 USD/month (~$25–100 AUD)</strong> depending on tier. More expensive than a raw VPS, but with way less ops burden—no server patching, no database backups to manage, and automatic scaling.</p>
<p><strong>Option C: The free tier special</strong></p>
<p>For a truly bootstrapped start:</p>
<ul>
<li><a href="https://vercel.com/pricing?ref=danmackinlay.name">Vercel</a> (free tier) for the frontend, if we go with a SvelteKit or Next.js frontend</li>
<li><a href="https://fly.io/docs/about/pricing/?ref=danmackinlay.name">Fly.io</a> (free tier: 3 shared-cpu VMs, 256MB RAM each) for the backend</li>
<li><a href="https://neon.tech/pricing?ref=danmackinlay.name">Neon</a> (free tier: 0.5GB storage, autosuspend) for PostgreSQL</li>
<li><a href="https://www.cloudflare.com/products/r2/?ref=danmackinlay.name">Cloudflare R2</a> (free tier: 10GB) for images</li>
</ul>
<p>Total: <strong>$0/month</strong> until we outgrow the free tiers, which for a neighbourhood of a few hundred users might be a while. The catch is that free tiers have cold-start latency (the app literally goes to sleep and takes a few seconds to wake up) and resource limits that will get annoying.</p>
</section>
<section id="deployment" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="deployment"><span class="header-section-number">2.3</span> Deployment</h3>
<p>The whole stack should be containerized from day one. A <code>docker compose</code> setup makes it possible to run the same stack locally for development, on a VPS for production, and on local hardware (Path 2) when we’re ready.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># docker-compose.yml (simplified)</span></span>
<span id="cb2-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">services</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">web</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">build</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> .</span></span>
<span id="cb2-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ports</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">[</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"8000:8000"</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">]</span></span>
<span id="cb2-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">environment</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">DATABASE_URL</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> postgres://db:5432/localplatform</span></span>
<span id="cb2-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">REDIS_URL</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redis://redis:6379</span></span>
<span id="cb2-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">depends_on</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">[</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">db</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">,</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redis</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">]</span></span>
<span id="cb2-10"></span>
<span id="cb2-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">db</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">image</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> postgis/postgis:16-3.4</span></span>
<span id="cb2-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">volumes</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">[</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"pgdata:/var/lib/postgresql/data"</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">]</span></span>
<span id="cb2-14"></span>
<span id="cb2-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">redis</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-16"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">image</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redis:7-alpine</span></span>
<span id="cb2-17"></span>
<span id="cb2-18"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">caddy</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-19"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">image</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> caddy:2</span></span>
<span id="cb2-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ports</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">[</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"80:80"</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">,</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"443:443"</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">]</span></span>
<span id="cb2-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">volumes</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">[</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"./Caddyfile:/etc/caddy/Caddyfile"</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">]</span></span>
<span id="cb2-22"></span>
<span id="cb2-23"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">volumes</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb2-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">pgdata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span></code></pre></div></div>
<p>From here to production on a VPS: <code>ssh</code> in, install Docker, run <code>docker compose up -d</code>, and point DNS at the server. That’s a Saturday afternoon, including lunch.</p>
</section>
<section id="backups" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="backups"><span class="header-section-number">2.4</span> Backups</h3>
<p>The database is the thing we cannot afford to lose. A daily <code>pg_dump</code> backup to object storage (Cloudflare R2, Backblaze B2) costs essentially nothing and is straightforward to automate. Test restores monthly—a backup we’ve never restored from is a hypothesis, not a backup.</p>
</section>
<section id="data-sovereignty-note" class="level3" data-number="2.5">
<h3 data-number="2.5" class="anchored" data-anchor-id="data-sovereignty-note"><span class="header-section-number">2.5</span> Data sovereignty note</h3>
<p>If we use a European or American hosting provider, the community’s data lives in their jurisdiction. For a neighbourhood marketplace this is probably fine—we’re not storing state secrets, just listings for second-hand couches. But if the community cares about data sovereignty (and they might, given the ethos of this project), an Australian hosting provider or local hardware (Path 2) is the answer.</p>
</section>
</section>
<section id="path-2-closet-servers" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="path-2-closet-servers"><span class="header-section-number">3</span> Path 2: Closet servers</h2>
<p>This is the sovereign option. The community’s data lives on hardware the community physically owns, in someone’s house or a shared space. It costs more upfront, requires more operational skill, and is less reliable than cloud hosting—but it means no one can pull the plug on our community because of a terms-of-service change or a foreign government’s policy shift.</p>
<section id="hardware" class="level3" data-number="3.1">
<h3 data-number="3.1" class="anchored" data-anchor-id="hardware"><span class="header-section-number">3.1</span> Hardware</h3>
<p>We don’t need much. A neighbourhood platform for 1,000 users with moderate traffic is computationally trivial by modern standards—a decade-old laptop could handle it.</p>
<p><strong>The minimum viable closet server:</strong></p>
<p>Buy two second-hand business laptops. ThinkPads, Latitudes, HP EliteBooks—the kind of thing that comes off three-year corporate leases and shows up on eBay or Gumtree for $150–300 each. We go for something with 16 GB RAM, an Ethernet port, and a working battery. Ideally, we buy at least two of the same model.</p>
<p>Why two? Redundancy. One is the primary server; the other is a warm standby running the same stack, with the database replicated via PostgreSQL streaming replication. If the primary dies (hardware failure, house fire, someone trips over the power cord), the standby can take over.</p>
<p><strong>Estimated hardware costs:</strong></p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Item</th>
<th>Cost</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>2× second-hand business laptop</td>
<td>$300–600 AUD</td>
</tr>
<tr class="even">
<td>2× USB-C Ethernet adapter (if needed)</td>
<td>$30–50 AUD</td>
</tr>
<tr class="odd">
<td>1× small Ethernet switch</td>
<td>$20–40 AUD</td>
</tr>
<tr class="even">
<td>1× external SSD for backups</td>
<td>$60–100 AUD</td>
</tr>
<tr class="odd">
<td>Misc cables</td>
<td>$20 AUD</td>
</tr>
</tbody>
</table>
<p><strong>Total: $430–810 AUD.</strong> That’s about $4–8 per household in a 100-household community—less than a month’s coffee.</p>
</section>
<section id="networking" class="level3" data-number="3.2">
<h3 data-number="3.2" class="anchored" data-anchor-id="networking"><span class="header-section-number">3.2</span> Networking</h3>
<p>The same problem we discussed for the <a href="../notebook/aus_sovereign_llm.html#the-nbn-still-sucks-but-not-so-badly-that-we-cant-work-around-it">sovereign compute closet</a>: Australian residential internet is not great, and running a server on NBN has quirks.</p>
<p>The requirements:</p>
<ul>
<li><strong>A static IP or dynamic DNS.</strong> Most NBN plans give you a dynamic IP, which changes periodically. A dynamic DNS service (e.g.&nbsp;<a href="https://www.duckdns.org/?ref=danmackinlay.name">DuckDNS</a>, free) maps a hostname to your current IP automatically. A business-grade NBN plan with a static IP ($10–30/month more than residential) is more reliable.</li>
<li><strong>Port forwarding or a tunnel.</strong> If the server is behind a home router, we need to forward ports 80 and 443 to the server. Alternatively, a <a href="https://www.cloudflare.com/products/tunnel/?ref=danmackinlay.name">Cloudflare Tunnel</a> (free tier) creates an outbound connection from the server to Cloudflare’s edge, avoiding the need for port forwarding entirely and providing DDoS protection as a bonus. This is probably the right answer for most setups.</li>
<li><strong>Upload bandwidth.</strong> A web application serving mostly text and small images is not bandwidth-heavy. At our scale, even a 20 Mbps upload link (typical for NBN FTTP 100/20 plans) would handle hundreds of concurrent users without breaking a sweat. Listing photos are the heaviest content; resizing them to reasonable dimensions on upload (say, 1200px wide, WebP format) keeps each image under 100KB.</li>
</ul>
<p>The Cloudflare Tunnel approach is cool because it solves several problems at once: no static IP needed, no port forwarding, automatic TLS, DDoS protection, and it works even behind double-NAT (common with some NBN configurations). The server makes an outbound connection to Cloudflare; Cloudflare routes incoming requests back through that connection.</p>
</section>
<section id="operating-system-and-maintenance" class="level3" data-number="3.3">
<h3 data-number="3.3" class="anchored" data-anchor-id="operating-system-and-maintenance"><span class="header-section-number">3.3</span> Operating system and maintenance</h3>
<p>Install Ubuntu Server LTS (currently 24.04) on both laptops. Enable <a href="https://wiki.debian.org/UnattendedUpgrades?ref=danmackinlay.name">unattended-upgrades</a> for automatic security patches. Run the same <code>docker compose</code> stack as the cloud version—the containers don’t care whether they’re running on Hetzner or on a ThinkPad in someone’s hallway cupboard.</p>
<p>Monitoring: a lightweight monitoring tool like <a href="https://github.com/louislam/uptime-kuma?ref=danmackinlay.name">Uptime Kuma</a> (self-hosted, runs in Docker) sends alerts if the server goes down. Point an external uptime monitor (e.g.&nbsp;<a href="https://uptimerobot.com/?ref=danmackinlay.name">UptimeRobot</a>, free for 50 monitors) at the public URL for an independent check.</p>
</section>
<section id="power-and-heat" class="level3" data-number="3.4">
<h3 data-number="3.4" class="anchored" data-anchor-id="power-and-heat"><span class="header-section-number">3.4</span> Power and heat</h3>
<p>Two laptops draw roughly 30–60 watts total under moderate load—negligible on the electricity bill (under $10/month at Australian rates). They generate less heat than a desk lamp. A hallway cupboard with a slightly open door is genuinely fine as a “data centre” for this scale of operation.</p>
<p>A dedicated UPS is nice to have but not essential—the laptop batteries provide 30–60 minutes of runtime, which is enough to ride out most power blips. For a longer outage, the platform is simply down until power returns, which is fine—we’re not running a stock exchange.</p>
</section>
<section id="replication-and-failover" class="level3" data-number="3.5">
<h3 data-number="3.5" class="anchored" data-anchor-id="replication-and-failover"><span class="header-section-number">3.5</span> Replication and failover</h3>
<p>PostgreSQL streaming replication keeps the standby laptop’s database in near-real-time sync with the primary (seconds of lag, typically). A simple failover procedure:</p>
<ol type="1">
<li>Primary goes down (detected by monitoring)</li>
<li>A human (the designated ops person) SSHs into the standby</li>
<li>Promote the standby to primary: <code>pg_ctl promote</code></li>
<li>Update the Cloudflare Tunnel or DNS to point at the standby’s IP</li>
<li>Investigate and repair the primary; when it’s back, reverse the replication direction</li>
</ol>
<p>This is not automatic failover (that’s complex to get right and risky to get wrong at small scale), but it’s a 10-minute procedure that any moderately competent Linux user can follow from a runbook.</p>
</section>
<section id="backups-1" class="level3" data-number="3.6">
<h3 data-number="3.6" class="anchored" data-anchor-id="backups-1"><span class="header-section-number">3.6</span> Backups</h3>
<p>Even with two machines, we want off-site backups. A nightly <code>pg_dump</code>, compressed and encrypted with <code>age</code> or GPG, pushed to a cloud storage bucket (Backblaze B2: $5/TB/month) or even to a third community member’s machine via <code>rsync</code>. Belt and braces.</p>
</section>
</section>
<section id="the-migration-path" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="the-migration-path"><span class="header-section-number">4</span> The migration path</h2>
<p>Start on cloud hosting (Path 1). It’s cheaper, faster to set up, and lets the community focus on the social problem (do people actually want this?) rather than the operational one (is the server up?).</p>
<p>If the platform takes off and the community decides it wants data sovereignty, the migration to local hardware (Path 2) is straightforward because we’ve containerized everything from the start. The procedure is:</p>
<ol type="1">
<li>Set up the closet servers and run the same <code>docker compose</code> stack</li>
<li>Take a database dump from the cloud and restore it locally</li>
<li>Switch DNS to point at the local server</li>
<li>Keep the cloud instance as a fallback for a month</li>
<li>Decommission the cloud instance</li>
</ol>
<p>This should take an afternoon and the community will experience maybe 30 minutes of planned downtime.</p>
</section>
<section id="features-roadmap" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="features-roadmap"><span class="header-section-number">5</span> Features roadmap</h2>
<p>What do we actually build, and in what order? This is a suggestion, not a prescription—the community should decide.</p>
<section id="v0.1-marketplace-mvp-month-12" class="level3" data-number="5.1">
<h3 data-number="5.1" class="anchored" data-anchor-id="v0.1-marketplace-mvp-month-12"><span class="header-section-number">5.1</span> v0.1: Marketplace MVP (Month 1–2)</h3>
<ul>
<li>User registration with postcode verification (enter postcode, receive a physical postcard with a code—low-tech, high-trust, and fun)</li>
<li>Listing creation: title, description, photos, price (or “free” or “swap”), category</li>
<li>Search and browse with PostGIS-powered proximity sorting</li>
<li>Messaging between buyer and seller</li>
<li>Basic reputation: completed transactions, star ratings, text reviews</li>
<li>Simple moderation: flag/report button, admin review queue</li>
</ul>
</section>
<section id="v0.2-events-directory-month-34" class="level3" data-number="5.2">
<h3 data-number="5.2" class="anchored" data-anchor-id="v0.2-events-directory-month-34"><span class="header-section-number">5.2</span> v0.2: Events + directory (Month 3–4)</h3>
<ul>
<li>Events calendar: create, browse, RSVP</li>
<li>Skills/services directory: “I’m a plumber,” “I do tutoring,” “I have a ute”</li>
<li>Tag-based discovery: search by skill, service, or interest</li>
<li>Notification preferences: email digest (daily/weekly) rather than push notifications—deliberately low-urgency</li>
</ul>
</section>
<section id="v0.3-trust-and-governance-month-56" class="level3" data-number="5.3">
<h3 data-number="5.3" class="anchored" data-anchor-id="v0.3-trust-and-governance-month-56"><span class="header-section-number">5.3</span> v0.3: Trust and governance (Month 5–6)</h3>
<ul>
<li>Vouching system: existing members can vouch for new members, creating a trust graph</li>
<li>Community proposals and voting (for platform rules, feature requests, spending decisions)</li>
<li>Transparency log: all moderation actions visible to members</li>
<li>Privacy controls: who can see your profile, your listings, your reviews</li>
</ul>
</section>
<section id="v1.0-community-infrastructure-month-6" class="level3" data-number="5.4">
<h3 data-number="5.4" class="anchored" data-anchor-id="v1.0-community-infrastructure-month-6"><span class="header-section-number">5.4</span> v1.0: Community infrastructure (Month 6+)</h3>
<ul>
<li>Tool/resource library: list things available to borrow, manage lending/returning</li>
<li>Mutual aid board: request or offer help, coordinated through the platform</li>
<li>Group purchasing: organize bulk buys (firewood, solar panels, etc.) at better rates</li>
<li>Integration with the <a href="../notebook/neo_friendly_societies.html">friendly society</a> (if one exists): membership management, communications, voting on society matters</li>
<li>AI-assisted features (if the community has access to <a href="../notebook/aus_sovereign_llm.html">sovereign compute</a>): smart search, listing categorization, translation for multilingual neighbourhoods, moderation assistance</li>
</ul>
</section>
</section>
<section id="ai-assisted-development" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="ai-assisted-development"><span class="header-section-number">6</span> AI-assisted development</h2>
<p>Since I argued in the <a href="../notebook/local_social_platforms.html">companion post</a> that LLMs lower the development cost, let me be concrete about what that looks like.</p>
<p>A competent developer working with a coding assistant (Claude, Cursor, Copilot, or inference from the <a href="../notebook/aus_sovereign_llm.html">community’s own compute</a>) can realistically:</p>
<ul>
<li><strong>Scaffold the entire v0.1 in 2–3 weekends</strong> (Django project structure, models, views, templates, basic CSS)</li>
<li><strong>Generate test suites</strong> that would otherwise take days to write by hand</li>
<li><strong>Draft moderation tooling</strong> (content classifiers, spam detection) using local models rather than shipping community data to a commercial API</li>
<li><strong>Produce documentation and runbooks</strong> for operational procedures, reducing the bus factor</li>
</ul>
<p>This doesn’t eliminate the need for human judgement—architecture decisions, UX design, security review—but it compresses the grunt work enough that a small volunteer team can make it go.</p>
<p>The sovereign compute connection is particularly neat here: if the community owns an LLM inference box, the same machine that serves the platform’s AI features (search, moderation, translation) can also be the coding assistant that helps maintain the platform itself. The tools build the tools.</p>
</section>
<section id="security-considerations" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="security-considerations"><span class="header-section-number">7</span> Security considerations</h2>
<p>A neighbourhood platform holds personal information (names, addresses, phone numbers, transaction history, private messages) for people who literally live near each other. A breach would be personally harmful in a way that’s different from a breach of a global platform—the attacker knows where we live.</p>
<p>Non-negotiable security measures:</p>
<ul>
<li><strong>TLS everywhere.</strong> Caddy handles this automatically with Let’s Encrypt certificates.</li>
<li><strong>Passwords: don’t.</strong> Use passkeys where possible, email magic links as fallback. No password database to breach.</li>
<li><strong>Input sanitization.</strong> Django’s ORM and template system handle the common injection vectors, but we should still run a security-focused code review before launch.</li>
<li><strong>Rate limiting.</strong> Prevent brute-force attacks on auth and abuse of messaging. Django-ratelimit or equivalent.</li>
<li><strong>Encryption at rest.</strong> Full-disk encryption on the server (LUKS on the closet laptops; most cloud providers offer this as a checkbox).</li>
<li><strong>Minimal data collection.</strong> Don’t store data we don’t need. If we don’t need to know someone’s exact address (we probably don’t—postcode is enough for locality), don’t ask for it.</li>
<li><strong>Penetration testing.</strong> Before launch, ask a security-minded community member (or hire someone for a day) to try to break in. Fix what they find.</li>
</ul>
</section>
<section id="legal-structure-for-the-platform" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="legal-structure-for-the-platform"><span class="header-section-number">8</span> Legal structure for the platform</h2>
<p>The platform needs a legal home—someone has to own the domain, pay the hosting bills, and be accountable for the data.</p>
<p>The simplest option is an <strong>incorporated association</strong> under Victorian (or relevant state) law. This gives the platform a legal identity, limits members’ personal liability, and costs ~$200 to set up and ~$57/year to maintain. The association’s committee manages the platform on behalf of its members.</p>
<p>If the platform grows and starts handling money (marketplace transaction fees, membership dues), a <strong>co-operative</strong> under the Co-operatives National Law might be more appropriate—it’s the legal form designed for member-owned economic infrastructure. See the <a href="../notebook/neo_friendly_societies_technical.html">friendly society legal analysis</a> for a deeper discussion of the options, which overlap substantially.</p>
<p><strong>Privacy obligations:</strong> under the Australian Privacy Act, organisations with annual turnover under $3 million are generally exempt from the Australian Privacy Principles. A neighbourhood platform is unlikely to hit this threshold. That said, the community should adopt privacy-respecting practices regardless of legal obligation—it’s the right thing to do, and it builds trust.</p>
</section>
<section id="what-this-costs-total" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="what-this-costs-total"><span class="header-section-number">9</span> What this costs, total</h2>
<section id="cloud-path-first-year" class="level3" data-number="9.1">
<h3 data-number="9.1" class="anchored" data-anchor-id="cloud-path-first-year"><span class="header-section-number">9.1</span> Cloud path (first year)</h3>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Item</th>
<th>Annual cost</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Hosting (Hetzner CX32)</td>
<td>~$170 AUD</td>
</tr>
<tr class="even">
<td>Domain name</td>
<td>~$20 AUD</td>
</tr>
<tr class="odd">
<td>Email (Fastmail or similar, for platform notifications)</td>
<td>~$60 AUD</td>
</tr>
<tr class="even">
<td>Backblaze B2 backups</td>
<td>~$10 AUD</td>
</tr>
<tr class="odd">
<td>Incorporated association setup</td>
<td>~$200 AUD</td>
</tr>
<tr class="even">
<td>Security review (1 day, hired)</td>
<td>~$500–1,000 AUD</td>
</tr>
<tr class="odd">
<td><strong>Total first year</strong></td>
<td><strong>~$960–1,460 AUD</strong></td>
</tr>
<tr class="even">
<td><strong>Total ongoing (year 2+)</strong></td>
<td><strong>~$320 AUD/year</strong></td>
</tr>
</tbody>
</table>
<p>At 200 households paying $50/year in membership, revenue is $10,000/year. Running costs are under $500/year ongoing. The surplus funds development, maintenance stipends, and community activities.</p>
</section>
<section id="closet-path-first-year-additional-to-cloud-year" class="level3" data-number="9.2">
<h3 data-number="9.2" class="anchored" data-anchor-id="closet-path-first-year-additional-to-cloud-year"><span class="header-section-number">9.2</span> Closet path (first year, additional to cloud year)</h3>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Item</th>
<th>Cost</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>2× second-hand laptops</td>
<td>$300–600 AUD</td>
</tr>
<tr class="even">
<td>Networking gear</td>
<td>$50–90 AUD</td>
</tr>
<tr class="odd">
<td>Business NBN upgrade (static IP)</td>
<td>~$200–360 AUD/year</td>
</tr>
<tr class="even">
<td>Electricity</td>
<td>~$60–100 AUD/year</td>
</tr>
<tr class="odd">
<td><strong>Total hardware setup</strong></td>
<td><strong>$350–690 AUD (one-off)</strong></td>
</tr>
<tr class="even">
<td><strong>Total ongoing</strong></td>
<td><strong>~$260–460 AUD/year</strong></td>
</tr>
</tbody>
</table>
<p>The cloud and closet paths cost roughly the same ongoing. The closet path has a higher upfront cost (about ~$700 one-off, on top of the cloud path), but gives us physical data sovereignty and no ongoing dependency on a hosting provider.</p>
</section>
</section>
<section id="open-questions" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="open-questions"><span class="header-section-number">10</span> Open questions</h2>
<ul>
<li>Is Django + HTMX the right default stack, or should we optimize for the specific skills of whoever shows up to build it? (If the founding devs are Rails people, build it in Rails. If they’re Elixir people, use Phoenix. The technology matters less than the people.)</li>
<li>How do we handle identity verification without becoming creepy? The postcard-with-code idea is fun but has edge cases (apartments, PO boxes, renters who move). Vouching by existing members is socially robust but creates gatekeeping risks.</li>
<li>What’s the right moderation model for neighbourhood scale? Professional community managers are too expensive; pure volunteer moderation burns people out; algorithmic moderation misses context. Some hybrid is needed.</li>
<li>Should the platform support financial transactions (escrow for marketplace purchases, membership fee collection), or keep money external (bank transfers, cash on pickup)? Handling money adds regulatory complexity but removes friction.</li>
<li>How do we handle the “missing stair” problem—a community member who everyone quietly knows is problematic, but who hasn’t technically violated any rules?</li>
</ul>
<p>As with everything in this series: if any of us have opinions, experience, or want to help build this, <a href="../contact.html">get in touch</a>.</p>


</section>

 ]]></description>
  <category>communicating</category>
  <category>community project</category>
  <category>cooperation</category>
  <category>diy</category>
  <category>engineering</category>
  <category>faster pussycat</category>
  <category>institutions</category>
  <category>networks</category>
  <category>P2P</category>
  <category>sovereign</category>
  <category>straya</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/local_social_platform_technical.html</guid>
  <pubDate>Wed, 25 Mar 2026 01:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/Bantem_market_BI-1972-1043-8.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>A social platform for your neighbourhood</title>
  <link>https://danmackinlay.name/notebook/local_social_platforms.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-friendly-market" class="figure illustration full quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-friendly-market-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/friednly_market_RP-P-1979-116.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/friednly_market_RP-P-1979-116.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-friendly-market-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<div class="callout callout-style-simple callout-none no-icon callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">None</span>A local app for local people
</div>
</div>
<div class="callout-body-container callout-body">
<p>It’s 2029. Over the past three years, things have gotten worse in the ways everyone predicted and no one prepared for. Facebook Marketplace has become even less usable unusable—half the listings are AI-generated scam bait, the algorithm buries anything that isn’t a promoted post, and Meta’s latest “community standards” update broke half the local buy/sell groups overnight. Nextdoor pivoted to a “local commerce super-app” that’s basically a worse version of Uber Eats with a comments section full of people reporting each other’s bins. Instagram is a shopping mall. Twitter/X is a propaganda channel. The <a href="../notebook/moloch_vs_slack.html#involution">enshittification</a> cycle has completed on basically every platform you used to rely on for local life.</p>
<p>You moved to your neighbourhood five years ago, but you still don’t know most of your neighbours. You have a vague sense that the person two doors down is a plumber, and that there’s a woman on the next street who keeps chickens—you’ve seen them through the fence—but you have no way to contact either of them. There’s no noticeboard. There’s no village square, that’s all gone into developer-led apartment block with no communal space. There’s just a Facebook group with 4,000 members and a posting cadence that’s 40% scam, 30% rant, 20% lost cat, and 10% someone asking whether anyone heard that noise last night.</p>
<p>Now imagine that eighteen months ago, a small group of people in your area started a local platform. Nothing grand—it started as a marketplace, honestly, because someone was sick of getting catfished on Facebook Marketplace when trying to sell a bookshelf. A simple listings board, verified to actual local residents, with a reputation system that meant something because people could see each other at the shops.</p>
<p>That marketplace turned out to be the seed. Once a few hundred people were on it and trusted it, other things grew: an events calendar that actually worked (no algorithmic filtering, no promoted events from the other side of the city), a skills exchange, a mutual aid thread that spun up fast when the February heatwave knocked out power to half the suburb for three days. During those three days, the platform was how people found out who had a generator, who needed to move their insulin to someone’s working fridge, which streets still had water pressure.</p>
<p>Nobody planned for it to be emergency infrastructure. It just turned out that a neighbourhood where people already knew and trusted each other digitally was also a neighbourhood that could coordinate when things went wrong.</p>
</div>
</div>
<p><strong>Interested? <a href="../contact.html">Get in touch</a> or <a href="https://woozy-page-39c.notion.site/32d398af2ab0805293a9dfb1561b4bdf?pvs=105&amp;ref=danmackinlay.name">sign up for updates</a>.</strong></p>
<p>This is the third in a series of posts about <a href="../notebook/civic_tech.html">practical community infrastructure building</a>. The <a href="../notebook/neo_friendly_societies.html">first</a> proposed neo-friendly societies for financial mutual aid. The <a href="../notebook/aus_sovereign_llm.html">second</a> explored community-owned AI compute. This one is about something that sounds simpler but might be harder: building a local social platform that people actually use.</p>
<p>This post is even less definite than its companions, were that possible. A friendly society has a clear value proposition (money when you need it) and a well-understood legal form. A compute collective has a concrete asset (a machine) and a measurable output (tokens per second). A local social platform has … vibes? Community? The warm feeling of knowing your neighbours?</p>
<p>These are real goods. But they’re harder to price, harder to pitch, and much harder to bootstrap, because the value of a social platform is almost entirely a function of whether other people are on it—the cold start problem that has killed a thousand well-intentioned alternatives to Facebook.</p>
<p>So why am I writing about it? Because I think the returns, if it works, are enormous—and because the other two projects in this series might naturally seed this kind of platform as a side effect, so we might as well be intentional about it. A friendly society is a social institution. A compute collective is a community of users. Both need trust, communication, and a shared sense of identity that doesn’t currently have a natural digital home. The social platform is the connective tissue.</p>
<section id="why-now" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="why-now"><span class="header-section-number">1</span> Why now?</h2>
<p>Two things have changed that make this more tractable than it was five years ago.</p>
<section id="the-incumbents-are-falling-apart" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="the-incumbents-are-falling-apart"><span class="header-section-number">1.1</span> The incumbents are falling apart</h3>
<p>This is the <a href="../notebook/moloch_vs_slack.html#involution">enshittification</a> thesis, and it’s moved from theory to lived experience. Cory Doctorow’s account of the platform life cycle—subsidize users to build lock-in, extract value once they’re trapped, then pivot to serving advertisers and shareholders at users’ expense—is something that we’ve all seen play out so many times that it is getting embarrassing that we do not plan around it. It’s a description of what Facebook, Instagram, and Twitter have already done. Paul Krugman has <a href="https://paulkrugman.substack.com/p/the-general-theory-of-enshittification?ref=danmackinlay.name">argued</a> that this logic extends to any business with network effects, not just social media specifically.</p>
<p>The practical consequence is that the platforms people relied on for local coordination—Facebook Groups, Facebook Marketplace, Facebook Events—are getting worse, not by accident but by design. Meta is optimizing for ad revenue, not for helping us find a second-hand couch or organize a street party. The gap between what these platforms provide and what communities actually need is widening.</p>
<p>That gap is a market niche. It’s a small one, and it won’t make anyone rich, but it’s real.</p>
</section>
<section id="llms-lower-the-development-cost" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="llms-lower-the-development-cost"><span class="header-section-number">1.2</span> LLMs lower the development cost</h3>
<p>Building a social platform used to require a well-funded startup. Now a competent developer with access to AI coding tools—or a small collective with a shared <a href="../notebook/aus_sovereign_llm.html">sovereign compute</a> instance—can stand up a functional web application in weeks rather than months. The technical barrier has dropped dramatically.</p>
<p>Robin Sloan has written beautifully about this: <a href="https://www.robinsloan.com/notes/home-cooked-app/?ref=danmackinlay.name">an app can be a home-cooked meal</a>. Not everything has to be a startup. Not everything has to scale. Sometimes we make a thing for the people we know, and it’s good because it’s <em>for them specifically</em>, in a way that a platform serving two billion users can never be.</p>
<p>Chris McCormick calls this <a href="https://mccormick.cx/news/entries/sub-dunbar-software?ref=danmackinlay.name">sub-Dunbar software</a>—software that works precisely <em>because</em> it doesn’t try to scale beyond the number of people who can actually know each other.</p>
<p>The question is whether we can build something that stays in that sweet spot: big enough to be useful (a marketplace needs liquidity; an events board needs events), small enough that trust is personal. I think the answer is neighbourhood-scale—somewhere between 500 and 2,000 people, roughly the population of a few city blocks or a small suburb.</p>
</section>
</section>
<section id="start-with-an-itch" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="start-with-an-itch"><span class="header-section-number">2</span> Start with an itch</h2>
<p>The graveyard of alternative social platforms is vast, and nearly all of them died of the same cause: they asked people to join a new social network <em>for its own sake</em>, on the promise that it would be better. It turns out that “better” is not a compelling reason to abandon the place where our friends already are.</p>
<p>So don’t start with “a social network”. Start with something concretely useful—something that scratches an itch that the incumbents have stopped scratching.</p>
<section id="a-local-marketplace-that-doesnt-suck" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="a-local-marketplace-that-doesnt-suck"><span class="header-section-number">2.1</span> A local marketplace that doesn’t suck</h3>
<p>Facebook Marketplace is notoriously terrible, and it’s getting worse. It’s flooded with scam listings, drop-shipped junk, and interstate sellers who aren’t actually local. The search is bad. The messaging is bad. There’s no meaningful reputation system, so we’re constantly fielding queries from people who ghost us. And Meta’s content moderation is simultaneously too aggressive (flagging legitimate listings for inscrutable policy violations) and too permissive (doing nothing about obvious fraud).</p>
<p>A neighbourhood marketplace that verifies residents (even loosely—a postcode check, a vouching system from existing members) and maintains a local reputation score would be <em>immediately, obviously better</em> than Facebook Marketplace for the specific use case of buying and selling things to people near us.</p>
<p>Is this a good business model? No, almost certainly not, if “business model” means “thing that generates venture-scale returns.” Classified advertising was once a goldmine, but the margins have been competed away, and a neighbourhood platform will never have the volume to make advertising work.</p>
<p>But “business model” can also mean “thing that sustains itself.” I’ve <a href="../notebook/public_sphere_business_models.html">written elsewhere</a> about how the business models we use to fund communication shape the communication we get—advertising-funded platforms optimize for attention capture, not for community welfare. The alternative is direct funding: an incorporated association with modest membership fees—say $5–10/month per household, or $50–100/year—could cover hosting and basic development costs for a platform serving a few hundred to a couple of thousand users. That’s the friendly society funding model applied to digital infrastructure: we pay for it because it’s ours and it’s useful, not because someone is extracting profit from our attention.</p>
</section>
<section id="other-wedges" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="other-wedges"><span class="header-section-number">2.2</span> Other wedges</h3>
<p>The marketplace is just one entry point. Depending on what the community actually wants, the seed might be:</p>
<p><strong>A local events calendar.</strong> I’ve <a href="../notebook/diy_socials.html#for-irl-events">ranted about this before</a>—Facebook is a strong incumbent, and Facebook does it badly. A simple, non-algorithmic calendar of what’s happening in our area, maintained by the people who live there, would fill a real gap.</p>
<p><strong>A skills and services directory.</strong> Who in the neighbourhood can fix a tap? Who does tutoring? Who has a ute and will help you move for a slab of beer? This information exists socially—people know it about their friends—but it’s not discoverable. A lightweight directory, backed by reputation, makes it discoverable.</p>
<p><strong>A tool and resource library.</strong> Do I really need to own a pressure washer I use twice a year? Tool libraries exist in physical form (<a href="https://www.sharingmap.com.au/?ref=danmackinlay.name">Melbourne has several</a>), but a digital layer makes them more accessible.</p>
<p><strong>A mutual aid coordination board.</strong> When the heatwave hits or the storm knocks out power, people need to know who needs help and who can provide it. This is the crisis function from the scenario above—but it works best if the social infrastructure already exists before the crisis.</p>
<p>I think the right wedge is very important—we need to scratch an actual itch. But we need to choose <em>something</em> concrete, see if people use it, and let the platform grow in the directions the community pulls it. This is the “home-cooked meal” philosophy: we’re making this for specific people—ourselves, so we should ask each other what we’re hungry for.</p>
<p>What I’m hungry for is community sovereignty, but that’s more of an ingredient than a meal.</p>
</section>
</section>
<section id="the-hard-problems-are-actually-social" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="the-hard-problems-are-actually-social"><span class="header-section-number">3</span> The hard problems are actually social</h2>
<p>I am a person who writes about <a href="../notebook/diy_socials.html">DIY social networks</a> and <a href="../notebook/fediverse.html">federated protocols</a> and <a href="../notebook/decnet.html">decentralized infrastructure</a>, so I am constitutionally inclined to think about social problems in terms of technology.</p>
<p>The social angle is the real hard bit, though. The technology for running a local social platform is <a href="../notebook/diy_socials.html">essentially solved</a>—there are mature, open-source options that would work out of the box.</p>
<p>The hard problems are:</p>
<p><strong>Cold start.</strong> How do we get the first hundred users? Network effects mean a platform is useless until it isn’t, and the transition happens fast—but getting <em>to</em> that transition requires sustained effort by a small group of very motivated people. For a neighbourhood platform, the bootstrap group is probably 10-20 households who know each other and commit to using the platform for three months regardless of whether it feels “worth it” yet. That’s the price of admission.</p>
<p><strong>Governance.</strong> Who decides the rules? Who moderates disputes? What happens when someone is creepy? <a href="../notebook/community_governance.html">Platform democracy</a> is a real field of research, and the work on <a href="https://www.belfercenter.org/publication/towards-platform-democracy-policymaking-beyond-corporate-ceos-and-partisan-pressure?ref=danmackinlay.name">mini-publics and deliberative processes</a> is directly relevant here. But at neighbourhood scale, governance can be simpler: a small elected committee, rotating terms, transparent decisions, published minutes. The friendly society governance model maps cleanly onto this.</p>
<p><strong>Attention and norms.</strong> A neighbourhood platform lives or dies on whether it feels good to use. Not “engaging” in the way that Facebook means (maximum time-on-site, maximum emotional arousal, maximum ad impressions), but <em>good</em>—useful, warm, not a time-sink. The <a href="https://www.humanetech.com/podcast?ref=danmackinlay.name">Center for Humane Technology</a>, the <a href="https://www.schoolofattention.org/attention-activism?ref=danmackinlay.name">Strother School of Radical Attention</a>, and a growing body of work on <a href="../notebook/attention_economy.html">the attention economy</a> all remind us that the design choices in a social platform shape the social behaviour that emerges on it. A platform that doesn’t have an engagement-maximizing algorithm doesn’t produce engagement-maximized behaviour. That’s a feature.</p>
<p><strong>Sustainability.</strong> What happens when the founding enthusiasts burn out? Community projects die when they depend on a small number of unpaid heroes. The membership-fee model helps—it means there’s a budget for someone to do administration, even if “someone” is a member who gets a fee waiver in exchange for 10 hours a month of maintenance.</p>
</section>
<section id="what-about-the-attention-economy" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="what-about-the-attention-economy"><span class="header-section-number">4</span> What about the attention economy?</h2>
<p>The platforms we’re trying to escape are <a href="../notebook/attention_economy.html">attention-extraction machines</a>. Their business model is to capture as much of our time and cognitive bandwidth as possible, because that’s what they sell to advertisers. This produces the behaviours we’ve all learned to recognize: infinite scroll, notification bombardment, algorithmic rage-bait, the manufactured sense of urgency about things that don’t matter.</p>
<p>A neighbourhood platform funded by membership fees has no reason to do any of this. There’s no advertiser to sell attention to. The incentive is reversed: the platform should help us get what we need and then <em>go do something else</em>. Check the marketplace, find the bookshelf, arrange pickup, done. Check the calendar, see there’s a park clean-up on Saturday, RSVP, done.</p>
<p>This is a radical proposition in the current landscape, and it’s worth being explicit about: <strong>we are building a platform that wants us to spend as little time as possible on it.</strong> The value isn’t in engagement; it’s in the social infrastructure that exists because the platform exists.</p>
</section>
<section id="technical-sketch" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="technical-sketch"><span class="header-section-number">5</span> Technical sketch</h2>
<p>I don’t want to go deep on technology here—that’s for a <a href="../notebook/local_social_platform_technical.html">companion post</a>—but a rough sketch helps ground the costs.</p>
<p>The simplest version of this is a web app (mobile-friendly, not a native app—app store review is a bottleneck we don’t need) running on a modest VPS. Off-the-shelf options include <a href="https://bonfirenetworks.org/?ref=danmackinlay.name">Bonfire</a> (a modular, federatable social platform built for community governance), <a href="https://www.discourse.org/?ref=danmackinlay.name">Discourse</a> (which despite being “forum software” is increasingly used as community infrastructure), or even a custom build on top of something like <a href="https://www.phoenixframework.org/?ref=danmackinlay.name">Elixir/Phoenix</a> or <a href="https://www.djangoproject.com/?ref=danmackinlay.name">Django</a> with real-time features.</p>
<p>Ballpark costs for a neighbourhood of ~1,000 active users:</p>
<ul>
<li><strong>Hosting:</strong> $20–50/month for a VPS (Hetzner, DigitalOcean, or a local Australian provider like VentraIP)</li>
<li><strong>Domain and email:</strong> $50–100/year</li>
<li><strong>Development:</strong> This is the wild card. An initial build using AI coding tools and volunteer labour could be near-zero in cash terms, or a few thousand dollars for a contractor to set up and customize a Bonfire or Discourse instance.</li>
<li><strong>Ongoing maintenance:</strong> 5–10 hours/month of volunteer or modestly-compensated time</li>
</ul>
<p>At $5/month per household and 200 participating households, that’s $1,000/month—more than enough to cover hosting and a small maintenance stipend, with surplus for improvements.</p>
<p>The federation question is interesting: platforms like Bonfire speak <a href="../notebook/fediverse.html">ActivityPub</a>, which means a neighbourhood instance could connect to the wider Fediverse (Mastodon, etc.) for broader discovery while keeping local governance local. Whether this is desirable depends on whether the community wants to be a walled garden or a node in a network. I’d bet on starting closed and opening up deliberately, rather than starting open and trying to close down later.</p>
</section>
<section id="how-this-connects-to-the-other-projects" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="how-this-connects-to-the-other-projects"><span class="header-section-number">6</span> How this connects to the other projects</h2>
<p>This platform is the social layer that the other mutual-aid projects need.</p>
<p>The <a href="../notebook/neo_friendly_societies.html">neo-friendly society</a> needs a communication channel that isn’t Facebook, isn’t email, and isn’t yet another WhatsApp group. It needs a place where members can discuss proposals, vote on decisions, and coordinate activities. A local social platform provides this.</p>
<p>The <a href="../notebook/aus_sovereign_llm.html">compute collective</a> needs a community of users. The local platform’s members are the natural user base, and the AI infrastructure can in turn power features of the platform—content moderation assistance, search, translation for multilingual neighbourhoods, smart matching for the marketplace.</p>
<p>Together, these three projects form something like a stack: financial resilience (the friendly society), computational sovereignty (the compute collective), and social infrastructure (the local platform). Each is useful on its own; together, they’re the skeleton of a genuinely self-reliant local community.</p>
</section>
<section id="prior-art" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="prior-art"><span class="header-section-number">7</span> Prior art</h2>
<section id="platform-cooperatives" class="level3" data-number="7.1">
<h3 data-number="7.1" class="anchored" data-anchor-id="platform-cooperatives"><span class="header-section-number">7.1</span> Platform cooperatives</h3>
<p>Nathan Schneider’s work at the <a href="https://platform.coop/?ref=danmackinlay.name">Platform Cooperativism Consortium</a> is the most developed theory of community-owned digital platforms. His argument is that community ownership won’t emerge from open protocols alone—you need to deliberately invest in ownership ecosystems with real governance structures. The Platform Co-op School has highlighted <a href="https://www.hylo.com/?ref=danmackinlay.name">Hylo</a> as a working example of community-owned social infrastructure.</p>
</section>
<section id="broodfonds-style-social-models" class="level3" data-number="7.2">
<h3 data-number="7.2" class="anchored" data-anchor-id="broodfonds-style-social-models"><span class="header-section-number">7.2</span> Broodfonds-style social models</h3>
<p>The <a href="https://en.wikipedia.org/wiki/Broodfonds?ref=danmackinlay.name">Broodfonds</a> model from the Netherlands, discussed in the <a href="../notebook/neo_friendly_societies.html">friendly society post</a>, is relevant here too—not for its financial mechanics, but for its social architecture. Groups of 25–50 people, self-selected, with shared obligations. The social platform is the digital home for groups like this.</p>
</section>
<section id="radicalxchange-governance" class="level3" data-number="7.3">
<h3 data-number="7.3" class="anchored" data-anchor-id="radicalxchange-governance"><span class="header-section-number">7.3</span> RadicalxChange governance</h3>
<p>The <a href="https://www.radicalxchange.org/?ref=danmackinlay.name">RadicalxChange</a> movement—associated with Glen Weyl, Audrey Tang, and the <em>Plurality</em> project—offers interesting governance mechanisms that could apply to a community platform: quadratic funding for deciding which features to build, data dignity frameworks for how member data is handled, Harberger-style mechanisms for allocating scarce resources (like prominent placement on the marketplace). These are more speculative, but they point toward forms of community governance that go beyond simple majority voting.</p>
</section>
<section id="existing-local-platforms" class="level3" data-number="7.4">
<h3 data-number="7.4" class="anchored" data-anchor-id="existing-local-platforms"><span class="header-section-number">7.4</span> Existing local platforms</h3>
<p>There are precedents, though none have broken out. <a href="https://nextdoor.com/?ref=danmackinlay.name">Nextdoor</a> started with a local-trust model and then seems to have enshittified in exactly the way Doctorow’s theory predicts. Various attempts at “local social” have launched and died—but the ones that survived longest were the ones attached to a concrete use case (marketplace, events) rather than generic “local social networking.” The lesson is: wedge in with utility, grow into community.</p>
</section>
</section>
<section id="whats-still-missing-from-the-literature" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="whats-still-missing-from-the-literature"><span class="header-section-number">8</span> What’s still missing from the literature</h2>
<p>Geek time! I would also like to research how and why people join these things, and learn how to make local platform development easier. How do users actually migrate from an enshittified platform to a community alternative when network effects penalize first movers? This is a coordination game with heterogeneous switching costs, and there’s almost no formal modelling of it. The RadicalxChange <em>Plurality</em> book gestures at this but doesn’t model it. If someone wants a research problem that matters, hit me up.</p>
</section>
<section id="open-questions" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="open-questions"><span class="header-section-number">9</span> Open questions</h2>
<ul>
<li>What’s the right first wedge for a specific neighbourhood? Marketplace? Events? Something else? This probably varies by community and the only way to find out is to ask.</li>
<li>How do we verify “local” without being creepy about it? Postcode checks? Vouching? Physical meetups?</li>
<li>What’s the right governance structure for a platform that’s too big for consensus but too small for representative democracy?</li>
<li>How do we handle the transition when someone abuses the platform—doxxing, harassment, commercial spam? The norms for a 500-person neighbourhood platform are different from the norms for Twitter.</li>
<li>Is federation (<a href="../notebook/fediverse.html">ActivityPub</a>, etc.) an asset or a liability at this scale? Does connecting to the global Fediverse dilute the local trust that makes the platform valuable?</li>
<li>Can this platform model be replicated—published as a template, the way the <a href="../notebook/neo_friendly_societies.html#replicating-to-other-mutual-aid-groups">friendly society template</a> is meant to be?</li>
</ul>
<p>As with the other posts in this series: if you know about any of this, if you’ve tried something like this, or if you’re in Melbourne and want to help build it, I’d <a href="../contact.html">love to hear from you</a>.</p>
<p>The technology is the easy part. The institutional design is the interesting part. The actual community is the hard part. Let’s start.</p>


</section>

 ]]></description>
  <category>communicating</category>
  <category>community project</category>
  <category>cooperation</category>
  <category>culture</category>
  <category>diy</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>institutions</category>
  <category>networks</category>
  <category>P2P</category>
  <category>sovereign</category>
  <category>straya</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/local_social_platforms.html</guid>
  <pubDate>Wed, 25 Mar 2026 01:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/friednly_market_RP-P-1979-116.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Quis computat?</title>
  <link>https://danmackinlay.name/notebook/who_computes.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>Surely this analysis has been done before in the bowels of <a href="https://www.lesswrong.com/?ref=danmackinlay.name">LessWrong</a>. I gave up searching because it was too irritating trying to disambiguate the terms <em>survival</em> and <em>hazard</em> in the technical mathematical sense that I needed, against the more colloquial sense that they are used in AI safety discourse. Feel free to point me to prior work in the comments.</p>
</div>
</div>
</div>
<div id="fig-werelt" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-werelt-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/werelt_RP-P-BI-2384.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/werelt_RP-P-BI-2384.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-werelt-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I had a discussion recently where the contested thing was whether getting more compute was, by default, “good” or “bad” for AI safety research. What follows is my attempt to formalize goodness and badness in terms of hazard models, which seems to me to be a nice way of making the assumptions and disagreements explicit.</p>
<p>The model setup is as follows. We assume two things can happen — an AI catastrophe (“doom”), or a breakthrough that guarantees alignment (“deliverance”). Both become more likely as more compute accumulates in the world, but they draw on different, potentially overlapping, pools of compute. The question becomes: given a trajectory of total compute and a policy for splitting it between capability and safety, what is the probability that doom arrives before deliverance?</p>
<p>The machinery I use is <a href="../notebook/survival_analysis.html">survival analysis</a> of <a href="https://en.wikipedia.org/wiki/Competing_risks?ref=danmackinlay.name">competing risks</a> — the branch of statistics built for this kind of “which stochastic event comes first?” problem. The motivation for expressing everything in terms of compute comes from <a href="../notebook/ai_economics_of_cognition.html">the economics of cognition</a>: compute is the fundamental currency of intelligence, so it should be possible to express both the problem and the solution in terms of how compute is allocated.</p>
<div class="callout callout-style-simple callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Translation guide
</div>
</div>
<div class="callout-body-container callout-body">
<p>If you haven’t seen <a href="https://en.wikipedia.org/wiki/Survival_analysis?ref=danmackinlay.name">survival analysis</a> or <a href="../notebook/point_processes.html">point processes</a> before, the key concepts are:</p>
<ul>
<li>A <em>hazard rate</em> is the instantaneous probability per unit time that an event fires <em>right now</em>, given that it hasn’t fired yet.</li>
<li>A <em>survival function</em> <img src="https://latex.codecogs.com/png.latex?S(t)"> is the probability that <em>nothing has happened yet</em> by time <img src="https://latex.codecogs.com/png.latex?t">. It starts at 1 and decays toward 0 as hazard accumulates.</li>
<li><a href="https://en.wikipedia.org/wiki/Competing_risks?ref=danmackinlay.name"><em>Competing risks</em></a> means two or more events are racing to fire first. We observe whichever wins; the loser is never realized.</li>
</ul>
<p>If you are coming from <a href="https://www.lesswrong.com/?ref=danmackinlay.name">LessWrong</a>, some translations: the safety fraction <img src="https://latex.codecogs.com/png.latex?%5Calpha"> is the “<a href="https://www.lesswrong.com/tag/alignment-tax?ref=danmackinlay.name">alignment tax</a>”; “<a href="https://www.lesswrong.com/tag/p-doom?ref=danmackinlay.name">P(doom)</a>” is derived here from a competing-risks integral rather than stated as a prior; and the response-function shapes below map onto familiar worldviews (“fast takeoff, hard alignment” <img src="https://latex.codecogs.com/png.latex?%5Cleftrightarrow"> convex <img src="https://latex.codecogs.com/png.latex?g"> / concave <img src="https://latex.codecogs.com/png.latex?h">; “slow takeoff, tractable alignment” <img src="https://latex.codecogs.com/png.latex?%5Cleftrightarrow"> the reverse).</p>
</div>
</div>
<div id="86a804f3" class="cell" data-execution_count="2">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> plotly.graph_objects <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> go</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> plotly.subplots <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> make_subplots</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> plotly.io <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pio</span>
<span id="cb1-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> scipy.integrate <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> cumulative_trapezoid</span>
<span id="cb1-6"></span>
<span id="cb1-7">pio.renderers.default <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"plotly_mimetype+notebook_connected"</span></span>
<span id="cb1-8"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> livingthing.plotly_style <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> set_livingthing_style</span>
<span id="cb1-9">set_livingthing_style()</span>
<span id="cb1-10"></span>
<span id="cb1-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Shared palette</span></span>
<span id="cb1-12">C_DOOM <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#c0392b'</span></span>
<span id="cb1-13">C_SALV <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#2471a3'</span></span>
<span id="cb1-14">C_SURV <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#27ae60'</span></span>
<span id="cb1-15">C_RUIN <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#8e44ad'</span></span>
<span id="cb1-16">C_NEUT <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#7f8c8d'</span></span>
<span id="cb1-17"></span>
<span id="cb1-18">LAYOUT <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(</span>
<span id="cb1-19">    paper_bgcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'rgba(0,0,0,0)'</span>,</span>
<span id="cb1-20">    plot_bgcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'rgba(0,0,0,0)'</span>,</span>
<span id="cb1-21">    hovermode<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'x unified'</span>,</span>
<span id="cb1-22">    legend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(bgcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'rgba(255,255,255,0.5)'</span>, bordercolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'#ccc'</span>, borderwidth<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>),</span>
<span id="cb1-23">)</span>
<span id="cb1-24"></span>
<span id="cb1-25"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Response-function zoo</span></span>
<span id="cb1-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> g_lin(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.8</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x</span>
<span id="cb1-27"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> h_lin(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x</span>
<span id="cb1-28"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> g_pess(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-29"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> h_pess(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.sqrt(x)</span>
<span id="cb1-30"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> g_opt(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.sqrt(x)</span>
<span id="cb1-31"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> h_opt(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb1-32"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> sigmoid(x, k, x0): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> x0)))</span>
<span id="cb1-33"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> g_sig(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> sigmoid(x, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>)</span>
<span id="cb1-34"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> h_sig(x): <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> sigmoid(x, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">7</span>)</span></code></pre></div></div>
</details>
</div>
<section id="compute-trajectories" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="compute-trajectories"><span class="header-section-number">1</span> Compute trajectories</h2>
<p>I think we should distinguish between the <em>rate</em> at which compute is performed and the cumulative “stock” of computation that has been done.</p>
<p>Let <img src="https://latex.codecogs.com/png.latex?c(t)"> denote the compute rate — the FLOP/s of AI-related computation happening in the world at time <img src="https://latex.codecogs.com/png.latex?t%20%5Cgeq%200">. This is exogenous capacity: hardware, data centres, and investment. We treat it as non-decreasing and right-continuous. We make no distinction between training and inference — <img src="https://latex.codecogs.com/png.latex?c(t)"> is <em>unstructured</em> compute, all of it. The more of it that is running, the more things are happening; we don’t need to model the internal structure of what kinds of workloads are running for this granularity of analysis.</p>
<p>The <em>cumulative compute</em> — total FLOPs performed by time <img src="https://latex.codecogs.com/png.latex?t"> — is</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathcal%7BC%7D(t)%20=%20%5Cint_0%5Et%20c(u)%5C,%20du.%0A"></p>
<p>A policy lever <img src="https://latex.codecogs.com/png.latex?%5Calpha(t)%20%5Cin%20%5B0,1%5D"> — the <em>safety fraction</em> — splits the compute <em>rate</em> into two streams:</p>
<ul>
<li><em>Capability rate</em> <img src="https://latex.codecogs.com/png.latex?c_c(t)%20=%20(1-%5Calpha(t))%5C,%20c(t)">: compute aimed at expanding what AI systems can do.</li>
<li><em>Safety rate</em> <img src="https://latex.codecogs.com/png.latex?c_s(t)%20=%20%5Calpha(t)%5C,%20c(t)">: compute focused on ensuring AI systems do what we want.</li>
</ul>
<p>The cumulative stocks in each pool are then</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cmathcal%7BC%7D_c(t)%20=%20%5Cint_0%5Et%20(1-%5Calpha(u))%5C,%20c(u)%5C,%20du,%20%5Cqquad%20%5Cmathcal%7BC%7D_s(t)%20=%20%5Cint_0%5Et%20%5Calpha(u)%5C,%20c(u)%5C,%20du,%0A"></p>
<p>with <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c(t)%20+%20%5Cmathcal%7BC%7D_s(t)%20=%20%5Cmathcal%7BC%7D(t)"> at all times.</p>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The stock/rate distinction matters in this model because we imagine that capabilities <em>persist</em>. We can’t un-train a frontier model by switching off the data centre; the weights, the papers, the algorithmic insights are already in the world. Safety progress persists too — proved theorems, verified architectures, and alignment techniques don’t evaporate. So the hazard of doom should depend on the cumulative stock of capability compute <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c(t)">, not the instantaneous rate <img src="https://latex.codecogs.com/png.latex?c_c(t)">. The rate <img src="https://latex.codecogs.com/png.latex?c(t)"> determines how fast the stocks grow; the stocks determine the hazard.</p>
</div>
</div>
</div>
<p>The function <img src="https://latex.codecogs.com/png.latex?%5Calpha(%5Ccdot)"> is the policy lever — the thing a civilisation chooses.</p>
</section>
<section id="two-competing-events" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="two-competing-events"><span class="header-section-number">2</span> Two competing events</h2>
<p>We model doom and deliverance as the first arrivals of <a href="../notebook/point_processes.html">inhomogeneous point processes</a> — random events whose chance of firing at any moment depends on how much compute has accumulated so far:</p>
<dl>
<dt><em>Doom</em> (<img src="https://latex.codecogs.com/png.latex?T_d">)</dt>
<dd>
An X-risk catastrophe happens. This is an irreversible absorbing state.
</dd>
<dt><em>Deliverance</em> (<img src="https://latex.codecogs.com/png.latex?T_s">)</dt>
<dd>
We achieve guaranteed alignment — a state after which X-risk from AI is effectively zero.
</dd>
</dl>
<p>Each event has a <em>latent</em> arrival time — <img src="https://latex.codecogs.com/png.latex?T_d"> and <img src="https://latex.codecogs.com/png.latex?T_s"> are the times at which doom and deliverance <em>would</em> fire if nothing else intervened. But the race ends at <img src="https://latex.codecogs.com/png.latex?T%5E*%20=%20%5Cmin(T_d,%20T_s)">: we observe whichever fires first, and from that moment both hazard rates cease to apply. Doom either happens first or not at all; deliverance either happens first or not at all; or neither fires within any relevant timeframe. When we write “<img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)">” below, we always mean the <em>outcome</em> “doom fires first” — i.e.&nbsp;<img src="https://latex.codecogs.com/png.latex?P(T_d%20%3C%20T_s)"> — not the marginal probability that the doom process would eventually fire in isolation.</p>
<p>Each event has a hazard rate (instantaneous arrival intensity given that neither event has yet occurred — i.e.&nbsp;while still being in <em>limbo</em>) that depends on the <em>cumulative stock</em> of compute in its respective pool:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Clambda_d(t)%20=%20g%5Cbigl(%5Cmathcal%7BC%7D_c(t)%5Cbigr),%20%5Cqquad%20%5Clambda_s(t)%20=%20h%5Cbigl(%5Cmathcal%7BC%7D_s(t)%5Cbigr),%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?g,%20h%20:%20%5B0,%20%5Cinfty)%20%5Cto%20%5B0,%20%5Cinfty)"> are monotonically non-decreasing functions, with <img src="https://latex.codecogs.com/png.latex?g(0)%20=%200"> and <img src="https://latex.codecogs.com/png.latex?h(0)%20=%200">. Monotonicity captures the assumption that the more capability compute we’ve done overall, the higher the catastrophe hazard per unit time; likewise, the more safety compute we’ve done overall, the higher the alignment-breakthrough hazard per unit time.</p>
<p>Note that these hazard rates depend on time via the cumulative compute stocks. The compute rate <img src="https://latex.codecogs.com/png.latex?c(t)"> does not appear directly—it enters only by determining how fast <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s"> grow. So the compute growth rate matters: doubling <img src="https://latex.codecogs.com/png.latex?c(t)"> does not double the hazard at time <img src="https://latex.codecogs.com/png.latex?t">, but it does make <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c(t)"> reach any given threshold sooner.</p>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The assumption that doom risk is monotone in <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c"> and safety progress is monotone in <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s"> is agnostic about the <em>shape</em> of the response — linear, concave, convex, sigmoidal — which is where non-trivial disagreements in AI safety discourse might live. We return to this below.</p>
</div>
</div>
</div>
<div id="cell-fig-hazard-shapes" class="cell" data-execution_count="3">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">300</span>)</span>
<span id="cb2-2">scenarios <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb2-3">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Linear"</span>,              g_lin(x),  h_lin(x)),</span>
<span id="cb2-4">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pessimistic (g convex, h concave)"</span>, g_pess(x), h_pess(x)),</span>
<span id="cb2-5">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Optimistic (g concave, h convex)"</span>,  g_opt(x),  h_opt(x)),</span>
<span id="cb2-6">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Sigmoidal overhang"</span>,  g_sig(x),  h_sig(x)),</span>
<span id="cb2-7">]</span>
<span id="cb2-8"></span>
<span id="cb2-9">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> go.Figure()</span>
<span id="cb2-10"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> name, gv, hv <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> scenarios:</span>
<span id="cb2-11">    vis <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> name.startswith(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pessimistic"</span>)</span>
<span id="cb2-12">    fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>x, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>gv, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"g(x)  doom"</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>),</span>
<span id="cb2-13">                             visible<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>vis, hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>))</span>
<span id="cb2-14">    fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>x, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>hv, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"h(x)  safety"</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_SALV, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>),</span>
<span id="cb2-15">                             visible<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>vis, hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>))</span>
<span id="cb2-16"></span>
<span id="cb2-17">buttons <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb2-18"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i, (name, _, _) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(scenarios):</span>
<span id="cb2-19">    vis <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(scenarios))</span>
<span id="cb2-20">    vis[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>i] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span> vis[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>i<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span></span>
<span id="cb2-21">    buttons.append(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>name, method<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"update"</span>, args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"visible"</span>: vis}]))</span>
<span id="cb2-22"></span>
<span id="cb2-23">fig.update_layout(</span>
<span id="cb2-24">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>LAYOUT,</span>
<span id="cb2-25">    updatemenus<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"buttons"</span>, direction<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"down"</span>, x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, xanchor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"left"</span>, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>,</span>
<span id="cb2-26">                      buttons<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>buttons, bgcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"white"</span>)],</span>
<span id="cb2-27">    xaxis_title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Cumulative compute 𝒞"</span>,</span>
<span id="cb2-28">    yaxis_title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Hazard rate"</span>,</span>
<span id="cb2-29">    height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">420</span>,</span>
<span id="cb2-30">)</span>
<span id="cb2-31">fig.show()</span></code></pre></div></div>
</details>
<div id="fig-hazard-shapes" class="cell-output cell-output-display quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-hazard-shapes-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>            <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script><script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>                <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.1.1.min.js" integrity="sha256-HUEFyfiTnZJxCxur99FjbKYTvKSzwDaD3/x5TqHpFu4=" crossorigin="anonymous"></script>                <div id="8c1c0837-b6d7-478f-b0a3-a3b7d3e483a3" class="plotly-graph-div" style="height:420px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("8c1c0837-b6d7-478f-b0a3-a3b7d3e483a3")) {                    Plotly.newPlot(                        "8c1c0837-b6d7-478f-b0a3-a3b7d3e483a3",                        [{"hovertemplate":"%{y:.2f}","line":{"color":"#c0392b","width":3},"name":"g(x)  doom","visible":false,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAF7r7j4mWbPwXuvuPiZas\u002fhDLPKmqMtD8F7r7j4mW7P8NUV86tH8E\u002fhDLPKmqMxD9EEEeHJvnHPwXuvuPiZcs\u002fxcs2QJ\u002fSzj\u002fDVFfOrR\u002fRP6NDk\u002fwL1tI\u002fhDLPKmqM1D9kIQtZyELWP0QQR4cm+dc\u002fJf+CtYSv2T8F7r7j4mXbP+Xc+hFBHN0\u002fxcs2QJ\u002fS3j9TXTm3fkTgP8NUV86tH+E\u002fM0x15dz64T+jQ5P8C9biPxQ7sRM7seM\u002fhDLPKmqM5D\u002f0Ke1BmWflP2QhC1nIQuY\u002f1BgpcPcd5z9EEEeHJvnnP7QHZZ5V1Og\u002fJf+CtYSv6T+V9qDMs4rqPwXuvuPiZes\u002fdeXc+hFB7D\u002fl3PoRQRztP1XUGClw9+0\u002fxcs2QJ\u002fS7j81w1RXzq3vP1NdObd+RPA\u002fC1nIQhay8D\u002fDVFfOrR\u002fxP3tQ5llFjfE\u002fM0x15dz68T\u002frRwRxdGjyP6NDk\u002fwL1vI\u002fXD8iiKND8z8UO7ETO7HzP8w2QJ\u002fSHvQ\u002fhDLPKmqM9D88Ll62Afr0P\u002fQp7UGZZ\u002fU\u002frCV8zTDV9T9kIQtZyEL2PxwdmuRfsPY\u002f1BgpcPcd9z+MFLj7jov3P0QQR4cm+fc\u002f\u002fAvWEr5m+D+0B2WeVdT4P20D9CntQfk\u002fJf+CtYSv+T\u002fd+hFBHB36P5X2oMyzivo\u002fTfIvWEv4+j8F7r7j4mX7P73pTW960\u002fs\u002fdeXc+hFB\u002fD8t4WuGqa78P+Xc+hFBHP0\u002fndiJndiJ\u002fT9V1BgpcPf9Pw3Qp7QHZf4\u002fxcs2QJ\u002fS\u002fj99x8XLNkD\u002fPzXDVFfOrf8\u002fd99x8bINAEBTXTm3fkQAQC\u002fbAH1KewBAC1nIQhayAEDn1o8I4ugAQMNUV86tHwFAn9IelHlWAUB7UOZZRY0BQFfOrR8RxAFAM0x15dz6AUAPyjyrqDECQOtHBHF0aAJAx8XLNkCfAkCjQ5P8C9YCQH\u002fBWsLXDANAXD8iiKNDA0A4velNb3oDQBQ7sRM7sQNA8Lh42QboA0DMNkCf0h4EQKi0B2WeVQRAhDLPKmqMBEBgsJbwNcMEQDwuXrYB+gRAGKwlfM0wBUD0Ke1BmWcFQNCntAdlngVArCV8zTDVBUCIo0OT\u002fAsGQGQhC1nIQgZAQJ\u002fSHpR5BkAcHZrkX7AGQPiaYaor5wZA1BgpcPcdB0CwlvA1w1QHQIwUuPuOiwdAaJJ\u002fwVrCB0BEEEeHJvkHQCCODk3yLwhA\u002fAvWEr5mCEDYiZ3YiZ0IQLQHZZ5V1AhAkIUsZCELCUBtA\u002fQp7UEJQEmBu++4eAlAJf+CtYSvCUAAfUp7UOYJQN36EUEcHQpAuHjZBuhTCkCV9qDMs4oKQHB0aJJ\u002fwQpATfIvWEv4CkAocPcdFy8LQAXuvuPiZQtA4muGqa6cC0C96U1vetMLQJpnFTVGCgxAdeXc+hFBDEBSY6TA3XcMQC3ha4aprgxACl8zTHXlDEDl3PoRQRwNQMJawtcMUw1AndiJndiJDUB6VlFjpMANQFXUGClw9w1AMlLg7jsuDkAN0Ke0B2UOQOpNb3rTmw5Axcs2QJ\u002fSDkCiSf4FawkPQH3Hxcs2QA9AWkWNkQJ3D0A1w1RXzq0PQBJBHB2a5A9Ad99x8bINEEBlnlXUGCkQQFNdObd+RBBAQRwdmuRfEEAv2wB9SnsQQB2a5F+wlhBAC1nIQhayEED5F6wlfM0QQOfWjwji6BBA1ZVz60cEEUDDVFfOrR8RQLETO7ETOxFAn9IelHlWEUCNkQJ333ERQHtQ5llFjRFAaQ\u002fKPKuoEUBXzq0fEcQRQEWNkQJ33xFAM0x15dz6EUAhC1nIQhYSQA\u002fKPKuoMRJA\u002foggjg5NEkDrRwRxdGgSQNoG6FPagxJAx8XLNkCfEkC2hK8ZproSQKNDk\u002fwL1hJAkgJ333HxEkB\u002fwVrC1wwTQG6APqU9KBNAXD8iiKNDE0BK\u002fgVrCV8TQDi96U1vehNAJnzNMNWVE0AUO7ETO7ETQAL6lPagzBNA8Lh42QboE0Ded1y8bAMUQMw2QJ\u002fSHhRAuvUjgjg6FECotAdlnlUUQJZz60cEcRRAhDLPKmqMFEBy8bIN0KcUQGCwlvA1wxRATm9605veFEA8Ll62AfoUQCrtQZlnFRVAGKwlfM0wFUAGawlfM0wVQPQp7UGZZxVA4ujQJP+CFUDQp7QHZZ4VQL5mmOrKuRVArCV8zTDVFUCa5F+wlvAVQIijQ5P8CxZAdmIndmInFkBkIQtZyEIWQFLg7jsuXhZAQJ\u002fSHpR5FkAuXrYB+pQWQBwdmuRfsBZACtx9x8XLFkD4mmGqK+cWQOdZRY2RAhdA1BgpcPcdF0DD1wxTXTkXQLCW8DXDVBdAn1XUGClwF0CMFLj7josXQHvTm970phdAaJJ\u002fwVrCF0BXUWOkwN0XQEQQR4cm+RdAM88qaowUGEAgjg5N8i8YQA9N8i9YSxhA\u002fAvWEr5mGEDryrn1I4IYQNiJndiJnRhAx0iBu++4GEC0B2WeVdQYQKPGSIG77xhAkIUsZCELGUB\u002fRBBHhyYZQG0D9CntQRlAW8LXDFNdGUBJgbvvuHgZQDdAn9IelBlAJf+CtYSvGUAUvmaY6soZQAB9SntQ5hlA7zsuXrYBGkDd+hFBHB0aQMy59SOCOBpAuHjZBuhTGkCnN73pTW8aQJX2oMyzihpAhLWErxmmGkBwdGiSf8EaQF8zTHXl3BpATfIvWEv4GkA8sRM7sRMbQChw9x0XLxtAFy\u002fbAH1KG0AF7r7j4mUbQPSsosZIgRtA4muGqa6cG0DPKmqMFLgbQL3pTW960xtArKgxUuDuG0CaZxU1RgocQIcm+ResJRxAdeXc+hFBHEBkpMDdd1wcQFJjpMDddxxAPyKIo0OTHEAt4WuGqa4cQBygT2kPyhxACl8zTHXlHED3HRcv2wAdQOXc+hFBHB1A1Jve9KY3HUDCWsLXDFMdQK8Zprpybh1AndiJndiJHUCMl22APqUdQHpWUWOkwB1AaBU1RgrcHUBV1BgpcPcdQEST\u002fAvWEh5AMlLg7jsuHkAgEcTRoUkeQA3Qp7QHZR5A\u002fI6Ll22AHkDqTW9605seQNgMU105tx5Axcs2QJ\u002fSHkC0ihojBe4eQKJJ\u002fgVrCR9AkAji6NAkH0B9x8XLNkAfQGyGqa6cWx9AWkWNkQJ3H0BIBHF0aJIfQDXDVFfOrR9AJII4OjTJH0ASQRwdmuQfQAAAAAAAACBA"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#2471a3","width":3},"name":"h(x)  safety","visible":false,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+RP8NUV86tH6E\u002fJP+CtYSvqT\u002fDVFfOrR+xP\u002fQp7UGZZ7U\u002fJP+CtYSvuT9V1BgpcPe9P8NUV86tH8E\u002fWz8iiKNDwz\u002f0Ke1BmWfFP4wUuPuOi8c\u002fJP+CtYSvyT+96U1vetPLP1XUGClw980\u002fd99x8bIN0D\u002fDVFfOrR\u002fRPw\u002fKPKuoMdI\u002fWz8iiKND0z+otAdlnlXUP\u002fQp7UGZZ9U\u002fQJ\u002fSHpR51j+MFLj7jovXP9iJndiJndg\u002fJP+CtYSv2T9xdGiSf8HaP73pTW9609s\u002fCV8zTHXl3D9V1BgpcPfdP6FJ\u002fgVrCd8\u002fd99x8bIN4D8dmuRfsJbgP8NUV86tH+E\u002faQ\u002fKPKuo4T8PyjyrqDHiP7WErxmmuuI\u002fWz8iiKND4z8B+pT2oMzjP6i0B2WeVeQ\u002fTm9605ve5D\u002f0Ke1BmWflP5rkX7CW8OU\u002fQJ\u002fSHpR55j\u002fmWUWNkQLnP4wUuPuOi+c\u002fMs8qaowU6D\u002fYiZ3YiZ3oP35EEEeHJuk\u002fJP+CtYSv6T\u002fLufUjgjjqP3F0aJJ\u002fweo\u002fFy\u002fbAH1K6z+96U1vetPrP2OkwN13XOw\u002fCV8zTHXl7D+vGaa6cm7tP1XUGClw9+0\u002f+46Ll22A7j+hSf4FawnvP0gEcXRoku8\u002fd99x8bIN8D\u002fKPKuoMVLwPx2a5F+wlvA\u002fcPcdFy\u002fb8D\u002fDVFfOrR\u002fxPxaykIUsZPE\u002faQ\u002fKPKuo8T+8bAP0Ke3xPw\u002fKPKuoMfI\u002fYid2Yid28j+1hK8ZprryPwji6NAk\u002f\u002fI\u002fWz8iiKND8z+unFs\u002fIojzPwH6lPagzPM\u002fVVfOrR8R9D+otAdlnlX0P\u002fsRQRwdmvQ\u002fTm9605ve9D+hzLOKGiP1P\u002fQp7UGZZ\u002fU\u002fR4cm+Res9T+a5F+wlvD1P+1BmWcVNfY\u002fQJ\u002fSHpR59j+T\u002fAvWEr72P+ZZRY2RAvc\u002fObd+RBBH9z+MFLj7jov3P99x8bIN0Pc\u002fMs8qaowU+D+FLGQhC1n4P9iJndiJnfg\u002fK+fWjwji+D9+RBBHhyb5P9GhSf4Fa\u002fk\u002fJP+CtYSv+T94XLxsA\u002fT5P8u59SOCOPo\u002fHhcv2wB9+j9xdGiSf8H6P8TRoUn+Bfs\u002fFy\u002fbAH1K+z9qjBS4+477P73pTW960\u002fs\u002fEEeHJvkX\u002fD9jpMDdd1z8P7YB+pT2oPw\u002fCV8zTHXl\u002fD9cvGwD9Cn9P68Zprpybv0\u002fAnffcfGy\u002fT9V1BgpcPf9P6gxUuDuO\u002f4\u002f+46Ll22A\u002fj9O7MRO7MT+P6FJ\u002fgVrCf8\u002f9KY3velN\u002fz9IBHF0aJL\u002fP5thqivn1v8\u002fd99x8bINAEAgjg5N8i8AQMo8q6gxUgBAc+tHBHF0AEAdmuRfsJYAQMZIgbvvuABAcPcdFy\u002fbAEAZprpybv0AQMNUV86tHwFAbQP0Ke1BAUAWspCFLGQBQMBgLeFrhgFAaQ\u002fKPKuoAUATvmaY6soBQLxsA\u002fQp7QFAZhugT2kPAkAPyjyrqDECQLl42QboUwJAYid2Yid2AkAM1hK+ZpgCQLWErxmmugJAXzNMdeXcAkAI4ujQJP8CQLKQhSxkIQNAWz8iiKNDA0AF7r7j4mUDQK6cWz8iiANAWEv4mmGqA0AB+pT2oMwDQKuoMVLg7gNAVVfOrR8RBED+BWsJXzMEQKi0B2WeVQRAUWOkwN13BED7EUEcHZoEQKTA3XdcvARATm9605veBED3HRcv2wAFQKHMs4oaIwVASntQ5llFBUD0Ke1BmWcFQJ3YiZ3YiQVAR4cm+ResBUDwNcNUV84FQJrkX7CW8AVAQ5P8C9YSBkDtQZlnFTUGQJbwNcNUVwZAQJ\u002fSHpR5BkDpTW9605sGQJP8C9YSvgZAPauoMVLgBkDmWUWNkQIHQJAI4ujQJAdAObd+RBBHB0DjZRugT2kHQIwUuPuOiwdANsNUV86tB0DfcfGyDdAHQIkgjg5N8gdAMs8qaowUCEDcfcfFyzYIQIUsZCELWQhAL9sAfUp7CEDYiZ3YiZ0IQII4OjTJvwhAK+fWjwjiCEDVlXPrRwQJQH5EEEeHJglAKPOsosZICUDRoUn+BWsJQHtQ5llFjQlAJP+CtYSvCUDOrR8RxNEJQHhcvGwD9AlAIQtZyEIWCkDLufUjgjgKQHRokn\u002fBWgpAHhcv2wB9CkDHxcs2QJ8KQHF0aJJ\u002fwQpAGiMF7r7jCkDE0aFJ\u002fgULQG2APqU9KAtAFy\u002fbAH1KC0DA3XdcvGwLQGqMFLj7jgtAEzuxEzuxC0C96U1vetMLQGaY6sq59QtAEEeHJvkXDEC59SOCODoMQGOkwN13XAxADFNdObd+DEC2AfqU9qAMQGCwlvA1wwxACV8zTHXlDECzDdCntAcNQFy8bAP0KQ1ABmsJXzNMDUCvGaa6cm4NQFnIQhaykA1AAnffcfGyDUCsJXzNMNUNQFXUGClw9w1A\u002f4K1hK8ZDkCoMVLg7jsOQFLg7jsuXg5A+46Ll22ADkClPSjzrKIOQE7sxE7sxA5A+JphqivnDkChSf4FawkPQEv4mmGqKw9A9KY3velND0CeVdQYKXAPQEgEcXRokg9A8bIN0Ke0D0CbYaor59YPQEQQR4cm+Q9Ad99x8bINEEDMNkCf0h4QQCCODk3yLxBAdeXc+hFBEEDKPKuoMVIQQB+UeVZRYxBAc+tHBHF0EEDIQhaykIUQQB2a5F+wlhBAcvGyDdCnEEDGSIG777gQQBugT2kPyhBAcPcdFy\u002fbEEDFTuzETuwQQBmmunJu\u002fRBAbv2III4OEUDDVFfOrR8RQBisJXzNMBFAbQP0Ke1BEUDBWsLXDFMRQBaykIUsZBFAawlfM0x1EUDAYC3ha4YRQBS4+46LlxFAaQ\u002fKPKuoEUC+ZpjqyrkRQBO+ZpjqyhFAZxU1RgrcEUC8bAP0Ke0RQBHE0aFJ\u002fhFAZhugT2kPEkC6cm79iCASQA\u002fKPKuoMRJAZCELWchCEkC5eNkG6FMSQA3Qp7QHZRJAYid2Yid2EkC3fkQQR4cSQAzWEr5mmBJAYS3ha4apEkC1hK8ZproSQArcfcfFyxJAXzNMdeXcEkC0ihojBe4SQAji6NAk\u002fxJAXTm3fkQQE0CykIUsZCETQAfoU9qDMhNAWz8iiKNDE0CwlvA1w1QTQAXuvuPiZRNAWkWNkQJ3E0CunFs\u002fIogTQAP0Ke1BmRNAWEv4mmGqE0CtosZIgbsTQAH6lPagzBNAVlFjpMDdE0CrqDFS4O4TQAAAAAAAABRA"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#c0392b","width":3},"name":"g(x)  doom","visible":true,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAML1kPkFNCPwwvWQ+QU2I\u002f7VREEQKedD8ML1kPkFOCP4RZ+xeRoow\u002f7VREEQKelD8LkICX9A+cPwwvWQ+QU6I\u002fi99sU8Ixpz+EWfsXkaKsP3pOgi7+UrE\u002f7VREEQKetD8fwEM0VDK4PwuQgJf0D7w\u002fWmJ9nXEbwD8ML1kPkFPCPx2uU6FVsMQ\u002fi99sU8Ixxz9aw6Ql1tfJP4RZ+xeRosw\u002fDaJwKvORzz96ToIu\u002flLRPxyl21dW79I\u002f7VREEQKe1D\u002fvXbxaAV\u002fWPx\u002fAQzRUMtg\u002ffXvanfoX2j8LkICX9A\u002fcP8f9NSFCGt4\u002fWmJ9nXEb4D9ocmfy6zLhPwwvWQ+QU+I\u002fSZhS9F194z8drlOhVbDkP4hwXBZ37OU\u002fi99sU8Ix5z8l+4RYN4DoP1rDpCXW1+k\u002fIzjMup446z+EWfsXkaLsP30nMj2tFe4\u002fDaJwKvOR7z+aZNtvsYvwP3pOgi7+UvE\u002fpQ4t0d8e8j8cpdtXVu\u002fyP98RjsJhxPM\u002f7VREEQKe9D9Jbv5DN3z1P+9dvFoBX\u002fY\u002f4SN+VWBG9z8fwEM0VDL4P6gyDffcIvk\u002ffXvanfoX+j+emqsorRH7PwuQgJf0D\u002fw\u002fw1tZ6tAS\u002fT\u002fH\u002fTUhQhr+Pxl2FjxIJv8\u002fWmJ9nXEbAEDOdPGOCaYAQGhyZ\u002fLrMgFAJ1vfxxjCAUAML1kPkFMCQBju1MhR5wJASZhS9F19A0CgLdKRtBUEQB2uU6FVsARAvxnXIkFNBUCIcFwWd+wFQHay43v3jQZAi99sU8IxB0DF9\u002fec19cHQCX7hFg3gAhArukThuEqCUBaw6Ql1tcJQCuINzcVhwpAIzjMup44C0BB02KwcuwLQIRZ+xeRogxA7cqV8flaDUB9JzI9rRUOQDJv0Pqq0g5ADaJwKvORD0AHYAnmwikQQJpk22+xixBAwF6uMsXuEEB6ToIu\u002flIRQMYzV2NcuBFApQ4t0d8eEkAX3wN4iIYSQByl21dW7xJAtGC0cElZE0DfEY7CYcQTQJy4aE2fMBRA7VREEQKeFEDS5iAOigwVQElu\u002fkM3fBVAU+vcsgntFUDvXbxaAV8WQB\u002fGnDse0hZA4SN+VWBGF0A2d2Cox7sXQB\u002fAQzRUMhhAmv4n+QWqGECoMg333CIZQElc8y3ZnBlAfXvanfoXGkBEkMJGQZQaQJ6aqyitERtAi5qVQz6QG0ALkICX9A8cQB17bCTQkBxAw1tZ6tASHUD7MUfp9pUdQMf9NSFCGh5AJb8lkrKfHkAZdhY8SCYfQJ0iCB8Drh9AWmJ9nXEbIEAuLvdHdGAgQM508Y4JpiBANTZscjHsIEBocmfy6zIhQGIp4w45eiFAJ1vfxxjCIUC0B1wdiwoiQAwvWQ+QUyJALtHWnSedIkAY7tTIUeciQM2FU5AOMiNASZhS9F19I0CRJdL0P8kjQKAt0pG0FSRAe7BSy7tiJEAdrlOhVbAkQIom1ROC\u002fiRAvxnXIkFNJUDAh1nOkpwlQIhwXBZ37CVAHNTf+u08JkB2suN7940mQJ0LaJmT3yZAi99sU8IxJ0BELvKpg4QnQMX395zX1ydAEjx+LL4rKEAl+4RYN4AoQAU1DCFD1ShArukThuEqKUAeGZyHEoEpQFrDpCXW1ylAXOgtYCwvKkAriDc3FYcqQMGiwaqQ3ypAIzjMup44K0BMSFdnP5IrQEHTYrBy7CtA\u002fNjulThHLECEWfsXkaIsQNNUiDZ8\u002fixA7cqV8flaLUDPuyNJCrgtQH0nMj2tFS5A8Q3BzeJzLkAyb9D6qtIuQDlLYMQFMi9ADaJwKvORL0CncwEtc\u002fIvQAdgCebCKTBAn0PSg5VaMECaZNtvsYswQPzCJKoWvTBAwF6uMsXuMEDrN3gJvSAxQHpOgi7+UjFAbqLMoYiFMUDGM1djXLgxQIQCInN56zFApQ4t0d8eMkAsWHh9j1IyQBffA3iIhjJAaKPPwMq6MkAcpdtXVu8yQDbkJz0rJDNAtGC0cElZM0CYGoHysI4zQN8RjsJhxDNAjEbb4Fv6M0CcuGhNnzA0QBNoNggsZzRA7VREEQKeNEAtf5JoIdU0QNLmIA6KDDVA24vvATxENUBJbv5DN3w1QBuOTdR7tDVAU+vcsgntNUDuhazf4CU2QO9dvFoBXzZAVHMMJGuYNkAfxpw7HtI2QE1WbaEaDDdA4SN+VWBGN0DYLs9X74A3QDZ3YKjHuzdA9\u002fwxR+n2N0AfwEM0VDI4QKnAlW8IbjhAmv4n+QWqOEDuefrQTOY4QKgyDffcIjlAxShga7ZfOUBJXPMt2Zw5QDLNxj5F2jlAfXvanfoXOkAvZy5L+VU6QESQwkZBlDpAwPaWkNLSOkCemqsorRE7QON7AA\u002fRUDtAi5qVQz6QO0CZ9mrG9M87QAuQgJf0DzxA4mbWtj1QPEAde2wk0JA8QL\u002fMQuCr0TxAw1tZ6tASPUAuKLBCP1Q9QPsxR+n2lT1AMHke3vfXPUDH\u002fTUhQho+QMW\u002fjbLVXD5AJb8lkrKfPkDt+\u002f2\u002f2OI+QBl2FjxIJj9AqC1vBgFqP0CdIggfA64\u002fQPZU4YVO8j9AWmJ9nXEbQEDsOCqf4D1AQC4u90d0YEBAJULklyyDQEDOdPGOCaZAQCnGHi0LyUBANTZscjHsQED1xNlefA9BQGhyZ\u002fLrMkFAjD4VLYBWQUBiKeMOOXpBQOsy0ZcWnkFAJ1vfxxjCQUAVog2fP+ZBQLQHXB2LCkJAB4zKQvsuQkAML1kPkFNCQMTwB4NJeEJALtHWnSedQkBJ0MVfKsJCQBju1MhR50JAmSoE2Z0MQ0DNhVOQDjJDQLD\u002fwu6jV0NASZhS9F19Q0CTTwKhPKNDQJEl0vQ\u002fyUNAPhrC72fvQ0CgLdKRtBVEQLRfAtslPERAe7BSy7tiREDxH8NidolEQB2uU6FVsERA+loEh1nXRECKJtUTgv5EQMsQxkfPJUVAvxnXIkFNRUBmQQil13RFQMCHWc6SnEVAzOzKnnLERUCIcFwWd+xFQPkSDjWgFEZAHNTf+u08RkDxs9FnYGVGQHay43v3jUZAsc8VN7O2RkCdC2iZk99GQDxm2qKYCEdAi99sU8IxR0COdx+rEFtHQEQu8qmDhEdArQPlTxuuR0DF9\u002fec19dHQJIKK5G4AUhAEjx+LL4rSEBDjPFu6FVIQCX7hFg3gEhAvIg46aqqSEAFNQwhQ9VIQAAAAAAAAElA"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#2471a3","width":3},"name":"h(x)  safety","visible":true,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAyF0o\u002flmi3P6GsHxpmjcA\u002fPiOihLtFxD8yF0o\u002flmjHPwWbYXTqK8o\u002fScQG3GOrzD8nUxWEcvfOP6GsHxpmjdA\u002fZpF3r3CO0T\u002fCq\u002fJQjoHSP6NF0mLKaNM\u002fPiOihLtF1D+PYxsUpRnVP+VcWECN5dU\u002f57wcHUyq1j8yF0o\u002flmjXP4V6xWYEIdg\u002f8YIvJxnU2D\u002fhmIoqRYLZPwWbYXTqK9o\u002f7D\u002f96l7R2j\u002fcSOJW7nLbP4TIs\u002frbENw\u002fScQG3GOr3D\u002f\u002fnBzPu0LdPyIo2FIU190\u002f3TTzRplo3j8nUxWEcvfeP+zFqlvEg98\u002fIxIGAtgG4D+c5kX6qUrgP6GsHxpmjeA\u002faFnkThnP4D83ifiMzw\u002fhP7fFR+mTT+E\u002fZpF3r3CO4T\u002fBklh1b8zhP0kp\u002fiuZCeI\u002fVfrSLvZF4j\u002fCq\u002fJQjoHiP1xXBelovOI\u002fELbP24z24j+HKKOlADDjP6NF0mLKaOM\u002fRDRJ1++g4z8nl2R1dtjjP+UNHmRjD+Q\u002fPiOihLtF5D9M1GB3g3vkP8mXp6C\u002fsOQ\u002f3t7RLHTl5D+PYxsUpRnlP\u002fEvHh5WTeU\u002fNxMF5YqA5T+SLnrYRrPlP+VcWECN5eU\u002fQ3AlP2EX5j9HklrUxUjmP+J8f969eeY\u002f57wcHUyq5j\u002fVu4gyc9rmP6\u002fokqU1Cuc\u002fXf4P45U55z8yF0o\u002flmjnP8X3Vvc4l+c\u002ff71WMoDF5z\u002fW5pwCbvPnP4V6xWYEIeg\u002f9ee3SkVO6D+BFJmIMnvoP9XmrenNp+g\u002f8YIvJxnU6D+zTRLrFQDpPxW2wNDFK+k\u002fDqzKZSpX6T\u002fhmIoqRYLpP8qawJIXrek\u002fZ7UkBqPX6T+3mfDg6AHqPwWbYXTqK+o\u002fGVozB6lV6j\u002fxpBPWJX\u002fqP2X\u002fDxRiqOo\u002f7D\u002f96l7R6j92o9l7HfrqP9WzKd+eIus\u002fNlVQJeRK6z\u002fcSOJW7nLrP6xt9XS+mus\u002fowFseVXC6z+nIjxXtOnrP4TIs\u002frbEOw\u002fAG65Sc037D8MmwkkiV7sP7V+cWMQhew\u002fScQG3GOr7D8nzFxchNHsPxput61y9+w\u002fdWg7lC8d7T\u002f\u002fnBzPu0LtP346yhgYaO0\u002fv+8YJ0WN7T8nQ2urQ7LtPyIo2FIU1+0\u002fKOpPxrf77T+ug7+qLiDuP+J1MqF5RO4\u002f3TTzRplo7j\u002fJOqo1jozuP1LTewNZsO4\u002fwa8kQ\u002frT7j8nUxWEcvfuPw1ljFLCGu8\u002faPivN+o97z+i06W56mDvP+zFqlvEg+8\u002fVhUpnnem7z+AEM7+BMnvPyfOnvhs6+8\u002fIxIGAtgG8D\u002fy74JL5xfwPzCjhpLkKPA\u002fF3SjD9A58D+c5kX6qUrwP+MAvYhyW\u002fA\u002frEVC8Cls8D\u002fmZQFl0HzwP6GsHxpmjfA\u002fUSjDQeud8D9AlBkNYK7wP9oEX6zEvvA\u002faFnkThnP8D+tdRUjXt\u002fwP6NFf1aT7\u002fA\u002frY3VFbn\u002f8D83ifiMzw\u002fxP9lZ+ubWH\u002fE\u002f2UgkTs8v8T\u002fl3PvruD\u002fxP7fFR+mTT\u002fE\u002fUp8UbmBf8T9ljrmhHm\u002fxP1a33KrOfvE\u002fZpF3r3CO8T9JF9vUBJ7xP4bWsz+LrfE\u002f1t4NFAS98T\u002fBklh1b8zxP45aaobN2\u002fE\u002frjqEaR7r8T+dTlVAYvrxP0kp\u002fiuZCfI\u002f4xsUTcMY8j8cZKTD4CfyP5BCN6\u002fxNvI\u002fVfrSLvZF8j9puv5g7lTyP81xxWPaY\u002fI\u002fB4+4VLpy8j\u002fCq\u002fJQjoHyPz4lGnVWkPI\u002fNaJj3RKf8j\u002fRhpSlw63yP1xXBelovPI\u002fJwqkwgLL8j9YSfZMkdnyP\u002fykG6IU6PI\u002fELbP24z28j\u002fZMmwT+gTzPx716mFcE\u002fM\u002fqfLn37Mh8z+HKKOlADDzP3l5AstCPvM\u002f7X+TZ3pM8z\u002f4U42Sp1rzP6NF0mLKaPM\u002f64vx7uJ28z\u002fV6ChN8YTzP+NCZpP1kvM\u002fRDRJ1++g8z8LkCQu4K7zP7zd\u002f6zGvPM\u002ffcuYaKPK8z8nl2R1dtjzP5dukec\u002f5vM\u002fVscH0\u002f\u002fz8z8RrmtLtgH0P+UNHmRjD\u002fQ\u002f8e89MAcd9D84s6nCoSr0Pzc9AC4zOPQ\u002fPiOihLtF9D\u002fkzLLYOlP0P6iPGTyxYPQ\u002fDsSCwB5u9D9M1GB3g3v0P81E7XHfiPQ\u002fpbYpwTKW9D8m5OB1faP0P8mXp6C\u002fsPQ\u002ff53dUfm99D+krq6ZKsv0P7VYE4hT2PQ\u002f3t7RLHTl9D+dFn+XjPL0P4o\u002ff9ec\u002f\u002fQ\u002fY9YG\u002fKQM9T+PYxsUpRn1PyJFlC6dJvU\u002finQbWo0z9T8ESC6ldUD1P\u002fEvHh5WTfU\u002fInAR0y5a9T9G1QPS\u002f2b1P3xmxyjJc\u002fU\u002fNxMF5YqA9T+DXT0URY31P78AycP3mfU\u002f6ZTZAKOm9T+SLnrYRrP1P4z7j1fjv\u002fU\u002fZNzainjM9T\u002fK+vV+Btn1P+VcWECN5fU\u002fv3VV2wzy9T\u002fCsh1chf71P2wGv872CvY\u002fQ3AlP2EX9j8cghu5xCP2P7viSkghMPY\u002f9c08+HY89j9HklrUxUj2PwIM7ucNVfY\u002fGR4iPk9h9j+aKAPiiW32P+J8f969efY\u002foM9nPuuF9j+pqG8MEpL2P63QLVMynvY\u002f57wcHUyq9j+5+Jp0X7b2P12N62NswvY\u002fpmc29XLO9j\u002fVu4gyc9r2P6Vn1SVt5vY\u002fg1L12GDy9j8HzKdVTv72P6\u002fokqU1Cvc\u002f9NxD0hYW9z+zVi\u002fl8SH3P\u002f7UsefGLfc\u002fXf4P45U59z979XbgXkX3P16s\u002fOghUfc\u002fHzagBd9c9z8yF0o\u002flmj3P0aUzJ5HdPc\u002fxP\u002fjLPN\u002f9z\u002fwBTfymIv3P8X3Vvc4l\u002fc\u002fchTARNOi9z+g0dniZ673P3si99n2ufc\u002ff71WMoDF9z8UYSP0A9H3PwUXdCeC3Pc\u002fznZM1Prn9z\u002fW5pwCbvP3P37cQrrb\u002fvc\u002fNBsJA0QK+D9o8qfkphX4P4V6xWYEIfg\u002f4ND1kFws+D+wUrtqrzf4PwvXhvv8Qvg\u002f9ee3SkVO+D93+pxfiFn4P9elc0HGZPg\u002f69lo9\u002f5v+D+BFJmIMnv4P\u002f6VEPxghvg\u002fD5XLWIqR+D+Zcbalrpz4P9XmrenNp\u002fg\u002fnDx\u002fK+iy+D\u002fwd+hx\u002fb34P8CKmMMNyfg\u002f8YIvJxnU+D+luD6jH9\u002f4P8z7SD4h6vg\u002fAcHC\u002fh31+D+zTRLrFQD5P6bjjwkJC\u002fk\u002fwOuFYPcV+T84IDH24CD5PxW2wNDFK\u002fk\u002fHYZW9qU2+T8ONQdtgUH5P1Nb2jpYTPk\u002f"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#c0392b","width":3},"name":"g(x)  doom","visible":false,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAyF0o\u002flmi3P6GsHxpmjcA\u002fPiOihLtFxD8yF0o\u002flmjHPwWbYXTqK8o\u002fScQG3GOrzD8nUxWEcvfOP6GsHxpmjdA\u002fZpF3r3CO0T\u002fCq\u002fJQjoHSP6NF0mLKaNM\u002fPiOihLtF1D+PYxsUpRnVP+VcWECN5dU\u002f57wcHUyq1j8yF0o\u002flmjXP4V6xWYEIdg\u002f8YIvJxnU2D\u002fhmIoqRYLZPwWbYXTqK9o\u002f7D\u002f96l7R2j\u002fcSOJW7nLbP4TIs\u002frbENw\u002fScQG3GOr3D\u002f\u002fnBzPu0LdPyIo2FIU190\u002f3TTzRplo3j8nUxWEcvfeP+zFqlvEg98\u002fIxIGAtgG4D+c5kX6qUrgP6GsHxpmjeA\u002faFnkThnP4D83ifiMzw\u002fhP7fFR+mTT+E\u002fZpF3r3CO4T\u002fBklh1b8zhP0kp\u002fiuZCeI\u002fVfrSLvZF4j\u002fCq\u002fJQjoHiP1xXBelovOI\u002fELbP24z24j+HKKOlADDjP6NF0mLKaOM\u002fRDRJ1++g4z8nl2R1dtjjP+UNHmRjD+Q\u002fPiOihLtF5D9M1GB3g3vkP8mXp6C\u002fsOQ\u002f3t7RLHTl5D+PYxsUpRnlP\u002fEvHh5WTeU\u002fNxMF5YqA5T+SLnrYRrPlP+VcWECN5eU\u002fQ3AlP2EX5j9HklrUxUjmP+J8f969eeY\u002f57wcHUyq5j\u002fVu4gyc9rmP6\u002fokqU1Cuc\u002fXf4P45U55z8yF0o\u002flmjnP8X3Vvc4l+c\u002ff71WMoDF5z\u002fW5pwCbvPnP4V6xWYEIeg\u002f9ee3SkVO6D+BFJmIMnvoP9XmrenNp+g\u002f8YIvJxnU6D+zTRLrFQDpPxW2wNDFK+k\u002fDqzKZSpX6T\u002fhmIoqRYLpP8qawJIXrek\u002fZ7UkBqPX6T+3mfDg6AHqPwWbYXTqK+o\u002fGVozB6lV6j\u002fxpBPWJX\u002fqP2X\u002fDxRiqOo\u002f7D\u002f96l7R6j92o9l7HfrqP9WzKd+eIus\u002fNlVQJeRK6z\u002fcSOJW7nLrP6xt9XS+mus\u002fowFseVXC6z+nIjxXtOnrP4TIs\u002frbEOw\u002fAG65Sc037D8MmwkkiV7sP7V+cWMQhew\u002fScQG3GOr7D8nzFxchNHsPxput61y9+w\u002fdWg7lC8d7T\u002f\u002fnBzPu0LtP346yhgYaO0\u002fv+8YJ0WN7T8nQ2urQ7LtPyIo2FIU1+0\u002fKOpPxrf77T+ug7+qLiDuP+J1MqF5RO4\u002f3TTzRplo7j\u002fJOqo1jozuP1LTewNZsO4\u002fwa8kQ\u002frT7j8nUxWEcvfuPw1ljFLCGu8\u002faPivN+o97z+i06W56mDvP+zFqlvEg+8\u002fVhUpnnem7z+AEM7+BMnvPyfOnvhs6+8\u002fIxIGAtgG8D\u002fy74JL5xfwPzCjhpLkKPA\u002fF3SjD9A58D+c5kX6qUrwP+MAvYhyW\u002fA\u002frEVC8Cls8D\u002fmZQFl0HzwP6GsHxpmjfA\u002fUSjDQeud8D9AlBkNYK7wP9oEX6zEvvA\u002faFnkThnP8D+tdRUjXt\u002fwP6NFf1aT7\u002fA\u002frY3VFbn\u002f8D83ifiMzw\u002fxP9lZ+ubWH\u002fE\u002f2UgkTs8v8T\u002fl3PvruD\u002fxP7fFR+mTT\u002fE\u002fUp8UbmBf8T9ljrmhHm\u002fxP1a33KrOfvE\u002fZpF3r3CO8T9JF9vUBJ7xP4bWsz+LrfE\u002f1t4NFAS98T\u002fBklh1b8zxP45aaobN2\u002fE\u002frjqEaR7r8T+dTlVAYvrxP0kp\u002fiuZCfI\u002f4xsUTcMY8j8cZKTD4CfyP5BCN6\u002fxNvI\u002fVfrSLvZF8j9puv5g7lTyP81xxWPaY\u002fI\u002fB4+4VLpy8j\u002fCq\u002fJQjoHyPz4lGnVWkPI\u002fNaJj3RKf8j\u002fRhpSlw63yP1xXBelovPI\u002fJwqkwgLL8j9YSfZMkdnyP\u002fykG6IU6PI\u002fELbP24z28j\u002fZMmwT+gTzPx716mFcE\u002fM\u002fqfLn37Mh8z+HKKOlADDzP3l5AstCPvM\u002f7X+TZ3pM8z\u002f4U42Sp1rzP6NF0mLKaPM\u002f64vx7uJ28z\u002fV6ChN8YTzP+NCZpP1kvM\u002fRDRJ1++g8z8LkCQu4K7zP7zd\u002f6zGvPM\u002ffcuYaKPK8z8nl2R1dtjzP5dukec\u002f5vM\u002fVscH0\u002f\u002fz8z8RrmtLtgH0P+UNHmRjD\u002fQ\u002f8e89MAcd9D84s6nCoSr0Pzc9AC4zOPQ\u002fPiOihLtF9D\u002fkzLLYOlP0P6iPGTyxYPQ\u002fDsSCwB5u9D9M1GB3g3v0P81E7XHfiPQ\u002fpbYpwTKW9D8m5OB1faP0P8mXp6C\u002fsPQ\u002ff53dUfm99D+krq6ZKsv0P7VYE4hT2PQ\u002f3t7RLHTl9D+dFn+XjPL0P4o\u002ff9ec\u002f\u002fQ\u002fY9YG\u002fKQM9T+PYxsUpRn1PyJFlC6dJvU\u002finQbWo0z9T8ESC6ldUD1P\u002fEvHh5WTfU\u002fInAR0y5a9T9G1QPS\u002f2b1P3xmxyjJc\u002fU\u002fNxMF5YqA9T+DXT0URY31P78AycP3mfU\u002f6ZTZAKOm9T+SLnrYRrP1P4z7j1fjv\u002fU\u002fZNzainjM9T\u002fK+vV+Btn1P+VcWECN5fU\u002fv3VV2wzy9T\u002fCsh1chf71P2wGv872CvY\u002fQ3AlP2EX9j8cghu5xCP2P7viSkghMPY\u002f9c08+HY89j9HklrUxUj2PwIM7ucNVfY\u002fGR4iPk9h9j+aKAPiiW32P+J8f969efY\u002foM9nPuuF9j+pqG8MEpL2P63QLVMynvY\u002f57wcHUyq9j+5+Jp0X7b2P12N62NswvY\u002fpmc29XLO9j\u002fVu4gyc9r2P6Vn1SVt5vY\u002fg1L12GDy9j8HzKdVTv72P6\u002fokqU1Cvc\u002f9NxD0hYW9z+zVi\u002fl8SH3P\u002f7UsefGLfc\u002fXf4P45U59z979XbgXkX3P16s\u002fOghUfc\u002fHzagBd9c9z8yF0o\u002flmj3P0aUzJ5HdPc\u002fxP\u002fjLPN\u002f9z\u002fwBTfymIv3P8X3Vvc4l\u002fc\u002fchTARNOi9z+g0dniZ673P3si99n2ufc\u002ff71WMoDF9z8UYSP0A9H3PwUXdCeC3Pc\u002fznZM1Prn9z\u002fW5pwCbvP3P37cQrrb\u002fvc\u002fNBsJA0QK+D9o8qfkphX4P4V6xWYEIfg\u002f4ND1kFws+D+wUrtqrzf4PwvXhvv8Qvg\u002f9ee3SkVO+D93+pxfiFn4P9elc0HGZPg\u002f69lo9\u002f5v+D+BFJmIMnv4P\u002f6VEPxghvg\u002fD5XLWIqR+D+Zcbalrpz4P9XmrenNp\u002fg\u002fnDx\u002fK+iy+D\u002fwd+hx\u002fb34P8CKmMMNyfg\u002f8YIvJxnU+D+luD6jH9\u002f4P8z7SD4h6vg\u002fAcHC\u002fh31+D+zTRLrFQD5P6bjjwkJC\u002fk\u002fwOuFYPcV+T84IDH24CD5PxW2wNDFK\u002fk\u002fHYZW9qU2+T8ONQdtgUH5P1Nb2jpYTPk\u002f"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#2471a3","width":3},"name":"h(x)  safety","visible":false,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"AAAAAAAAAAAML1kPkFNCPwwvWQ+QU2I\u002f7VREEQKedD8ML1kPkFOCP4RZ+xeRoow\u002f7VREEQKelD8LkICX9A+cPwwvWQ+QU6I\u002fi99sU8Ixpz+EWfsXkaKsP3pOgi7+UrE\u002f7VREEQKetD8fwEM0VDK4PwuQgJf0D7w\u002fWmJ9nXEbwD8ML1kPkFPCPx2uU6FVsMQ\u002fi99sU8Ixxz9aw6Ql1tfJP4RZ+xeRosw\u002fDaJwKvORzz96ToIu\u002flLRPxyl21dW79I\u002f7VREEQKe1D\u002fvXbxaAV\u002fWPx\u002fAQzRUMtg\u002ffXvanfoX2j8LkICX9A\u002fcP8f9NSFCGt4\u002fWmJ9nXEb4D9ocmfy6zLhPwwvWQ+QU+I\u002fSZhS9F194z8drlOhVbDkP4hwXBZ37OU\u002fi99sU8Ix5z8l+4RYN4DoP1rDpCXW1+k\u002fIzjMup446z+EWfsXkaLsP30nMj2tFe4\u002fDaJwKvOR7z+aZNtvsYvwP3pOgi7+UvE\u002fpQ4t0d8e8j8cpdtXVu\u002fyP98RjsJhxPM\u002f7VREEQKe9D9Jbv5DN3z1P+9dvFoBX\u002fY\u002f4SN+VWBG9z8fwEM0VDL4P6gyDffcIvk\u002ffXvanfoX+j+emqsorRH7PwuQgJf0D\u002fw\u002fw1tZ6tAS\u002fT\u002fH\u002fTUhQhr+Pxl2FjxIJv8\u002fWmJ9nXEbAEDOdPGOCaYAQGhyZ\u002fLrMgFAJ1vfxxjCAUAML1kPkFMCQBju1MhR5wJASZhS9F19A0CgLdKRtBUEQB2uU6FVsARAvxnXIkFNBUCIcFwWd+wFQHay43v3jQZAi99sU8IxB0DF9\u002fec19cHQCX7hFg3gAhArukThuEqCUBaw6Ql1tcJQCuINzcVhwpAIzjMup44C0BB02KwcuwLQIRZ+xeRogxA7cqV8flaDUB9JzI9rRUOQDJv0Pqq0g5ADaJwKvORD0AHYAnmwikQQJpk22+xixBAwF6uMsXuEEB6ToIu\u002flIRQMYzV2NcuBFApQ4t0d8eEkAX3wN4iIYSQByl21dW7xJAtGC0cElZE0DfEY7CYcQTQJy4aE2fMBRA7VREEQKeFEDS5iAOigwVQElu\u002fkM3fBVAU+vcsgntFUDvXbxaAV8WQB\u002fGnDse0hZA4SN+VWBGF0A2d2Cox7sXQB\u002fAQzRUMhhAmv4n+QWqGECoMg333CIZQElc8y3ZnBlAfXvanfoXGkBEkMJGQZQaQJ6aqyitERtAi5qVQz6QG0ALkICX9A8cQB17bCTQkBxAw1tZ6tASHUD7MUfp9pUdQMf9NSFCGh5AJb8lkrKfHkAZdhY8SCYfQJ0iCB8Drh9AWmJ9nXEbIEAuLvdHdGAgQM508Y4JpiBANTZscjHsIEBocmfy6zIhQGIp4w45eiFAJ1vfxxjCIUC0B1wdiwoiQAwvWQ+QUyJALtHWnSedIkAY7tTIUeciQM2FU5AOMiNASZhS9F19I0CRJdL0P8kjQKAt0pG0FSRAe7BSy7tiJEAdrlOhVbAkQIom1ROC\u002fiRAvxnXIkFNJUDAh1nOkpwlQIhwXBZ37CVAHNTf+u08JkB2suN7940mQJ0LaJmT3yZAi99sU8IxJ0BELvKpg4QnQMX395zX1ydAEjx+LL4rKEAl+4RYN4AoQAU1DCFD1ShArukThuEqKUAeGZyHEoEpQFrDpCXW1ylAXOgtYCwvKkAriDc3FYcqQMGiwaqQ3ypAIzjMup44K0BMSFdnP5IrQEHTYrBy7CtA\u002fNjulThHLECEWfsXkaIsQNNUiDZ8\u002fixA7cqV8flaLUDPuyNJCrgtQH0nMj2tFS5A8Q3BzeJzLkAyb9D6qtIuQDlLYMQFMi9ADaJwKvORL0CncwEtc\u002fIvQAdgCebCKTBAn0PSg5VaMECaZNtvsYswQPzCJKoWvTBAwF6uMsXuMEDrN3gJvSAxQHpOgi7+UjFAbqLMoYiFMUDGM1djXLgxQIQCInN56zFApQ4t0d8eMkAsWHh9j1IyQBffA3iIhjJAaKPPwMq6MkAcpdtXVu8yQDbkJz0rJDNAtGC0cElZM0CYGoHysI4zQN8RjsJhxDNAjEbb4Fv6M0CcuGhNnzA0QBNoNggsZzRA7VREEQKeNEAtf5JoIdU0QNLmIA6KDDVA24vvATxENUBJbv5DN3w1QBuOTdR7tDVAU+vcsgntNUDuhazf4CU2QO9dvFoBXzZAVHMMJGuYNkAfxpw7HtI2QE1WbaEaDDdA4SN+VWBGN0DYLs9X74A3QDZ3YKjHuzdA9\u002fwxR+n2N0AfwEM0VDI4QKnAlW8IbjhAmv4n+QWqOEDuefrQTOY4QKgyDffcIjlAxShga7ZfOUBJXPMt2Zw5QDLNxj5F2jlAfXvanfoXOkAvZy5L+VU6QESQwkZBlDpAwPaWkNLSOkCemqsorRE7QON7AA\u002fRUDtAi5qVQz6QO0CZ9mrG9M87QAuQgJf0DzxA4mbWtj1QPEAde2wk0JA8QL\u002fMQuCr0TxAw1tZ6tASPUAuKLBCP1Q9QPsxR+n2lT1AMHke3vfXPUDH\u002fTUhQho+QMW\u002fjbLVXD5AJb8lkrKfPkDt+\u002f2\u002f2OI+QBl2FjxIJj9AqC1vBgFqP0CdIggfA64\u002fQPZU4YVO8j9AWmJ9nXEbQEDsOCqf4D1AQC4u90d0YEBAJULklyyDQEDOdPGOCaZAQCnGHi0LyUBANTZscjHsQED1xNlefA9BQGhyZ\u002fLrMkFAjD4VLYBWQUBiKeMOOXpBQOsy0ZcWnkFAJ1vfxxjCQUAVog2fP+ZBQLQHXB2LCkJAB4zKQvsuQkAML1kPkFNCQMTwB4NJeEJALtHWnSedQkBJ0MVfKsJCQBju1MhR50JAmSoE2Z0MQ0DNhVOQDjJDQLD\u002fwu6jV0NASZhS9F19Q0CTTwKhPKNDQJEl0vQ\u002fyUNAPhrC72fvQ0CgLdKRtBVEQLRfAtslPERAe7BSy7tiREDxH8NidolEQB2uU6FVsERA+loEh1nXRECKJtUTgv5EQMsQxkfPJUVAvxnXIkFNRUBmQQil13RFQMCHWc6SnEVAzOzKnnLERUCIcFwWd+xFQPkSDjWgFEZAHNTf+u08RkDxs9FnYGVGQHay43v3jUZAsc8VN7O2RkCdC2iZk99GQDxm2qKYCEdAi99sU8IxR0COdx+rEFtHQEQu8qmDhEdArQPlTxuuR0DF9\u002fec19dHQJIKK5G4AUhAEjx+LL4rSEBDjPFu6FVIQCX7hFg3gEhAvIg46aqqSEAFNQwhQ9VIQAAAAAAAAElA"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#c0392b","width":3},"name":"g(x)  doom","visible":false,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"EyC5T9VRiT\u002foNH97CxGLP50UczUG74w\u002fb7fhMuDtjj8Lw1dG7IeQP5cU+5Gqq5E\u002fVHNElnLjkj9+ba\u002fvoTCUPwHid6utlJU\u002f07vNyyMRlz8zfh7jrKeYPwD6h8cNWpo\u002fd3iIXykqnD+VTv+IAhqeP51Xxg3fFaA\u002fmRmsg9IwoT+hJ51IE1+iP7GXmlbtoaM\u002fTjMKPML6pD9+33doCmumP22hlYlW9Kc\u002fBiWy+FCYqT9m38M4v1irPwPRB4WDN60\u002fnNMNcJ42rz+oPnBJGKywP42M4SU+z7E\u002fxwvixfMFsz89VA7ZflG0P+nqAro4s7U\u002fsqunZ48stz8kn82CBr+4P3Qm1U44bLo\u002fcQrPs9Y1vD\u002fcRD9ArB2+PwTaKZTOEsA\u002fH18BINQnwT+g3o72807CP3g5+IZJicM\u002fGsFE6P7XxD9+7h87TTzGP143O\u002f98t8c\u002fujuBWeZKyT9Kb\u002flH8ffKP4VD5L8VwMw\u002f3Jg9stukzj8zjjt57VPQP+\u002fnb31dZdE\u002fh6vpRJmH0j\u002f9pzqJg7vTPyICt\u002f0FAtU\u002fw+ns0hBc1j+SCzQbmsrXP5fvQg2dTtk\u002fRCu1IRnp2j\u002fpBHoIEZvcP0w5Q3OJZd4\u002fXUsh2cMk4D8fY2sQCCThP4jMGzASMeI\u002fmAlir2BM4z8BtaWVbnbkP1pyREqyr+U\u002fTmAJS5z45j9OQZfKlVHoP7hHrDj\u002fuuk\u002fsF3nti416z8SZoh9bsDsP+CcgzT7XO4\u002fDmwTI4EF8D\u002fJvLsYUOXwP52\u002fqHHvzfE\u002fcggRD1q\u002f8j9I7Gf8f7nzPz0c+75FvPQ\u002fk0h9uoPH9T93elSvBdv2Pxi7cleK9vc\u002fX\u002fBHJsMZ+T+gY\u002fkvVET6P9yMfDvUdfs\u002fQsx3As2t\u002fD9CL+egu+v9P0sGejURL\u002f8\u002fX4k72Zk7AEAn5Nxuv+EAQI5Yi76iiQFAGgWaVekyAkBDttmnNd0CQHCLO9oniANAbNJymF4zBEDVRq7xd94EQJmeRjgSiQVAftMn4MwyBkCeH8VXSdsGQDmjlNcrggdAbPFcJBwnCEDakghBxskIQD3lNA3baQlAmKdEzhAHCkDGdVyhI6EKQNXDUdXVNwtAGxo1LPDKC0CIf7gEQloMQI0XPmyh5QxAXPbUGutsDUBCL9BaAvANQP9y9N3Qbg5AJ6NygkbpDkDu\u002fQkKWV8PQExAvMUD0Q9A9Kc9nCMfEEAQkJJZlFMQQLgsAfbYhRBAL9foSfi1EEDgyRv1+uMQQI94mSnrDxFAnt5+d9Q5EUAKPMOaw2ERQOtoO0vGhxFAh\u002ftCD+urEUCwfVERQc4RQIQ6q\u002fjX7hFAEv5Ixb8NEkBHkACvCCsSQHPB6AfDRhJAhXXnIf9gEkCxFE43zXkSQHb2YFY9kRJAFYagT1+nEkBqzKamQrwSQOJ9aYX2zxJAvmqvsYniEkAxBIiECvQSQOdelOOGBBNAzoTyOwwUE0C+2p1+pyITQPq2GR5lMBNAlOM9DVE9E0D+kf++dkkTQJIkFCfhVBNAvhZOu5pfE0CGJZd1rWkTQHKebdYicxNA1GDN5wN8E0CKoG9AWYQTQDvUTgcrjBNAh2pe94CTE0Dm52djYpoTQFzqADrWoBNAN0GPCeOmE0C7z1EEj6wTQAJTZgTgsRNAPmDFj9u2E0AyCy\u002fchrsTQByfA9PmvxNAxrEEFQDEE0Ccmvv91scTQJwBQ6hvyxNAkM0x8M3OE0CYOGZ39dETQNo\u002f8Kfp1BNAygBbt63XE0Dn5ZSpRNoTQKHHtlOx3BNAuV2qXvbeE0Bci7BJFuETQHE1yGwT4xNAenD2+u\u002fkE0DO6nAEruYTQJ+Jq3hP6BNASTxKKNbpE0AzEvjGQ+sTQAClJO2Z7BNA\u002f+qoGdrtE0D1hVSzBe8TQPmfZAoe8BNAd2TlWSTxE0ATHv\u002fIGfITQNv7L2z\u002f8hNABnlzRtbzE0CxWlhKn\u002fQTQH0uBltb9RNAfCwzTQv2E0DKVQvor\u002fYTQCGgCeZJ9xNA1vXD9dn3E0BhyKq6YPgTQATrvM3e+BNAIGIwvlT5E0BsyxASw\u002fkTQNP600Yq+hNA11\u002fl0Yr6E0Bivygh5foTQJ3GdJs5+xNACfQFoYj7E0BcTeqL0vsTQMFRZrAX\u002fBNANpJTXVj8E0BKU3nclPwTQByW33LN\u002fBNA4uAcYQL9E0ATGp\u002fjM\u002f0TQIXE7zJi\u002fRNAAebzg439E0CU3ScItv0TQJ1q1+3b\u002fRNAtyFSYP\u002f9E0D4iByIIP4TQFgRHos\u002f\u002fhNA6B\u002fMjFz+E0BeVlKud\u002f4TQIZHuA6R\u002fhNAbMEEy6j+E0Bn1F7+vv4TQPK7LMLT\u002fhNAq8swLuf+E0DlgKRY+f4TQAzXUVYK\u002fxNAUPuqOhr\u002fE0AreuAXKf8TQK7\u002f9f42\u002fxNAAsLV\u002f0P\u002fE0Drq2IpUP8TQNhbiYlb\u002fxNAswpQLWb\u002fE0BcbOUgcP8TQMWarm95\u002fxNAQhtUJIL\u002fE0D9DM5Iiv8TQECOb+aR\u002fxNAlWXxBZn\u002fE0DM+nuvn\u002f8TQD+rsOql\u002fxNA9IOyvqv\u002fE0CDay4ysf8TQBTFYku2\u002fxNAE5UmELv\u002fE0DaL\u002fCFv\u002f8TQNJ527HD\u002fxNAQcCvmMf\u002fE0BaMeU+y\u002f8TQOT5qajO\u002fxNAOQ7n2dH\u002fE0AdpETW1P8TQI9iLqHX\u002fxNATUzXPdr\u002fE0CLaT2v3P8TQBI1Lfje\u002fxNAq9BEG+H\u002fE0B6BPca4\u002f8TQMkMjvnk\u002fxNAXDkuueb\u002fE0BmYdhb6P8TQOIubOPp\u002fxNA8kOqUev\u002fE0CyPDao7P8TQNqPmOjt\u002fxNAQlBAFO\u002f\u002fE0Ba0YQs8P8TQGgwpzLx\u002fxNAasTTJ\u002fL\u002fE0ARdiMN8\u002f8TQJMBnePz\u002fxNApyM2rPT\u002fE0ABs9Rn9f8TQKKnTxf2\u002fxNAHRFwu\u002fb\u002fE0Dp\u002fPFU9\u002f8TQNhNheT3\u002fxNAkoXOavj\u002fE0AOgWfo+P8TQNwo4F35\u002fxNA\u002fRW\u002fy\u002fn\u002fE0AeLIIy+v8TQNMpn5L6\u002fxNAei+E7Pr\u002fE0BnPZhA+\u002f8TQOupO4\u002f7\u002fxNAsI\u002fI2Pv\u002fE0D6NJMd\u002fP8TQC5s6l38\u002fxNAJu4Xmvz\u002fE0CurmDS\u002fP8TQHgrBQf9\u002fxNACbZBOP3\u002fE0DVuE5m\u002ff8TQN\u002f3YJH9\u002fxNAMs2puf3\u002fE0BoYVff\u002ff8TQJLglAL+\u002fxNArKuKI\u002f7\u002fE0Dlhl5C\u002fv8TQODEM1\u002f+\u002fxNALG8rev7\u002fE0AnbGST\u002fv8TQF6i+6r+\u002fxNAqhkMwf7\u002fE0AuGq\u002fV\u002fv8TQEtJ\u002fOj+\u002fxNA"},"type":"scatter"},{"hovertemplate":"%{y:.2f}","line":{"color":"#2471a3","width":3},"name":"h(x)  safety","visible":false,"x":{"dtype":"f8","bdata":"AAAAAAAAAADDVFfOrR+hP8NUV86tH7E\u002fJP+CtYSvuT\u002fDVFfOrR\u002fBP\u002fQp7UGZZ8U\u002fJP+CtYSvyT9V1BgpcPfNP8NUV86tH9E\u002fWz8iiKND0z\u002f0Ke1BmWfVP4wUuPuOi9c\u002fJP+CtYSv2T+96U1vetPbP1XUGClw990\u002fd99x8bIN4D\u002fDVFfOrR\u002fhPw\u002fKPKuoMeI\u002fWz8iiKND4z+otAdlnlXkP\u002fQp7UGZZ+U\u002fQJ\u002fSHpR55j+MFLj7jovnP9iJndiJneg\u002fJP+CtYSv6T9xdGiSf8HqP73pTW960+s\u002fCV8zTHXl7D9V1BgpcPftP6FJ\u002fgVrCe8\u002fd99x8bIN8D8dmuRfsJbwP8NUV86tH\u002fE\u002faQ\u002fKPKuo8T8PyjyrqDHyP7WErxmmuvI\u002fWz8iiKND8z8B+pT2oMzzP6i0B2WeVfQ\u002fTm9605ve9D\u002f0Ke1BmWf1P5rkX7CW8PU\u002fQJ\u002fSHpR59j\u002fmWUWNkQL3P4wUuPuOi\u002fc\u002fMs8qaowU+D\u002fYiZ3YiZ34P35EEEeHJvk\u002fJP+CtYSv+T\u002fLufUjgjj6P3F0aJJ\u002fwfo\u002fFy\u002fbAH1K+z+96U1vetP7P2OkwN13XPw\u002fCV8zTHXl\u002fD+vGaa6cm79P1XUGClw9\u002f0\u002f+46Ll22A\u002fj+hSf4Fawn\u002fP0gEcXRokv8\u002fd99x8bINAEDKPKuoMVIAQB2a5F+wlgBAcPcdFy\u002fbAEDDVFfOrR8BQBaykIUsZAFAaQ\u002fKPKuoAUC8bAP0Ke0BQA\u002fKPKuoMQJAYid2Yid2AkC1hK8ZproCQAji6NAk\u002fwJAWz8iiKNDA0CunFs\u002fIogDQAH6lPagzANAVVfOrR8RBECotAdlnlUEQPsRQRwdmgRATm9605veBEChzLOKGiMFQPQp7UGZZwVAR4cm+ResBUCa5F+wlvAFQO1BmWcVNQZAQJ\u002fSHpR5BkCT\u002fAvWEr4GQOZZRY2RAgdAObd+RBBHB0CMFLj7josHQN9x8bIN0AdAMs8qaowUCECFLGQhC1kIQNiJndiJnQhAK+fWjwjiCEB+RBBHhyYJQNGhSf4FawlAJP+CtYSvCUB4XLxsA\u002fQJQMu59SOCOApAHhcv2wB9CkBxdGiSf8EKQMTRoUn+BQtAFy\u002fbAH1KC0BqjBS4+44LQL3pTW960wtAEEeHJvkXDEBjpMDdd1wMQLYB+pT2oAxACV8zTHXlDEBcvGwD9CkNQK8Zprpybg1AAnffcfGyDUBV1BgpcPcNQKgxUuDuOw5A+46Ll22ADkBO7MRO7MQOQKFJ\u002fgVrCQ9A9KY3velND0BIBHF0aJIPQJthqivn1g9Ad99x8bINEEAgjg5N8i8QQMo8q6gxUhBAc+tHBHF0EEAdmuRfsJYQQMZIgbvvuBBAcPcdFy\u002fbEEAZprpybv0QQMNUV86tHxFAbQP0Ke1BEUAWspCFLGQRQMBgLeFrhhFAaQ\u002fKPKuoEUATvmaY6soRQLxsA\u002fQp7RFAZhugT2kPEkAPyjyrqDESQLl42QboUxJAYid2Yid2EkAM1hK+ZpgSQLWErxmmuhJAXzNMdeXcEkAI4ujQJP8SQLKQhSxkIRNAWz8iiKNDE0AF7r7j4mUTQK6cWz8iiBNAWEv4mmGqE0AB+pT2oMwTQKuoMVLg7hNAVVfOrR8RFED+BWsJXzMUQKi0B2WeVRRAUWOkwN13FED7EUEcHZoUQKTA3XdcvBRATm9605veFED3HRcv2wAVQKHMs4oaIxVASntQ5llFFUD0Ke1BmWcVQJ3YiZ3YiRVAR4cm+ResFUDwNcNUV84VQJrkX7CW8BVAQ5P8C9YSFkDtQZlnFTUWQJbwNcNUVxZAQJ\u002fSHpR5FkDpTW9605sWQJP8C9YSvhZAPauoMVLgFkDmWUWNkQIXQJAI4ujQJBdAObd+RBBHF0DjZRugT2kXQIwUuPuOixdANsNUV86tF0DfcfGyDdAXQIkgjg5N8hdAMs8qaowUGEDcfcfFyzYYQIUsZCELWRhAL9sAfUp7GEDYiZ3YiZ0YQII4OjTJvxhAK+fWjwjiGEDVlXPrRwQZQH5EEEeHJhlAKPOsosZIGUDRoUn+BWsZQHtQ5llFjRlAJP+CtYSvGUDOrR8RxNEZQHhcvGwD9BlAIQtZyEIWGkDLufUjgjgaQHRokn\u002fBWhpAHhcv2wB9GkDHxcs2QJ8aQHF0aJJ\u002fwRpAGiMF7r7jGkDE0aFJ\u002fgUbQG2APqU9KBtAFy\u002fbAH1KG0DA3XdcvGwbQGqMFLj7jhtAEzuxEzuxG0C96U1vetMbQGaY6sq59RtAEEeHJvkXHEC59SOCODocQGOkwN13XBxADFNdObd+HEC2AfqU9qAcQGCwlvA1wxxACV8zTHXlHECzDdCntAcdQFy8bAP0KR1ABmsJXzNMHUCvGaa6cm4dQFnIQhaykB1AAnffcfGyHUCsJXzNMNUdQFXUGClw9x1A\u002f4K1hK8ZHkCoMVLg7jseQFLg7jsuXh5A+46Ll22AHkClPSjzrKIeQE7sxE7sxB5A+JphqivnHkChSf4FawkfQEv4mmGqKx9A9KY3velNH0CeVdQYKXAfQEgEcXRokh9A8bIN0Ke0H0CbYaor59YfQEQQR4cm+R9Ad99x8bINIEDMNkCf0h4gQCCODk3yLyBAdeXc+hFBIEDKPKuoMVIgQB+UeVZRYyBAc+tHBHF0IEDIQhaykIUgQB2a5F+wliBAcvGyDdCnIEDGSIG777ggQBugT2kPyiBAcPcdFy\u002fbIEDFTuzETuwgQBmmunJu\u002fSBAbv2III4OIUDDVFfOrR8hQBisJXzNMCFAbQP0Ke1BIUDBWsLXDFMhQBaykIUsZCFAawlfM0x1IUDAYC3ha4YhQBS4+46LlyFAaQ\u002fKPKuoIUC+ZpjqyrkhQBO+ZpjqyiFAZxU1RgrcIUC8bAP0Ke0hQBHE0aFJ\u002fiFAZhugT2kPIkC6cm79iCAiQA\u002fKPKuoMSJAZCELWchCIkC5eNkG6FMiQA3Qp7QHZSJAYid2Yid2IkC3fkQQR4ciQAzWEr5mmCJAYS3ha4apIkC1hK8ZproiQArcfcfFyyJAXzNMdeXcIkC0ihojBe4iQAji6NAk\u002fyJAXTm3fkQQI0CykIUsZCEjQAfoU9qDMiNAWz8iiKNDI0CwlvA1w1QjQAXuvuPiZSNAWkWNkQJ3I0CunFs\u002fIogjQAP0Ke1BmSNAWEv4mmGqI0CtosZIgbsjQAH6lPagzCNAVlFjpMDdI0CrqDFS4O4jQAAAAAAAACRA"},"y":{"dtype":"f8","bdata":"57lGaztw0T467hxdDqXSPrg7YWU+79M+7LIk2kVQ1T71Y4k9ucnWPqHOPg1JXdg+Rh4OssMM2j4D9K2RF9rbPmrEPEVVx90+F83q9rHW3z6Cw8T0RAXhPkc+c5axMuI+IlsFQfh04z4GaVc5is3kPsw9t0\u002fyPeY+nVtCpNbH5z7Vu46K+mzpPkhVyI5AL+s+AMOTnqwQ7T4vay9YZhPvPg4oPMHdnPA+DEZTWBHD8T6Ow2MKn\u002f3yPk6\u002fGELvTfQ+DpiyWIO19T7t0odP9zX3PkrHD6gD0fg+1buTXH+I+j7sgcj7YV78PsCSuunFVP4+u7ZQZPU2AD8PUC4GHFYBP+zext0fiQI\u002fAVu7sGDRAz\u002fL6f2ZVjAFP2spsriTpwY\u002fWCTa\u002fMU4CD\u002fPYd8TueUJP0j8K3dYsAs\u002fiJsun7GaDT\u002fF2U1d9qYPP3gQvq+\u002f6xA\u002ffVMmcGcXEj9JiU7DyVcTPxDbDrxVrhQ\u002fgDke0ZMcFj+SPpqeJ6QXP27To8bRRhk\u002fmm8283EGGz\u002fYuYX7COUcP8niVS+75B4\u002fPTd3ZemDID\u002fpujpLYaghP5J52VkU4SI\u002f+Eu4zmgvJD\u002fSn\u002fGt3ZQlP9DB43gMEyc\u002fTcoNA6urKD9+wVJnjWAqP9B13x+oMyw\u002fDecWQxInLj+dpAn0gx4wPz5Qu1r2OzE\u002fvQW7TidtMj+bFx9ldLMzP5MLA19TEDU\u002fXjww1VOFNj+A80wBIRQ4P0OxmqaDvjk\u002f1A9wHGSGOz810cB8zG09P6dhL\u002fnqdj8\u002fa0qnLArSQD\u002fPaHRS4\u002ftBPyq4qf5VOkM\u002fo\u002fuE1M6ORD\u002fArIKq0\u002fpFP5bPv0cFgEc\u002fSVUKQCEgST+QtLrwA91KP+D1laCquEw\u002fUHgexTW1Tj\u002fQqPG3dWpQPwxFRfMcjVE\u002fCOBANN3DUj+Ek7kSGhBUP\u002fRE6bNPc1U\u002fKZaHexTvVj+5KJraGoVYPwuFAT4zN1o\u002f0XjqHk4HXD\u002fjd3A3fvddP09L8m79BGA\u002f4RyrRJEgYT\u002fgWRPBvk9iP+fxz2Dgk2M\u002f\u002fdTbgWjuZD9HZi8H42BmP4vy+Bj37Gc\u002fpB9PA2mUaT+8s2U1HFlrP\u002fxSbmMVPW0\u002fSfpxzXxCbz9skcpW0LVwP7LXL+h73XE\u002fsI3lLJIZcz+EdwJde2t0P1ekgGq41HU\u002fZbQUsORWdz+8UtK8t\u002fN4PxeBdz4HrXo\u002fBvJTDMmEfD9+e95UFX1+P\u002fBSFHgUTIA\u002fXry\u002f7DNsgT8obVTpL6CCP6QHp5ll6YM\u002fEgaj80lJhT8ynUpPa8GGP4fzDRlzU4g\u002fbEsIoCcBij9u2cMBbsyLP+wRNzVMt40\u002fow7ANuvDjz\u002fhCnqrTPqQP2gAFVfmJZI\u002fDQBb2xJmkz\u002fHzO0HObyUPyy3w7XXKZY\u002fJmB2VIewlz+DMRWP+1GZP+2FjwkFEJs\u002f2I7KN5PsnD+Do3RPtumeP5wj0arQhKA\u002fwC+cJFanoT9RDI01q92iP76af1IkKaQ\u002ftBLgByyLpT\u002fEs+NMRAWnP6Q3GecHmag\u002fzTF\u002f3itIqj8YsjICgRSsP+gcp331\u002f60\u002f9jgYP0sGsD+iMz30SB6xP5Hwpw4cSbI\u002fnz9r5v6Hsz8jEYzrPty0P1SyL5w9R7Y\u002fBmnFf3HKtz9WBgYmZ2e5P0heZSjCH7s\u002fGfFKLD71vD9x3Rfkr+m+P47lUwaDf8A\u002f3DFMMqWbwT8+TxtNUcrCP1QoPZaoDMQ\u002fnm17HdtjxT9JwA0gKNHGP26NQ1jeVcg\u002fvSDJPFzzyT8tqEQsEKvLP0pmr4F4fs0\u002fCiN0jSNvzz\u002fwvH+3V7\u002fQPxpUCeVk19E\u002f3yFoqZcA0z9XOZOV1TvUP7Ge9wULitU\u002fopjwmSrs1j\u002fhtB6LLGPYP7SniOEN8Nk\u002fwuhzgc+T2z+V+\u002fYPdU\u002fdP9AecKsDJN8\u002f4yumOkCJ4D90EnR1943hP8kj6IWnoOI\u002fnbgkps3B4z+tH+Yp4\u002fHkPwILCURcMeY\u002fgjs0s6aA5z\u002f0sCFXKODoP39GubA9UOo\u002fMJr2TzjR6z98f2szXWPtP1XAEh7jBu8\u002fZX+HdPhd8D8fBOzrTUHxP625GvtyLfI\u002f+xkXRF4i8z94oV9K+x\u002f0P0kTVsopJvU\u002f4tCDJ7009j\u002fvAI\u002f2e0v3P8TLlacfavg\u002fV3hcVVSQ+T9wFEe9uL36P9GwdmPe8fs\u002fgjWW5Uks\u002fT9M2u59c2z+PyEdRrfHsf8\u002fxVxrKNR9AEBd4DqotiQBQIAs2B8zzQFAYWG5x+12AkAouVEOiCEDQI8tjWehzANAj3TEJdh3BEC5SSZYyiIFQOP6ZaoWzQVAbad0QV12BkDXGyORQB4HQKB2xCZmxAdA2PxCZXdoCEBfaIwvIgoJQN4ZxH4ZqQlAkrlB4hVFCkAtTgPo1d0KQNEH3GwecwtAcqJG1LoEDEDEwlUofZIMQLRbwSI+HA1A33GCIN2hDUDZCcwBQCMOQMV7d\u002fhSoA5ALqArRwgZD0CZIaLzV40PQPZJdm4\u002f\u002fQ9AY4xvmWA0EEA9804w8mcQQEkUIylamRBAB3fqGKDIEEDWF61GzfUQQPbTnnbsIBFAtHG3tglKEUBgSUstMnERQM2+E+pzlhFAb4b8ud25EUCdk\u002fL9ftsRQJPW24Rn+xFAaszLaKcZEkCxX3jvTjYSQEyt5G1uURJABdErLxZrEkBGv0xeVoMSQGMx0fI+mhJA3o8koN+vEkCAVWzHR8QSQEdlsWuG1xJAgQEpKKrpEkAdR2wowfoSQDkTbiLZChNA5N0AUv8ZE0CGNMB1QCgTQCP2M82oNRNARSYGGERCE0CLACeWHU4TQPfZvQhAWRNANT7Is7VjE0ALiUtgiG0TQAf1\u002f17BdhNAMLFei2l\u002fE0DsAv9OiYcTQNbDMKUojxNAZqvEHk+WE0CEyfTlA50TQFFhYcJNoxNAVfQXHTOpE0CvxpsEuq4TQNF36DDosxNAzXloB8O4E0AFP9qeT70TQFnkH8OSwRNAXfD1+JDFE0BCeI6BTskTQLebDl7PzBNAvtTsUhfQE0BBEC\u002frKdMTQJrrh3sK1hNA0cpSJbzYE0CxxW7ZQdsTQMyn+Fqe3RNAUHPkQdTfE0CxAHf95eETQId3oNbV4xNABng48qXlE0CC4RxTWOcTQEQyNNzu6BNAH4hUUmvqE0CSUBBez+sTQI27aY0c7RNA6wRuVVTuE0A9qLkTeO8TQCSP5g+J8BNAdUblfIjxE0BlQEJ6d\u002fITQHAjWBVX8xNA"},"type":"scatter"}],                        {"template":{"layout":{"font":{"color":"#333333","family":"Alegreya, serif","size":14},"legend":{"font":{"size":12}},"title":{"font":{"size":20}},"xaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}},"yaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}}}},"legend":{"bgcolor":"rgba(255,255,255,0.5)","bordercolor":"#ccc","borderwidth":1},"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified","updatemenus":[{"bgcolor":"white","buttons":[{"args":[{"visible":[true,true,false,false,false,false,false,false]}],"label":"Linear","method":"update"},{"args":[{"visible":[false,false,true,true,false,false,false,false]}],"label":"Pessimistic (g convex, h concave)","method":"update"},{"args":[{"visible":[false,false,false,false,true,true,false,false]}],"label":"Optimistic (g concave, h convex)","method":"update"},{"args":[{"visible":[false,false,false,false,false,false,true,true]}],"label":"Sigmoidal overhang","method":"update"}],"direction":"down","type":"buttons","x":1.0,"xanchor":"left","y":1.0}],"xaxis":{"title":{"text":"Cumulative compute 𝒞"}},"yaxis":{"title":{"text":"Hazard rate"}},"height":420},                        {"responsive": true}                    ).then(function(){
                            
var gd = document.getElementById('8c1c0837-b6d7-478f-b0a3-a3b7d3e483a3');
var x = new MutationObserver(function (mutations, observer) {{
        var display = window.getComputedStyle(gd).display;
        if (!display || display === 'none') {{
            console.log([gd, 'removed!']);
            Plotly.purge(gd);
            observer.disconnect();
        }}
}});

// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
    x.observe(notebookContainer, {childList: true});
}}

// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
    x.observe(outputEl, {childList: true});
}}

                        })                };            </script>        </div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-hazard-shapes-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Response functions g (doom hazard, red) and h (safety hazard, blue) as functions of cumulative compute under four shape assumptions. Use the buttons to switch scenarios.
</figcaption>
</figure>
</div>
</div>
</section>
<section id="three-outcomes-of-the-race" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="three-outcomes-of-the-race"><span class="header-section-number">3</span> Three outcomes of the race</h2>
<p>The probability that the race is still in limbo at time <img src="https://latex.codecogs.com/png.latex?t"> — neither event has fired — is what survival analysis calls the <em>joint survival function</em>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AS(t)%20=%20%5Cexp%5C!%5Cleft%5B-%5CLambda_d(t)%20-%20%5CLambda_s(t)%5Cright%5D,%0A"></p>
<p>In words: the probability of still being in limbo decays exponentially as the hazard accumulates. Here <img src="https://latex.codecogs.com/png.latex?%5CLambda_d(t)%20=%20%5Cint_0%5Et%20g(%5Cmathcal%7BC%7D_c(u))%5C,%20du"> and <img src="https://latex.codecogs.com/png.latex?%5CLambda_s(t)%20=%20%5Cint_0%5Et%20h(%5Cmathcal%7BC%7D_s(u))%5C,%20du"> are cumulative hazard functions. Note the nested structure: each cumulative hazard is an integral over time of a function that itself contains an integral over time.</p>
<p>The race has three mutually exclusive <em>outcomes</em>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP(%5Ctext%7Bdoom%7D)%20+%20P(%5Ctext%7Bdeliverance%7D)%20+%20P(%5Ctext%7Blimbo%7D)%20=%201,%0A"></p>
<p>where:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)%20=%20%5Cint_0%5E%5Cinfty%20%5Clambda_d(t)%5C,%20S(t)%5C,%20dt"> — the doom event fires first,</li>
<li><img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdeliverance%7D)%20=%20%5Cint_0%5E%5Cinfty%20%5Clambda_s(t)%5C,%20S(t)%5C,%20dt"> — the deliverance event fires first,</li>
<li><img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Blimbo%7D)%20=%20%5Clim_%7Bt%5Cto%5Cinfty%7D%20S(t)"> — neither event ever fires.</li>
</ul>
<p>In our model, <img src="https://latex.codecogs.com/png.latex?g,%20h"> is monotone and stocks <img src="https://latex.codecogs.com/png.latex?%5CLambda_d(t)%20+%20%5CLambda_s(t)%20%5Cto%20%5Cinfty"> keep growing, so <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Blimbo%7D)%20=%200">: the race always resolves eventually. But “eventually” can be a very long time. Over any finite horizon, there is residual probability mass on “neither yet” — the green curve <img src="https://latex.codecogs.com/png.latex?S(t)"> in the plots below — and this residual is a practically relevant quantity. A world where <img src="https://latex.codecogs.com/png.latex?S(t)"> stays large at human-relevant timescales is one where we just muddle through indefinitely, which is arguably closer to most people’s baseline expectation than either doom or deliverance.</p>
<p>At each instant <img src="https://latex.codecogs.com/png.latex?t">, while we’re still in limbo, the probability that <em>some</em> event fires within <img src="https://latex.codecogs.com/png.latex?%5Bt,%20t+dt)"> is <img src="https://latex.codecogs.com/png.latex?(%5Clambda_d(t)%20+%20%5Clambda_s(t))%5C,%20dt">, and the conditional probability that the firing event is doom rather than deliverance is</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi_d(t)%20=%20%5Cfrac%7B%5Clambda_d(t)%7D%7B%5Clambda_d(t)%20+%20%5Clambda_s(t)%7D.%0A"></p>
<p>So doom probability can also be written</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP(%5Ctext%7Bdoom%7D)%20=%20%5Cint_0%5E%5Cinfty%20%5Cpi_d(t)%20%5Cbigl%5B%5Clambda_d(t)%20+%20%5Clambda_s(t)%5Cbigr%5D%20S(t)%5C,%20dt,%0A"></p>
<p>which decomposes neatly into: “probability we’re still waiting at time <img src="https://latex.codecogs.com/png.latex?t">” × “probability <em>something</em> happens right now” × “probability that the something is doom rather than deliverance.” This is the key integral of the post — everything below is about what determines its value.</p>
<div id="cell-fig-race-dynamics" class="cell" data-execution_count="4">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1">alpha_race <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span></span>
<span id="cb3-2">t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">35</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>)</span>
<span id="cb3-3">c_rate <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t)                          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># compute rate c(t) in FLOP/s</span></span>
<span id="cb3-4">Cc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid((<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> alpha_race) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 𝒞_c(t)</span></span>
<span id="cb3-5">Cs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(alpha_race <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 𝒞_s(t)</span></span>
<span id="cb3-6"></span>
<span id="cb3-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Response functions applied to cumulative stocks</span></span>
<span id="cb3-8">ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.005</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> Cc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># superlinear doom</span></span>
<span id="cb3-9">ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.015</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> Cs           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># linear safety</span></span>
<span id="cb3-10"></span>
<span id="cb3-11">cumhaz <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ls, t, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb3-12">S <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>cumhaz)</span>
<span id="cb3-13">doom_density <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> S</span>
<span id="cb3-14">deliv_density <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> S</span>
<span id="cb3-15">P_doom <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.trapezoid(doom_density, t)</span>
<span id="cb3-16">P_deliv <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.trapezoid(deliv_density, t)</span>
<span id="cb3-17">P_limbo <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> P_doom <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> P_deliv</span>
<span id="cb3-18"></span>
<span id="cb3-19">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> make_subplots(specs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[[{<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"secondary_y"</span>: <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>}]])</span>
<span id="cb3-20">fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>deliv_density, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"λ_s S(t)  deliverance density"</span>,</span>
<span id="cb3-21">                         fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'tozeroy'</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_SALV, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>),</span>
<span id="cb3-22">                         fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'rgba(36,113,163,0.35)'</span>,</span>
<span id="cb3-23">                         hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"t=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.1f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  deliv=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.4f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>),</span>
<span id="cb3-24">              secondary_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb3-25">fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>doom_density, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"λ_d S(t)  doom density"</span>,</span>
<span id="cb3-26">                         fill<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'tozeroy'</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>),</span>
<span id="cb3-27">                         fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'rgba(192,57,43,0.35)'</span>,</span>
<span id="cb3-28">                         hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"t=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.1f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  doom=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.4f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>),</span>
<span id="cb3-29">              secondary_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb3-30">fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>S, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"S(t)  limbo"</span>,</span>
<span id="cb3-31">                         line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_SURV, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>),</span>
<span id="cb3-32">                         hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"t=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.1f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  S=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.3f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>),</span>
<span id="cb3-33">              secondary_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb3-34"></span>
<span id="cb3-35"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Annotate all three outcomes</span></span>
<span id="cb3-36">fig.add_annotation(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t[np.argmax(doom_density)], y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(doom_density) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.15</span>,</span>
<span id="cb3-37">                   text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"P(doom) = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>P_doom<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, showarrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb3-38">                   font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM))</span>
<span id="cb3-39">fig.add_annotation(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t[np.argmax(deliv_density)], y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">max</span>(deliv_density) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.15</span>,</span>
<span id="cb3-40">                   text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"P(deliverance) = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>P_deliv<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, showarrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb3-41">                   font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_SALV))</span>
<span id="cb3-42">fig.add_annotation(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t[<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.85</span>, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.05</span>, yref<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y2"</span>,</span>
<span id="cb3-43">                   text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"P(limbo) = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>P_limbo<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, showarrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb3-44">                   font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">14</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_SURV))</span>
<span id="cb3-45"></span>
<span id="cb3-46">fig.update_xaxes(title_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Time t"</span>)</span>
<span id="cb3-47">fig.update_yaxes(title_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Event density"</span>, secondary_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb3-48">fig.update_yaxes(title_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"S(t) — limbo"</span>, secondary_y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.05</span>])</span>
<span id="cb3-49">fig.update_layout(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>LAYOUT, height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">440</span>)</span>
<span id="cb3-50">fig.show()</span></code></pre></div></div>
</details>
<div id="fig-race-dynamics" class="cell-output cell-output-display quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-race-dynamics-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>            <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script><script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>                <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.1.1.min.js" integrity="sha256-HUEFyfiTnZJxCxur99FjbKYTvKSzwDaD3/x5TqHpFu4=" crossorigin="anonymous"></script>                <div id="753e95de-2ef3-4ee4-bb4d-2a025c703eb6" class="plotly-graph-div" style="height:440px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("753e95de-2ef3-4ee4-bb4d-2a025c703eb6")) {                    Plotly.newPlot(                        "753e95de-2ef3-4ee4-bb4d-2a025c703eb6",                        [{"fill":"tozeroy","fillcolor":"rgba(36,113,163,0.35)","hovertemplate":"t=%{x:.1f}  deliv=%{y:.4f}","line":{"color":"#2471a3","width":1},"name":"λ_s S(t)  deliverance density","x":{"dtype":"f8","bdata":"AAAAAAAAAADwrmK0k22mP\u002fCuYrSTbbY\u002fNANKxy7SwD\u002fwrmK0k23GP6xae6H4CMw\u002fNANKxy7S0D8SWdY94Z\u002fTP\u002fCuYrSTbdY\u002fzgTvKkY72T+sWnuh+AjcP4qwBxir1t4\u002fNANKxy7S4D8jLpACCDniPxJZ1j3hn+M\u002fAYQceboG5T\u002fwrmK0k23mP9\u002fZqO9s1Oc\u002fzgTvKkY76T+9LzVmH6LqP6xae6H4COw\u002fm4XB3NFv7T+KsAcYq9buP7ztpinCHvA\u002fNANKxy7S8D+sGO1km4XxPyMukAIIOfI\u002fmkMzoHTs8j8SWdY94Z\u002fzP4puedtNU\u002fQ\u002fAYQceboG9T94mb8WJ7r1P\u002fCuYrSTbfY\u002faMQFUgAh9z\u002ff2ajvbNT3P1bvS43Zh\u002fg\u002fzgTvKkY7+T9GGpLIsu75P70vNWYfovo\u002fNEXYA4xV+z+sWnuh+Aj8PyRwHj9lvPw\u002fm4XB3NFv\u002fT8Sm2R6PiP+P4qwBxir1v4\u002fAsaqtReK\u002fz+87aYpwh4AQHh4eHh4eABANANKxy7SAEDwjRsW5SsBQKwY7WSbhQFAZ6O+s1HfAUAjLpACCDkCQN+4YVG+kgJAmkMzoHTsAkBWzgTvKkYDQBJZ1j3hnwNAzuOnjJf5A0CKbnnbTVMEQEX5SioErQRAAYQceboGBUC9Du7HcGAFQHiZvxYnugVANCSRZd0TBkDwrmK0k20GQKw5NANKxwZAaMQFUgAhB0AjT9egtnoHQN\u002fZqO9s1AdAm2R6PiMuCEBW70uN2YcIQBJ6HdyP4QhAzgTvKkY7CUCKj8B5\u002fJQJQEYaksiy7glAAaVjF2lICkC9LzVmH6IKQHm6BrXV+wpANEXYA4xVC0Dwz6lSQq8LQKxae6H4CAxAaOVM8K5iDEAkcB4\u002fZbwMQN\u002f6740bFg1Am4XB3NFvDUBXEJMriMkNQBKbZHo+Iw5AziU2yfR8DkCKsAcYq9YOQEY72WZhMA9AAsaqtReKD0C9UHwEzuMPQLztpinCHhBAGrMPUZ1LEEB4eHh4eHgQQNY94Z9TpRBANANKxy7SEECSyLLuCf8QQPCNGxblKxFATlOEPcBYEUCsGO1km4URQAneVYx2shFAZ6O+s1HfEUDFaCfbLAwSQCMukAIIORJAgfP4KeNlEkDfuGFRvpISQD1+yniZvxJAmkMzoHTsEkD4CJzHTxkTQFbOBO8qRhNAtJNtFgZzE0ASWdY94Z8TQHAeP2W8zBNAzuOnjJf5E0AsqRC0ciYUQIpuedtNUxRA5zPiAimAFEBF+UoqBK0UQKO+s1Hf2RRAAYQceboGFUBfSYWglTMVQL0O7sdwYBVAG9RW70uNFUB4mb8WJ7oVQNZeKD4C5xVANCSRZd0TFkCS6fmMuEAWQPCuYrSTbRZATnTL226aFkCsOTQDSscWQAr\u002fnCol9BZAaMQFUgAhF0DFiW55200XQCNP16C2ehdAgRRAyJGnF0Df2ajvbNQXQD2fERdIARhAm2R6PiMuGED5KeNl\u002floYQFbvS43ZhxhAtLS0tLS0GEASeh3cj+EYQHA\u002fhgNrDhlAzgTvKkY7GUAsyldSIWgZQIqPwHn8lBlA6FQpodfBGUBGGpLIsu4ZQKPf+u+NGxpAAaVjF2lIGkBfasw+RHUaQL0vNWYfohpAG\u002fWdjfrOGkB5uga11fsaQNd\u002fb9ywKBtANEXYA4xVG0CSCkErZ4IbQPDPqVJCrxtATpUSeh3cG0CsWnuh+AgcQAog5MjTNRxAaOVM8K5iHEDGqrUXio8cQCRwHj9lvBxAgTWHZkDpHEDf+u+NGxYdQD3AWLX2Qh1Am4XB3NFvHUD5SioErZwdQFcQkyuIyR1AtdX7UmP2HUASm2R6PiMeQHBgzaEZUB5AziU2yfR8HkAs657wz6keQIqwBxir1h5A6HVwP4YDH0BGO9lmYTAfQKQAQo48XR9AAsaqtReKH0BfixPd8rYfQL1QfATO4x9ADovylVQIIEC87aYpwh4gQGtQW70vNSBAGrMPUZ1LIEDJFcTkCmIgQHh4eHh4eCBAJ9ssDOaOIEDWPeGfU6UgQIWglTPBuyBANANKxy7SIEDjZf5anOggQJLIsu4J\u002fyBAQStngncVIUDwjRsW5SshQJ\u002fwz6lSQiFATlOEPcBYIUD9tTjRLW8hQKwY7WSbhSFAWnuh+AicIUAJ3lWMdrIhQLhACiDkyCFAZ6O+s1HfIUAWBnNHv\u002fUhQMVoJ9ssDCJAdMvbbpoiIkAjLpACCDkiQNKQRJZ1TyJAgfP4KeNlIkAwVq29UHwiQN+4YVG+kiJAjhsW5SupIkA9fsp4mb8iQOzgfgwH1iJAmkMzoHTsIkBJpucz4gIjQPgInMdPGSNAp2tQW70vI0BWzgTvKkYjQAUxuYKYXCNAtJNtFgZzI0Bj9iGqc4kjQBJZ1j3hnyNAwbuK0U62I0BwHj9lvMwjQB+B8\u002fgp4yNAzuOnjJf5I0B9RlwgBRAkQCypELRyJiRA2wvFR+A8JECKbnnbTVMkQDjRLW+7aSRA5zPiAimAJECWlpaWlpYkQEX5SioErSRA9Fv\u002fvXHDJECjvrNR39kkQFIhaOVM8CRAAYQceboGJUCw5tAMKB0lQF9JhaCVMyVADqw5NANKJUC9Du7HcGAlQGxxolvediVAG9RW70uNJUDKNguDuaMlQHiZvxYnuiVAJ\u002fxzqpTQJUDWXig+AuclQIXB3NFv\u002fSVANCSRZd0TJkDjhkX5SiomQJLp+Yy4QCZAQUyuICZXJkDwrmK0k20mQJ8RF0gBhCZATnTL226aJkD91n9v3LAmQKw5NANKxyZAW5zolrfdJkAK\u002f5wqJfQmQLlhUb6SCidAaMQFUgAhJ0AWJ7rlbTcnQMWJbnnbTSdAdOwiDUlkJ0AjT9egtnonQNKxizQkkSdAgRRAyJGnJ0Awd\u002fRb\u002f70nQN\u002fZqO9s1CdAjjxdg9rqJ0A9nxEXSAEoQOwBxqq1FyhAm2R6PiMuKEBKxy7SkEQoQPkp42X+WihAqIyX+WtxKEBW70uN2YcoQAVSACFHnihAtLS0tLS0KEBjF2lIIssoQBJ6HdyP4ShAwdzRb\u002f33KEBwP4YDaw4pQB+iOpfYJClAzgTvKkY7KUB9Z6O+s1EpQCzKV1IhaClA2ywM5o5+KUCKj8B5\u002fJQpQDnydA1qqylA6FQpodfBKUCXt900RdgpQEYaksiy7ilA9HxGXCAFKkCj3\u002frvjRsqQFJCr4P7MSpAAaVjF2lIKkCwBxir1l4qQF9qzD5EdSpADs2A0rGLKkC9LzVmH6IqQGyS6fmMuCpAG\u002fWdjfrOKkDKV1IhaOUqQHm6BrXV+ypAKB27SEMSK0DXf2\u002fcsCgrQIbiI3AePytANEXYA4xVK0Djp4yX+WsrQJIKQStngitAQW31vtSYK0Dwz6lSQq8rQJ8yXuavxStATpUSeh3cK0D998YNi\u002fIrQKxae6H4CCxAW70vNWYfLEAKIOTI0zUsQLmCmFxBTCxAaOVM8K5iLEAXSAGEHHksQMaqtReKjyxAdQ1qq\u002felLEAkcB4\u002fZbwsQNLS0tLS0ixAgTWHZkDpLEAwmDv6rf8sQN\u002f6740bFi1Ajl2kIYksLUA9wFi19kItQOwiDUlkWS1Am4XB3NFvLUBK6HVwP4YtQPlKKgStnC1AqK3elxqzLUBXEJMriMktQAZzR7\u002f13y1AtdX7UmP2LUBkOLDm0AwuQBKbZHo+Iy5Awf0YDqw5LkBwYM2hGVAuQB\u002fDgTWHZi5AziU2yfR8LkB9iOpcYpMuQCzrnvDPqS5A201ThD3ALkCKsAcYq9YuQDkTvKsY7S5A6HVwP4YDL0CX2CTT8xkvQEY72WZhMC9A9Z2N+s5GL0CkAEKOPF0vQFNj9iGqcy9AAsaqtReKL0CwKF9JhaAvQF+LE93yti9ADu7HcGDNL0C9UHwEzuMvQGyzMJg7+i9ADovylVQIMEBlvMxfixMwQLztpinCHjBAFB+B8\u002fgpMEBrUFu9LzUwQMOBNYdmQDBAGrMPUZ1LMEBy5Oka1FYwQMkVxOQKYjBAIUeerkFtMEB4eHh4eHgwQNCpUkKvgzBAJ9ssDOaOMEB\u002fDAfWHJowQNY94Z9TpTBALm+7aYqwMECFoJUzwbswQN3Rb\u002f33xjBANANKxy7SMECLNCSRZd0wQONl\u002flqc6DBAOpfYJNPzMECSyLLuCf8wQOn5jLhACjFAQStngncVMUCYXEFMriAxQPCNGxblKzFAR7\u002f13xs3MUCf8M+pUkIxQPYhqnOJTTFATlOEPcBYMUClhF4H92MxQP21ONEtbzFAVOcSm2R6MUCsGO1km4UxQANKxy7SkDFAWnuh+AicMUCyrHvCP6cxQAneVYx2sjFAYQ8wVq29MUC4QAog5MgxQBBy5Oka1DFAZ6O+s1HfMUC\u002f1Jh9iOoxQBYGc0e\u002f9TFAbjdNEfYAMkDFaCfbLAwyQB2aAaVjFzJAdMvbbpoiMkDM\u002fLU40S0yQCMukAIIOTJAel9qzD5EMkDSkESWdU8yQCnCHmCsWjJAgfP4KeNlMkDYJNPzGXEyQDBWrb1QfDJAh4eHh4eHMkDfuGFRvpIyQDbqOxv1nTJAjhsW5SupMkDlTPCuYrQyQD1+yniZvzJAlK+kQtDKMkDs4H4MB9YyQEMSWdY94TJAmkMzoHTsMkDydA1qq\u002fcyQEmm5zPiAjNAodfB\u002fRgOM0D4CJzHTxkzQFA6dpGGJDNAp2tQW70vM0D\u002fnCol9DozQFbOBO8qRjNArv\u002feuGFRM0AFMbmCmFwzQF1ik0zPZzNAtJNtFgZzM0AMxUfgPH4zQGP2IapziTNAuyf8c6qUM0ASWdY94Z8zQGmKsAcYqzNAwbuK0U62M0AY7WSbhcEzQHAeP2W8zDNAx08ZL\u002fPXM0AfgfP4KeMzQHayzcJg7jNAzuOnjJf5M0AlFYJWzgQ0QH1GXCAFEDRA1Hc26jsbNEAsqRC0ciY0QIPa6n2pMTRA2wvFR+A8NEAyPZ8RF0g0QIpuedtNUzRA4Z9TpYReNEA40S1vu2k0QJACCDnydDRA5zPiAimANEA\u002fZbzMX4s0QJaWlpaWljRA7sdwYM2hNEBF+UoqBK00QJ0qJfQ6uDRA9Fv\u002fvXHDNEBMjdmHqM40QKO+s1Hf2TRA+++NGxblNEBSIWjlTPA0QKpSQq+D+zRAAYQceboGNUBYtfZC8RE1QLDm0AwoHTVABxir1l4oNUBfSYWglTM1QLZ6X2rMPjVADqw5NANKNUBl3RP+OVU1QL0O7sdwYDVAFEDIkadrNUBscaJb3nY1QMOifCUVgjVAG9RW70uNNUByBTG5gpg1QMo2C4O5ozVAIWjlTPCuNUB4mb8WJ7o1QNDKmeBdxTVAJ\u002fxzqpTQNUB\u002fLU50y9s1QNZeKD4C5zVALpACCDnyNUCFwdzRb\u002f01QN3ytpumCDZANCSRZd0TNkCMVWsvFB82QOOGRflKKjZAO7gfw4E1NkCS6fmMuEA2QOoa1FbvSzZAQUyuICZXNkCZfYjqXGI2QPCuYrSTbTZAR+A8fsp4NkCfERdIAYQ2QPZC8RE4jzZATnTL226aNkClpaWlpaU2QP3Wf2\u002fcsDZAVAhaORO8NkCsOTQDSsc2QANrDs2A0jZAW5zolrfdNkCyzcJg7ug2QAr\u002fnCol9DZAYTB39Fv\u002fNkC5YVG+kgo3QBCTK4jJFTdAaMQFUgAhN0C\u002f9d8bNyw3QBYnuuVtNzdAbliUr6RCN0DFiW552003QB27SEMSWTdAdOwiDUlkN0DMHf3Wf283QCNP16C2ejdAe4Cxau2FN0DSsYs0JJE3QCrjZf5anDdAgRRAyJGnN0DZRRqSyLI3QDB39Fv\u002fvTdAiKjOJTbJN0Df2ajvbNQ3QDYLg7mj3zdAjjxdg9rqN0DlbTdNEfY3QD2fERdIAThAlNDr4H4MOEDsAcaqtRc4QEMzoHTsIjhAm2R6PiMuOEDylVQIWjk4QErHLtKQRDhAofgInMdPOED5KeNl\u002flo4QFBbvS81ZjhAqIyX+WtxOED\u002fvXHDonw4QFbvS43ZhzhAriAmVxCTOEAFUgAhR544QF2D2up9qThAtLS0tLS0OEAM5o5+6784QGMXaUgiyzhAu0hDElnWOEASeh3cj+E4QGqr96XG7DhAwdzRb\u002f33OEAZDqw5NAM5QHA\u002fhgNrDjlAyHBgzaEZOUAfojqX2CQ5QHfTFGEPMDlAzgTvKkY7OUAlNsn0fEY5QH1no76zUTlA1Jh9iOpcOUAsyldSIWg5QIP7MRxYczlA2ywM5o5+OUAyXuavxYk5QIqPwHn8lDlA4cCaQzOgOUA58nQNaqs5QJAjT9egtjlA6FQpodfBOUA\u002fhgNrDs05QJe33TRF2DlA7ui3\u002fnvjOUBGGpLIsu45QJ1LbJLp+TlA9HxGXCAFOkBMriAmVxA6QKPf+u+NGzpA+xDVucQmOkBSQq+D+zE6QKpziU0yPTpAAaVjF2lIOkBZ1j3hn1M6QLAHGKvWXjpACDnydA1qOkBfasw+RHU6QLebpgh7gDpADs2A0rGLOkBm\u002flqc6JY6QL0vNWYfojpAFGEPMFatOkBskun5jLg6QMPDw8PDwzpAG\u002fWdjfrOOkByJnhXMdo6QMpXUiFo5TpAIYks657wOkB5uga11fs6QNDr4H4MBztAKB27SEMSO0B\u002fTpUSeh07QNd\u002fb9ywKDtALrFJpuczO0CG4iNwHj87QN0T\u002fjlVSjtANEXYA4xVO0CMdrLNwmA7QOOnjJf5aztAO9lmYTB3O0CSCkErZ4I7QOo7G\u002fWdjTtAQW31vtSYO0CZns+IC6Q7QPDPqVJCrztASAGEHHm6O0CfMl7mr8U7QPdjOLDm0DtATpUSeh3cO0CmxuxDVOc7QP33xg2L8jtAVSmh18H9O0CsWnuh+Ag8QAOMVWsvFDxAW70vNWYfPECy7gn\u002fnCo8QAog5MjTNTxAYVG+kgpBPEC5gphcQUw8QBC0ciZ4VzxAaOVM8K5iPEC\u002fFie65W08QBdIAYQceTxAbnnbTVOEPEDGqrUXio88QB3cj+HAmjxAdQ1qq\u002felPEDMPkR1LrE8QCRwHj9lvDxAe6H4CJzHPEDS0tLS0tI8QCoErZwJ3jxAgTWHZkDpPEDZZmEwd\u002fQ8QDCYO\u002fqt\u002fzxAiMkVxOQKPUDf+u+NGxY9QDcsyldSIT1Ajl2kIYksPUDmjn7rvzc9QD3AWLX2Qj1AlfEyfy1OPUDsIg1JZFk9QERU5xKbZD1Am4XB3NFvPUDytpumCHs9QErodXA\u002fhj1AoRlQOnaRPUD5SioErZw9QFB8BM7jpz1AqK3elxqzPUD\u002f3rhhUb49QFcQkyuIyT1ArkFt9b7UPUAGc0e\u002f9d89QF2kIYks6z1AtdX7UmP2PUAMB9YcmgE+QGQ4sObQDD5Au2mKsAcYPkASm2R6PiM+QGrMPkR1Lj5Awf0YDqw5PkAZL\u002fPX4kQ+QHBgzaEZUD5AyJGna1BbPkAfw4E1h2Y+QHf0W\u002f+9cT5AziU2yfR8PkAmVxCTK4g+QH2I6lxikz5A1bnEJpmePkAs657wz6k+QIQceboGtT5A201ThD3APkAzfy1OdMs+QIqwBxir1j5A4eHh4eHhPkA5E7yrGO0+QJBElnVP+D5A6HVwP4YDP0A\u002fp0oJvQ4\u002fQJfYJNPzGT9A7gn\u002fnColP0BGO9lmYTA\u002fQJ1sszCYOz9A9Z2N+s5GP0BMz2fEBVI\u002fQKQAQo48XT9A+zEcWHNoP0BTY\u002fYhqnM\u002fQKqU0Ovgfj9AAsaqtReKP0BZ94R\u002fTpU\u002fQLAoX0mFoD9ACFo5E7yrP0BfixPd8rY\u002fQLe87aYpwj9ADu7HcGDNP0BmH6I6l9g\u002fQL1QfATO4z9AFYJWzgTvP0BsszCYO\u002fo\u002fQGJyBTG5AkBADovylVQIQEC5o9\u002f67w1AQGW8zF+LE0BAEdW5xCYZQEC87aYpwh5AQGgGlI5dJEBAFB+B8\u002fgpQEDAN25YlC9AQGtQW70vNUBAF2lIIss6QEDDgTWHZkBAQG+aIuwBRkBAGrMPUZ1LQEDGy\u002fy1OFFAQHLk6RrUVkBAHv3Wf29cQEDJFcTkCmJAQHUusUmmZ0BAIUeerkFtQEDNX4sT3XJAQHh4eHh4eEBAJJFl3RN+QEDQqVJCr4NAQHvCP6dKiUBAJ9ssDOaOQEDT8xlxgZRAQH8MB9YcmkBAKiX0OrifQEDWPeGfU6VAQIJWzgTvqkBALm+7aYqwQEDZh6jOJbZAQIWglTPBu0BAMbmCmFzBQEDd0W\u002f998ZAQIjqXGKTzEBANANKxy7SQEDgGzcsytdAQIs0JJFl3UBAN00R9gDjQEDjZf5anOhAQI9+67837kBAOpfYJNPzQEDmr8WJbvlAQJLIsu4J\u002f0BAPuGfU6UEQUDp+Yy4QApBQJUSeh3cD0FAQStngncVQUDtQ1TnEhtBQJhcQUyuIEFARHUusUkmQUDwjRsW5StBQJumCHuAMUFAR7\u002f13xs3QUDz1+JEtzxBQJ\u002fwz6lSQkFASgm9Du5HQUD2IapziU1BQKI6l9gkU0FATlOEPcBYQUD5a3GiW15BQKWEXgf3Y0FAUZ1LbJJpQUD9tTjRLW9BQKjOJTbJdEFAVOcSm2R6QUAAAAAAAIBBQA=="},"y":{"dtype":"f8","bdata":"AAAAAAAAAAA2emH\u002f+JM1P5I2rAH6n0U\u002fPH\u002fpDfNAUD9Og\u002fGv1rdVP2s+TKudNFs\u002fm1axnp5bYD9i\u002fxcN1R9jP+xJ4jTs5mU\u002fcXDi4t2waD+yMnKbo31rP+J2Lpk2TW4\u002f6JXY5cePcD\u002fBxCTrU\u002fpxP3pnWYc7ZnM\u002fi87kvXrTdD89CCBqDUJ2P21eqD7vsXc\u002feFe4xBsjeT9eTYBbjpV6P++ufjdCCXw\u002fyv\u002fXYTJ+fT9xrK63WfR+P4lkvXTZNYA\u002fAOkwPRzygD\u002f+Qsdf8q6BP7Z5xO9YbII\u002fI2nH6Ewqgz\u002fCInYuy+iDP\u002faPKozQp4Q\u002ff2SftFlnhT\u002fab51BYyeGP9lcqbPp54Y\u002fbe+xcemohz\u002fk0L7IXmqIP6X7n+tFLIk\u002fsted8pruiT8GGirbWbGKPz95kYd+dIs\u002fsEquvgQ4jD9qG5wr6PuMP21ZbF0kwI0\u002fvyHcxrSEjj\u002fMSAu+lEmPP1xZGr5fB5A\u002fNAm0DhhqkD8JkyLQ8MyQP5RE3HLnL5E\u002fxxldWPmSkT+23wbTI\u002faRPzxHAiZkWZI\u002fofQghbe8kj9XmcAUGyCTP5slr+mLg5M\u002fvR8QCQfnkz9nL0NoiUqUPzrry+wPrpQ\u002fxPc6bJcRlT+thhisHHWVP7lF0GGc2JU\u002fKM2eMhM8lj9pnYCzfZ+WP4S8ImnYApc\u002fowPVxx9mlz+OLX4zUMmXPz23kf9lLJg\u002fzKMHb12PmD9nNVa0MvKYPxmtbfHhVJk\u002ffSO2N2e3mT\u002fJjA+IvhmaP6L609Lje5o\u002fji7c99Ldmj8IkIbGhz+bP1yZwP39oJs\u002foM4STDECnD92Uq9PHWOcPyEsg5a9w5w\u002f3lJKng0knT+CkqbUCISdP2RdOZeq450\u002fwp\u002fAM+5Cnj8IqTbozqGePx0\u002f9eJHAJ8\u002fRfDbQlRenz\u002fjt3kX77ufP0MFnbCJDKA\u002f3q7KCN46oD\u002fqn6IF8migPwMKPhHDlqA\u002ffkOQjk7EoD\u002f9Z4bZkfGgPzbpKEeKHqE\u002f0hm\u002fJTVLoT8bvPS8j3ehPzWeAU6Xo6E\u002fSE3TE0nPoT8I6ThDovqhP78gEQugJaI\u002f62J6lD9Qoj8eSAUDfnqiP8VB6XRYpKI\u002fNpU7A8zNoj\u002fnqijC1faiP8W5L8FyH6M\u002fEdZgC6BHoz\u002fWap2nWm+jP+Qk25iflqM\u002fnVVp3mu9oz+w0zh0vOOjP01fJlOOCaQ\u002f\u002fY5Hcd4upD\u002fdSTrCqVOkP1TTdjftd6Q\u002fB2ykwKWbpD8Ri\u002fBL0L6kPzOyaMZp4aQ\u002fvN5WHG8DpT+nmKA53SSlP3qgKAqxRaU\u002f8jszeudlpT+3IM12fYWlP5n7NO5vpKU\u002fJZJH0LvCpT9ze+4OXuClP1RskZ5T\u002faU\u002fJhKKdpkZpj+rdpqRLDWmP03mZe4JUKY\u002fZFHsjy5qpj\u002f+Hwh+l4OmP7Ju7sVBnKY\u002f96mxeiq0pj9\u002ffMa1TsumP+QDi5er4aY\u002f7T3QRz73pj9xn2X2AwynP+zEptv5H6c\u002fUSsLOR0zpz\u002fQ3rdZa0WnP6MLE5PhVqc\u002fKlxZRX1npz+7DTXcO3enP\u002fCkVs8ahqc\u002fQSgPoxeUpz\u002fexuvoL6GnPxLQUkBhrac\u002fSt4hV6m4pz9zF03qBcOnP61if8Z0zKc\u002flnK7yPPUpz8rgf3egNynP6SZ3Qga46c\u002flEoyWL3opz+\u002fmbPxaO2nPyERng0b8ac\u002fxrtV+NHzpz8y5wgTjPWnP9p8UtRH9qc\u002fEcbbyAP2pz\u002fnav2TvvSnP7l7X\u002fB28qc\u002fPVOYsCvvpz8lHsq\u002f2+qnP7zTPiKG5ac\u002f02kC9infpz8qDXtzxtenPzsm\u002f+1az6c\u002fRfFo1ObFpz9jb6exabunP3N1TC3jr6c\u002fmpwXDFOjpz9Z130wuZWnP1FtLZsVh6c\u002fAh+Oa2h3pz85Mj3gsWanP0InhVfyVKc\u002fYtbQTypCpz+\u002ftBloWi6nP3v\u002fUGCDGac\u002fjYvDGaYDpz\u002fE+HeXw+ymP1oGh\u002f7c1KY\u002fgMdtlvO7pj+edlnJCKKmPyGmbCQeh6Y\u002feo79VzVrpj8KOc03UE6mP9NIN7twMKY\u002fbyJa\u002fZgRpj+\u002fNTc9y\u002fGlPxcty90J0aU\u002flMYdZlevpT8tHkmBtoylPzkweP4paaU\u002fGF7c0LREpT+MwJkPWh+lP08VqvUc+aQ\u002fpxe24QDSpD81FuVVCaqkP6Saovc5gaQ\u002fwPpZj5ZXpD8krScIIy2kPwM\u002fgG\u002fjAaQ\u002ficvM9NvVoz\u002fQ2PzoEKmjP\u002fSBDb6Ge6M\u002fmNmFBkJNoz\u002fSc+h0Rx6jP8UKGtub7qI\u002fSDW9KUS+oj80K4NvRY2iP6uXcdikW6I\u002fEH4drWcpoj9rO9tRk\u002fahP6yy40Utw6E\u002fYbduIjuPoT+Iz8KZwlqhP6FqOnbJJaE\u002fE7E+mVXwoD\u002ffFDj6bLqgP9zRdKUVhKA\u002fd5EFu1VNoD93a5BtMxagP2UGNQJqvZ8\u002fUwyRk8FNnz\u002farSxVet2eP8ppDCihbJ4\u002fzG6PBUP7nT9d8K38bImdP4ieKC8sF50\u002fVA+qzo2knD9Z9NoZnzGcP9wBalltvps\u002fjncI3QVLmz8rRlz4ddeaP7nW6P\u002fKY5o\u002fC4PvRRLwmT9a2EgXWXyZP1nGN7isCJk\u002f8+U3YRqVmD9aC8g7ryGYP0lfMl94rpc\u002fZEJTzYI7lz\u002fxRGBv28iWPxWDsBKPVpY\u002f2buHZarklT+5feXzOXOVP2jIWSRKApU\u002fZIbgNOeRlD+DRMU3HSKUP9+OkBD4spM\u002fc1wAcYNEkz+58gzWytaSPyOq+4TZaZI\u002fCfuAiLr9kT9AOPOteJKRP1BZj4IeKJE\u002fSjLRULa+kD+qceAdSlaQP4BuJ07H3Y8\u002f0x4WvxgRjz+cLMbbmkaOPyH7A1Rffo0\u002fBUr\u002fNXe4jD\u002fo11Pq8vSLP1apTDDiM4s\u002fOQ5kGlR1ij8LYwILV7mJPyxvfbH4\u002f4g\u002fgSFaB0ZJiD9GTNJNS5WHPyPenwsU5IY\u002f4PIOC6s1hj8+8FdYGoqFP7q8QkBr4YQ\u002fv\u002fUTT6Y7hD9C4cRP05iDP2Sshkv5+II\u002fEV2RiR5cgj9XsD6PSMKBP9bxcCB8K4E\u002fkatFQL2XgD9\u002f3hMyDweAP8SMavXo8n4\u002fQ\u002fkzxN3dfT+cPkvq\u002fs58P7PlqQ9Nxns\u002fg45Vb8fDej+2dsXca8d5P1aY0Mk20Xg\u002fleMgTSPhdz9dwCcpK\u002fd2P7Wvj9NGE3Y\u002feJMmfW01dT\u002fL0zsalV10PydObWuyi3M\u002feLHdBrm\u002fcj8tps5hm\u002flxP47hmNpKOXE\u002fIwb8wrd+cD8W+n\u002fVopNvPy2BQlUMNW4\u002fq8YC34bhbD+Y7KmL65hrP6ucj8oRW2o\u002fShchec8naT88Xdj6+P5nPwfodFFh4GY\u002fx01nNdrLZT8mImEuNMFkP7Rn+qs+wGM\u002fa\u002fJdHsjIYj+JNe4OntphPxse1DiN9WA\u002f6MtpoWEZYD+FdOZgzYtePy5lLpDO9Vw\u002fvXAWuVtwWz\u002fF+8oWCftZP0W4EGVqlVg\u002fHno2DRM\u002fVz+OzApSlvdVP0U0v3qHvlQ\u002fWiuk\u002fHmTUz9DFaqjAXZSP9WolLmyZVE\u002fgJvPKyJiUD9cZKlfy9VOP0J+Kcwn\u002f0w\u002fmAGt9og\u002fSz8Gkv+QIJZJP7qYfeEiAkg\u002fYO4V\u002fMaCRj\u002f+SOz3RhdFP9olkSHgvkM\u002fm+XGKdN4Qj+WyM5QZERBP0VpO47bIEA\u002fXGySagkbPj\u002fPg4ArXxM8P1cFyzJgKTo\u002fopIIvLxbOD\u002fCnDaYLak2P11hdlR0EDU\u002fNEJNWluQMz95co0JticyP780EMxg1TA\u002fFsbdRoIwLz8nWddhi94sP4y7fG\u002fMsio\u002fRUL5M0erKD+o5K+gD8YmP4Hs27lLASU\u002fAiPUcjNbIz9s1nGBENIhP+MVICk+ZCA\u002fPb0z\u002fFEgHj+hXb9CnagbP3cW3Ot6Xhk\u002fe\u002f59nyg\u002fFz+EAEE6BEgVP1nT0RWLdhM\u002fvQkjSFnIET+Yh3raKDsQPzklvvKhmQ0\u002fREXQPIr2Cj\u002fKRtdpKIkIP2Qd\u002fHTPTQY\u002f4XpiuAVBBD9XHusig18CP0FZ72ovpgA\u002fkBstf0Ak\u002fj5LQqP0LkH7PoK65aMCnvg+MwiFIeU19j6MYbOdTQT0PjEc7GP9BPI+OV\u002fDZ\u002fwz8D5r6cvBKxvtPo4TRfCpHOo+t8BODgNm5z6Vp+PYOfHkPrtQgOm9uOI+P5FUtmW34D7Gfm2D0dDdPi3i8\u002fSzjto+l\u002f3xnESg1z5Alrfg9v3UPgJVp6LVoNI+wrONnnmC0D57HoheADrNPrsjKPsE1sk+jJ68LxrPxj6X2zvjLxzEPtTABZP9tME+pVIR0ucjvz4xpPYvXli7PpsghfLT+rc+nFg4z+P\u002ftD59tHWiNl2yPjIhQ\u002fdtCbA+0NX2zB\u002f4qz6xGv2B6FqoPh3M7e9lLaU+1KABbCdjoj6hyDxv+uGfPv3WLEu4mZs+ylGZoIbblz5FX4iLR5eUPu00vB2UvpE++PCT3SWJjj5rOvjzozuKPllTqy5HgIY+uzG7vPxEgz4nUKOFv3mAPqtv4vPEIHw+DPz9Q7\u002f4dz56aFkqV2V0PiTmaA8aU3E+xbX6g+BhbT44R9RAtd9oPq8nxWJtBWU+JLcMTxG8YT7+0QVJK99dPl0F3BgIHVk+J\u002fRvO1oTVT5pDJcIxadRPug3y7Hihk0+emCo\u002fjylSD7YxbM1f4hEPrsOLhxIE0E+PCxNDKhYPD6MNyjf53s3PiV1BpcpazM+3ZfOrKoGMD5FJvd6o2YqPs6TtWsWtCU+iuaMEnXOIT7UjbyH9igdPhG1UMsB1Bc+dQz3IntuEz5KM5BElaAPPoqiOrNtrwk+4uClT+LQBD5jpE7Vh9UAPrxT6P94K\u002fs9P2p3Gubg9T22+CT4VJTxPaWpT04yMOw97zb4x7eM5j3qRasgrP\u002fhPZsh8MTvqtw93myMn07H1j2YbSEFwQ7SPZICqzVgkMw9uyGve+uJxj1i9C+lFb7BPWq6CVIJ3rs9GiJsNBXVtT0M29smFhCxPb4j3\u002f3ymqo9G\u002fuwtOCwpD3kaq1QHQ2gPe\u002fHF8xY15g9LiU0SW4skz24bbU0roWNPXrJSC1dq4Y9TSD7qqJcgT0n3UYqHYZ6PStTSBfgNHQ9CkSUxoC0bj3YhzAzF0RnPYV3Dby9lGE9jV3NIz9\u002fWj3kR4M0belTPSiJeE+k1009wGdMFaNMRj3+VyK+g51APUTR\u002fBpOsDg9Ogs7gv9JMj2pjUP9VAQrPT+5RlBP5SM9HkfA+SU3HT0cr2s8smIVPZhuKiB1Ng89EBnvszG1Bj0sy\u002fOQEHgAPZySqJtN0Pc8ajZKupgp8TzBQjZ9tKjoPKZtgCVuqOE8U24rMfo02TxqTt\u002fyv+7RPNVuGvA9bsk8IeAWyrz4wTz9buOnsFC5PENf4urixLE8h+bQD+7bqDwzYg1CLFShPPoA1DkeE5g8x4iwzRCqkDxlrYAL2vyGPAM2Lpe6mH88r39hp9KidTzKuk+iwIVtPMJ+tbtBEWQ8+KBODugtWzyjfmksLlZSPPFQ1qDcpUg8nGry7JSAQDydK7xSBwM2PMle+wsRPy08AMtDb1RaIzzsHhSttIIZPAA1O0oUvxA8TgC3Gr7lBTyKfNc7GoT8O99lWbS4ffI7oqW4K53h5zvM4Vi2o7beOyxJJemfqtM7NN9m7QgUyTvrCO6yZte\u002fO6UMV15XILQ7XONWB89UqTuoQolXu72fO3RBeO4wzJM7zyyfUcWViDsQMrJZKGR+O8JdQmq2snI7fVZmsLnmZjuK4xvtC+tbOx0OarjO71A7mKXwfadzRDvUuTwJ4pM4O74v1EOKZC07dwrkF1Z9ITt2rwhpArYUO7ZmKyZOZwg7EvJb+iOc\u002fDpApVABha\u002fwOqASpl7lXOM6oXvBeYla1jqA05EVA6zJOo4n4\u002fTlU706TUgCNcapsDqdXC7dbdWiOtZQnUoFLJU6BlDJFLarhzoN52FPoVF6OgPUFOnNGW06fHPnmx3\u002fXzrXtbPkpH1ROvXRiLl0A0M67ufPn8CMNDr0uH0UzxQmOh5WL4N9lhc6awUZV1gMCTqqAkH0t3D6Oep\u002f6fHhves5QwgMrS3u3DktsloNK\u002fzNORGmgSTK4r450KBGKoKdrzmXEwQiOxSgOQNJzEJLQJA5u4wA191RgDlsJU0mXkhwOarpdhy9I2A58aFwl+fITzkAsnACAxc\u002fOdVIldTKNC459lhC+ycmHTk7xOIc0e8LOR\u002fKaDsnl\u002fo4itmOSA0i6Th2SMpavJbXOBK0\u002fFOW+8U44tbQ0\u002fhWtDisshk\u002fEq+iOPGm+Hy6CZE4edMcmqHYfjjRNOCXP7drOHCrv8OQt1g4t1WR8mfgRTjgYGz5GzczOKYmJ4mIvyA4VvIsQzf4DDgkyMy029v4N4Z6K9DGKeU3SpEvI6ff0TewHZb30PK9N6FuulUd46g3K2XFkx+DlDcf3bzdVMSAN5IxX6TTLms3JWmcgo3ZVTfZ9LPRDWpBN3Rdn05lhSs3GjHoLi2PFTd\u002fvDiE9b0AN1fHqegmxuk2jo8yhuCp0zb8k+Y4RLy9NkyLm6DCR6Y2+BLP0tuKkDZm5cHwwlZ4Nv9gvSc2vWE2xd+Rsr2dSTaeToK9NFIyNgq0JFEx9Rk2W2q0mVY2AjZP5Rf6607pNYc5xVenadE12ahVYXW5tzUihy83UACgNexYmugjXoU1km96LLw+bDWtFkRpJ3pSNQgulC3e7Dc1f98Ov0+oHjVnrfICkm8DNYKuIgHhYeg0\u002fXcuI8tCzjQrQX7LcJOyNNTqeLTUjpY0bQTUScUXezQlrnH97BZgNH7sKfuG5UI0iRT2FnPxJTTqP4gv6zAJNFDtBxF\u002fluwz6rAQApUI0DNp2lO8U8axMxD840UFeZMzxT6cWEsUdTOpFMTNaItWM4f9AB\u002fg0TczkP0PkR3cGDPubyUEIaD5Mj2B5EcaFtoyAWyH8uo4ujKLum81ggaaMp3IL+wJgHkyGnoH8t+pWDJMBmtCW4s3MniigQ5hLhYyWBRGPNKe9DG8qxU13enSMcAkRxxCHbExbUiAfTCNjjH6rUB+ReVqMQt\u002fi6qAWUcxlO1def38IzF96q8krd4AMTw4ZI5BEtwwVzCSCkAFtzC4rR7vAJuSMNS\u002fYgu4om0wnZ+9d0lBRzAtkhaPKPohMEbVnjy9YPsvpTcGnDaI1C+KPRO6kVOuL52ZeT1HDYYvvc28VXmSXy8LiRdLTz82L8NsRIaP2w4viamA1B4P5S5IORcBE0i8LufVqj+vrpIu2216dUpHaC4wepMInAc\u002fLvbcXWmsfxMuLP6KPvMX6C2t\u002fN0NJES9LVYFL1txeJEtmn\u002fKKHl\u002fZC1lKrjFkaE3LRCZQTa2wwot89jeaKLG3SzCTyjqTkSwLM9M+BDjc4EssCGz4VNiUiyKoT+CcAIjLE8rPX\u002fBSvMrBBPisHI2wysucrSX18WSK3NYhPd2\u002fmEr91cMr5nqMCuLlXQr0jD\u002fKoHiF6BvMcwq+SXKLDX7mCq2eHtK9rFlKm\u002fgfrqbdjIqJ0y8WyzK\u002fikOLjnhBSbJKXZp\u002f+IjHpQpodCqz4iEXyn\u002fuhce0isoKSFiSOgbJfIoXMLLNDapuigNhlMuTiqDKGCgiO6Y9EooZ+qfUm6KEijWDkECIvHYJ29SCLYFZ6AnophCyIMWZSdTeYdVIH8qJ0Y\u002fGoTbQ\u002fAmp5Q4U+2BsyY0bip55dl2JmUh\u002fBt7IzomsIgo7Zow\u002fSW4KQfIP9G\u002fJX9R2lsR7IAlv3T3RdSPQSV5HqmoKccBJUW7GfH\u002fjMEkgiBocK\u002fkgCThKKxRX7M\u002fJAZYtfCZ\u002fPwjYJvuOCTTuSOZew2VdWl2Iwf1XNEp8TIjcfy5uscs7yI\u002fb4jBzvioInkgoEl2d2MiC+rLdmuHHSI1fbij9MjVIQQo4Q02Qo8hbChJa5nNRSG9awz6OJD9IEuT6zPsebMg3gXTERXuaCCMXwJhL\u002f4eIJjFdQHAtNIf\u002f6S66lrrhR\u002fqmkSBE+04H4vLgyMxgOse5a6pCvFtnR5+5uTj4IlOHnOIb5BkuP4d30Er0xfzrR0uGUDNF0pcHdmsTDPe4Qkdc5SymxHuthwi4UNrUapjHEQWY81kUhAcxHEeTXY2uhuEBHCeultkG5O6FHaYkw4b\u002fD105AEythpJ732dUyNfGiFxgt+YGQUa7tHijbqdqxnV7D07mnJRGRjrnnAnR\u002fUYZL5BwFMJmRiQijgv5Wk8GP50f9SkF98XX5ZcWstlgBd0iODCdKogF6OEix7xUMAWHTR8hYfDXhYTz1qvBev7FWcdGGpUYZgVPpkxHhZ7NBXIfh8kgIvQFKWBTGg6smkUsJ7zLu4sAxQ4pGU37H2bE86gpLOx7DITEdMt9ZYCyRJCCFa+Z7dfElg+XDJbSvMRCdrW8xaAhhGTMKRjzCcZEYVYTV1j8qoQPduaKqqlOxBJ1T1sXSjLDz+Squnsh1kPSpVCVTH25g7wgrf\u002flb9zDrn4YW9mPAAO9YNc+1uCiQ3ZF6dt\u002fCMTDQBYRYSVbJsMr0zflum\u002fIgwTwnrcJ3WoCz5uqx36ay4LnM7Yx64Isgpmk94J5F40CmIwqgrg6bUJrgBRNaxwNgn3lFU7dt21CFoPPbVEQzQILBRZ2PrZsQfi7IsymuMtBw=="},"type":"scatter","xaxis":"x","yaxis":"y"},{"fill":"tozeroy","fillcolor":"rgba(192,57,43,0.35)","hovertemplate":"t=%{x:.1f}  doom=%{y:.4f}","line":{"color":"#c0392b","width":1},"name":"λ_d S(t)  doom density","x":{"dtype":"f8","bdata":"AAAAAAAAAADwrmK0k22mP\u002fCuYrSTbbY\u002fNANKxy7SwD\u002fwrmK0k23GP6xae6H4CMw\u002fNANKxy7S0D8SWdY94Z\u002fTP\u002fCuYrSTbdY\u002fzgTvKkY72T+sWnuh+AjcP4qwBxir1t4\u002fNANKxy7S4D8jLpACCDniPxJZ1j3hn+M\u002fAYQceboG5T\u002fwrmK0k23mP9\u002fZqO9s1Oc\u002fzgTvKkY76T+9LzVmH6LqP6xae6H4COw\u002fm4XB3NFv7T+KsAcYq9buP7ztpinCHvA\u002fNANKxy7S8D+sGO1km4XxPyMukAIIOfI\u002fmkMzoHTs8j8SWdY94Z\u002fzP4puedtNU\u002fQ\u002fAYQceboG9T94mb8WJ7r1P\u002fCuYrSTbfY\u002faMQFUgAh9z\u002ff2ajvbNT3P1bvS43Zh\u002fg\u002fzgTvKkY7+T9GGpLIsu75P70vNWYfovo\u002fNEXYA4xV+z+sWnuh+Aj8PyRwHj9lvPw\u002fm4XB3NFv\u002fT8Sm2R6PiP+P4qwBxir1v4\u002fAsaqtReK\u002fz+87aYpwh4AQHh4eHh4eABANANKxy7SAEDwjRsW5SsBQKwY7WSbhQFAZ6O+s1HfAUAjLpACCDkCQN+4YVG+kgJAmkMzoHTsAkBWzgTvKkYDQBJZ1j3hnwNAzuOnjJf5A0CKbnnbTVMEQEX5SioErQRAAYQceboGBUC9Du7HcGAFQHiZvxYnugVANCSRZd0TBkDwrmK0k20GQKw5NANKxwZAaMQFUgAhB0AjT9egtnoHQN\u002fZqO9s1AdAm2R6PiMuCEBW70uN2YcIQBJ6HdyP4QhAzgTvKkY7CUCKj8B5\u002fJQJQEYaksiy7glAAaVjF2lICkC9LzVmH6IKQHm6BrXV+wpANEXYA4xVC0Dwz6lSQq8LQKxae6H4CAxAaOVM8K5iDEAkcB4\u002fZbwMQN\u002f6740bFg1Am4XB3NFvDUBXEJMriMkNQBKbZHo+Iw5AziU2yfR8DkCKsAcYq9YOQEY72WZhMA9AAsaqtReKD0C9UHwEzuMPQLztpinCHhBAGrMPUZ1LEEB4eHh4eHgQQNY94Z9TpRBANANKxy7SEECSyLLuCf8QQPCNGxblKxFATlOEPcBYEUCsGO1km4URQAneVYx2shFAZ6O+s1HfEUDFaCfbLAwSQCMukAIIORJAgfP4KeNlEkDfuGFRvpISQD1+yniZvxJAmkMzoHTsEkD4CJzHTxkTQFbOBO8qRhNAtJNtFgZzE0ASWdY94Z8TQHAeP2W8zBNAzuOnjJf5E0AsqRC0ciYUQIpuedtNUxRA5zPiAimAFEBF+UoqBK0UQKO+s1Hf2RRAAYQceboGFUBfSYWglTMVQL0O7sdwYBVAG9RW70uNFUB4mb8WJ7oVQNZeKD4C5xVANCSRZd0TFkCS6fmMuEAWQPCuYrSTbRZATnTL226aFkCsOTQDSscWQAr\u002fnCol9BZAaMQFUgAhF0DFiW55200XQCNP16C2ehdAgRRAyJGnF0Df2ajvbNQXQD2fERdIARhAm2R6PiMuGED5KeNl\u002floYQFbvS43ZhxhAtLS0tLS0GEASeh3cj+EYQHA\u002fhgNrDhlAzgTvKkY7GUAsyldSIWgZQIqPwHn8lBlA6FQpodfBGUBGGpLIsu4ZQKPf+u+NGxpAAaVjF2lIGkBfasw+RHUaQL0vNWYfohpAG\u002fWdjfrOGkB5uga11fsaQNd\u002fb9ywKBtANEXYA4xVG0CSCkErZ4IbQPDPqVJCrxtATpUSeh3cG0CsWnuh+AgcQAog5MjTNRxAaOVM8K5iHEDGqrUXio8cQCRwHj9lvBxAgTWHZkDpHEDf+u+NGxYdQD3AWLX2Qh1Am4XB3NFvHUD5SioErZwdQFcQkyuIyR1AtdX7UmP2HUASm2R6PiMeQHBgzaEZUB5AziU2yfR8HkAs657wz6keQIqwBxir1h5A6HVwP4YDH0BGO9lmYTAfQKQAQo48XR9AAsaqtReKH0BfixPd8rYfQL1QfATO4x9ADovylVQIIEC87aYpwh4gQGtQW70vNSBAGrMPUZ1LIEDJFcTkCmIgQHh4eHh4eCBAJ9ssDOaOIEDWPeGfU6UgQIWglTPBuyBANANKxy7SIEDjZf5anOggQJLIsu4J\u002fyBAQStngncVIUDwjRsW5SshQJ\u002fwz6lSQiFATlOEPcBYIUD9tTjRLW8hQKwY7WSbhSFAWnuh+AicIUAJ3lWMdrIhQLhACiDkyCFAZ6O+s1HfIUAWBnNHv\u002fUhQMVoJ9ssDCJAdMvbbpoiIkAjLpACCDkiQNKQRJZ1TyJAgfP4KeNlIkAwVq29UHwiQN+4YVG+kiJAjhsW5SupIkA9fsp4mb8iQOzgfgwH1iJAmkMzoHTsIkBJpucz4gIjQPgInMdPGSNAp2tQW70vI0BWzgTvKkYjQAUxuYKYXCNAtJNtFgZzI0Bj9iGqc4kjQBJZ1j3hnyNAwbuK0U62I0BwHj9lvMwjQB+B8\u002fgp4yNAzuOnjJf5I0B9RlwgBRAkQCypELRyJiRA2wvFR+A8JECKbnnbTVMkQDjRLW+7aSRA5zPiAimAJECWlpaWlpYkQEX5SioErSRA9Fv\u002fvXHDJECjvrNR39kkQFIhaOVM8CRAAYQceboGJUCw5tAMKB0lQF9JhaCVMyVADqw5NANKJUC9Du7HcGAlQGxxolvediVAG9RW70uNJUDKNguDuaMlQHiZvxYnuiVAJ\u002fxzqpTQJUDWXig+AuclQIXB3NFv\u002fSVANCSRZd0TJkDjhkX5SiomQJLp+Yy4QCZAQUyuICZXJkDwrmK0k20mQJ8RF0gBhCZATnTL226aJkD91n9v3LAmQKw5NANKxyZAW5zolrfdJkAK\u002f5wqJfQmQLlhUb6SCidAaMQFUgAhJ0AWJ7rlbTcnQMWJbnnbTSdAdOwiDUlkJ0AjT9egtnonQNKxizQkkSdAgRRAyJGnJ0Awd\u002fRb\u002f70nQN\u002fZqO9s1CdAjjxdg9rqJ0A9nxEXSAEoQOwBxqq1FyhAm2R6PiMuKEBKxy7SkEQoQPkp42X+WihAqIyX+WtxKEBW70uN2YcoQAVSACFHnihAtLS0tLS0KEBjF2lIIssoQBJ6HdyP4ShAwdzRb\u002f33KEBwP4YDaw4pQB+iOpfYJClAzgTvKkY7KUB9Z6O+s1EpQCzKV1IhaClA2ywM5o5+KUCKj8B5\u002fJQpQDnydA1qqylA6FQpodfBKUCXt900RdgpQEYaksiy7ilA9HxGXCAFKkCj3\u002frvjRsqQFJCr4P7MSpAAaVjF2lIKkCwBxir1l4qQF9qzD5EdSpADs2A0rGLKkC9LzVmH6IqQGyS6fmMuCpAG\u002fWdjfrOKkDKV1IhaOUqQHm6BrXV+ypAKB27SEMSK0DXf2\u002fcsCgrQIbiI3AePytANEXYA4xVK0Djp4yX+WsrQJIKQStngitAQW31vtSYK0Dwz6lSQq8rQJ8yXuavxStATpUSeh3cK0D998YNi\u002fIrQKxae6H4CCxAW70vNWYfLEAKIOTI0zUsQLmCmFxBTCxAaOVM8K5iLEAXSAGEHHksQMaqtReKjyxAdQ1qq\u002felLEAkcB4\u002fZbwsQNLS0tLS0ixAgTWHZkDpLEAwmDv6rf8sQN\u002f6740bFi1Ajl2kIYksLUA9wFi19kItQOwiDUlkWS1Am4XB3NFvLUBK6HVwP4YtQPlKKgStnC1AqK3elxqzLUBXEJMriMktQAZzR7\u002f13y1AtdX7UmP2LUBkOLDm0AwuQBKbZHo+Iy5Awf0YDqw5LkBwYM2hGVAuQB\u002fDgTWHZi5AziU2yfR8LkB9iOpcYpMuQCzrnvDPqS5A201ThD3ALkCKsAcYq9YuQDkTvKsY7S5A6HVwP4YDL0CX2CTT8xkvQEY72WZhMC9A9Z2N+s5GL0CkAEKOPF0vQFNj9iGqcy9AAsaqtReKL0CwKF9JhaAvQF+LE93yti9ADu7HcGDNL0C9UHwEzuMvQGyzMJg7+i9ADovylVQIMEBlvMxfixMwQLztpinCHjBAFB+B8\u002fgpMEBrUFu9LzUwQMOBNYdmQDBAGrMPUZ1LMEBy5Oka1FYwQMkVxOQKYjBAIUeerkFtMEB4eHh4eHgwQNCpUkKvgzBAJ9ssDOaOMEB\u002fDAfWHJowQNY94Z9TpTBALm+7aYqwMECFoJUzwbswQN3Rb\u002f33xjBANANKxy7SMECLNCSRZd0wQONl\u002flqc6DBAOpfYJNPzMECSyLLuCf8wQOn5jLhACjFAQStngncVMUCYXEFMriAxQPCNGxblKzFAR7\u002f13xs3MUCf8M+pUkIxQPYhqnOJTTFATlOEPcBYMUClhF4H92MxQP21ONEtbzFAVOcSm2R6MUCsGO1km4UxQANKxy7SkDFAWnuh+AicMUCyrHvCP6cxQAneVYx2sjFAYQ8wVq29MUC4QAog5MgxQBBy5Oka1DFAZ6O+s1HfMUC\u002f1Jh9iOoxQBYGc0e\u002f9TFAbjdNEfYAMkDFaCfbLAwyQB2aAaVjFzJAdMvbbpoiMkDM\u002fLU40S0yQCMukAIIOTJAel9qzD5EMkDSkESWdU8yQCnCHmCsWjJAgfP4KeNlMkDYJNPzGXEyQDBWrb1QfDJAh4eHh4eHMkDfuGFRvpIyQDbqOxv1nTJAjhsW5SupMkDlTPCuYrQyQD1+yniZvzJAlK+kQtDKMkDs4H4MB9YyQEMSWdY94TJAmkMzoHTsMkDydA1qq\u002fcyQEmm5zPiAjNAodfB\u002fRgOM0D4CJzHTxkzQFA6dpGGJDNAp2tQW70vM0D\u002fnCol9DozQFbOBO8qRjNArv\u002feuGFRM0AFMbmCmFwzQF1ik0zPZzNAtJNtFgZzM0AMxUfgPH4zQGP2IapziTNAuyf8c6qUM0ASWdY94Z8zQGmKsAcYqzNAwbuK0U62M0AY7WSbhcEzQHAeP2W8zDNAx08ZL\u002fPXM0AfgfP4KeMzQHayzcJg7jNAzuOnjJf5M0AlFYJWzgQ0QH1GXCAFEDRA1Hc26jsbNEAsqRC0ciY0QIPa6n2pMTRA2wvFR+A8NEAyPZ8RF0g0QIpuedtNUzRA4Z9TpYReNEA40S1vu2k0QJACCDnydDRA5zPiAimANEA\u002fZbzMX4s0QJaWlpaWljRA7sdwYM2hNEBF+UoqBK00QJ0qJfQ6uDRA9Fv\u002fvXHDNEBMjdmHqM40QKO+s1Hf2TRA+++NGxblNEBSIWjlTPA0QKpSQq+D+zRAAYQceboGNUBYtfZC8RE1QLDm0AwoHTVABxir1l4oNUBfSYWglTM1QLZ6X2rMPjVADqw5NANKNUBl3RP+OVU1QL0O7sdwYDVAFEDIkadrNUBscaJb3nY1QMOifCUVgjVAG9RW70uNNUByBTG5gpg1QMo2C4O5ozVAIWjlTPCuNUB4mb8WJ7o1QNDKmeBdxTVAJ\u002fxzqpTQNUB\u002fLU50y9s1QNZeKD4C5zVALpACCDnyNUCFwdzRb\u002f01QN3ytpumCDZANCSRZd0TNkCMVWsvFB82QOOGRflKKjZAO7gfw4E1NkCS6fmMuEA2QOoa1FbvSzZAQUyuICZXNkCZfYjqXGI2QPCuYrSTbTZAR+A8fsp4NkCfERdIAYQ2QPZC8RE4jzZATnTL226aNkClpaWlpaU2QP3Wf2\u002fcsDZAVAhaORO8NkCsOTQDSsc2QANrDs2A0jZAW5zolrfdNkCyzcJg7ug2QAr\u002fnCol9DZAYTB39Fv\u002fNkC5YVG+kgo3QBCTK4jJFTdAaMQFUgAhN0C\u002f9d8bNyw3QBYnuuVtNzdAbliUr6RCN0DFiW552003QB27SEMSWTdAdOwiDUlkN0DMHf3Wf283QCNP16C2ejdAe4Cxau2FN0DSsYs0JJE3QCrjZf5anDdAgRRAyJGnN0DZRRqSyLI3QDB39Fv\u002fvTdAiKjOJTbJN0Df2ajvbNQ3QDYLg7mj3zdAjjxdg9rqN0DlbTdNEfY3QD2fERdIAThAlNDr4H4MOEDsAcaqtRc4QEMzoHTsIjhAm2R6PiMuOEDylVQIWjk4QErHLtKQRDhAofgInMdPOED5KeNl\u002flo4QFBbvS81ZjhAqIyX+WtxOED\u002fvXHDonw4QFbvS43ZhzhAriAmVxCTOEAFUgAhR544QF2D2up9qThAtLS0tLS0OEAM5o5+6784QGMXaUgiyzhAu0hDElnWOEASeh3cj+E4QGqr96XG7DhAwdzRb\u002f33OEAZDqw5NAM5QHA\u002fhgNrDjlAyHBgzaEZOUAfojqX2CQ5QHfTFGEPMDlAzgTvKkY7OUAlNsn0fEY5QH1no76zUTlA1Jh9iOpcOUAsyldSIWg5QIP7MRxYczlA2ywM5o5+OUAyXuavxYk5QIqPwHn8lDlA4cCaQzOgOUA58nQNaqs5QJAjT9egtjlA6FQpodfBOUA\u002fhgNrDs05QJe33TRF2DlA7ui3\u002fnvjOUBGGpLIsu45QJ1LbJLp+TlA9HxGXCAFOkBMriAmVxA6QKPf+u+NGzpA+xDVucQmOkBSQq+D+zE6QKpziU0yPTpAAaVjF2lIOkBZ1j3hn1M6QLAHGKvWXjpACDnydA1qOkBfasw+RHU6QLebpgh7gDpADs2A0rGLOkBm\u002flqc6JY6QL0vNWYfojpAFGEPMFatOkBskun5jLg6QMPDw8PDwzpAG\u002fWdjfrOOkByJnhXMdo6QMpXUiFo5TpAIYks657wOkB5uga11fs6QNDr4H4MBztAKB27SEMSO0B\u002fTpUSeh07QNd\u002fb9ywKDtALrFJpuczO0CG4iNwHj87QN0T\u002fjlVSjtANEXYA4xVO0CMdrLNwmA7QOOnjJf5aztAO9lmYTB3O0CSCkErZ4I7QOo7G\u002fWdjTtAQW31vtSYO0CZns+IC6Q7QPDPqVJCrztASAGEHHm6O0CfMl7mr8U7QPdjOLDm0DtATpUSeh3cO0CmxuxDVOc7QP33xg2L8jtAVSmh18H9O0CsWnuh+Ag8QAOMVWsvFDxAW70vNWYfPECy7gn\u002fnCo8QAog5MjTNTxAYVG+kgpBPEC5gphcQUw8QBC0ciZ4VzxAaOVM8K5iPEC\u002fFie65W08QBdIAYQceTxAbnnbTVOEPEDGqrUXio88QB3cj+HAmjxAdQ1qq\u002felPEDMPkR1LrE8QCRwHj9lvDxAe6H4CJzHPEDS0tLS0tI8QCoErZwJ3jxAgTWHZkDpPEDZZmEwd\u002fQ8QDCYO\u002fqt\u002fzxAiMkVxOQKPUDf+u+NGxY9QDcsyldSIT1Ajl2kIYksPUDmjn7rvzc9QD3AWLX2Qj1AlfEyfy1OPUDsIg1JZFk9QERU5xKbZD1Am4XB3NFvPUDytpumCHs9QErodXA\u002fhj1AoRlQOnaRPUD5SioErZw9QFB8BM7jpz1AqK3elxqzPUD\u002f3rhhUb49QFcQkyuIyT1ArkFt9b7UPUAGc0e\u002f9d89QF2kIYks6z1AtdX7UmP2PUAMB9YcmgE+QGQ4sObQDD5Au2mKsAcYPkASm2R6PiM+QGrMPkR1Lj5Awf0YDqw5PkAZL\u002fPX4kQ+QHBgzaEZUD5AyJGna1BbPkAfw4E1h2Y+QHf0W\u002f+9cT5AziU2yfR8PkAmVxCTK4g+QH2I6lxikz5A1bnEJpmePkAs657wz6k+QIQceboGtT5A201ThD3APkAzfy1OdMs+QIqwBxir1j5A4eHh4eHhPkA5E7yrGO0+QJBElnVP+D5A6HVwP4YDP0A\u002fp0oJvQ4\u002fQJfYJNPzGT9A7gn\u002fnColP0BGO9lmYTA\u002fQJ1sszCYOz9A9Z2N+s5GP0BMz2fEBVI\u002fQKQAQo48XT9A+zEcWHNoP0BTY\u002fYhqnM\u002fQKqU0Ovgfj9AAsaqtReKP0BZ94R\u002fTpU\u002fQLAoX0mFoD9ACFo5E7yrP0BfixPd8rY\u002fQLe87aYpwj9ADu7HcGDNP0BmH6I6l9g\u002fQL1QfATO4z9AFYJWzgTvP0BsszCYO\u002fo\u002fQGJyBTG5AkBADovylVQIQEC5o9\u002f67w1AQGW8zF+LE0BAEdW5xCYZQEC87aYpwh5AQGgGlI5dJEBAFB+B8\u002fgpQEDAN25YlC9AQGtQW70vNUBAF2lIIss6QEDDgTWHZkBAQG+aIuwBRkBAGrMPUZ1LQEDGy\u002fy1OFFAQHLk6RrUVkBAHv3Wf29cQEDJFcTkCmJAQHUusUmmZ0BAIUeerkFtQEDNX4sT3XJAQHh4eHh4eEBAJJFl3RN+QEDQqVJCr4NAQHvCP6dKiUBAJ9ssDOaOQEDT8xlxgZRAQH8MB9YcmkBAKiX0OrifQEDWPeGfU6VAQIJWzgTvqkBALm+7aYqwQEDZh6jOJbZAQIWglTPBu0BAMbmCmFzBQEDd0W\u002f998ZAQIjqXGKTzEBANANKxy7SQEDgGzcsytdAQIs0JJFl3UBAN00R9gDjQEDjZf5anOhAQI9+67837kBAOpfYJNPzQEDmr8WJbvlAQJLIsu4J\u002f0BAPuGfU6UEQUDp+Yy4QApBQJUSeh3cD0FAQStngncVQUDtQ1TnEhtBQJhcQUyuIEFARHUusUkmQUDwjRsW5StBQJumCHuAMUFAR7\u002f13xs3QUDz1+JEtzxBQJ\u002fwz6lSQkFASgm9Du5HQUD2IapziU1BQKI6l9gkU0FATlOEPcBYQUD5a3GiW15BQKWEXgf3Y0FAUZ1LbJJpQUD9tTjRLW9BQKjOJTbJdEFAVOcSm2R6QUAAAAAAAIBBQA=="},"y":{"dtype":"f8","bdata":"AAAAAAAAAADZUaPdfTXEPrmnslwdTOQ+0kRMTR\u002fv9j4wMaTHeHkEPxm1XG2oEBA\u002fQCFLwtU7Fz9u5JyjkMIfP5HYU7WT1CQ\u002fm67nF\u002fV5Kj+TZI6bymkwP073G6nO8TM\u002fErR4fBvWNz8EP1DsxRc8P9GS8mHxW0A\u002fCFgDVMPbQj9U7pj94otFP3YobWDabEg\u002f4QnsPzN\u002fSz\u002fGd\u002fsRd8NOP3EZqXcXHVE\u002fy0quwfHxUj8uzNZ9juBUP3ZTfXsx6VY\u002fJWzQOR4MWT+QEtnel0lbPyuhRC7hoV0\u002fybP4P54KYD+hpB7b9VFhP87jChoYp2I\u002f5HBkaSUKZD\u002fMHcvrPXtlPw8CgHSB+mY\u002fY47tgQ+IaD\u002fYBA84ByRqP7get1qHzms\u002flq21R66HbT8DCtzwmU9vP\u002fcT8Oozk3A\u002f3RYPfxqGcT91OBz5joByP9\u002fgylqfgnM\u002fbvreX1mMdD+oUMp6yp11P78HOdH\u002ftnY\u002f4y6NOAbYdz8mc0ky6gB5PwL9aui3MXo\u002fSIayKXtqez8lu9xlP6t8P638yakP9H0\u002fm6CVm\u002fZEfz9DZ047\u002f06AP9qPuoOY\u002f4A\u002fJpbp00u0gT\u002fMmjCdHW2CP3URQxMSKoM\u002fNIYOKi3rgz+Fyo6TcrCEP4Ktmr3leYU\u002fbWapz4lHhj9n25CoYRmHPz\u002fyPNxv74c\u002fQhxgsbbJiD+yUR0fOKiJP1W1q8r1ioo\u002fUBz0BPFxiz9HuijIKl2MPwc2V7WjTI0\u002fvG71EVxAjj9gPmnFUziPPwTFRStFGpA\u002flnqTdH+akD\u002f1SLkd2ByRPyN2xFFOoZE\u002f5eltBuEnkj+spdL6jrCSP\u002fAFK7ZWO5M\u002fAwaBhjbIkz\u002fbwWV\u002fLFeUP8xzpng26JQ\u002fDS8BDVJ7lT9YmtmYfBCWP9vw7Tizp5Y\u002fZ5IMyfJAlz9absriN9yXPyiYOtx+eZg\u002fm1anxsMYmT85Ak1tArqZPwYKF1Q2XZo\u002fs3hftloCmz+RV7GFaqmbPxRPjmhgUpw\u002fUeg3uTb9nD9K1XyE56mdP16piohsWJ4\u002f6m3EM78Inz8ogp6j2LqfP00cwNFYN6A\u002ff9PVVSGSoD+HEBbwwe2gP27s5Yc2SqE\u002fi5GI2XqnoT\u002fY76F1igWiP4rFvcBgZKI\u002f+j7b8vjDoj+pcv0WTiSjPzz\u002fwApbhaM\u002fyxL3fRrnoz8JJEbyhkmkPwWn0LqarKQ\u002fkgji+08QpT9fPKKqoHSlP\u002fsq0IyG2aU\u002f+U2DOPs+pj9XyfQT+KSmP1RSUFV2C6c\u002ffTSNAm9ypz+1xk\u002fx2tmnP1+i08ayQag\u002fve\u002fe9+6pqD+\u002fGr\u002fIhxKpPxZET011e6k\u002fj8IIaa\u002fkqT8MCR7PLU6qPzRFoALot6o\u002fRwuwVtUhqz8aY7nu7IurP+aJu74l9qs\u002fT7yci3ZgrD9gW4rr1cqsP2K+ZUY6Na0\u002fogI+1pmfrT9YKden6gmuP1jSPpsidK4\u002fB+FuZDferj9zV\u002f6LHkivP7+x4G\u002fNsa8\u002f+AQaopwNsD8bJQ+KK0KwP7jYXOGNdrA\u002fgHUIBr6qsD88fBVDtt6wPzeUE9FwErE\u002fdam01udFsT8RSGtpFXmxP2NNEY7zq7E\u002fnwWXOXzesT+LyrpRqRCyP6A1ya10QrI\u002f9PVlF9hzsj9SV11LzaSyP\u002fWFfvpN1bI\u002fMZd+ylMFsz\u002fhXORW2DSzPyEG\u002fTHVY7M\u002fV43Z5UOSsz\u002fU71T1HcCzP0koI91c7bM\u002f8eHoFPoZtD+E1lsQ70W0P5nFa0A1cbQ\u002f\u002fe9zFMabtD\u002ft\u002fXT7msW0P90yV2Wt7rQ\u002fPc00xPYWtT+6bKyNcD61P5VUOzwUZbU\u002fm1ufUNuKtT+BVkBTv6+1P5fEoNW507U\u002fSILVc8T2tT+pPwTW2Bi2P6R06LHwObY\u002fHIdezAVatj910vT6EXm2P6Y6giUPl7Y\u002fye\u002fBR\u002feztj8QAvRyxM+2P2hggs9w6rY\u002fPtepnvYDtz8NnyY8UBy3P5cF5B94M7c\u002f0bau32hJtz\u002fvJekwHV63PwmRQeqPcbc\u002fbhVpBbyDtz\u002fjRMugnJS3P5WnRQEtpLc\u002fU5Hek2iytz\u002fPq3rvSr+3PyiTkNbPyrc\u002fJd3ZOPPUtz9y3wA1sd23P76EShoG5bc\u002fn3w7au7qtz97DjjaZu+3P8\u002fTHVVs8rc\u002fFpvW\u002fPvztz9mseMrE\u002fS3PwnO4Hav8rc\u002f19j9rc7vtz\u002f6wW7ebuu3P8+f0FOO5bc\u002fSEaDmSvetz\u002fcifZ7RdW3P4Vf6gnbyrc\u002fDguhleu+tz\u002fZjAK2drG3P9+AsEd8orc\u002fFKIJbvyRtz8\u002fJhyU93+3P+Aohm1ubLc\u002f211D92FXtz8FSGd400C3P90yw4LEKLc\u002fMDN38zYPtz\u002fUdm3zLPS2Pxgxv\u002feo17Y\u002fEHcCwq25tj+zZYBgPpq2PynyUi5eebY\u002f+8xp0xBXtj87yHVEWjO2Pws6usI+DrY\u002fJt7D28LntT++wgRp67+1PxTYVI+9lrU\u002frsRWvj5stT9arMCvdEC1P+GjiGZlE7U\u002fspj0LRfltD9ugI2YkLW0P9Sy9X7YhLQ\u002fPF6i\u002fvVStD8jFnh48B+0PySKSo\u002fP67M\u002fn4M\u002fJpu2sz9VWBVfW4CzP6sQTZgYSbM\u002f2ZA4a9sQsz90Je2prNeyPx\u002flGl2VnbI\u002fPGrJwZ5isj+IefpG0iayP+A7M4s56rE\u002fhcPsWd6ssT+ppuyoym6xPxuLhpUIMLE\u002fR5DHYaLwsD98loxxorCwP0pzhEcTcLA\u002fRTQfgv8usD9fQ9ew49qvPy2GyC3qVq8\u002fMG9aOCjSrj\u002fPhYirs0yuP2D9SHmixq0\u002fbVy+owpArT92flY2ArmsP74f2j6fMaw\u002frjlwxvepqz9+jJjKISKrPxvGIDYzmqo\u002fa8gX2kESqj9BoMJmY4qpP+DLlmStAqk\u002fE3s9LTV7qD\u002fBeqPkD\u002fSnP7qEGXJSbac\u002fP6+IeRHnpj+luL5UYWGmP1Hp1QxW3KU\u002fbEG8UwNYpT\u002fIn919fNSkP62E9HvUUaQ\u002fsAUF1R3Qoz\u002fkdoWgak+jP0s6uIDMz6I\u002fbw86nVRRoj\u002fmI8idE9ShP4oIQaUZWKE\u002fLZDjTHbdoD\u002fxec6fOGSgPx5Jhy3e2J8\u002fOcBiKE\u002fsnj\u002fXkgjB3gKeP4\u002fah02mHJ0\u002fVoX44r05nD\u002fNsutPPFqbP1rOfBc3fpo\u002fqk4GbcKlmT+dlHww8dCYP4jxcOvU\u002f5c\u002fEWi+zn0ylz9sQ+Gw+miWP7kn+gxZo5U\u002fQcN8AqXhlD\u002fTy4lV6SOUPx14828vapM\u002f6yXrYn+0kj9UY1bp3wKSP\u002fgTyWpWVZE\u002fE\u002fEh\u002f+arkD85KsZylAaQP47r8JbAyo4\u002fI9mOm5WQjT9PNh0Gpl6MP+qMCoDtNIs\u002fffGqV2UTij98D2uPBPqIP6fL++2\u002f6Ic\u002fkm1pD4rfhj\u002fOmRB3U96FPxXNYqIK5YQ\u002fw3lrHJzzgz8gbAaS8gmDP6Ont+b2J4I\u002fWI8USpBNgT\u002fu2K1NpHqAP2oR0\u002fYtXn8\u002flQV42JXVfT+nOl6+Qlt8PyIdTKH07no\u002fBiWaI2mQeT9WaUfAWz94P1eYIfqF+3Y\u002fe9Xeip\u002fEdT+iggiSXpp0Pz6elsN3fHM\u002fOiMclp5qcj+1uGVwhWRxPw38bNbdaXA\u002flpIHK7H0bj94MDjfSyttP1mdJIvrdms\u002fL5TCgO\u002fWaT8asFHytkpoP1m74T+h0WY\u002f7A0qQg5rZT9G\u002fYySXhZkPwbGJdDz0mI\u002fZNTC4TCgYT\u002fN27E0en1gP\u002fqIjfBr1F4\u002fLyYUrJjLXD9zGv5MT99aP\u002fPx6kRpDlk\u002fU9a8IcVXVz8GQD7iRrpVP52mwEPYNFQ\u002fZeK3CGnGUj\u002fKilw4721RP6f9ZVdnKlA\u002fvbnlM6n1TT9UV3kdgrxLP3CJcYd7p0k\u002fXkGcyMW0Rz8QmZiin+JFP5f4qGVWL0Q\u002foqrTCEaZQj8HsMM22R5BP8fmxJ8SfT8\u002fsApSxLztPD80flku3ow6P0Qq3zHBVzg\u002fZ\u002fj\u002f28xLNj+RJO6ahGY0P+5+y9aHpTI\u002fwYaFfJEGMT8wfrD37g4vP\u002flIOHNUTCw\u002fZaED72fBKT9EObVkcGonPwc\u002fEvDlQyU\u002fA3NdbHBKIz9aNEkF5nohP\u002f+FG3uTpB8\u002fNRo\u002f2pObHD8oX9xxfdUZP9tzAAxRTRc\u002fY5VT01z+FD+bJwoxOeQSP1ajd6vF+hA\u002fPzdgkEt8Dj9R4OToe1ULP5X9w+xgegg\u002fK9jF0rTkBT++rHCPoY4DP3SOoAa7cgE\u002f4+3YvfIX\u002fz4fCMzzZqv7PqKYviczl\u002fg+RMQFG2DT9T7aqVvClFjzPiqSRYsMIPE+\u002fUZh\u002fRtH7j7c7U+Fw7rqPl0\u002f3PiTkOc+qlZpJ\u002fS+5D6x90uuHT3iPmH78gMOA+A+1n9eh\u002fAS3D4fJ6lvb5PYPt61Xj6Ge9U+2BxBVEHA0j6icDVWtVfQPi5y2dbTccw+2buInIu3yD4WvUtJ+HHFPv8XHCj2k8I+carICbcRwD6bH6UhSMG7PrrB+FCD7rc+WNNzGSuatD6gGhORHbWxPtZlIUG+Y64+yI8Id+MIqj4cSVDQXkSmPtYPtsdPA6M+uco2ZQI1oD5VUD2ka5WbPlZ2tgjQbpc+UPoETUzfkz4VKgrLwtKQPnzvzkIfb4w+kuJL8oP8hz48g4xzuDKEPmYN6jg1+oA+LxdgXP58fD5XUmd\u002fltt3PnOI0kZX8XM+N97TCIyjcD7KqbwBR7ZrPjgxw9V1CGc+Vt3frmwbYz56MKmyk6NfPi4zYoe\u002fJFo+dLaHcUyPVT7mr4Sxeb5RPvE7S+rzJU0+SCnQH2XkRz7DW8c5JotDPgdYbR0L6D8+asx07IL9OT56l9TzVSA1PtIrC5fMIjE+NTdzgxW9Kz4x6J7h5WYmPlsZ9o1iDSI+3DGLKaYHHT7Rlej6DUoXPtY46lZGpBI+yKm3TnPGDT6k768kb7kHPtzqOqL62wI+9VxryuDp\u002fT2jNebE56r3PcStFGdervI9Hr6MvmVr7T1vaJut6hvnPcLkAu6QG+I9mom9K6lO3D0jk5yHHhLWPWXToGE4KtE97fVjW5Whyj2f7GToIZvEPZUET\u002f8rzr89yQcZ9U17uD36YvkFb8uyPShFANnZx6w9CV0lOx\u002f6pT04vcpVfLygPf3akX23a5k9zK3CoKZAkz1+eht4rRSNPZoFdnm\u002f5oU9ARHkPJVygD13HguGD6J4PSDWLD2NZHI9OS6sC\u002fliaz2+XXuZQ1RkPWZiomVVF149bGiENSM0Vj1luGEVh1VQPV\u002fUwwN+9Uc9XcbZ13eEQT2hExY+NIk5PfRvS1XWjTI9e8Jo1HngKj2W0kxXgmcjPc4RP\u002fKt7Rs95\u002fMl33wIFD3EYtwINaUMPet20I1+aQQ9aimYlUP+\u002fDxZWWa+fIX0PDdDlFeH8+w8Hp2XuBBa5DwkP7QfnoPcPIJBTyS259M84Vqf5UyxyzxxxpoM2THDPDm1Lhlvg7o8kvwvArA+sjzEJt29nASpPOTLedrjFqE8v+\u002fb\u002f4xClzw3c+oTF4qPPEimIMBBTYU8EScKGw6qfDwMA+grDjZzPOGpGk6Ppmk8hfcVFI4OYTybSBLVKphWPIuOwcRJz008rfRH+8OVQzxeGQMsM6E5PGSlfQVtszA8SZRtsMKsJTxn8\u002f\u002flHAMcPAktIBRJBhI8yFjSpcsYBzxxLcXgDXj9O7P19jy9t\u002fI7vQ82TGSs5zvBkhFM+c7dO8UHmxXQrtI7mZgZ3VVQxzsSLUDqz\u002fW8OxNhS5CI57E7WmPWHjMJpjun04SCc\u002f6aO2gFBJSpdJA7qOkWoq33gzsA0iDOvRx4O5CwEvfn+Ww7uKClgU9TYTs\u002fcVa2uZ1UO+X7wWPZaEg78jclIXbBPDtcUHo2FtowO8Dr+r2JpiM7R2t1marLFjt+iY+7XE4KOznSKWiTMv460iFTzYY98Tq0OowwiJTjOvyJS74QHtY6Z0EXf+LYyDq7iA93oMK7Ot1s\u002fCO11646fOpwrJ8JoTo4C9qRg7eSOnS9BCa+cYQ6o3xb4d8zdjpBVcaE3PhnOqhocBgcu1k6r4iDRJJ0Szr9bWfK2x49OlEpBJdhsy464GVwS8AVIDrJTh+UWsAQOmZTMWFkVgE6F3d8GADV8TleF7JNpDniOcQ82r4wgtI5IlVU3wCtwjl+a3oW+7iyOTCP8PKbpaI5VN0uu\u002fxykjl5EDL11CGCOe959rd2s3E5h0ZX1sUpYTkmw5swKodQOSxwaGn7nD85Ckahku0FLjnEWrIUIFAcOf2Girbcggo5KyAYx4yl+DiCUC4Uhb\u002fmOAG+1OzU19Q4fhiMBBr1wjjLku+9Wh2xOHc2mgTQq544VVzov45GizgivFlySxJ4OMZMHMKkFGU4lzxjQIRRUjhOmMIbZZY\u002fOObItsXuBCs4yHhg1oXtFjhW7Xh1u0wDOK27Szo5HfA3ggrgo1aw2jeGSlkKUevFN9u1l18o2rE3XrV8SNzVnDeQAvMlMxeHNx5\u002fAHcSVXI328oMF6nbXDfg50ohF4RGN44MRRvXaTE3Ze7gZiKyGjeqsyJzvUcEN9iB\u002fEb0iO423iaT0kDH1jagYtYyB9bANj7WvdNGqKg26njJ6CHjkTYnMrNyC7V5NkAsAiQTTGI2XrYu\u002fMfLSTbcOhxbBwIyNlm5diKC5Rg2FbB6uFUKATZS\u002f+zQKBjnNStj6vol\u002fM41Uo1j5D6TtDUHXlvOzAubNdsG49C9l4E1RYzPpCemZjVGwTkvOtpMNd3rXwHMLjI1l07EITOsFjX0yyaPYff7NAIDy6dyD+E0qZVPrxGWxDS9yyjPzZCoND35Yl2b\u002fIw07yCgpbDocDSlv3mKsYBTNENrVrJ1PDY0FVxsaCUPGTTscPIXHen7Mx+B7NZUuN4z9zLhWn+0wDPjC3CkK\u002fOhM7PW+1XPDYMzfmqzqZX6YzOfrJj+wbBEMwuYP8Y1KSUzqJ3nguReBTN5i0DAK0\u002flMrJdaNkG+sQysPwPOxlipDJ+LWlajYyDMuLGkm\u002fKgGIyfoXZtQZIQTKnGoovftkfMlebScc+9PwxGSN1YM722THIIRvArva2MaCSyoxlB5Qx9z4kFbQ5cTFed5dmHzZNMfEDpaG8aigxQ0CScegdBDH\u002fHKgMllXgMCNGEVSWI7owxBxrn0qblDBUytke\u002fgBwMCiRKW5nfEgwHm4ra9ZyIjBC7b18KGD7L8oGrc+k\u002f9MvrC9WI\u002fDDrC8wKOaEE12EL\u002fRsIwE9YFwvgfm7QIl0My8SIYuwsT8KL1yOl5SCa+EueaHv9yy+ti54znKTqTONLrI4bZpib2IueiaAQILiNi58bspLOO0LLnxuHHt+v+AtMyQGQMK9sy3UPb+0NN2GLe2zAjb7A1ot+j5gEZoTLS0aKsOInOr\u002fLF1\u002fDJdjM9Eslu9IndMzoix9OJ1Fn+hyLP+JGipAR0Msg7qprahJEywrfkx95O7iK4p+7sVCO7IrNTpPJgI4gSuwwV2rDeVPK9Yd+NJl9hwrAwuR9QjI6SoEOEVoR362KjXavUcVO4MqKMi7v9QbUCqqTxwQmG8aKkoGyDC6PuUpfMiJxfO3sCkK1zP148J5KXJrl4p8bUMp7IJBgVmtDCmf+ef6nrXUKGkd9HbpQp0olHoz5Ss4ZCjG5G8oRVMrKMsVZGBrDfIn7ejpaORQtydiBYYYRW59JzmFDvc0JkInYB2s5QneBSf3mzQErrvJJse9beIDko0m93U0+kGWUCYYiePYuykSJvHg+hilaNMldfM6tSI8lCWnNq4A9JNUJb1MDv98aBQlWneFM9a70yQJ2OhTrpmSJC2Km\u002ff8FVEk3k5oD3OVDiRT+Q7a56nKI5I1LxqHo4Yjdc0sYgG3QiPPBfhvlx7+IrRZ881BlrciWh7ke7D4cSJwJvLLYqMqInvWxb\u002fcMuMhbnFNzq3nmiG\u002fFbbS8lJSIYMUJ0kKQQghzb2dQgwwvyC6p3n+kHlzICR+YQSvnScgY5lBIpbM2x\u002fuloQrxcGPHwAoZuQ\u002fmUEfiDzDNT7r8h7XKfsku7ijHhlYJgr37VMegTZdU66EAx739x8WQYWyHeSPrfmfBWEdWPAXkFtMDh1dZRSaZhq6HKh5qK+Tw2UcX50f41uOERw4CW4I\u002fmS7Gy4bEid9qmQb9pK8obAjDhuJzo0\u002f3jy1GuIyM2Pv6VwaSlVtGPsBAxpfIU1\u002fmCCoGTA4Jv\u002fajk0Z78OOBwB48RgRJcCqWeqTGNCVjqdm5DUYjz3nAkMy1xddzJPz3K53Fw0up\u002fKrShcXvf+ywNEOthZQTHSkyRtUFtFLT6rko\u002fEVi9avHL7FjRWs3wbxCSkoFUcrhOrh2MIUCC0lO8RBXBQ2Z8JIFln0E4Qw3h8mJIwT8jJ7twOuIhMiHnpq1cu3Euf2ZPD3E00SN7RpaggJ4RH7034LyiFzEXZlFSlklgQRsCf1NOg3lRAtEQFU9u8kEHQYU0LGxbMPt+sWSwzdQQ\u002fLuM5t3N3ODs3Ck03ofVkOd01G+t0d5A1RXi5LWFNuDfUxEGzJ0vUMlMXA9Oj5fQw2rTp3u6MDDEOrkOQeiogLoGUpc8k5DQsaEKmSxJSQClBEshL26hEK0FLIEnVukglWYEMPXgoSCYBFy2dOy5AIeM9oU6y5DQjv3ea7Wf+IBw=="},"type":"scatter","xaxis":"x","yaxis":"y"},{"hovertemplate":"t=%{x:.1f}  S=%{y:.3f}","line":{"color":"#27ae60","width":3},"name":"S(t)  limbo","x":{"dtype":"f8","bdata":"AAAAAAAAAADwrmK0k22mP\u002fCuYrSTbbY\u002fNANKxy7SwD\u002fwrmK0k23GP6xae6H4CMw\u002fNANKxy7S0D8SWdY94Z\u002fTP\u002fCuYrSTbdY\u002fzgTvKkY72T+sWnuh+AjcP4qwBxir1t4\u002fNANKxy7S4D8jLpACCDniPxJZ1j3hn+M\u002fAYQceboG5T\u002fwrmK0k23mP9\u002fZqO9s1Oc\u002fzgTvKkY76T+9LzVmH6LqP6xae6H4COw\u002fm4XB3NFv7T+KsAcYq9buP7ztpinCHvA\u002fNANKxy7S8D+sGO1km4XxPyMukAIIOfI\u002fmkMzoHTs8j8SWdY94Z\u002fzP4puedtNU\u002fQ\u002fAYQceboG9T94mb8WJ7r1P\u002fCuYrSTbfY\u002faMQFUgAh9z\u002ff2ajvbNT3P1bvS43Zh\u002fg\u002fzgTvKkY7+T9GGpLIsu75P70vNWYfovo\u002fNEXYA4xV+z+sWnuh+Aj8PyRwHj9lvPw\u002fm4XB3NFv\u002fT8Sm2R6PiP+P4qwBxir1v4\u002fAsaqtReK\u002fz+87aYpwh4AQHh4eHh4eABANANKxy7SAEDwjRsW5SsBQKwY7WSbhQFAZ6O+s1HfAUAjLpACCDkCQN+4YVG+kgJAmkMzoHTsAkBWzgTvKkYDQBJZ1j3hnwNAzuOnjJf5A0CKbnnbTVMEQEX5SioErQRAAYQceboGBUC9Du7HcGAFQHiZvxYnugVANCSRZd0TBkDwrmK0k20GQKw5NANKxwZAaMQFUgAhB0AjT9egtnoHQN\u002fZqO9s1AdAm2R6PiMuCEBW70uN2YcIQBJ6HdyP4QhAzgTvKkY7CUCKj8B5\u002fJQJQEYaksiy7glAAaVjF2lICkC9LzVmH6IKQHm6BrXV+wpANEXYA4xVC0Dwz6lSQq8LQKxae6H4CAxAaOVM8K5iDEAkcB4\u002fZbwMQN\u002f6740bFg1Am4XB3NFvDUBXEJMriMkNQBKbZHo+Iw5AziU2yfR8DkCKsAcYq9YOQEY72WZhMA9AAsaqtReKD0C9UHwEzuMPQLztpinCHhBAGrMPUZ1LEEB4eHh4eHgQQNY94Z9TpRBANANKxy7SEECSyLLuCf8QQPCNGxblKxFATlOEPcBYEUCsGO1km4URQAneVYx2shFAZ6O+s1HfEUDFaCfbLAwSQCMukAIIORJAgfP4KeNlEkDfuGFRvpISQD1+yniZvxJAmkMzoHTsEkD4CJzHTxkTQFbOBO8qRhNAtJNtFgZzE0ASWdY94Z8TQHAeP2W8zBNAzuOnjJf5E0AsqRC0ciYUQIpuedtNUxRA5zPiAimAFEBF+UoqBK0UQKO+s1Hf2RRAAYQceboGFUBfSYWglTMVQL0O7sdwYBVAG9RW70uNFUB4mb8WJ7oVQNZeKD4C5xVANCSRZd0TFkCS6fmMuEAWQPCuYrSTbRZATnTL226aFkCsOTQDSscWQAr\u002fnCol9BZAaMQFUgAhF0DFiW55200XQCNP16C2ehdAgRRAyJGnF0Df2ajvbNQXQD2fERdIARhAm2R6PiMuGED5KeNl\u002floYQFbvS43ZhxhAtLS0tLS0GEASeh3cj+EYQHA\u002fhgNrDhlAzgTvKkY7GUAsyldSIWgZQIqPwHn8lBlA6FQpodfBGUBGGpLIsu4ZQKPf+u+NGxpAAaVjF2lIGkBfasw+RHUaQL0vNWYfohpAG\u002fWdjfrOGkB5uga11fsaQNd\u002fb9ywKBtANEXYA4xVG0CSCkErZ4IbQPDPqVJCrxtATpUSeh3cG0CsWnuh+AgcQAog5MjTNRxAaOVM8K5iHEDGqrUXio8cQCRwHj9lvBxAgTWHZkDpHEDf+u+NGxYdQD3AWLX2Qh1Am4XB3NFvHUD5SioErZwdQFcQkyuIyR1AtdX7UmP2HUASm2R6PiMeQHBgzaEZUB5AziU2yfR8HkAs657wz6keQIqwBxir1h5A6HVwP4YDH0BGO9lmYTAfQKQAQo48XR9AAsaqtReKH0BfixPd8rYfQL1QfATO4x9ADovylVQIIEC87aYpwh4gQGtQW70vNSBAGrMPUZ1LIEDJFcTkCmIgQHh4eHh4eCBAJ9ssDOaOIEDWPeGfU6UgQIWglTPBuyBANANKxy7SIEDjZf5anOggQJLIsu4J\u002fyBAQStngncVIUDwjRsW5SshQJ\u002fwz6lSQiFATlOEPcBYIUD9tTjRLW8hQKwY7WSbhSFAWnuh+AicIUAJ3lWMdrIhQLhACiDkyCFAZ6O+s1HfIUAWBnNHv\u002fUhQMVoJ9ssDCJAdMvbbpoiIkAjLpACCDkiQNKQRJZ1TyJAgfP4KeNlIkAwVq29UHwiQN+4YVG+kiJAjhsW5SupIkA9fsp4mb8iQOzgfgwH1iJAmkMzoHTsIkBJpucz4gIjQPgInMdPGSNAp2tQW70vI0BWzgTvKkYjQAUxuYKYXCNAtJNtFgZzI0Bj9iGqc4kjQBJZ1j3hnyNAwbuK0U62I0BwHj9lvMwjQB+B8\u002fgp4yNAzuOnjJf5I0B9RlwgBRAkQCypELRyJiRA2wvFR+A8JECKbnnbTVMkQDjRLW+7aSRA5zPiAimAJECWlpaWlpYkQEX5SioErSRA9Fv\u002fvXHDJECjvrNR39kkQFIhaOVM8CRAAYQceboGJUCw5tAMKB0lQF9JhaCVMyVADqw5NANKJUC9Du7HcGAlQGxxolvediVAG9RW70uNJUDKNguDuaMlQHiZvxYnuiVAJ\u002fxzqpTQJUDWXig+AuclQIXB3NFv\u002fSVANCSRZd0TJkDjhkX5SiomQJLp+Yy4QCZAQUyuICZXJkDwrmK0k20mQJ8RF0gBhCZATnTL226aJkD91n9v3LAmQKw5NANKxyZAW5zolrfdJkAK\u002f5wqJfQmQLlhUb6SCidAaMQFUgAhJ0AWJ7rlbTcnQMWJbnnbTSdAdOwiDUlkJ0AjT9egtnonQNKxizQkkSdAgRRAyJGnJ0Awd\u002fRb\u002f70nQN\u002fZqO9s1CdAjjxdg9rqJ0A9nxEXSAEoQOwBxqq1FyhAm2R6PiMuKEBKxy7SkEQoQPkp42X+WihAqIyX+WtxKEBW70uN2YcoQAVSACFHnihAtLS0tLS0KEBjF2lIIssoQBJ6HdyP4ShAwdzRb\u002f33KEBwP4YDaw4pQB+iOpfYJClAzgTvKkY7KUB9Z6O+s1EpQCzKV1IhaClA2ywM5o5+KUCKj8B5\u002fJQpQDnydA1qqylA6FQpodfBKUCXt900RdgpQEYaksiy7ilA9HxGXCAFKkCj3\u002frvjRsqQFJCr4P7MSpAAaVjF2lIKkCwBxir1l4qQF9qzD5EdSpADs2A0rGLKkC9LzVmH6IqQGyS6fmMuCpAG\u002fWdjfrOKkDKV1IhaOUqQHm6BrXV+ypAKB27SEMSK0DXf2\u002fcsCgrQIbiI3AePytANEXYA4xVK0Djp4yX+WsrQJIKQStngitAQW31vtSYK0Dwz6lSQq8rQJ8yXuavxStATpUSeh3cK0D998YNi\u002fIrQKxae6H4CCxAW70vNWYfLEAKIOTI0zUsQLmCmFxBTCxAaOVM8K5iLEAXSAGEHHksQMaqtReKjyxAdQ1qq\u002felLEAkcB4\u002fZbwsQNLS0tLS0ixAgTWHZkDpLEAwmDv6rf8sQN\u002f6740bFi1Ajl2kIYksLUA9wFi19kItQOwiDUlkWS1Am4XB3NFvLUBK6HVwP4YtQPlKKgStnC1AqK3elxqzLUBXEJMriMktQAZzR7\u002f13y1AtdX7UmP2LUBkOLDm0AwuQBKbZHo+Iy5Awf0YDqw5LkBwYM2hGVAuQB\u002fDgTWHZi5AziU2yfR8LkB9iOpcYpMuQCzrnvDPqS5A201ThD3ALkCKsAcYq9YuQDkTvKsY7S5A6HVwP4YDL0CX2CTT8xkvQEY72WZhMC9A9Z2N+s5GL0CkAEKOPF0vQFNj9iGqcy9AAsaqtReKL0CwKF9JhaAvQF+LE93yti9ADu7HcGDNL0C9UHwEzuMvQGyzMJg7+i9ADovylVQIMEBlvMxfixMwQLztpinCHjBAFB+B8\u002fgpMEBrUFu9LzUwQMOBNYdmQDBAGrMPUZ1LMEBy5Oka1FYwQMkVxOQKYjBAIUeerkFtMEB4eHh4eHgwQNCpUkKvgzBAJ9ssDOaOMEB\u002fDAfWHJowQNY94Z9TpTBALm+7aYqwMECFoJUzwbswQN3Rb\u002f33xjBANANKxy7SMECLNCSRZd0wQONl\u002flqc6DBAOpfYJNPzMECSyLLuCf8wQOn5jLhACjFAQStngncVMUCYXEFMriAxQPCNGxblKzFAR7\u002f13xs3MUCf8M+pUkIxQPYhqnOJTTFATlOEPcBYMUClhF4H92MxQP21ONEtbzFAVOcSm2R6MUCsGO1km4UxQANKxy7SkDFAWnuh+AicMUCyrHvCP6cxQAneVYx2sjFAYQ8wVq29MUC4QAog5MgxQBBy5Oka1DFAZ6O+s1HfMUC\u002f1Jh9iOoxQBYGc0e\u002f9TFAbjdNEfYAMkDFaCfbLAwyQB2aAaVjFzJAdMvbbpoiMkDM\u002fLU40S0yQCMukAIIOTJAel9qzD5EMkDSkESWdU8yQCnCHmCsWjJAgfP4KeNlMkDYJNPzGXEyQDBWrb1QfDJAh4eHh4eHMkDfuGFRvpIyQDbqOxv1nTJAjhsW5SupMkDlTPCuYrQyQD1+yniZvzJAlK+kQtDKMkDs4H4MB9YyQEMSWdY94TJAmkMzoHTsMkDydA1qq\u002fcyQEmm5zPiAjNAodfB\u002fRgOM0D4CJzHTxkzQFA6dpGGJDNAp2tQW70vM0D\u002fnCol9DozQFbOBO8qRjNArv\u002feuGFRM0AFMbmCmFwzQF1ik0zPZzNAtJNtFgZzM0AMxUfgPH4zQGP2IapziTNAuyf8c6qUM0ASWdY94Z8zQGmKsAcYqzNAwbuK0U62M0AY7WSbhcEzQHAeP2W8zDNAx08ZL\u002fPXM0AfgfP4KeMzQHayzcJg7jNAzuOnjJf5M0AlFYJWzgQ0QH1GXCAFEDRA1Hc26jsbNEAsqRC0ciY0QIPa6n2pMTRA2wvFR+A8NEAyPZ8RF0g0QIpuedtNUzRA4Z9TpYReNEA40S1vu2k0QJACCDnydDRA5zPiAimANEA\u002fZbzMX4s0QJaWlpaWljRA7sdwYM2hNEBF+UoqBK00QJ0qJfQ6uDRA9Fv\u002fvXHDNEBMjdmHqM40QKO+s1Hf2TRA+++NGxblNEBSIWjlTPA0QKpSQq+D+zRAAYQceboGNUBYtfZC8RE1QLDm0AwoHTVABxir1l4oNUBfSYWglTM1QLZ6X2rMPjVADqw5NANKNUBl3RP+OVU1QL0O7sdwYDVAFEDIkadrNUBscaJb3nY1QMOifCUVgjVAG9RW70uNNUByBTG5gpg1QMo2C4O5ozVAIWjlTPCuNUB4mb8WJ7o1QNDKmeBdxTVAJ\u002fxzqpTQNUB\u002fLU50y9s1QNZeKD4C5zVALpACCDnyNUCFwdzRb\u002f01QN3ytpumCDZANCSRZd0TNkCMVWsvFB82QOOGRflKKjZAO7gfw4E1NkCS6fmMuEA2QOoa1FbvSzZAQUyuICZXNkCZfYjqXGI2QPCuYrSTbTZAR+A8fsp4NkCfERdIAYQ2QPZC8RE4jzZATnTL226aNkClpaWlpaU2QP3Wf2\u002fcsDZAVAhaORO8NkCsOTQDSsc2QANrDs2A0jZAW5zolrfdNkCyzcJg7ug2QAr\u002fnCol9DZAYTB39Fv\u002fNkC5YVG+kgo3QBCTK4jJFTdAaMQFUgAhN0C\u002f9d8bNyw3QBYnuuVtNzdAbliUr6RCN0DFiW552003QB27SEMSWTdAdOwiDUlkN0DMHf3Wf283QCNP16C2ejdAe4Cxau2FN0DSsYs0JJE3QCrjZf5anDdAgRRAyJGnN0DZRRqSyLI3QDB39Fv\u002fvTdAiKjOJTbJN0Df2ajvbNQ3QDYLg7mj3zdAjjxdg9rqN0DlbTdNEfY3QD2fERdIAThAlNDr4H4MOEDsAcaqtRc4QEMzoHTsIjhAm2R6PiMuOEDylVQIWjk4QErHLtKQRDhAofgInMdPOED5KeNl\u002flo4QFBbvS81ZjhAqIyX+WtxOED\u002fvXHDonw4QFbvS43ZhzhAriAmVxCTOEAFUgAhR544QF2D2up9qThAtLS0tLS0OEAM5o5+6784QGMXaUgiyzhAu0hDElnWOEASeh3cj+E4QGqr96XG7DhAwdzRb\u002f33OEAZDqw5NAM5QHA\u002fhgNrDjlAyHBgzaEZOUAfojqX2CQ5QHfTFGEPMDlAzgTvKkY7OUAlNsn0fEY5QH1no76zUTlA1Jh9iOpcOUAsyldSIWg5QIP7MRxYczlA2ywM5o5+OUAyXuavxYk5QIqPwHn8lDlA4cCaQzOgOUA58nQNaqs5QJAjT9egtjlA6FQpodfBOUA\u002fhgNrDs05QJe33TRF2DlA7ui3\u002fnvjOUBGGpLIsu45QJ1LbJLp+TlA9HxGXCAFOkBMriAmVxA6QKPf+u+NGzpA+xDVucQmOkBSQq+D+zE6QKpziU0yPTpAAaVjF2lIOkBZ1j3hn1M6QLAHGKvWXjpACDnydA1qOkBfasw+RHU6QLebpgh7gDpADs2A0rGLOkBm\u002flqc6JY6QL0vNWYfojpAFGEPMFatOkBskun5jLg6QMPDw8PDwzpAG\u002fWdjfrOOkByJnhXMdo6QMpXUiFo5TpAIYks657wOkB5uga11fs6QNDr4H4MBztAKB27SEMSO0B\u002fTpUSeh07QNd\u002fb9ywKDtALrFJpuczO0CG4iNwHj87QN0T\u002fjlVSjtANEXYA4xVO0CMdrLNwmA7QOOnjJf5aztAO9lmYTB3O0CSCkErZ4I7QOo7G\u002fWdjTtAQW31vtSYO0CZns+IC6Q7QPDPqVJCrztASAGEHHm6O0CfMl7mr8U7QPdjOLDm0DtATpUSeh3cO0CmxuxDVOc7QP33xg2L8jtAVSmh18H9O0CsWnuh+Ag8QAOMVWsvFDxAW70vNWYfPECy7gn\u002fnCo8QAog5MjTNTxAYVG+kgpBPEC5gphcQUw8QBC0ciZ4VzxAaOVM8K5iPEC\u002fFie65W08QBdIAYQceTxAbnnbTVOEPEDGqrUXio88QB3cj+HAmjxAdQ1qq\u002felPEDMPkR1LrE8QCRwHj9lvDxAe6H4CJzHPEDS0tLS0tI8QCoErZwJ3jxAgTWHZkDpPEDZZmEwd\u002fQ8QDCYO\u002fqt\u002fzxAiMkVxOQKPUDf+u+NGxY9QDcsyldSIT1Ajl2kIYksPUDmjn7rvzc9QD3AWLX2Qj1AlfEyfy1OPUDsIg1JZFk9QERU5xKbZD1Am4XB3NFvPUDytpumCHs9QErodXA\u002fhj1AoRlQOnaRPUD5SioErZw9QFB8BM7jpz1AqK3elxqzPUD\u002f3rhhUb49QFcQkyuIyT1ArkFt9b7UPUAGc0e\u002f9d89QF2kIYks6z1AtdX7UmP2PUAMB9YcmgE+QGQ4sObQDD5Au2mKsAcYPkASm2R6PiM+QGrMPkR1Lj5Awf0YDqw5PkAZL\u002fPX4kQ+QHBgzaEZUD5AyJGna1BbPkAfw4E1h2Y+QHf0W\u002f+9cT5AziU2yfR8PkAmVxCTK4g+QH2I6lxikz5A1bnEJpmePkAs657wz6k+QIQceboGtT5A201ThD3APkAzfy1OdMs+QIqwBxir1j5A4eHh4eHhPkA5E7yrGO0+QJBElnVP+D5A6HVwP4YDP0A\u002fp0oJvQ4\u002fQJfYJNPzGT9A7gn\u002fnColP0BGO9lmYTA\u002fQJ1sszCYOz9A9Z2N+s5GP0BMz2fEBVI\u002fQKQAQo48XT9A+zEcWHNoP0BTY\u002fYhqnM\u002fQKqU0Ovgfj9AAsaqtReKP0BZ94R\u002fTpU\u002fQLAoX0mFoD9ACFo5E7yrP0BfixPd8rY\u002fQLe87aYpwj9ADu7HcGDNP0BmH6I6l9g\u002fQL1QfATO4z9AFYJWzgTvP0BsszCYO\u002fo\u002fQGJyBTG5AkBADovylVQIQEC5o9\u002f67w1AQGW8zF+LE0BAEdW5xCYZQEC87aYpwh5AQGgGlI5dJEBAFB+B8\u002fgpQEDAN25YlC9AQGtQW70vNUBAF2lIIss6QEDDgTWHZkBAQG+aIuwBRkBAGrMPUZ1LQEDGy\u002fy1OFFAQHLk6RrUVkBAHv3Wf29cQEDJFcTkCmJAQHUusUmmZ0BAIUeerkFtQEDNX4sT3XJAQHh4eHh4eEBAJJFl3RN+QEDQqVJCr4NAQHvCP6dKiUBAJ9ssDOaOQEDT8xlxgZRAQH8MB9YcmkBAKiX0OrifQEDWPeGfU6VAQIJWzgTvqkBALm+7aYqwQEDZh6jOJbZAQIWglTPBu0BAMbmCmFzBQEDd0W\u002f998ZAQIjqXGKTzEBANANKxy7SQEDgGzcsytdAQIs0JJFl3UBAN00R9gDjQEDjZf5anOhAQI9+67837kBAOpfYJNPzQEDmr8WJbvlAQJLIsu4J\u002f0BAPuGfU6UEQUDp+Yy4QApBQJUSeh3cD0FAQStngncVQUDtQ1TnEhtBQJhcQUyuIEFARHUusUkmQUDwjRsW5StBQJumCHuAMUFAR7\u002f13xs3QUDz1+JEtzxBQJ\u002fwz6lSQkFASgm9Du5HQUD2IapziU1BQKI6l9gkU0FATlOEPcBYQUD5a3GiW15BQKWEXgf3Y0FAUZ1LbJJpQUD9tTjRLW9BQKjOJTbJdEFAVOcSm2R6QUAAAAAAAIBBQA=="},"y":{"dtype":"f8","bdata":"AAAAAAAA8D+HmgnE8P\u002fvP1rJK8bC\u002f+8\u002f3HzMcXX\u002f7z85mQgxCP\u002fvPyu1tWx6\u002fu8\u002fLAJkjMv97z83X2D2+vzvPyuXtg8I\u002fO8\u002f7MszPPL67z95D2neuPnvP\u002forrldb+O8\u002fG5wkCNn27z+3tLpOMfXvPykBL4lj8+8\u002fVdMTFG\u002fx7z++CNNKU+\u002fvP8oFsocP7e8\u002fhOjVI6Pq7z8S9Ed3DejvPxo2+thN5e8\u002fcmfMnmPi7z9FCZEdTt\u002fvPxPAEqkM3O8\u002fvO0ZlJ7Y7z\u002f4i3IwA9XvP4dI8s450e8\u002fWuR+v0HN7z8i1xRRGsnvP3o4ztHCxO8\u002fHPDpjjrA7z9fLtPUgLvvP14uKe+Utu8\u002fIEPHKHax7z8GMc3LI6zvP+rUpyGdpu8\u002fLhoac+Gg7z8bQUYI8JrvP9t2tyjIlO8\u002fY8BrG2mO7z+TOd4m0ofvP96pEZECge8\u002fwm+bn\u002fl57z9SxK6XtnLvPxlYKL44a+8\u002fjkqaV39j7z9bfVioiVvvP6ZEhfRWU+8\u002fiHUegOZK7z\u002fs0wqPN0LvP+XgJ2VJOe8\u002frApYRhsw7z9JP5F2rCbvPwrj6zn8HO8\u002ftyuy1AkT7z+X4W+L1AjvPyWHAqNb\u002fu4\u002fcOipYJ7z7j\u002f0EhkKnOjuP9G2h+VT3e4\u002fGvLDOcXR7j\u002f4hkRO78XuP1t9O2vRue4\u002fyDCp2Wqt7j\u002fdym\u002fjuqDuPw8rZ9PAk+4\u002fCzxx9XuG7j8it46W63juPwZW9AQPa+4\u002fHnMgkOVc7j+NGPGIbk7uPwh+ukGpP+4\u002ffPVdDpUw7j9lRmFEMSHuP6p3Bjt9Ee4\u002fwAdkS3gB7j+pkn3QIfHtP2nlXCd54O0\u002fSH4rr33P7T9GeUzJLr7tP\u002fbndtmLrO0\u002fxpPQRZSa7T\u002fLKQl3R4jtP9TOddikde0\u002fjRot2Kti7T9FeCPnW0\u002ftP9jrR3m0O+0\u002fAjmhBbUn7T9ga2sGXRPtPxa9Nfmr\u002fuw\u002fCdoAX6Hp7D93fV28PNTsP2Jni5l9vuw\u002fYaeYgmOo7D\u002f8OYEH7pHsP7\u002f1Trwce+w\u002f3cQ5Oe9j7D8zKMgaZUzsPy0A8AF+NOw\u002f+Zc3lDkc7D8079Z7lwPsPxA+2WeX6us\u002fy68+DDnR6z8MTx4ifLfrP5AfyGdgnes\u002fZmDnoOWC6z+r8aSWC2jrP6bYyRfSTOs\u002fx9zh+Dgx6z\u002fsN14UQBXrPyVUuErn+Oo\u002fx5CUgi7c6j+gCOWoFb\u002fqP8FSDLGcoeo\u002fGzcAlcOD6j8IUGxVimXqP4uR1PnwRuo\u002f2q63kPcn6j+bVrEvngjqP+w9nPPk6Ok\u002fKPKzAMzI6T8TabaCU6jpP+BGBa17h+k\u002fWNHGukRm6T8dhwbvrkTpP8ZR1ZS6Iuk\u002fjElp\u002f2cA6T+5AD2Kt93oPxFNLpmpuug\u002fKYWcmD6X6D9WJ4b9dnPoP87fpUVTT+g\u002fNuOO99Mq6D\u002ffksii+QXoP4Vf6d\u002fE4Oc\u002ff9+wUDa75z\u002fMDCGgTpXnP5ufloIOb+c\u002fenngtXZI5z9dFVYBiCHnP37w7DVD+uY\u002f899MLqnS5j\u002fERuPOuqrmPyUg9QV5guY\u002fadGvy+RZ5j8ktzgi\u002fzDmP\u002fVguxXJB+Y\u002fTW92vEPe5T+NBsc2cLTlP8LKMq9PiuU\u002fXldwWuNf5T8xJm53LDXlPwDZV08sCuU\u002fGNmZNeTe5D9iQOOHVbPkP2z\u002fJa6Bh+Q\u002fIzSVGmpb5D\u002f0pKFJEC\u002fkP0dU9MF1AuQ\u002fcSBnFJzV4z9QZPvbhKjjPziNzr0xe+M\u002fwpoMaaRN4z+ifeCW3h\u002fjP8ZKYgri8eI\u002fTjiDkLDD4j9rWvf\u002fS5XiP2gWHTm2ZuI\u002fnULiJfE34j906qa5\u002fgjiPxyuHfHg2eE\u002f\u002frUp0pmq4T+VMrprK3vhP8Rho9WXS+E\u002fbhN1MOEb4T+Tp06lCezgP+2AsGUTvOA\u002foudKqwCM4D9gWMq301vgP9Q8odSOK+A\u002fsxaepWj23z+gmEkVjZXfPwsJDrePNN8\u002fwglaV3XT3j+yQLvPQnLePyCUUgb9EN4\u002fZz1D7aiv3T9EuRyCS07dP6efP83p7Nw\u002ffG494YiL3D\u002f+VDPaLSrcP2gPIN3dyNs\u002fseQ0F55n2z+I2iG9cwbbP6A1XQpkpdo\u002f6l5mQHRE2j92SASmqePZPw1vf4YJg9k\u002fApjXMJki2T\u002f5bPX2XcLYP9MZ2CxdYtg\u002fZxO\u002fJ5wC2D\u002fTL1A9IKPXPxs8usLuQ9c\u002fmDzUCw3l1j+XiDlqgIbWP8bzYixOKNY\u002fejq9nHvK1T8f6LwADm3VP43x75cKENU\u002fZj8Nm3az1D+tZgI7V1fUPzbQ\u002f5+x+9M\u002fmZGD6Iqg0z+WPGMo6EXTP7zr1GfO69I\u002fUtV3okKS0j8qr1zGSTnSP10wDrPo4NE\u002f4v6ZOCSJ0T9qWZoWATLRP+7OQPuD29A\u002fAldigrGF0D88H4U0jjDQP5XG4As9uM8\u002fg0x9q80Qzz9kSeXZ1mrOP6yvHvtgxs0\u002fhMVmQ3QjzT8RhnC1GILMPw09qyBW4ss\u002fdRCSHzREyz\u002f7KwUWuqfKP4BBrS\u002fvDMo\u002f8BBqXtpzyT8tqcxYgtzIP0IRnpjtRsg\u002fHQhzWSKzxz8Qhk2XJiHHP+OoTA0AkcY\u002f8K9rNLQCxj8\u002fqlBCSHbFP6R0KyjB68Q\u002fSqGlkSNjxD9i3ePjc9zDP1VkmTy2V8M\u002fKQouce7Uwj+pYPcNIFTCP2N0hVVO1cE\u002fd5cDQHxYwT9Jqa16rN3AP6ZBWmfhZMA\u002fWj00ODrcvz9iV9rFwvK+P17dGnNfDb4\u002fckGgohIsvT9QWDoe3k68PyeD+hbDdbs\u002f31R9JcKguj9k62FK28+5P8og7+4NA7k\u002f0aHm5Vg6uD+M4YVsunW3PxHLtCswtbY\u002fafthObf4tT\u002fFNgwaTEC1P4W0eMLqi7Q\u002f1saVmY7bsz\u002f9SYl6Mi+zPx8x6rbQhrI\u002fFG4kGWPisT\u002feWgbn4kGxPxG0duRIpbA\u002fyRxSVo0MsD9XHN4KUO+uP8f8jYMgza0\u002f2eqGy3myrD\u002f0YVuzSJ+rP4zIfi55k6o\u002f7BmmWvaOqT+AhmSHqpGoP2myAD5\u002fm6c\u002fthh\u002fSV2spj+c992+LMSlP\u002fkMfwXV4qQ\u002fdk273zwIpD8Bp5xzSjSjP5HHuVPjZqI\u002ficwviOyfoT9krLWXSt+gP+IcxZDhJKA\u002f8lWpJSrhnj\u002fvXz2vkISdPxGQ4Xi8M5w\u002f0dT+lnLumj\u002fThHKKd7SZPxvVK1OPhZg\u002fA2C3gn1hlz+YGbBOBUiWP+QlDaPpOJU\u002fLSBENO0zlD8ehzeR0jiTP4Qp6TRcR5I\u002fUZ7ol0xfkT8vB3ZBZoCQPzouo7DXVI8\u002fAy1hZkC6jT95xaHRjDCMP4BjSL9Dt4o\u002f8GEZuuxNiT+o1EkoEPSHPzlkGmg3qYY\u002fTHhy6+xshT9CrHFSvD6EP8NQ7oQyHoM\u002fSIbYyt0Kgj8lUHrjTQSBPxrTjRsUCoA\u002fuJlHxIY3fj\u002fsWqq44HF8P+Yzd+9iwno\u002fLf5a9z0oeT9xdnYypqJ3P1aL1\u002fPTMHY\u002fgjFwmgPSdD8AAIupdYVzPwyLv95uSnI\u002fsR9qRTggcT\u002fDJaxHHwZwP8oM+Hnr9m0\u002fDwWa7CP\u002faz\u002fgybGPnSNqP0jXLSEXY2g\u002fBU7Zfli8Zj8vuU2sMi5lP9xzk9R\u002ft2M\u002ftJ2RRyNXYj+WunBzCQxhP\u002fo7KrRPql8\u002frDWwBfpiXT8mOlHRIEBbP06hesnkP1k\u002f4pMHLHhgVz9nivKKHqBVPwUKNY8s\u002fVM\u002fVDUytgd2Uj9u8AkKJglRP0xAZqobak8\u002fnfp3o6rwTD+lDh+pRKNKP0K7PepTf0g\u002fX1iZY2CCRj9h0+8iD6pEP4zPA4Uh9EI\u002f+VRUb3ReQT\u002fIo2IM\u002f80\u002fP6oBtL+oFz0\u002f1SmbajuWOj+RyOIiPUY4PwFjVP5iJDY\u002fGnMAbo8tND9Brb6Z0F4yPzvF+7xetTA\u002f8mq4CzVdLj\u002fUfFrvFpArP35YHaO8\u002fig\u002f4vFh9MakJj8RaejiGn4kPzGYSZHehiI\u002fmNYHRHa7ID\u002fPXefgAjEeP\u002ft5BbmvNRs\u002f2GwxoQ1\u002fGD+Pokm4nAcWP4QisVs9yhM\u002f9upAACvCET9gOK1p7tUPP4iIyJ4JgQw\u002fqt5iigZ+CT8v8Jdd1MUGP1CG7+\u002fpUQQ\u002fpxV\u002fdz0cAj8E0DyZPB8APzcpR6KJq\u002fw+NhP5Yjh2+T5klrvw1JX2PqZrW\u002fRkAvQ+qYV\u002fv5e08T5+J6vZdEvvPvC8IkFZn+s+ON6TyqtZ6D7nfulBN3DlPsvp\u002fDqv2eI+KZGTQJ6N4D7S074uqgjdPhhC3hW2bdk+AnOHdL491j6cojOzVW3TPtijub0o8tA++GzDOM6FzT4slBBwWa7JPk8ApGjaTsY+7aBVlsFZwz6ZRC0q5cLAPqAi46jA\u002frw+sbOeIeoKuT76UIKs4Ji1PtVi6wohmbI+eg2Dxrf7rz6M9IWDlXWrPt0f24oRiqc+XutTcd0lpD4Ppkiw5DehPrsvODQiYp0+PJ1uiykImT4RjKkNckqVPi03Oh1kFJI+1g\u002fRVtunjj7ENXbZc\u002fKJPnL4H4vg7IU+EOF4o\u002fN+gj5EqMDQMyd\u002fPov\u002fIpb5MHo+rmZZCF37dT6SMRKEvmpyPoGEMTlqzm4+cUQqgjC4aT7ibneOLW9lPkdZ7Am01GE+IIwV\u002fM6cXT6D0os1V4tYPjclFb1JTlQ+Xw+OgJHEUD585Min7qNLPoE2AOvsvEY+bCSNt02rQj5Oj5os65g+Ppi1J9E1Bjk+D3kZVAJtND45e9IynaMwPl3liy\u002fkDSs+TVN3JhzzJT5uz96KisUhPjCBc7fdtxw+dbvlZb0nFz7TT1KJZqESPrXP0fx86g0+At62MZ73Bz5BJJ2K6CgDPhA1mHb1kP49GRu\u002fWetT+D2KOwKDx1HzPeq5B6GDne49vAeCl+cz6D32gacb6hbjPWWhtbAcC949W\u002fH8mhOW1z3T6DZIKHnSPXGpc\u002fZZ3sw9TiXJoKuAxj2JBFS3e3\u002fBPQNo6nJxJbs9vUucSl0BtT1dNoaUjjawPYq2nNIs96g9Ju38mDMsoz230ImQXV+dPWgMhT71cJY9LdWlvNQZkT2421Onhv6JPZv383EutIM9BcNh75DKfT0pg2Et6nV2PWlRC0s343A9NQOBCiFTaT2qol9tkO9iPWrekXznPFw9ZEOk78X+VD0gyY10kyFPPUH4NUeBA0c9Yxd6WJ72QD3kDGPSEu84PfjHmZk7RTI9P4peEAmyKj1tg7g1oXEjPdHfcKjpPBw9w2yG7BBxFD3PnV1DAoENPX7JEiOnOQU95jhRikNx\u002fjytp04P9cL1PAwIf9wVA+88BnSaM5AG5jxrjB3yFS\u002ffPA8IHpGKANY8\u002f3CyDKjxzjwfiN7vx6\u002fFPEjI3KxSS748YEHc8CYWtTx5gd351UCtPMB1kit4OKQ80ABKwPramzzpmrAIQh6TPIX3qJYaJoo8hW1g5FTRgTwkpWqNaTF4PMuKcq83XXA8nMPV\u002fA8OZjyvFAdj8pxdPKejjbsnzlM8w3V3ZuljSjyXoueqsoNBPCtkC7kzKDc86oaTcUF\u002fLjzaCuGojQAkPGllAGnyIRo87qM1l4IAETzcHPnfbQgGPFrHSJZdb\u002fw71vsLf8FF8jsJ7qnWs2LnO4r3ajuFzd07Yg\u002fbUNPo0jtMbsNPa+THOze8UWGODr47OtD7xLbSsjttb7xAuninO3PjI7ApI507Tj+vbf4AkjuatQZy3SWGO9N60gbqHns7rM9dIzeHcDsr36+HJw1kO5\u002fBgEr9NVg7kAY9bBsYTTuKxdV\u002fsmVBO0Dy3659tDQ7Xlqs3HGFKDvYOjDvyOUcOxcsp6RV8RA7YlkePWzEAzvFgYXVIPL2OtRUf1vLf+o6EMEM0eNx3jrYZLs+32XROjiSXKaix8M6\u002fdVERFhetjrE5eTAICmpOg4ycw8BJpw6sbm6RcZRjzq7Ss2b91OBOmrdt8VOEXM6dHVk9EfdZDqzO0Zbk7NWOitF90s6j0g6bldCvK1qOjpA86tA2z8sOh9CZ2NICB46qYWQ8zO9Dzotr3tM3qsAOqAJ+dSFaPE5t\u002f2ne0ER4jmPzLEB9qLSOVMrenTTGsM5xhTvjGt2sznhkEILxrOjOaejlChy0ZM5XlCeTZTOgzk12xlf76pzOWNiIx3pZmM5vkILSIkDUznLGUx4c4JCOXGFQNXb5TE50wQ5E3cwITm3uQxaZmUQObHBf8s\u002fEP841O3SsKo47TgY5ayZsUvbOCfRN4YDUck4F8bT9SVQtzgrWSJ3RFClOP+Gq9EFWJM4uZliMGhtgThuTVOcSitvOJ8Ks20+qls4q5e8fqteSDitwefZyE01OI3lF0kQeyI4QI01s67QDzi+LI5J5yv7N\u002fIIUWXPBec31MYyXCta0zelAg5a6iLAN9dHXf0lsao3scEBEFnllTevz72YQdCBN+Y5vplQvmw3TiVEaMX+VjdCXQlkoT1CN74nrs78sCw3Ytc+FsNeFjcmAOiyN0oBN1UuWGf\u002ffeo2tkuNQskd1Da5UWY+6Ea+NhLo0eVTlKY2YTtBpoevkDYAcGaDLW94NuWCWTeWuWE2Jjqp6Lp5STYjDVaOjCIyNpd7X+bLkhk2LU8Fx7\u002fbATb8ovdCPLPoNeX2\u002f\u002fYi6tA1SqmF7Q\u002fwtjXx\u002fC+T1sueNaGv+tRNd4Q1XIN73yrtajVvAjm9NohRNfDc46FjmDY1ujpXnljRHDVBf\u002frkHS8CNcDiHl+PtOY0wCKNGz4MzDQCOwtKDyOxNGqzu+GXtpQ0\u002f7QfP9rCeDRXBmHot0VdNPu0Ah4CHEE035ihIm\u002fGIzSNVcMRpJgGNBIBzjQIhukzZyYoNA9\u002fzDPeQ1c8lnGvM4K2qNC8JJEzs\u002fdjzq94cjOQj1i916lTM0gK0LHTrTQztUJZSj97FTMIidppPwr2Mrs4JWb\u002fVNYyHErhCBRYtjItTxlpuxKWMij1fFHzhnUymYuIW2O5VDLZmBDGG7EzMlaGdegtdxIyz2EeiiYW8TGZmBjn6TLPMeIt3vOVGawxN5Cx1gT3iDGllS1MJuBlMVP\u002fQu5F50IxuuyF0GobIDFIiOlD+Q\u002f7MHsAJ7RaadYwkG9HPkFLsjAf4uNVFm+NMLrVi+9TVWcwyd6J2JE5QjAOzp1ABAwcMKrvJ74FQvUvWo85KsK8zy+ttwsegVSnLxnYDknV4oAvKSyKLYAQWC+y3xNd8OAwLzmWga6WTQcvtTx3EO+o3y7QXXePMCm1LinwCKr\u002f04su3s+hi5r\u002fYS7CNtc+s+U2LmtjrJfgpAwuTCuF84md4S066VwRcEy1LQFIpRauT4kt4jTGnoSPXS1\u002fa482B\u002fYwLUZDY8YcHwMt9rCXi9As1Syf8ofumwenLDMMUItKmHgs0WCwpMvJSSxFKr0M\u002fooaLP6vdEJB0OorhgF4jZmUuiuzcjvOP9qJK+UpyUyHqlgrPuaFdRkVJysA6p+tnS71KjofEID2DsMqvlOXJkrPkCpPaaa4IRBdKtJ3FxS+nigqg55Uzypv9Cm0JVFFIJ3AKRmbUsZsdYop2\u002feI7IGhVClMRr\u002f8t38fKdSNY8uSieco9icpOIA2sSi8+9IWNKJ4KGSM8iJyPkEo7gRE4PScByj3+4hcvZ7PJ4mcAAPvspQnrXcNXXJ9Wie8lJys4ZAgJ3WjzkHBPuQmU\u002fNA3oIrqCb23+7j6i5sJsrdepKSCzAmaJ6qGxnW8SW31rvwXVqzJTp8sXvmfXQlvf09tlUrNSXD9cgN+lT1JNHeBxmR9rQkey3YSvEVdCRGfzTJdsIyJLpXZllGE\u002fEjcfqLqFhJriO4Lo4wBSpqI2PH\u002fT0vAyYjOpGspQ8I4iLCyoDzccGcIjg1HxVlUFYiOSEzaNLYECISlVTzj77IIaTOdN3uq4Ehf9i4yzOKOCEIDHb4sY\u002fwIO3EX2zCuKUg5QDOcHqtWyD2LdkTRiARIDlg9SFAlMQfesR1CyIBeB+yd93XRywrH0mDuU7m190etXLgmIbKjx5yuG5RbGtAHtmDgV01cfAdS3h+Xunpnx0bTa6i9wFOHW4dnZNgVPscevGUnScaqBxAT4VxpJNUHGw+BUwxAAEcmnwWwdctqxu9LFE2UwNVGxaRnwajav8aBDd9r5uzphrBgUCvJbRPGhw2037HYvUZKoWFogHdmxnapDchJIZBGXubpiAsRuUYJMYvAR7riBju4dh7yiYsGGN8V\u002fV3qs4Xn9lUSXQZcBdz9fod40kQFzydWv7Ov68WB5RADbHLTRb1wjWmwurqFWHMoyBLZocV6eas82qRIxVzUr0o1ni\u002fFO9qS4dJVFgUBT05\u002f8ES8hPsQjPLW8uJE+Ff1T79rCETSRZfSAdBtxKlsy6HJ1tNEuTDiQMsxuERxTEjC1GjdBFLzkgOEPgGEVgGDKhSfpgQelnrLzQEKRDkvELBZna4Dw5w7yWx5EYPGumTvBl\u002f1A5T1PWFbYxhDt8Gd9ZzuewNfHYXAqJ2dg024OpKcscADfQNcyei7ocMQmdIPNJJEAxB5HwcsyaVC5UyoPa3MBoL\u002ftz8lTPpngp\u002f1tNlHmEhCj5fxDeEnKIJSuS03P\u002f4IglyYyOPMmeiCIe4rsJE+iAIz3NEdJnHnQeerF4eZ9EYBw=="},"type":"scatter","xaxis":"x","yaxis":"y2"}],                        {"template":{"layout":{"font":{"color":"#333333","family":"Alegreya, serif","size":14},"legend":{"font":{"size":12}},"title":{"font":{"size":20}},"xaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}},"yaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}}}},"xaxis":{"anchor":"y","domain":[0.0,0.94],"title":{"text":"Time t"}},"yaxis":{"anchor":"x","domain":[0.0,1.0],"title":{"text":"Event density"}},"yaxis2":{"anchor":"x","overlaying":"y","side":"right","title":{"text":"S(t) — limbo"},"range":[0,1.05]},"annotations":[{"font":{"color":"#c0392b","size":14},"showarrow":false,"text":"P(doom) = 0.64","x":8.717146433041302,"y":0.10760324282404954},{"font":{"color":"#2471a3","size":14},"showarrow":false,"text":"P(deliverance) = 0.36","x":6.921151439299123,"y":0.05382097374770676},{"font":{"color":"#27ae60","size":14},"showarrow":false,"text":"P(limbo) = 0.00","x":29.75,"y":0.05,"yref":"y2"}],"legend":{"bgcolor":"rgba(255,255,255,0.5)","bordercolor":"#ccc","borderwidth":1},"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified","height":440},                        {"responsive": true}                    ).then(function(){
                            
var gd = document.getElementById('753e95de-2ef3-4ee4-bb4d-2a025c703eb6');
var x = new MutationObserver(function (mutations, observer) {{
        var display = window.getComputedStyle(gd).display;
        if (!display || display === 'none') {{
            console.log([gd, 'removed!']);
            Plotly.purge(gd);
            observer.disconnect();
        }}
}});

// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
    x.observe(notebookContainer, {childList: true});
}}

// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
    x.observe(outputEl, {childList: true});
}}

                        })                };            </script>        </div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-race-dynamics-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;3: Resolution of the race with superlinear doom risk (g(𝒞) = 0.005𝒞²) and linear safety progress (h(𝒞) = 0.015𝒞). Compute rate c(t) = e^{0.1t}, α = 0.5. The green curve (right axis) is S(t), the probability of limbo — neither doom nor deliverance has yet occurred. The shaded areas (left axis) show doom density λ_d(t)S(t) (red) and deliverance density λ_s(t)S(t) (blue). Their integrals give P(doom) and P(deliverance); the residual 1 − P(doom) − P(deliverance) is P(limbo) over this time window.
</figcaption>
</figure>
</div>
</div>
</section>
<section id="the-constant-hazard-ratio-case" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="the-constant-hazard-ratio-case"><span class="header-section-number">4</span> The constant-hazard-ratio case</h2>
<p>Consider an ultra-simple sanity-check case. If the ratio <img src="https://latex.codecogs.com/png.latex?%5Cpi_d(t)%20%5Cequiv%20%5Cpi_d"> is constant over time, then <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)%20=%20%5Cpi_d"> holds regardless of the compute trajectory — this is a standard competing risks identity. <img src="https://latex.codecogs.com/png.latex?%5Cpi_d"> stays constant when <img src="https://latex.codecogs.com/png.latex?g"> and <img src="https://latex.codecogs.com/png.latex?h"> are linear and <img src="https://latex.codecogs.com/png.latex?%5Calpha"> is constant. If <img src="https://latex.codecogs.com/png.latex?g(x)%20=%20ax"> and <img src="https://latex.codecogs.com/png.latex?h(x)%20=%20bx">, then <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c(t)%20=%20(1-%5Calpha)%5Cmathcal%7BC%7D(t)"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s(t)%20=%20%5Calpha%5Cmathcal%7BC%7D(t)">. [TODO clarify]</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi_d%20=%20%5Cfrac%7Ba(1-%5Calpha)%5C,%5Cmathcal%7BC%7D(t)%7D%7Ba(1-%5Calpha)%5C,%5Cmathcal%7BC%7D(t)%20+%20b%5Calpha%5C,%5Cmathcal%7BC%7D(t)%7D%20=%20%5Cfrac%7Ba(1-%5Calpha)%7D%7Ba(1-%5Calpha)%20+%20b%5Calpha%7D,%0A"></p>
<p>and the <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D(t)"> cancels. The probability of a doom outcome <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)"> depends only on <img src="https://latex.codecogs.com/png.latex?%5Calpha"> and the ratio <img src="https://latex.codecogs.com/png.latex?a/b">, not on the compute rate <img src="https://latex.codecogs.com/png.latex?c(t)"> or how fast it grows. This is the regime in which the speed of progress doesn’t matter — only the split between capability and safety compute determines your fate. If you’ve ever heard someone say “it doesn’t matter how fast AI progresses, only whether we invest enough in safety” — this is the (very specific) model in which that’s true.</p>
<p>It’s also not very plausible. Let’s get complicated.</p>
</section>
<section id="interesting-response-curves" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="interesting-response-curves"><span class="header-section-number">5</span> Interesting response curves</h2>
<p>With non-linear response functions, this invariance breaks down. <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)"> now depends on the full trajectory <img src="https://latex.codecogs.com/png.latex?c(t)">, because the time spent at each cumulative compute level determines how much hazard accumulates at that level. In the plot below, we compute <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)"> by integration over a trajectory with exponential compute growth <img src="https://latex.codecogs.com/png.latex?c(t)%20=%20e%5E%7Brt%7D">, for two different growth rates.</p>
<div id="cell-fig-pdoom-vs-alpha" class="cell" data-execution_count="5">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb4-1">alphas <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.99</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>)</span>
<span id="cb4-2">t_sim <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2000</span>)</span>
<span id="cb4-3"></span>
<span id="cb4-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> compute_pdoom(g_fn, h_fn, alpha_val, r):</span>
<span id="cb4-5">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Compute P(doom) by integration over a trajectory."""</span></span>
<span id="cb4-6">    c_rate <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t_sim)</span>
<span id="cb4-7">    Cc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid((<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> alpha_val) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t_sim, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-8">    Cs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(alpha_val <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t_sim, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-9">    ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> g_fn(Cc)</span>
<span id="cb4-10">    ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> h_fn(Cs)</span>
<span id="cb4-11">    cumhaz <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ls, t_sim, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb4-12">    S <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>cumhaz)</span>
<span id="cb4-13">    doom_density <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> S</span>
<span id="cb4-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> np.trapezoid(doom_density, t_sim)</span>
<span id="cb4-15"></span>
<span id="cb4-16">curves <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb4-17">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Linear"</span>,      g_lin,  h_lin,  C_NEUT),</span>
<span id="cb4-18">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pessimistic"</span>,  g_pess, h_pess, C_DOOM),</span>
<span id="cb4-19">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Optimistic"</span>,   g_opt,  h_opt,  C_SALV),</span>
<span id="cb4-20">    (<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Sigmoidal"</span>,    g_sig,  h_sig,  C_RUIN),</span>
<span id="cb4-21">]</span>
<span id="cb4-22"></span>
<span id="cb4-23">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> go.Figure()</span>
<span id="cb4-24"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> name, gf, hf, col <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> curves:</span>
<span id="cb4-25">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> r, dash, suffix <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"solid"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fast r=0.3"</span>), (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.05</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dash"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"slow r=0.05"</span>)]:</span>
<span id="cb4-26">        pr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.array([compute_pdoom(gf, hf, a, r) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> a <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> alphas])</span>
<span id="cb4-27">        fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alphas, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>pr, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> (</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>suffix<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">)"</span>,</span>
<span id="cb4-28">                                 line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>col, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>, dash<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dash),</span>
<span id="cb4-29">                                 hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"α=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  P(doom)=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.3f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>))</span>
<span id="cb4-30"></span>
<span id="cb4-31">fig.add_hline(y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>, line_dash<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dot"</span>, line_color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#bbb"</span>, annotation_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"P(doom) = ½"</span>,</span>
<span id="cb4-32">              annotation_position<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottom right"</span>)</span>
<span id="cb4-33"></span>
<span id="cb4-34">fig.update_layout(</span>
<span id="cb4-35">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>LAYOUT,</span>
<span id="cb4-36">    xaxis_title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Safety fraction α"</span>,</span>
<span id="cb4-37">    yaxis_title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"P(doom)"</span>,</span>
<span id="cb4-38">    height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">480</span>,</span>
<span id="cb4-39">)</span>
<span id="cb4-40">fig.show()</span></code></pre></div></div>
</details>
<div id="fig-pdoom-vs-alpha" class="cell-output cell-output-display quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-pdoom-vs-alpha-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>            <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script><script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>                <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.1.1.min.js" integrity="sha256-HUEFyfiTnZJxCxur99FjbKYTvKSzwDaD3/x5TqHpFu4=" crossorigin="anonymous"></script>                <div id="454f18b5-9107-4592-9b91-760de8887eb3" class="plotly-graph-div" style="height:480px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("454f18b5-9107-4592-9b91-760de8887eb3")) {                    Plotly.newPlot(                        "454f18b5-9107-4592-9b91-760de8887eb3",                        [{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#7f8c8d","dash":"solid","width":2.5},"name":"Linear (fast r=0.3)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"AUu3aODL7z\u002fYSbiHl4vvP8adRH+zSu8\u002fUdwNGzIJ7z9XBwgcEcfuP0rSJzhOhO4\u002fiwIfGudA7j9X2hZh2fztP0t9aKAiuO0\u002fvTxTX8By7T+hubAYsCztP9zIpjrv5ew\u002fDwZXJnue7D9QAIwvUVbsP0DrY5xuDew\u002fU774pNDD6z+wqgVzdHnrP\u002fnPiSFXLus\u002fXxZovHXi6j8OFARAzZXqP4vi25haSOo\u002ftMceoxr66T+plEAqCqvpP+ebieglW+k\u002fbR6jhmoK6T9VDiCb1LjoPxEEAqpgZug\u002f8kE6JAsT6D\u002fBnyZn0L7nPy03Crysaec\u002fUaeBV5wT5z+GxPJYm7zmP0iH98mlZOY\u002fOQvEnbcL5j8dbYewzLHlP5hUx8bgVuU\u002f7fO1jO\u002f65D\u002fsRYKV9J3kP0JPolrrP+Q\u002fIiYXO8\u002fg4z8SgKp6m4DjP\u002fGCJUFLH+M\u002f\u002fpKAmdm84j+V1AtxQVniP6IUkJZ99OE\u002fZ8dnuYiO4T80yY9oXSfhP8SIrxH2vuA\u002fij4YAE1V4D\u002fGn3W3uNTfP7TwJ1A8\u002fN4\u002fXpwchhgh3j\u002fNY7PHQEPdP\u002fFmbzOoYtw\u002fi+J4lUF\u002f2z\u002fC3gZl\u002f5jaPzy9r8HTr9k\u002fs4ifcLDD2D+H2LLZhtTXP6cLdQRI4tY\u002f040AleTs1T+NyL\u002fITPTUP8ZODXNw+NM\u002f276x+T750j+HwT1Rp\u002fbRP952PvmX8NA\u002fbxWV8P3Nzz8ZI8yvk7PNP5dodkDLkcs\u002fJSxLp31oyT\u002fbgRzUgjfHP+OOK5ix\u002fsQ\u002f5U4UnN+9wj9mrUtV4XTAP9fwVPYTR7w\u002fhMT+9laTtz854kPdLM6yP6CC\u002fyto7qs\u002frl94YBAcoj8eay8IB0mQPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#7f8c8d","dash":"dash","width":2.5},"name":"Linear (slow r=0.05)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"zCdDvxXM7z9pgq9YzIvvP13B\u002fcnnSu8\u002f8ozd3mUJ7z9Y8UBYRMfuP+qjGuyAhO4\u002fR2MaRRlB7j8IYmcCC\u002f3tPw+rWLdTuO0\u002fvG0r6\u002fBy7T+UH7cY4CztP1NgH64e5uw\u002fi4yDDKqe7D8f6quHf1bsPyFZtGWcDew\u002fynK03v3D6z84\u002f2QcoXnrP+CpwjmDLus\u002fYdutQqHi6j+1nocz+JXqPzl2y\u002fiESOo\u002fcQSmbkT66T+eaohgM6vpP5k+uIhOW+k\u002fh\u002ffbj5IK6T9IsIMM\u002fLjoP1EcroKHZug\u002fwIpJYzET6D\u002fV0bAL9r7nP7r6I8XRaec\u002f9IQ8xMAT5z+XFV0ov7zmP+xlHPvIZOY\u002f9EGrL9oL5j8EZjWi7rHlPw4IPRcCV+U\u002f8dbwOhD75D\u002fpN3ygFJ7kP2+HUcEKQOQ\u002fWyBu\u002fO3g4z8v6ZeVuYDjP5kklLRoH+M\u002f7T5XZPa84j9WTy2SXVniP6P\u002f2gyZ9OE\u002fi4q2g6OO4T+9e7iFdyfhP4rZg4APv+A\u002fm1tlv2VV4D\u002fLmpLU6NTfP5htTwlr\u002fN4\u002flL\u002fM2EUh3j+8fmCxbEPdP6u\u002fg7HSYtw\u002fGHpUpWp\u002f2z9zNf8DJ5naP4uVD+35r9k\u002fDaimJdXD2D9axpUVqtTXP3TOXMRp4tY\u002fKmYK1gTt1T8E6vyHa\u002fTUP6uWgq2N+NM\u002fumhXrFr50j9CGf94wfbRP1qI+ZKw8NA\u002fHZ6fASzOzz\u002fqMvCXvrPNP\u002fGfHPnykcs\u002fIfS+KaJoyT88UIsZpDfHP+QjpJnP\u002fsQ\u002fh+yFUvq9wj8xSIW5+HTAP3nCsws8R7w\u002fldFgSniTtz\u002fs\u002fXpfR86yPwYyLG+P7qs\u002fecLkwikcoj+M41vLHUmQPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#c0392b","dash":"solid","width":2.5},"name":"Pessimistic (fast r=0.3)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"5Y6\u002fnS8A7j+9OuphOgntP2kF4lD0Uew\u002fX5BhVGS46z9qb2crpzDrP\u002fVEth7vtOo\u002f+RTk9ORB6j8HUoLdZ9XpP0g\u002fh8kDbuk\u002fPDCOVa0K6T+gR0ijnKroP6FMlok3Teg\u002ffvnvBQTy5z\u002fviolqn5jnP0BeYWm4QOc\u002f\u002fCyL7Qrq5j8BhakiXZTmPy5SFkh9P+Y\u002fCHgEEUDr5T9sw3tof5flP7fxhH0ZROU\u002f6dZ7BPDw5D82eymg553kPwsvGGnnSuQ\u002fMk8xjNj34z8+d4j7paTjPzx8hC08UeM\u002f56GG54j94j\u002fWXOARe6niP3SbapMCVeI\u002fTPdzMxAA4j8KVgaBlarhP9O6vr6EVOE\u002f4tif0tD94D+tp2w5babgP0EtNv1NTuA\u002f\u002fXfBXc\u002fq3z88tfTEXjffP5wVnlw1gt4\u002fefpxWT\u002fL3T8nXnYBahLdP+cLCrujV9w\u002fGZ8bItya2z+mIxAkBNzaP76s\u002fSIOG9o\u002f4x0GIe5X2T\u002fHwcr0mZLYP3JBI4gJy9c\u002fBFp7IjcB1z9DqHvAHzXWP7iI7HrDZtU\u002fjwEY\u002fyWW1D+st1IbT8PTP97oxWJL7tI\u002f6SQX7CwX0j9vrx8vDD7RP4RKjgYJY9A\u002fPtgVtpcMzz\u002fxNYb8DVDNP4v7RXrwkMs\u002fU3jCYtXPyT92s7K2cQ3IP3scthueSsY\u002f9H\u002fFa1yIxD+V8pkP3sfCPxim\u002fjOLCsE\u002fU9ODxRWkvj8JthX0l0C7P95kUMgd77c\u002fsFhRkN+0tD9jEyRO4ZexP6xorq8JPq0\u002f+BnwJC2kpz+++QfknnOiPzz1JKEPf5s\u002f7FlqLs04kz9OoAUhMn2IP3iKHItr5Ho\u002fwuUqY8BbZj92xYS8\u002fr1BPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#c0392b","dash":"dash","width":2.5},"name":"Pessimistic (slow r=0.05)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"PdkGE\u002f\u002fO7T\u002f26UbBUMHsP42WnYuk+es\u002fUv8Od5dS6z8Of0XeF7\u002fqP4ObIPbFOOo\u002fq3lpVfe76T8kLDXIVkbpP2\u002fE7utM1ug\u002fZeB+VrVq6D\u002ftQpbDtQLoP56edh+mnec\u002fvEixpAE75z8POZcuXdrmP7WL27Bge+Y\u002fAxHwqsId5j\u002fRoD7nRMHlP3TcDRqyZeU\u002f8x40G9wK5T99oXSNmrDkPwncKtXJVuQ\u002ftL5hSUr94z9kza6Q\u002f6PjP8kQWR\u002fQSuM\u002fbS8zz6Tx4j9T4JGLaJjiP4QcNQ0IP+I\u002fSxkCo3Hl4T\u002f\u002fOi0FlYvhPz+xAjFjMeE\u002fOYboS87W4D+ecoeMyXvgP9CxRylJIOA\u002fjI8Cl4SI3z88fc4NVs\u002feP8XZq6n0FN4\u002fAIaOJlBZ3T8ouo0OWpzcP\u002fR4psUF3ts\u002fNtdVnEge2z9QESjpGV3aP12Idilzmtk\u002fekWqKVDW2D++EnM1rxDYPxfqfFCRSdc\u002fjZlGePqA1j\u002fr+9Tv8bbVP7zGFZaC69Q\u002fLyjbR7se1D8JXm1Or1DTPze+v9t2gdI\u002fB2dhlS+x0T8SSUQv\u002fd\u002fQPx64axcKDtA\u002fHT\u002fyZhB3zj9YGrZhY9HMP7gCH9CTK8s\u002f\u002fOPUpTyGyT9PfCoqD+LHP0gT3ynVP8Y\u002f4bEIQ3OgxD\u002f1pY9A6wTDP3vmSHVebsE\u002f6YlS\u002fx+8vz\u002fVN7Wrzaq8P2Afj9zeq7k\u002fIlxFlLnCtj+4ArgrEfOzP+WTT\u002f7jQLE\u002fQzXUKOtgrT+QTnVpiIyoP8FS0UnxDaQ\u002fDFKKbDvdnz8d8lQz2m+YP2Sh3Ams5ZE\u002fHdK9VRSeiD\u002fuf7Tsdud+P1KD4y7mwnA\u002fbZMN2DKgWz+3reO2DdM1Pw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#2471a3","dash":"solid","width":2.5},"name":"Optimistic (fast r=0.3)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"PUDvBF377z8ElBC5cOnvP27I+0gDyu8\u002frr2gsdad7z9NcPwgBGbvP82uXNfQI+8\u002fiqmU7Y3Y7j+AAVtSg4XuP9k2y5fjK+4\u002fhJwi4MXM7T9Yr427I2ntP2LGHmjZAe0\u002f+s0qaaeX7D+HNkzLNCvsP\u002ffUsqsRves\u002faCdNxLlN6z+gt7\u002fZlt3qPwBnPvkCbeo\u002fgonMfkr86T+QEJXirYvpP2DEh09jG+k\u002fcr84B5ir6D9YFcuXcTzoP9+34OgOzuc\u002fWt5iJIlg5z9tx6B\u002f9PPmP9Do1+hgiOY\u002fepfHnNod5j\u002fRioOnarTlP0IAUVMXTOU\u002fC+P7h+Tk5D8x8bwc1H7kP1c9fx7mGeQ\u002f5g0SDBm24z92HJsJalPjP6uyawzV8eI\u002fqCUwAFWR4j+o3Uvm4zHiPzSaE\u002fB60+E\u002fXz17lBJ24T\u002fpbLOhohnhP6wnHUsivuA\u002ft3rlM4hj4D\u002f5Qol2ygngP4LB31K9Yd8\u002fj+N2wXOx3j8tGrpaoQLeP48d1jIuVd0\u002fCE1MQwGp3D\u002fGuw1YAP7bP6OiL\u002fYPVNs\u002f4JqPOxOr2j\u002fwGYK26wLaP+RGXDR5W9k\u002fsJ1OhZm02D\u002fBX5EzKA7YP95\u002fTSv+Z9c\u002fk+PnT\u002fHB1j+IfE\u002f60xvWPzbyjlp0ddU\u002fKFUCtZvO1D\u002fPCfhwDSfUP5r02+qFftM\u002fiFLQ9rjU0j91Jff4TynSP\u002fskV23ne9E\u002fvQwGqAvM0D83a1h7NBnQP3h6To1+xc4\u002fSXBOUc1PzT94QVMqbc\u002fLP7z4w2H1Qco\u002fjoDQZkakyD9tY0mMMvLGPxghCmrpJcU\u002fkIQKfuc2wz9kFQh+zxfBP3g\u002fQb7TYr0\u002fulqPdlCotz9rLpY2ieCvPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#2471a3","dash":"dash","width":2.5},"name":"Optimistic (slow r=0.05)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"91eXwx797z\u002fwaFA2CfLvP8WKYpBT3u8\u002f54lgXgrC7z+TqtPMYJ3vPzn5Y3KrcO8\u002fm6N0mFk87z8drzAJ7gDvP6SMEC74vu4\u002fKxY8\u002fg137j86TAD5xinuP7Ttoje41+0\u002fSOCRg3GB7T95mnROeyftP2z4VWRVyuw\u002f1iPwMHZq7D9A2ix1SgjsPwGzQU81pOs\u002fnwZRfZA+6z\u002fdMozHrNfqP9JlOIPSb+o\u002fXA2bI0IH6j9lMMDQNJ7pP0UnWf7cNOk\u002f0RO3\u002fmbL6D\u002fORzuP+WHoP7ICl1y2+Oc\u002fmr\u002fufbqP5z8QcHvmHifnP8kYos34vuY\u002fFka6DVpX5j8wcOV5UfDlPxCdcivrieU\u002fF9VWxzAk5T9Fw0e8Kb\u002fkP0mbBHrbWuQ\u002fQAFUokn34z9ShzU0dpTjP\u002fRdu7FhMuM\u002fKbf1QAvR4j\u002fIi03IcHDiPw4yoAaPEOI\u002fm6Vgp2Gx4T\u002fKh\u002fZS41LhP4inhbsN9eA\u002fuxw7ptmX4D+acy7xPjvgPylTqytpvt8\u002fe7zyT2EH3z\u002fI6AWiUFHeP4BBz44fnN0\u002fc+qwg7Tn3D842n3L8zPcP6zSymC\u002fgNs\u002foanxs\u002fbN2j+VfqFidhvaPx1mMd4Xadk\u002fquAS\u002fbC22D+RbKJyEwTYP6AxEicMUdc\u002f83UbZ2Kd1j8SGkng1ujVP52QqVoiM9U\u002fO\u002fP3GvR71D\u002fr6evP78LTP\u002foW6+CqB9M\u002fU1Vj4ahJ0j8utYTOVojRPw4An40Ew9A\u002fD9t6pbfxzz+2OoMfplHOP6ZBCzI0o8w\u002ftij1wPjiyj9r3EQVYgzJPyH7R5ASGcc\u002fVUOKRLX\u002fxD+dGKBeoLHCP2+Kp2FUFcA\u002fqGshKhTtuT\u002f5sTd\u002fZ3+xPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#8e44ad","dash":"solid","width":2.5},"name":"Sigmoidal (fast r=0.3)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"Iu4OSxT+7z9rttopF\u002f7vPyk+\u002f\u002f0Z\u002fu8\u002fjOvnxRz+7z\u002fkPsd\u002fH\u002f7vP8s6jSki\u002fu8\u002fi+TbwCT+7z8obflCJ\u002f7vP+V1v6wp\u002fu8\u002fpb2G+iv+7z8OUw4oLv7vPyonXTAw\u002fu8\u002flYacDTL+7z\u002fNjum4M\u002f7vP7EcGyo1\u002fu8\u002fUuV4Vzb+7z\u002fEUl81N\u002f7vPw1ByrU3\u002fu8\u002fyaW+xzf+7z9WS4hWN\u002f7vP+u6vEg2\u002fu8\u002fYq\u002fufjT+7z8RMvXRMf7vP5WmnRAu\u002fu8\u002fTtCO\u002fCj+7z9FpAlGIv7vP8eJD4YZ\u002fu8\u002finU+Ng7+7z\u002fYxmCl\u002f\u002f3vP8y5Mufs\u002fe8\u002fcqEjvdT97z\u002fN77t0tf3vP8e5nbaM\u002fe8\u002fomN6Plf97z9Ej1dwEP3vP1CGVbmx\u002fO8\u002fIYqyoDH87z+5akNfgvvvP6nLeb2P+u8\u002fycaq1jv57z+yVKwuWvfvP0UnAj+o9O8\u002fNznBPMLw7z\u002fxbLxVEuvvPzN6Bwy44u8\u002flbNu0GTW7z+fWk\u002fmKsTvP33E1bU8qe8\u002f8uF8Qp6B7z+nwuc10kfvP\u002fx2cjKZ9O4\u002f\u002fPPu\u002f+t+7j8cZKwyadztP53c0MhuAu0\u002fNp+e5\u002fTn6z\u002fAMFQv74fqP4D2uBqU4+g\u002fKaGr8KkD5z\u002fdWiIfIfjkP1cAEJ\u002fe1eI\u002fLeMneFmz4D9EAPD0QkrdPw0WpsuZdtk\u002f9x80y5IA1j+6UsWx9vHSP43Nlix3S9A\u002fVM+0nMMOzD9RWX2ggDjIPw42EdTt\u002fcQ\u002f6SmJPH5Iwj9UVAlYGgPAPyS13noLNrw\u002feuhPYFQAuT\u002f9dYQ7DUq2P2hGLSLe\u002fLM\u002fSswZLXUGsj\u002fUOUeI31ewP0+zRyPhya0\u002fMuOETXtHqz94phlSXxipPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#8e44ad","dash":"dash","width":2.5},"name":"Sigmoidal (slow r=0.05)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"bO605sz+7z9T8Nj3z\u002f7vPxQ22fnS\u002fu8\u002frNLj6tX+7z87O+zI2P7vP7pQopHb\u002fu8\u002fPM5nQt7+7z\u002f+xkPY4P7vP0\u002fM00\u002fj\u002fu8\u002fdTo6peX+7z\u002f8DAnU5\u002f7vP8lyKNfp\u002fu8\u002fjii4qOv+7z8yX+pB7f7vP\u002fKg1pru\u002fu8\u002fMbxCqu\u002f+7z+DLl9l8P7vP37Tc7\u002fw\u002fu8\u002fM6h4qfD+7z+CNJUR8P7vP3J\u002ff+Lu\u002fu8\u002fiTWxAu3+7z\u002fJoGZT6v7vP73vVq\u002fm\u002fu8\u002f8p8P6eH+7z9PCdXI2\u002f7vP54b3wnU\u002fu8\u002f7gG6Vsr+7z80knxEvv7vP0E0Z0yv\u002fu8\u002f875Qw5z+7z+mxQTOhf7vP\u002f5KVVFp\u002fu8\u002fJSEQ3EX+7z+AFCyIGf7vP9EqMc\u002fh\u002fe8\u002f5W7VS5v97z9Oz5RfQf3vP3xO9K3N\u002fO8\u002f0IjuVjf87z8GvafMcfvvP5BJcwpr+u8\u002f62lozgj57z9r1hQ5JPfvP7+Qgc+C9O8\u002fDgJzMMvw7z+f7dq5cuvvPz0Amrif4+8\u002fdsquivnX7z9vTMPwXcbvP9jlGMNyq+8\u002f+O8XURKC7z+vuhAdp0LvPz09n1O44u4\u002f7mzrgCJV7j+nyxmZk4vtP6q4oIGUeew\u002fOwutdpEY6z+3KYq8U2vpP3KzUM4Zf+c\u002fyXCnxHdp5T8sQ1Md1UPjPz3aLTp2JuE\u002fTghKqqpJ3j9b4wrGEJjaP6ieRfTdRdc\u002fOux1kdJW1D\u002fqbNFowcfRP3gbk522Is8\u002fehrhiaZUyz+qYtG2ohHIP4LQbVymRsU\u002ffsGZ7EXiwj9AFH1fE9XAPyv3alhfI74\u002f4Tyr210Zuz\u002f\u002fvYn1zXi4PyKv7yRtMbY\u002f1KY985k1tD8Xfl\u002ft63myPw=="},"type":"scatter"}],                        {"template":{"layout":{"font":{"color":"#333333","family":"Alegreya, serif","size":14},"legend":{"font":{"size":12}},"title":{"font":{"size":20}},"xaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}},"yaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}}}},"shapes":[{"line":{"color":"#bbb","dash":"dot"},"type":"line","x0":0,"x1":1,"xref":"x domain","y0":0.5,"y1":0.5,"yref":"y"}],"annotations":[{"showarrow":false,"text":"P(doom) = ½","x":1,"xanchor":"right","xref":"x domain","y":0.5,"yanchor":"top","yref":"y"}],"legend":{"bgcolor":"rgba(255,255,255,0.5)","bordercolor":"#ccc","borderwidth":1},"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified","xaxis":{"title":{"text":"Safety fraction α"}},"yaxis":{"title":{"text":"P(doom)"}},"height":480},                        {"responsive": true}                    ).then(function(){
                            
var gd = document.getElementById('454f18b5-9107-4592-9b91-760de8887eb3');
var x = new MutationObserver(function (mutations, observer) {{
        var display = window.getComputedStyle(gd).display;
        if (!display || display === 'none') {{
            console.log([gd, 'removed!']);
            Plotly.purge(gd);
            observer.disconnect();
        }}
}});

// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
    x.observe(notebookContainer, {childList: true});
}}

// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
    x.observe(outputEl, {childList: true});
}}

                        })                };            </script>        </div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-pdoom-vs-alpha-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;4: Probability of doom as a function of safety fraction α, computed by integration over an exponential compute trajectory. Solid lines: fast growth (r = 0.3); dashed: slow growth (r = 0.05). For the linear case (grey), the curves coincide — growth rate doesn’t matter. For non-linear responses, faster growth shifts the doom probability because it changes how much time the system spends in different hazard regimes.
</figcaption>
</figure>
</div>
</div>
<p>Interesting cases arise when <img src="https://latex.codecogs.com/png.latex?g"> and <img src="https://latex.codecogs.com/png.latex?h"> have different shapes.</p>
<div class="callout callout-style-simple callout-warning">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>I think I made an arithmetic error here; the pessimistic curve should be worse than the optimistic one, but the plot above shows the opposite. Five internet points if you can show me the error.</p>
</div>
</div>
</div>
<p>Some scenarios to consider:</p>
<p><strong>Convex <img src="https://latex.codecogs.com/png.latex?g">, concave <img src="https://latex.codecogs.com/png.latex?h"> — “fast takeoff, hard alignment.”</strong> The doom hazard rate is <em>superlinear</em> in cumulative capability compute; the deliverance hazard rate has <em>diminishing returns</em> in cumulative safety compute. This is the pessimistic scenario: increasing <img src="https://latex.codecogs.com/png.latex?%5Calpha"> helps at first, but as <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D(t)%20%5Cto%20%5Cinfty"> grows, the doom hazard rate eventually dominates regardless of allocation, so <img src="https://latex.codecogs.com/png.latex?%5Cpi_d(t)%20%5Cto%201">, and the doom outcome becomes near-certain. In this regime, <em>slowing down</em> <img src="https://latex.codecogs.com/png.latex?c(t)"> itself — reducing the rate at which compute accumulates — is the only robust strategy. This is roughly the worldview behind calls for a <a href="https://pauseai.info/?ref=danmackinlay.name">compute pause</a>: if the response curves are this shape, allocation alone cannot save us.</p>
<p><strong>Concave <img src="https://latex.codecogs.com/png.latex?g">, convex <img src="https://latex.codecogs.com/png.latex?h"> — “slow takeoff, tractable alignment.”</strong> The doom hazard rate saturates; the deliverance hazard rate is <em>superlinear</em> once we invest enough. This is the optimistic scenario: there exists a threshold of cumulative safety compute above which the deliverance outcome is almost certain. This is the implicit model behind “<a href="https://www.lesswrong.com/tag/alignment-tax?ref=danmackinlay.name">we just need to invest enough in alignment</a>” — the alignment tax is finite and worth paying.</p>
<p><strong>Sigmoidal <img src="https://latex.codecogs.com/png.latex?g"> and <img src="https://latex.codecogs.com/png.latex?h"> with different inflection points — “<a href="https://www.lesswrong.com/tag/compute-overhang?ref=danmackinlay.name">the capability overhang</a>.”</strong> Both processes have thresholds, but they may not be in the same place. If the safety threshold <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s%5E*"> is much larger than the doom threshold <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c%5E*">, there is a dangerous window where cumulative capability compute is in the steep part of <img src="https://latex.codecogs.com/png.latex?g"> while cumulative safety compute is still in the flat part of <img src="https://latex.codecogs.com/png.latex?h">. This is arguably the scenario most alignment researchers are worried about: a period in which capabilities are advancing rapidly but safety hasn’t yet reached its own inflection point.</p>
<p><strong><img src="https://latex.codecogs.com/png.latex?g"> depends on <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s"> too — “<a href="https://www.lesswrong.com/posts/5HtDzRAk7ePWsiL2L/safety-is-not-a-product?ref=danmackinlay.name">capabilities are fungible</a>.”</strong> Safety research itself requires capable AI systems. If <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s"> contributes to both <img src="https://latex.codecogs.com/png.latex?%5Clambda_s"> and <img src="https://latex.codecogs.com/png.latex?%5Clambda_d"> (because safety compute also advances capabilities as a side effect), the model needs modification. One could write <img src="https://latex.codecogs.com/png.latex?%5Clambda_d(t)%20=%20g(%5Cmathcal%7BC%7D(t))"> — making doom risk a function of <em>total</em> cumulative compute — while <img src="https://latex.codecogs.com/png.latex?%5Clambda_s(t)%20=%20h(%5Cmathcal%7BC%7D_s(t))">. This makes the allocation problem strictly harder, because safety investment has a capability externality.</p>
<p>Let’s plot the first of those, then return to the last one.</p>
<div id="cell-fig-dangerous-window" class="cell" data-execution_count="6">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb5-1">alpha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span></span>
<span id="cb5-2">t <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">25</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">800</span>)</span>
<span id="cb5-3">c_rate <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.3</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t)                               <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># compute rate</span></span>
<span id="cb5-4">Cc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid((<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> alpha) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 𝒞_c(t)</span></span>
<span id="cb5-5">Cs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(alpha <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 𝒞_s(t)</span></span>
<span id="cb5-6"></span>
<span id="cb5-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Sigmoidal response to cumulative stocks</span></span>
<span id="cb5-8">ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> sigmoid(Cc, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb5-9">ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> sigmoid(Cs, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb5-10"></span>
<span id="cb5-11">pi_d <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1e-12</span>)</span>
<span id="cb5-12"></span>
<span id="cb5-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Window boundaries (where doom is &gt;0.5 of max but safety is &lt;0.5 of max)</span></span>
<span id="cb5-14">t_doom_on <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> t[np.searchsorted(ld, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)]</span>
<span id="cb5-15">t_salv_on <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> t[np.searchsorted(ls, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>)]</span>
<span id="cb5-16"></span>
<span id="cb5-17">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> make_subplots(rows<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, cols<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, shared_xaxes<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb5-18">                    subplot_titles<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Hazard rates"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Conditional doom probability π_d(t)"</span>],</span>
<span id="cb5-19">                    vertical_spacing<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.12</span>)</span>
<span id="cb5-20"></span>
<span id="cb5-21">fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ld, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"λ_d (doom)"</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>),</span>
<span id="cb5-22">                          hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>), row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-23">fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ls, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"λ_s (safety)"</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_SALV, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>),</span>
<span id="cb5-24">                          hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>), row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-25">fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>pi_d, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"π_d(t)"</span>, line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_RUIN, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>),</span>
<span id="cb5-26">                          hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.3f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>), row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-27"></span>
<span id="cb5-28">fig.add_vrect(x0<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t_doom_on, x1<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t_salv_on, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rgba(192,57,43,0.10)"</span>,</span>
<span id="cb5-29">              line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, dash<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dash"</span>), row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-30">fig.add_vrect(x0<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t_doom_on, x1<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>t_salv_on, fillcolor<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"rgba(192,57,43,0.10)"</span>,</span>
<span id="cb5-31">              line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, dash<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dash"</span>), row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-32"></span>
<span id="cb5-33">fig.add_annotation(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(t_doom_on <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> t_salv_on)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.5</span>, text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Dangerous&lt;br&gt;window"</span>,</span>
<span id="cb5-34">                   showarrow<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>, font<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">13</span>, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>C_DOOM), row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-35"></span>
<span id="cb5-36">fig.update_xaxes(title_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Time t"</span>, row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-37">fig.update_yaxes(title_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Hazard rate"</span>, row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-38">fig.update_yaxes(title_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"π_d(t)"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.05</span>], row<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, col<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-39">fig.update_layout(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>LAYOUT, height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">560</span>)</span>
<span id="cb5-40">fig.show()</span></code></pre></div></div>
</details>
<div id="fig-dangerous-window" class="cell-output cell-output-display quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-dangerous-window-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>            <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script><script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>                <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.1.1.min.js" integrity="sha256-HUEFyfiTnZJxCxur99FjbKYTvKSzwDaD3/x5TqHpFu4=" crossorigin="anonymous"></script>                <div id="e5243881-f7bc-4943-953c-6481726bed38" class="plotly-graph-div" style="height:560px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("e5243881-f7bc-4943-953c-6481726bed38")) {                    Plotly.newPlot(                        "e5243881-f7bc-4943-953c-6481726bed38",                        [{"hovertemplate":"%{y:.2f}","line":{"color":"#c0392b","width":2.5},"name":"λ_d (doom)","x":{"dtype":"f8","bdata":"AAAAAAAAAAD1fEZcIAWgP\u002fV8RlwgBbA\u002fcLtpirAHuD\u002f1fEZcIAXAPzIcWHNoBsQ\u002fcLtpirAHyD+tWnuh+AjMP\u002fV8RlwgBdA\u002flEzPZ8QF0j8yHFhzaAbUP9Hr4H4MB9Y\u002fcLtpirAH2D8Oi\u002fKVVAjaP61ae6H4CNw\u002fSyoErZwJ3j\u002f1fEZcIAXgP8TkCmJyBeE\u002flEzPZ8QF4j9jtJNtFgbjPzIcWHNoBuQ\u002fAoQceboG5T\u002fR6+B+DAfmP6BTpYReB+c\u002fcLtpirAH6D8\u002fIy6QAgjpPw6L8pVUCOo\u002f3fK2m6YI6z+tWnuh+AjsP3zCP6dKCe0\u002fSyoErZwJ7j8bksiy7gnvP\u002fV8RlwgBfA\u002f3bAoX0mF8D\u002fE5ApicgXxP6wY7WSbhfE\u002flEzPZ8QF8j97gLFq7YXyP2O0k20WBvM\u002fS+h1cD+G8z8yHFhzaAb0PxpQOnaRhvQ\u002fAoQceboG9T\u002fpt\u002f5744b1P9Hr4H4MB\u002fY\u002fuR\u002fDgTWH9j+gU6WEXgf3P4iHh4eHh\u002fc\u002fcLtpirAH+D9X70uN2Yf4Pz8jLpACCPk\u002fJlcQkyuI+T8Oi\u002fKVVAj6P\u002fa+1Jh9iPo\u002f3fK2m6YI+z\u002fFJpmez4j7P61ae6H4CPw\u002flI5dpCGJ\u002fD98wj+nSgn9P2T2Iapzif0\u002fSyoErZwJ\u002fj8zXuavxYn+PxuSyLLuCf8\u002fAsaqtReK\u002fz\u002f1fEZcIAUAQOmWt900RQBA3bAoX0mFAEDQypngXcUAQMTkCmJyBQFAuP5744ZFAUCsGO1km4UBQKAyXuavxQFAlEzPZ8QFAkCHZkDp2EUCQHuAsWrthQJAb5oi7AHGAkBjtJNtFgYDQFfOBO8qRgNAS+h1cD+GA0A+AufxU8YDQDIcWHNoBgRAJjbJ9HxGBEAaUDp2kYYEQA5qq\u002felxgRAAoQceboGBUD1nY36zkYFQOm3\u002fnvjhgVA3dFv\u002fffGBUDR6+B+DAcGQMUFUgAhRwZAuR\u002fDgTWHBkCsOTQDSscGQKBTpYReBwdAlG0WBnNHB0CIh4eHh4cHQHyh+AicxwdAcLtpirAHCEBj1doLxUcIQFfvS43ZhwhASwm9Du7HCEA\u002fIy6QAggJQDM9nxEXSAlAJlcQkyuICUAacYEUQMgJQA6L8pVUCApAAqVjF2lICkD2vtSYfYgKQOrYRRqSyApA3fK2m6YIC0DRDCgdu0gLQMUmmZ7PiAtAuUAKIOTIC0CtWnuh+AgMQKF07CINSQxAlI5dpCGJDECIqM4lNskMQHzCP6dKCQ1AcNywKF9JDUBk9iGqc4kNQFgQkyuIyQ1ASyoErZwJDkA\u002fRHUusUkOQDNe5q\u002fFiQ5AJ3hXMdrJDkAbksiy7gkPQA+sOTQDSg9AAsaqtReKD0D23xs3LMoPQPV8RlwgBRBA7wn\u002fnColEEDplrfdNEUQQOMjcB4\u002fZRBA3bAoX0mFEEDXPeGfU6UQQNDKmeBdxRBAyldSIWjlEEDE5ApicgURQL5xw6J8JRFAuP5744ZFEUCyizQkkWURQKwY7WSbhRFApqWlpaWlEUCgMl7mr8URQJq\u002fFie65RFAlEzPZ8QFEkCO2YeoziUSQIdmQOnYRRJAgfP4KeNlEkB7gLFq7YUSQHUNaqv3pRJAb5oi7AHGEkBpJ9ssDOYSQGO0k20WBhNAXUFMriAmE0BXzgTvKkYTQFFbvS81ZhNAS+h1cD+GE0BFdS6xSaYTQD4C5\u002fFTxhNAOI+fMl7mE0AyHFhzaAYUQCypELRyJhRAJjbJ9HxGFEAgw4E1h2YUQBpQOnaRhhRAFN3ytpumFEAOaqv3pcYUQAj3Yziw5hRAAoQceboGFUD7ENW5xCYVQPWdjfrORhVA7ypGO9lmFUDpt\u002f5744YVQONEt7ztphVA3dFv\u002fffGFUDXXig+AucVQNHr4H4MBxZAy3iZvxYnFkDFBVIAIUcWQL+SCkErZxZAuR\u002fDgTWHFkCyrHvCP6cWQKw5NANKxxZApsbsQ1TnFkCgU6WEXgcXQJrgXcVoJxdAlG0WBnNHF0CO+s5GfWcXQIiHh4eHhxdAghRAyJGnF0B8ofgInMcXQHYusUmm5xdAcLtpirAHGEBpSCLLuicYQGPV2gvFRxhAXWKTTM9nGEBX70uN2YcYQFF8BM7jpxhASwm9Du7HGEBFlnVP+OcYQD8jLpACCBlAObDm0AwoGUAzPZ8RF0gZQC3KV1IhaBlAJlcQkyuIGUAg5MjTNagZQBpxgRRAyBlAFP45VUroGUAOi\u002fKVVAgaQAgYq9ZeKBpAAqVjF2lIGkD8MRxYc2gaQPa+1Jh9iBpA8EuN2YeoGkDq2EUaksgaQORl\u002flqc6BpA3fK2m6YIG0DXf2\u002fcsCgbQNEMKB27SBtAy5ngXcVoG0DFJpmez4gbQL+zUd\u002fZqBtAuUAKIOTIG0CzzcJg7ugbQK1ae6H4CBxAp+cz4gIpHEChdOwiDUkcQJoBpWMXaRxAlI5dpCGJHECOGxblK6kcQIioziU2yRxAgjWHZkDpHEB8wj+nSgkdQHZP+OdUKR1AcNywKF9JHUBqaWlpaWkdQGT2IapziR1AXoPa6n2pHUBYEJMriMkdQFGdS2yS6R1ASyoErZwJHkBFt7ztpikeQD9EdS6xSR5AOdEtb7tpHkAzXuavxYkeQC3rnvDPqR5AJ3hXMdrJHkAhBRBy5OkeQBuSyLLuCR9AFR+B8\u002fgpH0APrDk0A0ofQAg58nQNah9AAsaqtReKH0D8UmP2IaofQPbfGzcsyh9A8GzUdzbqH0D1fEZcIAUgQHLDonwlFSBA7wn\u002fnColIEBsUFu9LzUgQOmWt900RSBAZt0T\u002fjlVIEDjI3AeP2UgQGBqzD5EdSBA3bAoX0mFIEBa94R\u002fTpUgQNc94Z9TpSBAVIQ9wFi1IEDQypngXcUgQE0R9gBj1SBAyldSIWjlIEBHnq5BbfUgQMTkCmJyBSFAQStngncVIUC+ccOifCUhQDu4H8OBNSFAuP5744ZFIUA1RdgDjFUhQLKLNCSRZSFAL9KQRJZ1IUCsGO1km4UhQClfSYWglSFApqWlpaWlIUAj7AHGqrUhQKAyXuavxSFAHXm6BrXVIUCavxYnuuUhQBcGc0e\u002f9SFAlEzPZ8QFIkARkyuIyRUiQI7Zh6jOJSJACiDkyNM1IkCHZkDp2EUiQAStnAneVSJAgfP4KeNlIkD+OVVK6HUiQHuAsWrthSJA+MYNi\u002fKVIkB1DWqr96UiQPJTxsv8tSJAb5oi7AHGIkDs4H4MB9YiQGkn2ywM5iJA5m03TRH2IkBjtJNtFgYjQOD6740bFiNAXUFMriAmI0Dah6jOJTYjQFfOBO8qRiNA1BRhDzBWI0BRW70vNWYjQM6hGVA6diNAS+h1cD+GI0DILtKQRJYjQEV1LrFJpiNAwbuK0U62I0A+AufxU8YjQLtIQxJZ1iNAOI+fMl7mI0C11ftSY\u002fYjQDIcWHNoBiRAr2K0k20WJEAsqRC0ciYkQKnvbNR3NiRAJjbJ9HxGJECjfCUVglYkQCDDgTWHZiRAnQneVYx2JEAaUDp2kYYkQJeWlpaWliRAFN3ytpumJECRI0\u002fXoLYkQA5qq\u002felxiRAi7AHGKvWJEAI92M4sOYkQIU9wFi19iRAAoQceboGJUB\u002fyniZvxYlQPsQ1bnEJiVAeFcx2sk2JUD1nY36zkYlQHLk6RrUViVA7ypGO9lmJUBscaJb3nYlQOm3\u002fnvjhiVAZv5anOiWJUDjRLe87aYlQGCLE93ytiVA3dFv\u002fffGJUBaGMwd\u002fdYlQNdeKD4C5yVAVKWEXgf3JUDR6+B+DAcmQE4yPZ8RFyZAy3iZvxYnJkBIv\u002fXfGzcmQMUFUgAhRyZAQkyuICZXJkC\u002fkgpBK2cmQDzZZmEwdyZAuR\u002fDgTWHJkA1Zh+iOpcmQLKse8I\u002fpyZAL\u002fPX4kS3JkCsOTQDSscmQCmAkCNP1yZApsbsQ1TnJkAjDUlkWfcmQKBTpYReBydAHZoBpWMXJ0Ca4F3FaCcnQBcnuuVtNydAlG0WBnNHJ0ARtHImeFcnQI76zkZ9ZydAC0ErZ4J3J0CIh4eHh4cnQAXO46eMlydAghRAyJGnJ0D\u002fWpzolrcnQHyh+AicxydA+edUKaHXJ0B2LrFJpucnQPN0DWqr9ydAcLtpirAHKEDsAcaqtRcoQGlIIsu6JyhA5o5+6783KEBj1doLxUcoQOAbNyzKVyhAXWKTTM9nKEDaqO9s1HcoQFfvS43ZhyhA1DWord6XKEBRfATO46coQM7CYO7otyhASwm9Du7HKEDITxkv89coQEWWdU\u002f45yhAwtzRb\u002f33KEA\u002fIy6QAggpQLxpirAHGClAObDm0AwoKUC29kLxETgpQDM9nxEXSClAsIP7MRxYKUAtyldSIWgpQKoQtHImeClAJlcQkyuIKUCjnWyzMJgpQCDkyNM1qClAnSol9Dq4KUAacYEUQMgpQJe33TRF2ClAFP45VUroKUCRRJZ1T\u002fgpQA6L8pVUCCpAi9FOtlkYKkAIGKvWXigqQIVeB\u002fdjOCpAAqVjF2lIKkB\u002f6783blgqQPwxHFhzaCpAeXh4eHh4KkD2vtSYfYgqQHMFMbmCmCpA8EuN2YeoKkBtkun5jLgqQOrYRRqSyCpAZx+iOpfYKkDkZf5anOgqQGCsWnuh+CpA3fK2m6YIK0BaORO8qxgrQNd\u002fb9ywKCtAVMbL\u002fLU4K0DRDCgdu0grQE5ThD3AWCtAy5ngXcVoK0BI4Dx+yngrQMUmmZ7PiCtAQm31vtSYK0C\u002fs1Hf2agrQDz6rf\u002feuCtAuUAKIOTIK0A2h2ZA6dgrQLPNwmDu6CtAMBQfgfP4K0CtWnuh+AgsQCqh18H9GCxAp+cz4gIpLEAkLpACCDksQKF07CINSSxAHrtIQxJZLECaAaVjF2ksQBdIAYQceSxAlI5dpCGJLEAR1bnEJpksQI4bFuUrqSxAC2JyBTG5LECIqM4lNsksQAXvKkY72SxAgjWHZkDpLED\u002fe+OGRfksQHzCP6dKCS1A+Qicx08ZLUB2T\u002fjnVCktQPOVVAhaOS1AcNywKF9JLUDtIg1JZFktQGppaWlpaS1A56\u002fFiW55LUBk9iGqc4ktQOE8fsp4mS1AXoPa6n2pLUDbyTYLg7ktQFgQkyuIyS1A1VbvS43ZLUBRnUtskuktQM7jp4yX+S1ASyoErZwJLkDIcGDNoRkuQEW3vO2mKS5Awv0YDqw5LkA\u002fRHUusUkuQLyK0U62WS5AOdEtb7tpLkC2F4qPwHkuQDNe5q\u002fFiS5AsKRC0MqZLkAt657wz6kuQKox+xDVuS5AJ3hXMdrJLkCkvrNR39kuQCEFEHLk6S5Anktskun5LkAbksiy7gkvQJjYJNPzGS9AFR+B8\u002fgpL0CSZd0T\u002fjkvQA+sOTQDSi9Ai\u002fKVVAhaL0AIOfJ0DWovQIV\u002fTpUSei9AAsaqtReKL0B\u002fDAfWHJovQPxSY\u002fYhqi9AeZm\u002fFie6L0D23xs3LMovQHMmeFcx2i9A8GzUdzbqL0BtszCYO\u002fovQPV8RlwgBTBAM6B07CINMEByw6J8JRUwQLDm0AwoHTBA7wn\u002fnColMEAtLS0tLS0wQGxQW70vNTBAqnOJTTI9MEDplrfdNEUwQCe65W03TTBAZt0T\u002fjlVMECkAEKOPF0wQOMjcB4\u002fZTBAIUeerkFtMEBgasw+RHUwQJ6N+s5GfTBA3bAoX0mFMEAb1FbvS40wQFr3hH9OlTBAmBqzD1GdMEDXPeGfU6UwQBVhDzBWrTBAVIQ9wFi1MECSp2tQW70wQNDKmeBdxTBAD+7HcGDNMEBNEfYAY9UwQIw0JJFl3TBAyldSIWjlMEAJe4Cxau0wQEeerkFt9TBAhsHc0W\u002f9MEDE5ApicgUxQAMIOfJ0DTFAQStngncVMUCATpUSeh0xQL5xw6J8JTFA\u002fZTxMn8tMUA7uB\u002fDgTUxQHrbTVOEPTFAuP5744ZFMUD3IapziU0xQDVF2AOMVTFAdGgGlI5dMUCyizQkkWUxQPGuYrSTbTFAL9KQRJZ1MUBt9b7UmH0xQKwY7WSbhTFA6jsb9Z2NMUApX0mFoJUxQGeCdxWjnTFApqWlpaWlMUDkyNM1qK0xQCPsAcaqtTFAYQ8wVq29MUCgMl7mr8UxQN5VjHayzTFAHXm6BrXVMUBbnOiWt90xQJq\u002fFie65TFA2OJEt7ztMUAXBnNHv\u002fUxQFUpodfB\u002fTFAlEzPZ8QFMkDSb\u002f33xg0yQBGTK4jJFTJAT7ZZGMwdMkCO2YeoziUyQMz8tTjRLTJACiDkyNM1MkBJQxJZ1j0yQIdmQOnYRTJAxoluedtNMkAErZwJ3lUyQEPQypngXTJAgfP4KeNlMkDAFie65W0yQP45VUrodTJAPV2D2up9MkB7gLFq7YUyQLqj3\u002frvjTJA+MYNi\u002fKVMkA36jsb9Z0yQHUNaqv3pTJAtDCYO\u002fqtMkDyU8bL\u002fLUyQDF39Fv\u002fvTJAb5oi7AHGMkCuvVB8BM4yQOzgfgwH1jJAKwStnAneMkBpJ9ssDOYyQKhKCb0O7jJA5m03TRH2MkAkkWXdE\u002f4yQGO0k20WBjNAodfB\u002fRgOM0Dg+u+NGxYzQB4eHh4eHjNAXUFMriAmM0CbZHo+Iy4zQNqHqM4lNjNAGKvWXig+M0BXzgTvKkYzQJXxMn8tTjNA1BRhDzBWM0ASOI+fMl4zQFFbvS81ZjNAj37rvzduM0DOoRlQOnYzQAzFR+A8fjNAS+h1cD+GM0CJC6QAQo4zQMgu0pBEljNABlIAIUeeM0BFdS6xSaYzQIOYXEFMrjNAwbuK0U62M0AA37hhUb4zQD4C5\u002fFTxjNAfSUVglbOM0C7SEMSWdYzQPprcaJb3jNAOI+fMl7mM0B3ss3CYO4zQLXV+1Jj9jNA9Pgp42X+M0AyHFhzaAY0QHE\u002fhgNrDjRAr2K0k20WNEDuheIjcB40QCypELRyJjRAa8w+RHUuNECp72zUdzY0QOgSm2R6PjRAJjbJ9HxGNEBlWfeEf040QKN8JRWCVjRA4p9TpYReNEAgw4E1h2Y0QF7mr8WJbjRAnQneVYx2NEDbLAzmjn40QBpQOnaRhjRAWHNoBpSONECXlpaWlpY0QNW5xCaZnjRAFN3ytpumNEBSACFHnq40QJEjT9egtjRAz0Z9Z6O+NEAOaqv3pcY0QEyN2YeozjRAi7AHGKvWNEDJ0zWord40QAj3Yziw5jRARhqSyLLuNECFPcBYtfY0QMNg7ui3\u002fjRAAoQceboGNUBAp0oJvQ41QH\u002fKeJm\u002fFjVAve2mKcIeNUD7ENW5xCY1QDo0A0rHLjVAeFcx2sk2NUC3el9qzD41QPWdjfrORjVANMG7itFONUBy5Oka1FY1QLEHGKvWXjVA7ypGO9lmNUAuTnTL2241QGxxolvedjVAq5TQ6+B+NUDpt\u002f5744Y1QCjbLAzmjjVAZv5anOiWNUClIYks6541QONEt7ztpjVAImjlTPCuNUBgixPd8rY1QJ+uQW31vjVA3dFv\u002fffGNUAc9Z2N+s41QFoYzB391jVAmDv6rf\u002feNUDXXig+Auc1QBWCVs4E7zVAVKWEXgf3NUCSyLLuCf81QNHr4H4MBzZADw8PDw8PNkBOMj2fERc2QIxVay8UHzZAy3iZvxYnNkAJnMdPGS82QEi\u002f9d8bNzZAhuIjcB4\u002fNkDFBVIAIUc2QAMpgJAjTzZAQkyuICZXNkCAb9ywKF82QL+SCkErZzZA\u002fbU40S1vNkA82WZhMHc2QHr8lPEyfzZAuR\u002fDgTWHNkD3QvEROI82QDVmH6I6lzZAdIlNMj2fNkCyrHvCP6c2QPHPqVJCrzZAL\u002fPX4kS3NkBuFgZzR782QKw5NANKxzZA61xik0zPNkApgJAjT9c2QGijvrNR3zZApsbsQ1TnNkDl6RrUVu82QCMNSWRZ9zZAYjB39Fv\u002fNkCgU6WEXgc3QN920xRhDzdAHZoBpWMXN0BcvS81Zh83QJrgXcVoJzdA2QOMVWsvN0AXJ7rlbTc3QFZK6HVwPzdAlG0WBnNHN0DSkESWdU83QBG0ciZ4VzdAT9egtnpfN0CO+s5GfWc3QMwd\u002fdZ\u002fbzdAC0ErZ4J3N0BJZFn3hH83QIiHh4eHhzdAxqq1F4qPN0AFzuOnjJc3QEPxETiPnzdAghRAyJGnN0DAN25YlK83QP9anOiWtzdAPX7KeJm\u002fN0B8ofgInMc3QLrEJpmezzdA+edUKaHXN0A3C4O5o983QHYusUmm5zdAtFHf2ajvN0DzdA1qq\u002fc3QDGYO\u002fqt\u002fzdAcLtpirAHOECu3pcasw84QOwBxqq1FzhAKyX0OrgfOEBpSCLLuic4QKhrUFu9LzhA5o5+6783OEAlsqx7wj84QGPV2gvFRzhAovgInMdPOEDgGzcsylc4QB8\u002fZbzMXzhAXWKTTM9nOECchcHc0W84QNqo72zUdzhAGcwd\u002fdZ\u002fOEBX70uN2Yc4QJYSeh3cjzhA1DWord6XOEATWdY94Z84QFF8BM7jpzhAkJ8yXuavOEDOwmDu6Lc4QA3mjn7rvzhASwm9Du7HOECJLOue8M84QMhPGS\u002fz1zhABnNHv\u002fXfOEBFlnVP+Oc4QIO5o9\u002f67zhAwtzRb\u002f33OEAAAAAAAAA5QA=="},"y":{"dtype":"f8","bdata":"EyC5T9VRiT8XTyuhzSqKPzIujKIqDYs\u002fzeqV5mb5iz9aV+cVBPCMPz8SF2OL8Y0\u002fQBPaBo7+jj\u002fzymvi0guQPyU26Ly6npA\u002fBmvm2VQ4kT\u002fXComq\u002fNiRP94gWCETgZI\u002fLKnED\u002f8wkz+MIGKKLemTPwUuWVQSqpQ\u002fGOKgUih0lT+uS5cH8keWP25Nnhf6JZc\u002fl8Ru19MOmD90Q+LkGwOZP2r1Ast4A5o\u002fPsxBspsQmz9R68QdQSucPxSC07YxVJ0\u002fHvx4J0OMnj+uvI8FWdSfP+nLveeylqA\u002f9AL7\u002fTVMoT+M3TSPPwuiPxF\u002fvJBi1KI\u002fy\u002fC0zDuooz9+wCqYcoekP\u002fjUDZe5cqU\u002fOX8hj89qpj\u002fwVQtLgHCnP4Itv46lhKg\u002fpHydHiioqT9wtLHaANyqP3V1l+85Iaw\u002fnwmoHvB4rT97By0fVOSuP+KpOA1WMrA\u002fylNToqr9sD9MglnK4tSxP8Fbi87GuLI\u002f9hscRC2qsz8oXz8d\u002fKm0P2kFX84pubU\u002foU7GiL7Ytj8sMRiM1Qm4P6SU7Y+eTbk\u002fUi77Rl+luj9wLx39dBK8P22Hn1FWlr0\u002fnq8KD5Uyvz\u002fugNIQcHTAPw6z2taCXcE\u002faZkxo3pVwj9yw+YiYV3DP7tlTyNTdsQ\u002fz79534GhxT9NuPBdNODGP+dtIN7IM8g\u002fb+tCVLadyT\u002ffizvyjR\u002fLP30+LLv8usw\u002ftK\u002fVHs1xzj95\u002fXpM9CLQP78e6qesHNE\u002fjZ\u002f61SUn0j\u002f4uMjwh0PTP\u002fP1ZLENc9Q\u002fzSTiFwW31T8mheD7zxDXP5dR9X3kgdg\u002f5IACUc0L2j81BijRKbDbP+wncdytcN0\u002fyX7DXyFP3z+kbXXEr6bgPy1necaqtuE\u002ffwEzeIDY4j97f86eNg3kP+AMEIrYVeU\u002fY\u002fa0PXWz5j9PUp8xHSfoP7D+Q57fsek\u002f65+5S8dU6z9l+1jb1hDtP9ncPoYE5+4\u002fLAIopxps8D+HVd\u002fRm3LxP699SsNeh\u002fI\u002fUnY8Gauq8z9asli1s9z0P\u002fDCokKTHfY\u002fem3Mrkht9z\u002f811+ws8v4P\u002fg\u002frneROPo\u002fQo24rHmz+z+X\u002fqjf2zv9PzmTdJP90P4\u002f63Qvhfw4AEBFS\u002ft83g4BQFOdr6OG6QFAVG2cckLIAkBvWxxxTKoDQDZFdVXOjgRAfFxWueN0BUBapVZUnVsGQJtIRqcEQgdANCJD\u002fB8nCEAuL+WZ9gkJQAF5BwSV6QlAu2UQIxHFCkChV1srjpsLQBf8fyFAbAxA7Sls3W42DUCWFy11ePkNQNlMSQDTtA5ACIsIrQ1oD0DyPqqUaAkQQMsZNLRvWhBAPfFragmnEEBoQaSBLu8QQLKuqX7iMhFANEXInjJyEUCLg+C6NK0RQOX9ZBsG5BFAVb74R8oWEkDvS\u002fDbqUUSQB9qUWfRcBJAzLA5YnCYEkCfYu02uLwSQC3ASmXb3RJA+AkIwQz8EkBqzQLLfhcTQD02ACVjMBNAMTmOHupGE0DWDThZQlsTQAtk74GYbRNALwtgHRd+E0C3MtZk5owTQIgzaTEsmhNAlcE38wumE0ACJ6myprATQPpG1RkbuhNA+ApnhIXCE0D4w38UAMoTQDLkU8ui0BNAMdNopIPWE0DPi4eyttsTQFKknz1O4BNAJRb64FrkE0CUjzqp6+cTQEFyyTEO6xNAQhtYwc7tE0Ag\u002f0RlOPATQNLatQtV8hNA7xdMnC30E0BT3WIPyvUTQAp1z4Mx9xNAIgEkU2r4E0CXNHokevkTQDgq0P1l+hNApboEVDL7E0CWDYMZ4\u002fsTQGC7rst7\u002fBNAw88if\u002f\u002f8E0CcfNbqcP0TQJZkOnLS\u002fRNAmzFhLib+E0ADukX2bf4TQIpaQGar\u002fhNA9Gy85t\u002f+E0BA7z2yDP8TQJGMxtoy\u002fxNAp06oTlP\u002fE0CsUdPcbv8TQHboqjiG\u002fxNALLht\u002fZn\u002fE0D5cTuxqv8TQLH5wce4\u002fxNAcfqapMT\u002fE0D\u002fJmKdzv8TQHyri\u002fvW\u002fxNAV6kB\u002ft3\u002fE0Ds9I7a4\u002f8TQFe2HL\u002fo\u002fxNAkQPI0uz\u002fE0DfCdQ28P8TQPjlfAfz\u002fxNABt6uXPX\u002fE0A7TaVK9\u002f8TQD42dOL4\u002fxNALx9\u002fMvr\u002fE0BXj99G+\u002f8TQNxCvSn8\u002fxNA2uuZ4\u002fz\u002fE0AmIZJ7\u002ff8TQLDplPf9\u002fxNARieTXP7\u002fE0DQ+6eu\u002fv8TQAYhO\u002fH+\u002fxNAJgseJ\u002f\u002f\u002fE0B8k6RS\u002f\u002f8TQOfOuXX\u002f\u002fxNAy57xkf\u002f\u002fE0C6d5eo\u002f\u002f8TQHfIurr\u002f\u002fxNA8Fw5yf\u002f\u002fE0A3DMjU\u002f\u002f8TQCf1+d3\u002f\u002fxNAgoNG5f\u002f\u002fE0Avbw7r\u002f\u002f8TQG\u002ffn+\u002f\u002f\u002fxNADtY58\u002f\u002f\u002fE0C5AA\u002f2\u002f\u002f8TQCMKSPj\u002f\u002fxNApYAF+v\u002f\u002fE0BxZGH7\u002f\u002f8TQLdscPz\u002f\u002fxNAaxBD\u002ff\u002f\u002fE0BaXeb9\u002f\u002f8TQIemZP7\u002f\u002fxNACxHG\u002fv\u002f\u002fE0C8BRH\u002f\u002f\u002f8TQImMSv\u002f\u002f\u002fxNAypV2\u002f\u002f\u002f\u002fE0DnNJj\u002f\u002f\u002f8TQCTPsf\u002f\u002f\u002fxNA4kDF\u002f\u002f\u002f\u002fE0A0+9P\u002f\u002f\u002f8TQEAb3\u002f\u002f\u002f\u002fxNAwnzn\u002f\u002f\u002f\u002fE0CQyO3\u002f\u002f\u002f8TQBCA8v\u002f\u002f\u002fxNAIwb2\u002f\u002f\u002f\u002fE0Agpvj\u002f\u002f\u002f8TQEiZ+v\u002f\u002f\u002fxNA\u002fQr8\u002f\u002f\u002f\u002fE0AFHP3\u002f\u002f\u002f8TQA\u002fl\u002ff\u002f\u002f\u002fxNAp3j+\u002f\u002f\u002f\u002fE0Cv5P7\u002f\u002f\u002f8TQIUz\u002f\u002f\u002f\u002f\u002fxNA3mz\u002f\u002f\u002f\u002f\u002fE0B3lv\u002f\u002f\u002f\u002f8TQIi0\u002f\u002f\u002f\u002f\u002fxNANcr\u002f\u002f\u002f\u002f\u002fE0DH2f\u002f\u002f\u002f\u002f8TQO7k\u002f\u002f\u002f\u002f\u002fxNA5Oz\u002f\u002f\u002f\u002f\u002fE0CO8v\u002f\u002f\u002f\u002f8TQJL2\u002f\u002f\u002f\u002f\u002fxNAafn\u002f\u002f\u002f\u002f\u002fE0Bp+\u002f\u002f\u002f\u002f\u002f8TQND8\u002f\u002f\u002f\u002f\u002fxNAy\u002f3\u002f\u002f\u002f\u002f\u002fE0B7\u002fv\u002f\u002f\u002f\u002f8TQPX+\u002f\u002f\u002f\u002f\u002fxNASv\u002f\u002f\u002f\u002f\u002f\u002fE0CD\u002f\u002f\u002f\u002f\u002f\u002f8TQKv\u002f\u002f\u002f\u002f\u002f\u002fxNAx\u002f\u002f\u002f\u002f\u002f\u002f\u002fE0DZ\u002f\u002f\u002f\u002f\u002f\u002f8TQOb\u002f\u002f\u002f\u002f\u002f\u002fxNA7\u002f\u002f\u002f\u002f\u002f\u002f\u002fE0D1\u002f\u002f\u002f\u002f\u002f\u002f8TQPn\u002f\u002f\u002f\u002f\u002f\u002fxNA+\u002f\u002f\u002f\u002f\u002f\u002f\u002fE0D8\u002f\u002f\u002f\u002f\u002f\u002f8TQP7\u002f\u002f\u002f\u002f\u002f\u002fxNA\u002f\u002f\u002f\u002f\u002f\u002f\u002f\u002fE0D\u002f\u002f\u002f\u002f\u002f\u002f\u002f8TQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQA=="},"type":"scatter","xaxis":"x","yaxis":"y"},{"hovertemplate":"%{y:.2f}","line":{"color":"#2471a3","width":2.5},"name":"λ_s (safety)","x":{"dtype":"f8","bdata":"AAAAAAAAAAD1fEZcIAWgP\u002fV8RlwgBbA\u002fcLtpirAHuD\u002f1fEZcIAXAPzIcWHNoBsQ\u002fcLtpirAHyD+tWnuh+AjMP\u002fV8RlwgBdA\u002flEzPZ8QF0j8yHFhzaAbUP9Hr4H4MB9Y\u002fcLtpirAH2D8Oi\u002fKVVAjaP61ae6H4CNw\u002fSyoErZwJ3j\u002f1fEZcIAXgP8TkCmJyBeE\u002flEzPZ8QF4j9jtJNtFgbjPzIcWHNoBuQ\u002fAoQceboG5T\u002fR6+B+DAfmP6BTpYReB+c\u002fcLtpirAH6D8\u002fIy6QAgjpPw6L8pVUCOo\u002f3fK2m6YI6z+tWnuh+AjsP3zCP6dKCe0\u002fSyoErZwJ7j8bksiy7gnvP\u002fV8RlwgBfA\u002f3bAoX0mF8D\u002fE5ApicgXxP6wY7WSbhfE\u002flEzPZ8QF8j97gLFq7YXyP2O0k20WBvM\u002fS+h1cD+G8z8yHFhzaAb0PxpQOnaRhvQ\u002fAoQceboG9T\u002fpt\u002f5744b1P9Hr4H4MB\u002fY\u002fuR\u002fDgTWH9j+gU6WEXgf3P4iHh4eHh\u002fc\u002fcLtpirAH+D9X70uN2Yf4Pz8jLpACCPk\u002fJlcQkyuI+T8Oi\u002fKVVAj6P\u002fa+1Jh9iPo\u002f3fK2m6YI+z\u002fFJpmez4j7P61ae6H4CPw\u002flI5dpCGJ\u002fD98wj+nSgn9P2T2Iapzif0\u002fSyoErZwJ\u002fj8zXuavxYn+PxuSyLLuCf8\u002fAsaqtReK\u002fz\u002f1fEZcIAUAQOmWt900RQBA3bAoX0mFAEDQypngXcUAQMTkCmJyBQFAuP5744ZFAUCsGO1km4UBQKAyXuavxQFAlEzPZ8QFAkCHZkDp2EUCQHuAsWrthQJAb5oi7AHGAkBjtJNtFgYDQFfOBO8qRgNAS+h1cD+GA0A+AufxU8YDQDIcWHNoBgRAJjbJ9HxGBEAaUDp2kYYEQA5qq\u002felxgRAAoQceboGBUD1nY36zkYFQOm3\u002fnvjhgVA3dFv\u002fffGBUDR6+B+DAcGQMUFUgAhRwZAuR\u002fDgTWHBkCsOTQDSscGQKBTpYReBwdAlG0WBnNHB0CIh4eHh4cHQHyh+AicxwdAcLtpirAHCEBj1doLxUcIQFfvS43ZhwhASwm9Du7HCEA\u002fIy6QAggJQDM9nxEXSAlAJlcQkyuICUAacYEUQMgJQA6L8pVUCApAAqVjF2lICkD2vtSYfYgKQOrYRRqSyApA3fK2m6YIC0DRDCgdu0gLQMUmmZ7PiAtAuUAKIOTIC0CtWnuh+AgMQKF07CINSQxAlI5dpCGJDECIqM4lNskMQHzCP6dKCQ1AcNywKF9JDUBk9iGqc4kNQFgQkyuIyQ1ASyoErZwJDkA\u002fRHUusUkOQDNe5q\u002fFiQ5AJ3hXMdrJDkAbksiy7gkPQA+sOTQDSg9AAsaqtReKD0D23xs3LMoPQPV8RlwgBRBA7wn\u002fnColEEDplrfdNEUQQOMjcB4\u002fZRBA3bAoX0mFEEDXPeGfU6UQQNDKmeBdxRBAyldSIWjlEEDE5ApicgURQL5xw6J8JRFAuP5744ZFEUCyizQkkWURQKwY7WSbhRFApqWlpaWlEUCgMl7mr8URQJq\u002fFie65RFAlEzPZ8QFEkCO2YeoziUSQIdmQOnYRRJAgfP4KeNlEkB7gLFq7YUSQHUNaqv3pRJAb5oi7AHGEkBpJ9ssDOYSQGO0k20WBhNAXUFMriAmE0BXzgTvKkYTQFFbvS81ZhNAS+h1cD+GE0BFdS6xSaYTQD4C5\u002fFTxhNAOI+fMl7mE0AyHFhzaAYUQCypELRyJhRAJjbJ9HxGFEAgw4E1h2YUQBpQOnaRhhRAFN3ytpumFEAOaqv3pcYUQAj3Yziw5hRAAoQceboGFUD7ENW5xCYVQPWdjfrORhVA7ypGO9lmFUDpt\u002f5744YVQONEt7ztphVA3dFv\u002fffGFUDXXig+AucVQNHr4H4MBxZAy3iZvxYnFkDFBVIAIUcWQL+SCkErZxZAuR\u002fDgTWHFkCyrHvCP6cWQKw5NANKxxZApsbsQ1TnFkCgU6WEXgcXQJrgXcVoJxdAlG0WBnNHF0CO+s5GfWcXQIiHh4eHhxdAghRAyJGnF0B8ofgInMcXQHYusUmm5xdAcLtpirAHGEBpSCLLuicYQGPV2gvFRxhAXWKTTM9nGEBX70uN2YcYQFF8BM7jpxhASwm9Du7HGEBFlnVP+OcYQD8jLpACCBlAObDm0AwoGUAzPZ8RF0gZQC3KV1IhaBlAJlcQkyuIGUAg5MjTNagZQBpxgRRAyBlAFP45VUroGUAOi\u002fKVVAgaQAgYq9ZeKBpAAqVjF2lIGkD8MRxYc2gaQPa+1Jh9iBpA8EuN2YeoGkDq2EUaksgaQORl\u002flqc6BpA3fK2m6YIG0DXf2\u002fcsCgbQNEMKB27SBtAy5ngXcVoG0DFJpmez4gbQL+zUd\u002fZqBtAuUAKIOTIG0CzzcJg7ugbQK1ae6H4CBxAp+cz4gIpHEChdOwiDUkcQJoBpWMXaRxAlI5dpCGJHECOGxblK6kcQIioziU2yRxAgjWHZkDpHEB8wj+nSgkdQHZP+OdUKR1AcNywKF9JHUBqaWlpaWkdQGT2IapziR1AXoPa6n2pHUBYEJMriMkdQFGdS2yS6R1ASyoErZwJHkBFt7ztpikeQD9EdS6xSR5AOdEtb7tpHkAzXuavxYkeQC3rnvDPqR5AJ3hXMdrJHkAhBRBy5OkeQBuSyLLuCR9AFR+B8\u002fgpH0APrDk0A0ofQAg58nQNah9AAsaqtReKH0D8UmP2IaofQPbfGzcsyh9A8GzUdzbqH0D1fEZcIAUgQHLDonwlFSBA7wn\u002fnColIEBsUFu9LzUgQOmWt900RSBAZt0T\u002fjlVIEDjI3AeP2UgQGBqzD5EdSBA3bAoX0mFIEBa94R\u002fTpUgQNc94Z9TpSBAVIQ9wFi1IEDQypngXcUgQE0R9gBj1SBAyldSIWjlIEBHnq5BbfUgQMTkCmJyBSFAQStngncVIUC+ccOifCUhQDu4H8OBNSFAuP5744ZFIUA1RdgDjFUhQLKLNCSRZSFAL9KQRJZ1IUCsGO1km4UhQClfSYWglSFApqWlpaWlIUAj7AHGqrUhQKAyXuavxSFAHXm6BrXVIUCavxYnuuUhQBcGc0e\u002f9SFAlEzPZ8QFIkARkyuIyRUiQI7Zh6jOJSJACiDkyNM1IkCHZkDp2EUiQAStnAneVSJAgfP4KeNlIkD+OVVK6HUiQHuAsWrthSJA+MYNi\u002fKVIkB1DWqr96UiQPJTxsv8tSJAb5oi7AHGIkDs4H4MB9YiQGkn2ywM5iJA5m03TRH2IkBjtJNtFgYjQOD6740bFiNAXUFMriAmI0Dah6jOJTYjQFfOBO8qRiNA1BRhDzBWI0BRW70vNWYjQM6hGVA6diNAS+h1cD+GI0DILtKQRJYjQEV1LrFJpiNAwbuK0U62I0A+AufxU8YjQLtIQxJZ1iNAOI+fMl7mI0C11ftSY\u002fYjQDIcWHNoBiRAr2K0k20WJEAsqRC0ciYkQKnvbNR3NiRAJjbJ9HxGJECjfCUVglYkQCDDgTWHZiRAnQneVYx2JEAaUDp2kYYkQJeWlpaWliRAFN3ytpumJECRI0\u002fXoLYkQA5qq\u002felxiRAi7AHGKvWJEAI92M4sOYkQIU9wFi19iRAAoQceboGJUB\u002fyniZvxYlQPsQ1bnEJiVAeFcx2sk2JUD1nY36zkYlQHLk6RrUViVA7ypGO9lmJUBscaJb3nYlQOm3\u002fnvjhiVAZv5anOiWJUDjRLe87aYlQGCLE93ytiVA3dFv\u002fffGJUBaGMwd\u002fdYlQNdeKD4C5yVAVKWEXgf3JUDR6+B+DAcmQE4yPZ8RFyZAy3iZvxYnJkBIv\u002fXfGzcmQMUFUgAhRyZAQkyuICZXJkC\u002fkgpBK2cmQDzZZmEwdyZAuR\u002fDgTWHJkA1Zh+iOpcmQLKse8I\u002fpyZAL\u002fPX4kS3JkCsOTQDSscmQCmAkCNP1yZApsbsQ1TnJkAjDUlkWfcmQKBTpYReBydAHZoBpWMXJ0Ca4F3FaCcnQBcnuuVtNydAlG0WBnNHJ0ARtHImeFcnQI76zkZ9ZydAC0ErZ4J3J0CIh4eHh4cnQAXO46eMlydAghRAyJGnJ0D\u002fWpzolrcnQHyh+AicxydA+edUKaHXJ0B2LrFJpucnQPN0DWqr9ydAcLtpirAHKEDsAcaqtRcoQGlIIsu6JyhA5o5+6783KEBj1doLxUcoQOAbNyzKVyhAXWKTTM9nKEDaqO9s1HcoQFfvS43ZhyhA1DWord6XKEBRfATO46coQM7CYO7otyhASwm9Du7HKEDITxkv89coQEWWdU\u002f45yhAwtzRb\u002f33KEA\u002fIy6QAggpQLxpirAHGClAObDm0AwoKUC29kLxETgpQDM9nxEXSClAsIP7MRxYKUAtyldSIWgpQKoQtHImeClAJlcQkyuIKUCjnWyzMJgpQCDkyNM1qClAnSol9Dq4KUAacYEUQMgpQJe33TRF2ClAFP45VUroKUCRRJZ1T\u002fgpQA6L8pVUCCpAi9FOtlkYKkAIGKvWXigqQIVeB\u002fdjOCpAAqVjF2lIKkB\u002f6783blgqQPwxHFhzaCpAeXh4eHh4KkD2vtSYfYgqQHMFMbmCmCpA8EuN2YeoKkBtkun5jLgqQOrYRRqSyCpAZx+iOpfYKkDkZf5anOgqQGCsWnuh+CpA3fK2m6YIK0BaORO8qxgrQNd\u002fb9ywKCtAVMbL\u002fLU4K0DRDCgdu0grQE5ThD3AWCtAy5ngXcVoK0BI4Dx+yngrQMUmmZ7PiCtAQm31vtSYK0C\u002fs1Hf2agrQDz6rf\u002feuCtAuUAKIOTIK0A2h2ZA6dgrQLPNwmDu6CtAMBQfgfP4K0CtWnuh+AgsQCqh18H9GCxAp+cz4gIpLEAkLpACCDksQKF07CINSSxAHrtIQxJZLECaAaVjF2ksQBdIAYQceSxAlI5dpCGJLEAR1bnEJpksQI4bFuUrqSxAC2JyBTG5LECIqM4lNsksQAXvKkY72SxAgjWHZkDpLED\u002fe+OGRfksQHzCP6dKCS1A+Qicx08ZLUB2T\u002fjnVCktQPOVVAhaOS1AcNywKF9JLUDtIg1JZFktQGppaWlpaS1A56\u002fFiW55LUBk9iGqc4ktQOE8fsp4mS1AXoPa6n2pLUDbyTYLg7ktQFgQkyuIyS1A1VbvS43ZLUBRnUtskuktQM7jp4yX+S1ASyoErZwJLkDIcGDNoRkuQEW3vO2mKS5Awv0YDqw5LkA\u002fRHUusUkuQLyK0U62WS5AOdEtb7tpLkC2F4qPwHkuQDNe5q\u002fFiS5AsKRC0MqZLkAt657wz6kuQKox+xDVuS5AJ3hXMdrJLkCkvrNR39kuQCEFEHLk6S5Anktskun5LkAbksiy7gkvQJjYJNPzGS9AFR+B8\u002fgpL0CSZd0T\u002fjkvQA+sOTQDSi9Ai\u002fKVVAhaL0AIOfJ0DWovQIV\u002fTpUSei9AAsaqtReKL0B\u002fDAfWHJovQPxSY\u002fYhqi9AeZm\u002fFie6L0D23xs3LMovQHMmeFcx2i9A8GzUdzbqL0BtszCYO\u002fovQPV8RlwgBTBAM6B07CINMEByw6J8JRUwQLDm0AwoHTBA7wn\u002fnColMEAtLS0tLS0wQGxQW70vNTBAqnOJTTI9MEDplrfdNEUwQCe65W03TTBAZt0T\u002fjlVMECkAEKOPF0wQOMjcB4\u002fZTBAIUeerkFtMEBgasw+RHUwQJ6N+s5GfTBA3bAoX0mFMEAb1FbvS40wQFr3hH9OlTBAmBqzD1GdMEDXPeGfU6UwQBVhDzBWrTBAVIQ9wFi1MECSp2tQW70wQNDKmeBdxTBAD+7HcGDNMEBNEfYAY9UwQIw0JJFl3TBAyldSIWjlMEAJe4Cxau0wQEeerkFt9TBAhsHc0W\u002f9MEDE5ApicgUxQAMIOfJ0DTFAQStngncVMUCATpUSeh0xQL5xw6J8JTFA\u002fZTxMn8tMUA7uB\u002fDgTUxQHrbTVOEPTFAuP5744ZFMUD3IapziU0xQDVF2AOMVTFAdGgGlI5dMUCyizQkkWUxQPGuYrSTbTFAL9KQRJZ1MUBt9b7UmH0xQKwY7WSbhTFA6jsb9Z2NMUApX0mFoJUxQGeCdxWjnTFApqWlpaWlMUDkyNM1qK0xQCPsAcaqtTFAYQ8wVq29MUCgMl7mr8UxQN5VjHayzTFAHXm6BrXVMUBbnOiWt90xQJq\u002fFie65TFA2OJEt7ztMUAXBnNHv\u002fUxQFUpodfB\u002fTFAlEzPZ8QFMkDSb\u002f33xg0yQBGTK4jJFTJAT7ZZGMwdMkCO2YeoziUyQMz8tTjRLTJACiDkyNM1MkBJQxJZ1j0yQIdmQOnYRTJAxoluedtNMkAErZwJ3lUyQEPQypngXTJAgfP4KeNlMkDAFie65W0yQP45VUrodTJAPV2D2up9MkB7gLFq7YUyQLqj3\u002frvjTJA+MYNi\u002fKVMkA36jsb9Z0yQHUNaqv3pTJAtDCYO\u002fqtMkDyU8bL\u002fLUyQDF39Fv\u002fvTJAb5oi7AHGMkCuvVB8BM4yQOzgfgwH1jJAKwStnAneMkBpJ9ssDOYyQKhKCb0O7jJA5m03TRH2MkAkkWXdE\u002f4yQGO0k20WBjNAodfB\u002fRgOM0Dg+u+NGxYzQB4eHh4eHjNAXUFMriAmM0CbZHo+Iy4zQNqHqM4lNjNAGKvWXig+M0BXzgTvKkYzQJXxMn8tTjNA1BRhDzBWM0ASOI+fMl4zQFFbvS81ZjNAj37rvzduM0DOoRlQOnYzQAzFR+A8fjNAS+h1cD+GM0CJC6QAQo4zQMgu0pBEljNABlIAIUeeM0BFdS6xSaYzQIOYXEFMrjNAwbuK0U62M0AA37hhUb4zQD4C5\u002fFTxjNAfSUVglbOM0C7SEMSWdYzQPprcaJb3jNAOI+fMl7mM0B3ss3CYO4zQLXV+1Jj9jNA9Pgp42X+M0AyHFhzaAY0QHE\u002fhgNrDjRAr2K0k20WNEDuheIjcB40QCypELRyJjRAa8w+RHUuNECp72zUdzY0QOgSm2R6PjRAJjbJ9HxGNEBlWfeEf040QKN8JRWCVjRA4p9TpYReNEAgw4E1h2Y0QF7mr8WJbjRAnQneVYx2NEDbLAzmjn40QBpQOnaRhjRAWHNoBpSONECXlpaWlpY0QNW5xCaZnjRAFN3ytpumNEBSACFHnq40QJEjT9egtjRAz0Z9Z6O+NEAOaqv3pcY0QEyN2YeozjRAi7AHGKvWNEDJ0zWord40QAj3Yziw5jRARhqSyLLuNECFPcBYtfY0QMNg7ui3\u002fjRAAoQceboGNUBAp0oJvQ41QH\u002fKeJm\u002fFjVAve2mKcIeNUD7ENW5xCY1QDo0A0rHLjVAeFcx2sk2NUC3el9qzD41QPWdjfrORjVANMG7itFONUBy5Oka1FY1QLEHGKvWXjVA7ypGO9lmNUAuTnTL2241QGxxolvedjVAq5TQ6+B+NUDpt\u002f5744Y1QCjbLAzmjjVAZv5anOiWNUClIYks6541QONEt7ztpjVAImjlTPCuNUBgixPd8rY1QJ+uQW31vjVA3dFv\u002fffGNUAc9Z2N+s41QFoYzB391jVAmDv6rf\u002feNUDXXig+Auc1QBWCVs4E7zVAVKWEXgf3NUCSyLLuCf81QNHr4H4MBzZADw8PDw8PNkBOMj2fERc2QIxVay8UHzZAy3iZvxYnNkAJnMdPGS82QEi\u002f9d8bNzZAhuIjcB4\u002fNkDFBVIAIUc2QAMpgJAjTzZAQkyuICZXNkCAb9ywKF82QL+SCkErZzZA\u002fbU40S1vNkA82WZhMHc2QHr8lPEyfzZAuR\u002fDgTWHNkD3QvEROI82QDVmH6I6lzZAdIlNMj2fNkCyrHvCP6c2QPHPqVJCrzZAL\u002fPX4kS3NkBuFgZzR782QKw5NANKxzZA61xik0zPNkApgJAjT9c2QGijvrNR3zZApsbsQ1TnNkDl6RrUVu82QCMNSWRZ9zZAYjB39Fv\u002fNkCgU6WEXgc3QN920xRhDzdAHZoBpWMXN0BcvS81Zh83QJrgXcVoJzdA2QOMVWsvN0AXJ7rlbTc3QFZK6HVwPzdAlG0WBnNHN0DSkESWdU83QBG0ciZ4VzdAT9egtnpfN0CO+s5GfWc3QMwd\u002fdZ\u002fbzdAC0ErZ4J3N0BJZFn3hH83QIiHh4eHhzdAxqq1F4qPN0AFzuOnjJc3QEPxETiPnzdAghRAyJGnN0DAN25YlK83QP9anOiWtzdAPX7KeJm\u002fN0B8ofgInMc3QLrEJpmezzdA+edUKaHXN0A3C4O5o983QHYusUmm5zdAtFHf2ajvN0DzdA1qq\u002fc3QDGYO\u002fqt\u002fzdAcLtpirAHOECu3pcasw84QOwBxqq1FzhAKyX0OrgfOEBpSCLLuic4QKhrUFu9LzhA5o5+6783OEAlsqx7wj84QGPV2gvFRzhAovgInMdPOEDgGzcsylc4QB8\u002fZbzMXzhAXWKTTM9nOECchcHc0W84QNqo72zUdzhAGcwd\u002fdZ\u002fOEBX70uN2Yc4QJYSeh3cjzhA1DWord6XOEATWdY94Z84QFF8BM7jpzhAkJ8yXuavOEDOwmDu6Lc4QA3mjn7rvzhASwm9Du7HOECJLOue8M84QMhPGS\u002fz1zhABnNHv\u002fXfOEBFlnVP+Oc4QIO5o9\u002f67zhAwtzRb\u002f33OEAAAAAAAAA5QA=="},"y":{"dtype":"f8","bdata":"HYb\u002fRjOpuT4BjJC3yga6PiD+nVOeZro+f5sWI7\u002fIuj5CXuHHPi27Puy\u002fGIQvlLs+QVaOQKT9uz7UZ5qTsGm8PhtJO8ho2Lw+dImI5eFJvT5XLn62Mb69Ppx5JNJuNb4+p\u002fQYpLCvvj4cwH11Dy2\u002fPiRuVHakrb8+WPyk48QYwD5h2\u002fxBbVzAPnPE1mbZocA+audQ6xfpwD4sDOr2NzLBPvH1sUVJfcE+MrPGLlzKwT6W9iKrgRnCPi7SwVzLasI+lW8clku+wj4jpAZiFRTDPsiJ74s8bMM+kZSLqNXGwz4J7u0e9iPEPhU6FzK0g8Q+sEQACyfmxD5RfyfDZkvFPpGcqG+Ms8U+JQzmLLIexj6\u002fkMwq84zGPratublr\u002fsY+NC8OWDlzxz7spnbAeuvHPo1R9PhPZ8g+8n+xYtrmyD5sUq3KPGrJPupSS3ub8ck+fkPUThx9yj46U\u002fbC5gzLPsLQUw0kocs+MmowMf85zD6aEk4WpdfMPujBC6FEes0+A3HZyw4izj6R+BXCNs\u002fOPsLUbPzxgc8+A6FlLzwd0D702gIsgnzQPmwvpIHp3tA+yZC3JZJE0T7TtzGIna3RPj4xUKcuGtI+\u002fNt\u002fJGqK0j4LU3padv7SPi8ErnR7dtM+ww0GiKPy0z7GcyitGnPUPmLPQhwP+NQ+4EZ\u002fSrGB1T63bj0JNBDWPlekLKfMo9Y+G4tnE7M81z4xlLICItvXPl7mARdXf9g+ZJVtCZMp2T446b3WGdrZPrx5vO4ykdo+myl6ZilP2z7Uir0tTBTcPlYG0Ufu4Nw+9jPsB2e13T6\u002fPHhREpLePobjc9xQd98+GXsgP8Qy4D4nPpU7kq7gPtZ5fOJKL+E+Lzp4vSm14T6Ayc2PbUDiPnu9ZohY0eI+APgmdzBo4z7NaNUFPwXkPvUw2vTRqOQ+oQMaXDtT5T7LSjzw0QTmPtC7r0zxveY++7PHQvp+5z568VMuU0joPosXHFBoGuk+ifewLqz16T6e2w7+l9rqPqwmlg6syes+UJDqQ3DD7D7rMVWUdMjtPjSSUpFR2e4+yPwD+qj27z7SbCUsk5DwPk27stS\u002fLPE+dIF7CTvQ8T5wM7xSa3vyPgaxkpa9LvM+Io1IiaXq8z5YlxMmnq\u002f0Pgda\u002fTAqfvU+aruxwtRW9j452AXfMTr3Pl22GhffKPg+DasTOIQj+T6fg24H1Cr6PsnHIw6NP\u002fs+ExLQc3pi\u002fD4EqUTrdJT9Ph+O\u002fbFj1v4+ky4P0p4UAD8a9l4zBccAPz2COdXxggE\u002fD5EhRPtIAj\u002fesqN9whkDP08eyrzz9QM\u002fhiiXV0feBD8Mzw2vgtMFP6pldTN51gY\u002ftfGufg3oBz9\u002ffqCGMgkJP\u002fct7ensOgo\u002floRoWVR+Cz\u002fF+vAgldQMPzXmodLxPg4\u002ftwKYF8W+Dz8ojOvUwaoQP\u002fCrnT1fghE\u002fN4TjhhJnEj+mEgcBxFkTP3twf\u002fBtWxQ\u002fxIBoEx5tFT9RK8BK948WP\u002ffx8GozxRc\u002fZd6QNyUOGT\u002fxnqWOOmwaPydlNMj+4Bs\u002ffyZnTx1uHT8N0SJ7ZBUfP9xVRlZkbCA\u002fSzlZ3TNdIT9rh6lZRl4iP\u002fXV0\u002fzZcCM\u002fqpWE5keWJD\u002fb\u002fDOhBtAlP9HMY96sHyc\u002fOQ4oefSGKD\u002fmcInGvQcqPzRWLTwTpCs\u002fQLindi1eLT80hfGpdzgvP1xE20PKmjA\u002fu4JG1DGsMT8W1FnDA9IyP2seVw32DTQ\u002fU3cGFudhNT\u002fCHW614c82P33CWrQhWjg\u002fBF+ZxRgDOj\u002fiCVcKdM07P5hw4jEivD0\u002fQ\u002fgMR1rSPz9Fh9ef0QlBP4SRsjLuQUI\u002fzNDBWKOTQz90EcacRwFFP\u002fxalWZtjUY\u002f0rR\u002fdek6SD9AICQb2gxKP82fe06vBkw\u002fFpb7sTMsTj9iy5xVy0BQP4hZQNe7hVE\u002fsLKucnnnUj\u002fDKy+u12hUP36fHnX3DFY\u002fmLu3BFDXVz+J0HDyuMtZPxRswHB17ls\u002fQ5Ys\u002fEBEXj+VIivQLmlgP5XBqwVSz2E\u002fgI+z1spXYz8W5LaVOAZlP5qTnLqk3mY\u002fkK657Y\u002flaD8lvljHACBrP43wBYCUk20\u002fLOtE60gjcD9cHjw9\u002f59xPwtL2arbQ3M\u002fZIk3DkYTdT8JqkBNLxN3P53ACSMjSXk\u002fV6sGWly7ez\u002fGzrrQ23B+Pzd35lfBuIA\u002fAODNIxhjgj8bJXQOcjyEPytOGWBySoY\u002fvg8rEXaTiD+aTpcZrR6LPysxgFo39I0\u002fc3hd1KKOkD+OZ+7IH1KSP0qIvkV3SpQ\u002fgOR7qld+lj\u002fV7Mk3VfWYPyAlzFcKuJs\u002f1U1RhTzQnj+CkRQ7gyShP6vqcCCEF6M\u002fobFrJU9IpT\u002fkRUjwD7+nPw7CdzcThao\u002fY2EuM++krT8hhvC3WJWwP7evwkgJkrI\u002fQmH5SljQtD+zpY0NKFm3P1nqI4ySNro\u002fMwySqRF0vT92q\u002fCmVY\u002fAP7\u002fAY5+QosI\u002fbLn\u002fIhL8xD\u002fuiADtRKXHP0J25X3BqMo\u002f61yaJ2kSzj+HDmKkv\u002ffQP4zw1VxfJ9M\u002fyCEbXjSg1T+uf4H2JGvYP6m+LGHYkds\u002fV+nTEKge3z\u002f33FPlQY7hP23AWHZiy+M\u002fC3OGgnZM5j\u002fKngsDJhfpP2keZo3FMOw\u002fHf7+Tw2e7z9s8TQSYbHxP4AK1YWpwPM\u002f3bul4Tf99T+esp3sT2b4P4mgGy3y+fo\u002fNtbXLLi0\u002fT\u002f7EfVa4UgAQIeCnwFgxQFAL9oUCQdMA0CugIgffdgEQD6xPbsNZgZAuOUkGuDvB0Dv6yMWM3EJQDzhzs2X5QpACNg7NSVJDEBjBTu4n5gNQDeZRe2R0Q5ACCjPgVXyD0BuAMLHBn0QQOTS1IhK9BBAqOx6hTJfEUBwX40LO74RQOsy8mEQEhJAoTyDrH9bEkCgiTJwaZsSQBiHCjq20hJAdnGOlk0CE0BxOXdIDysTQK7AtYXOTRNA2gqo7E5rE0Abe9jcQoQTQJb1s+FKmRNAxY1h5vWqE0DV+0H1wbkTQFm2glEdxhNAI1tbxGfQE0COXFIB9NgTQA8uCA0J4BNAnvmImOPlE0AUNytIt+oTQPuJxOCv7hNAYPi4WPLxE0BhSVLMnfQTQNWiFlbM9hNAy7emzJP4E0AWeiVoBvoTQC2gZlEz+xNA7L8xHSf8E0BoqNs17PwTQCyUWTWL\u002fRNAZ03JMQv+E0AjuTv+cf4TQE8PYGHE\u002fhNA76p\u002fQwb\u002fE0BXVQ7VOv8TQK4V6q5k\u002fxNAe1BA7YX\u002fE0A1hexFoP8TQHgqBxu1\u002fxNAmN9AisX\u002fE0AcJY950v8TQNrDm6Hc\u002fxNAKLJWluT\u002fE0BbVPvN6v8TQEYjzabv\u002fxNAHM7Ea\u002fP\u002fE0BDmF1Y9v8TQKHIqpv4\u002fxNAT03WWvr\u002fE0C\u002fECSz+\u002f8TQEO+kLv8\u002fxNAILkehv3\u002fE0BTtuAg\u002fv8TQM2jzpb+\u002fxNA1zpv8P7\u002fE0ASs140\u002f\u002f8TQEZ4uWf\u002f\u002fxNAL3lwjv\u002f\u002fE0CSlIur\u002f\u002f8TQITKXcH\u002f\u002fxNAdyGu0f\u002f\u002fE0ABmtfd\u002f\u002f8TQOoT4ub\u002f\u002fxNAPaWV7f\u002f\u002fE0CmlYny\u002f\u002f8TQNHwL\u002fb\u002f\u002fxNAwm\u002fe+P\u002f\u002fE0CPUNX6\u002f\u002f8TQFWTRPz\u002f\u002fxNAsvlP\u002ff\u002f\u002fE0CCERL+\u002f\u002f8TQJeDnv7\u002f\u002fxNAatID\u002f\u002f\u002f\u002fE0Dbqkz\u002f\u002f\u002f8TQDThgP\u002f\u002f\u002fxNAtC6m\u002f\u002f\u002f\u002fE0AYv8D\u002f\u002f\u002f8TQOGZ0\u002f\u002f\u002f\u002fxNAe\u002fDg\u002f\u002f\u002f\u002fE0D7V+r\u002f\u002f\u002f8TQK7z8P\u002f\u002f\u002fxNAW5T1\u002f\u002f\u002f\u002fE0Aaz\u002fj\u002f\u002f\u002f8TQBAO+\u002f\u002f\u002f\u002fxNAhZz8\u002f\u002f\u002f\u002fE0Ctr\u002f3\u002f\u002f\u002f8TQAJt\u002fv\u002f\u002f\u002fxNA0e7+\u002f\u002f\u002f\u002fE0B9R\u002f\u002f\u002f\u002f\u002f8TQNeD\u002f\u002f\u002f\u002f\u002fxNAw6z\u002f\u002f\u002f\u002f\u002fE0BoyP\u002f\u002f\u002f\u002f8TQAPb\u002f\u002f\u002f\u002f\u002fxNAfOf\u002f\u002f\u002f\u002f\u002fE0DQ7\u002f\u002f\u002f\u002f\u002f8TQFv1\u002f\u002f\u002f\u002f\u002fxNAB\u002fn\u002f\u002f\u002f\u002f\u002fE0Bz+\u002f\u002f\u002f\u002f\u002f8TQAz9\u002f\u002f\u002f\u002f\u002fxNAFv7\u002f\u002f\u002f\u002f\u002fE0DE\u002fv\u002f\u002f\u002f\u002f8TQDb\u002f\u002f\u002f\u002f\u002f\u002fxNAfv\u002f\u002f\u002f\u002f\u002f\u002fE0Cu\u002f\u002f\u002f\u002f\u002f\u002f8TQMz\u002f\u002f\u002f\u002f\u002f\u002fxNA4P\u002f\u002f\u002f\u002f\u002f\u002fE0Dr\u002f\u002f\u002f\u002f\u002f\u002f8TQPT\u002f\u002f\u002f\u002f\u002f\u002fxNA+f\u002f\u002f\u002f\u002f\u002f\u002fE0D7\u002f\u002f\u002f\u002f\u002f\u002f8TQP7\u002f\u002f\u002f\u002f\u002f\u002fxNA\u002fv\u002f\u002f\u002f\u002f\u002f\u002fE0D\u002f\u002f\u002f\u002f\u002f\u002f\u002f8TQP\u002f\u002f\u002f\u002f\u002f\u002f\u002fxNAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQAAAAAAAABRAAAAAAAAAFEAAAAAAAAAUQA=="},"type":"scatter","xaxis":"x","yaxis":"y"},{"hovertemplate":"%{y:.3f}","line":{"color":"#8e44ad","width":2.5},"name":"π_d(t)","x":{"dtype":"f8","bdata":"AAAAAAAAAAD1fEZcIAWgP\u002fV8RlwgBbA\u002fcLtpirAHuD\u002f1fEZcIAXAPzIcWHNoBsQ\u002fcLtpirAHyD+tWnuh+AjMP\u002fV8RlwgBdA\u002flEzPZ8QF0j8yHFhzaAbUP9Hr4H4MB9Y\u002fcLtpirAH2D8Oi\u002fKVVAjaP61ae6H4CNw\u002fSyoErZwJ3j\u002f1fEZcIAXgP8TkCmJyBeE\u002flEzPZ8QF4j9jtJNtFgbjPzIcWHNoBuQ\u002fAoQceboG5T\u002fR6+B+DAfmP6BTpYReB+c\u002fcLtpirAH6D8\u002fIy6QAgjpPw6L8pVUCOo\u002f3fK2m6YI6z+tWnuh+AjsP3zCP6dKCe0\u002fSyoErZwJ7j8bksiy7gnvP\u002fV8RlwgBfA\u002f3bAoX0mF8D\u002fE5ApicgXxP6wY7WSbhfE\u002flEzPZ8QF8j97gLFq7YXyP2O0k20WBvM\u002fS+h1cD+G8z8yHFhzaAb0PxpQOnaRhvQ\u002fAoQceboG9T\u002fpt\u002f5744b1P9Hr4H4MB\u002fY\u002fuR\u002fDgTWH9j+gU6WEXgf3P4iHh4eHh\u002fc\u002fcLtpirAH+D9X70uN2Yf4Pz8jLpACCPk\u002fJlcQkyuI+T8Oi\u002fKVVAj6P\u002fa+1Jh9iPo\u002f3fK2m6YI+z\u002fFJpmez4j7P61ae6H4CPw\u002flI5dpCGJ\u002fD98wj+nSgn9P2T2Iapzif0\u002fSyoErZwJ\u002fj8zXuavxYn+PxuSyLLuCf8\u002fAsaqtReK\u002fz\u002f1fEZcIAUAQOmWt900RQBA3bAoX0mFAEDQypngXcUAQMTkCmJyBQFAuP5744ZFAUCsGO1km4UBQKAyXuavxQFAlEzPZ8QFAkCHZkDp2EUCQHuAsWrthQJAb5oi7AHGAkBjtJNtFgYDQFfOBO8qRgNAS+h1cD+GA0A+AufxU8YDQDIcWHNoBgRAJjbJ9HxGBEAaUDp2kYYEQA5qq\u002felxgRAAoQceboGBUD1nY36zkYFQOm3\u002fnvjhgVA3dFv\u002fffGBUDR6+B+DAcGQMUFUgAhRwZAuR\u002fDgTWHBkCsOTQDSscGQKBTpYReBwdAlG0WBnNHB0CIh4eHh4cHQHyh+AicxwdAcLtpirAHCEBj1doLxUcIQFfvS43ZhwhASwm9Du7HCEA\u002fIy6QAggJQDM9nxEXSAlAJlcQkyuICUAacYEUQMgJQA6L8pVUCApAAqVjF2lICkD2vtSYfYgKQOrYRRqSyApA3fK2m6YIC0DRDCgdu0gLQMUmmZ7PiAtAuUAKIOTIC0CtWnuh+AgMQKF07CINSQxAlI5dpCGJDECIqM4lNskMQHzCP6dKCQ1AcNywKF9JDUBk9iGqc4kNQFgQkyuIyQ1ASyoErZwJDkA\u002fRHUusUkOQDNe5q\u002fFiQ5AJ3hXMdrJDkAbksiy7gkPQA+sOTQDSg9AAsaqtReKD0D23xs3LMoPQPV8RlwgBRBA7wn\u002fnColEEDplrfdNEUQQOMjcB4\u002fZRBA3bAoX0mFEEDXPeGfU6UQQNDKmeBdxRBAyldSIWjlEEDE5ApicgURQL5xw6J8JRFAuP5744ZFEUCyizQkkWURQKwY7WSbhRFApqWlpaWlEUCgMl7mr8URQJq\u002fFie65RFAlEzPZ8QFEkCO2YeoziUSQIdmQOnYRRJAgfP4KeNlEkB7gLFq7YUSQHUNaqv3pRJAb5oi7AHGEkBpJ9ssDOYSQGO0k20WBhNAXUFMriAmE0BXzgTvKkYTQFFbvS81ZhNAS+h1cD+GE0BFdS6xSaYTQD4C5\u002fFTxhNAOI+fMl7mE0AyHFhzaAYUQCypELRyJhRAJjbJ9HxGFEAgw4E1h2YUQBpQOnaRhhRAFN3ytpumFEAOaqv3pcYUQAj3Yziw5hRAAoQceboGFUD7ENW5xCYVQPWdjfrORhVA7ypGO9lmFUDpt\u002f5744YVQONEt7ztphVA3dFv\u002fffGFUDXXig+AucVQNHr4H4MBxZAy3iZvxYnFkDFBVIAIUcWQL+SCkErZxZAuR\u002fDgTWHFkCyrHvCP6cWQKw5NANKxxZApsbsQ1TnFkCgU6WEXgcXQJrgXcVoJxdAlG0WBnNHF0CO+s5GfWcXQIiHh4eHhxdAghRAyJGnF0B8ofgInMcXQHYusUmm5xdAcLtpirAHGEBpSCLLuicYQGPV2gvFRxhAXWKTTM9nGEBX70uN2YcYQFF8BM7jpxhASwm9Du7HGEBFlnVP+OcYQD8jLpACCBlAObDm0AwoGUAzPZ8RF0gZQC3KV1IhaBlAJlcQkyuIGUAg5MjTNagZQBpxgRRAyBlAFP45VUroGUAOi\u002fKVVAgaQAgYq9ZeKBpAAqVjF2lIGkD8MRxYc2gaQPa+1Jh9iBpA8EuN2YeoGkDq2EUaksgaQORl\u002flqc6BpA3fK2m6YIG0DXf2\u002fcsCgbQNEMKB27SBtAy5ngXcVoG0DFJpmez4gbQL+zUd\u002fZqBtAuUAKIOTIG0CzzcJg7ugbQK1ae6H4CBxAp+cz4gIpHEChdOwiDUkcQJoBpWMXaRxAlI5dpCGJHECOGxblK6kcQIioziU2yRxAgjWHZkDpHEB8wj+nSgkdQHZP+OdUKR1AcNywKF9JHUBqaWlpaWkdQGT2IapziR1AXoPa6n2pHUBYEJMriMkdQFGdS2yS6R1ASyoErZwJHkBFt7ztpikeQD9EdS6xSR5AOdEtb7tpHkAzXuavxYkeQC3rnvDPqR5AJ3hXMdrJHkAhBRBy5OkeQBuSyLLuCR9AFR+B8\u002fgpH0APrDk0A0ofQAg58nQNah9AAsaqtReKH0D8UmP2IaofQPbfGzcsyh9A8GzUdzbqH0D1fEZcIAUgQHLDonwlFSBA7wn\u002fnColIEBsUFu9LzUgQOmWt900RSBAZt0T\u002fjlVIEDjI3AeP2UgQGBqzD5EdSBA3bAoX0mFIEBa94R\u002fTpUgQNc94Z9TpSBAVIQ9wFi1IEDQypngXcUgQE0R9gBj1SBAyldSIWjlIEBHnq5BbfUgQMTkCmJyBSFAQStngncVIUC+ccOifCUhQDu4H8OBNSFAuP5744ZFIUA1RdgDjFUhQLKLNCSRZSFAL9KQRJZ1IUCsGO1km4UhQClfSYWglSFApqWlpaWlIUAj7AHGqrUhQKAyXuavxSFAHXm6BrXVIUCavxYnuuUhQBcGc0e\u002f9SFAlEzPZ8QFIkARkyuIyRUiQI7Zh6jOJSJACiDkyNM1IkCHZkDp2EUiQAStnAneVSJAgfP4KeNlIkD+OVVK6HUiQHuAsWrthSJA+MYNi\u002fKVIkB1DWqr96UiQPJTxsv8tSJAb5oi7AHGIkDs4H4MB9YiQGkn2ywM5iJA5m03TRH2IkBjtJNtFgYjQOD6740bFiNAXUFMriAmI0Dah6jOJTYjQFfOBO8qRiNA1BRhDzBWI0BRW70vNWYjQM6hGVA6diNAS+h1cD+GI0DILtKQRJYjQEV1LrFJpiNAwbuK0U62I0A+AufxU8YjQLtIQxJZ1iNAOI+fMl7mI0C11ftSY\u002fYjQDIcWHNoBiRAr2K0k20WJEAsqRC0ciYkQKnvbNR3NiRAJjbJ9HxGJECjfCUVglYkQCDDgTWHZiRAnQneVYx2JEAaUDp2kYYkQJeWlpaWliRAFN3ytpumJECRI0\u002fXoLYkQA5qq\u002felxiRAi7AHGKvWJEAI92M4sOYkQIU9wFi19iRAAoQceboGJUB\u002fyniZvxYlQPsQ1bnEJiVAeFcx2sk2JUD1nY36zkYlQHLk6RrUViVA7ypGO9lmJUBscaJb3nYlQOm3\u002fnvjhiVAZv5anOiWJUDjRLe87aYlQGCLE93ytiVA3dFv\u002fffGJUBaGMwd\u002fdYlQNdeKD4C5yVAVKWEXgf3JUDR6+B+DAcmQE4yPZ8RFyZAy3iZvxYnJkBIv\u002fXfGzcmQMUFUgAhRyZAQkyuICZXJkC\u002fkgpBK2cmQDzZZmEwdyZAuR\u002fDgTWHJkA1Zh+iOpcmQLKse8I\u002fpyZAL\u002fPX4kS3JkCsOTQDSscmQCmAkCNP1yZApsbsQ1TnJkAjDUlkWfcmQKBTpYReBydAHZoBpWMXJ0Ca4F3FaCcnQBcnuuVtNydAlG0WBnNHJ0ARtHImeFcnQI76zkZ9ZydAC0ErZ4J3J0CIh4eHh4cnQAXO46eMlydAghRAyJGnJ0D\u002fWpzolrcnQHyh+AicxydA+edUKaHXJ0B2LrFJpucnQPN0DWqr9ydAcLtpirAHKEDsAcaqtRcoQGlIIsu6JyhA5o5+6783KEBj1doLxUcoQOAbNyzKVyhAXWKTTM9nKEDaqO9s1HcoQFfvS43ZhyhA1DWord6XKEBRfATO46coQM7CYO7otyhASwm9Du7HKEDITxkv89coQEWWdU\u002f45yhAwtzRb\u002f33KEA\u002fIy6QAggpQLxpirAHGClAObDm0AwoKUC29kLxETgpQDM9nxEXSClAsIP7MRxYKUAtyldSIWgpQKoQtHImeClAJlcQkyuIKUCjnWyzMJgpQCDkyNM1qClAnSol9Dq4KUAacYEUQMgpQJe33TRF2ClAFP45VUroKUCRRJZ1T\u002fgpQA6L8pVUCCpAi9FOtlkYKkAIGKvWXigqQIVeB\u002fdjOCpAAqVjF2lIKkB\u002f6783blgqQPwxHFhzaCpAeXh4eHh4KkD2vtSYfYgqQHMFMbmCmCpA8EuN2YeoKkBtkun5jLgqQOrYRRqSyCpAZx+iOpfYKkDkZf5anOgqQGCsWnuh+CpA3fK2m6YIK0BaORO8qxgrQNd\u002fb9ywKCtAVMbL\u002fLU4K0DRDCgdu0grQE5ThD3AWCtAy5ngXcVoK0BI4Dx+yngrQMUmmZ7PiCtAQm31vtSYK0C\u002fs1Hf2agrQDz6rf\u002feuCtAuUAKIOTIK0A2h2ZA6dgrQLPNwmDu6CtAMBQfgfP4K0CtWnuh+AgsQCqh18H9GCxAp+cz4gIpLEAkLpACCDksQKF07CINSSxAHrtIQxJZLECaAaVjF2ksQBdIAYQceSxAlI5dpCGJLEAR1bnEJpksQI4bFuUrqSxAC2JyBTG5LECIqM4lNsksQAXvKkY72SxAgjWHZkDpLED\u002fe+OGRfksQHzCP6dKCS1A+Qicx08ZLUB2T\u002fjnVCktQPOVVAhaOS1AcNywKF9JLUDtIg1JZFktQGppaWlpaS1A56\u002fFiW55LUBk9iGqc4ktQOE8fsp4mS1AXoPa6n2pLUDbyTYLg7ktQFgQkyuIyS1A1VbvS43ZLUBRnUtskuktQM7jp4yX+S1ASyoErZwJLkDIcGDNoRkuQEW3vO2mKS5Awv0YDqw5LkA\u002fRHUusUkuQLyK0U62WS5AOdEtb7tpLkC2F4qPwHkuQDNe5q\u002fFiS5AsKRC0MqZLkAt657wz6kuQKox+xDVuS5AJ3hXMdrJLkCkvrNR39kuQCEFEHLk6S5Anktskun5LkAbksiy7gkvQJjYJNPzGS9AFR+B8\u002fgpL0CSZd0T\u002fjkvQA+sOTQDSi9Ai\u002fKVVAhaL0AIOfJ0DWovQIV\u002fTpUSei9AAsaqtReKL0B\u002fDAfWHJovQPxSY\u002fYhqi9AeZm\u002fFie6L0D23xs3LMovQHMmeFcx2i9A8GzUdzbqL0BtszCYO\u002fovQPV8RlwgBTBAM6B07CINMEByw6J8JRUwQLDm0AwoHTBA7wn\u002fnColMEAtLS0tLS0wQGxQW70vNTBAqnOJTTI9MEDplrfdNEUwQCe65W03TTBAZt0T\u002fjlVMECkAEKOPF0wQOMjcB4\u002fZTBAIUeerkFtMEBgasw+RHUwQJ6N+s5GfTBA3bAoX0mFMEAb1FbvS40wQFr3hH9OlTBAmBqzD1GdMEDXPeGfU6UwQBVhDzBWrTBAVIQ9wFi1MECSp2tQW70wQNDKmeBdxTBAD+7HcGDNMEBNEfYAY9UwQIw0JJFl3TBAyldSIWjlMEAJe4Cxau0wQEeerkFt9TBAhsHc0W\u002f9MEDE5ApicgUxQAMIOfJ0DTFAQStngncVMUCATpUSeh0xQL5xw6J8JTFA\u002fZTxMn8tMUA7uB\u002fDgTUxQHrbTVOEPTFAuP5744ZFMUD3IapziU0xQDVF2AOMVTFAdGgGlI5dMUCyizQkkWUxQPGuYrSTbTFAL9KQRJZ1MUBt9b7UmH0xQKwY7WSbhTFA6jsb9Z2NMUApX0mFoJUxQGeCdxWjnTFApqWlpaWlMUDkyNM1qK0xQCPsAcaqtTFAYQ8wVq29MUCgMl7mr8UxQN5VjHayzTFAHXm6BrXVMUBbnOiWt90xQJq\u002fFie65TFA2OJEt7ztMUAXBnNHv\u002fUxQFUpodfB\u002fTFAlEzPZ8QFMkDSb\u002f33xg0yQBGTK4jJFTJAT7ZZGMwdMkCO2YeoziUyQMz8tTjRLTJACiDkyNM1MkBJQxJZ1j0yQIdmQOnYRTJAxoluedtNMkAErZwJ3lUyQEPQypngXTJAgfP4KeNlMkDAFie65W0yQP45VUrodTJAPV2D2up9MkB7gLFq7YUyQLqj3\u002frvjTJA+MYNi\u002fKVMkA36jsb9Z0yQHUNaqv3pTJAtDCYO\u002fqtMkDyU8bL\u002fLUyQDF39Fv\u002fvTJAb5oi7AHGMkCuvVB8BM4yQOzgfgwH1jJAKwStnAneMkBpJ9ssDOYyQKhKCb0O7jJA5m03TRH2MkAkkWXdE\u002f4yQGO0k20WBjNAodfB\u002fRgOM0Dg+u+NGxYzQB4eHh4eHjNAXUFMriAmM0CbZHo+Iy4zQNqHqM4lNjNAGKvWXig+M0BXzgTvKkYzQJXxMn8tTjNA1BRhDzBWM0ASOI+fMl4zQFFbvS81ZjNAj37rvzduM0DOoRlQOnYzQAzFR+A8fjNAS+h1cD+GM0CJC6QAQo4zQMgu0pBEljNABlIAIUeeM0BFdS6xSaYzQIOYXEFMrjNAwbuK0U62M0AA37hhUb4zQD4C5\u002fFTxjNAfSUVglbOM0C7SEMSWdYzQPprcaJb3jNAOI+fMl7mM0B3ss3CYO4zQLXV+1Jj9jNA9Pgp42X+M0AyHFhzaAY0QHE\u002fhgNrDjRAr2K0k20WNEDuheIjcB40QCypELRyJjRAa8w+RHUuNECp72zUdzY0QOgSm2R6PjRAJjbJ9HxGNEBlWfeEf040QKN8JRWCVjRA4p9TpYReNEAgw4E1h2Y0QF7mr8WJbjRAnQneVYx2NEDbLAzmjn40QBpQOnaRhjRAWHNoBpSONECXlpaWlpY0QNW5xCaZnjRAFN3ytpumNEBSACFHnq40QJEjT9egtjRAz0Z9Z6O+NEAOaqv3pcY0QEyN2YeozjRAi7AHGKvWNEDJ0zWord40QAj3Yziw5jRARhqSyLLuNECFPcBYtfY0QMNg7ui3\u002fjRAAoQceboGNUBAp0oJvQ41QH\u002fKeJm\u002fFjVAve2mKcIeNUD7ENW5xCY1QDo0A0rHLjVAeFcx2sk2NUC3el9qzD41QPWdjfrORjVANMG7itFONUBy5Oka1FY1QLEHGKvWXjVA7ypGO9lmNUAuTnTL2241QGxxolvedjVAq5TQ6+B+NUDpt\u002f5744Y1QCjbLAzmjjVAZv5anOiWNUClIYks6541QONEt7ztpjVAImjlTPCuNUBgixPd8rY1QJ+uQW31vjVA3dFv\u002fffGNUAc9Z2N+s41QFoYzB391jVAmDv6rf\u002feNUDXXig+Auc1QBWCVs4E7zVAVKWEXgf3NUCSyLLuCf81QNHr4H4MBzZADw8PDw8PNkBOMj2fERc2QIxVay8UHzZAy3iZvxYnNkAJnMdPGS82QEi\u002f9d8bNzZAhuIjcB4\u002fNkDFBVIAIUc2QAMpgJAjTzZAQkyuICZXNkCAb9ywKF82QL+SCkErZzZA\u002fbU40S1vNkA82WZhMHc2QHr8lPEyfzZAuR\u002fDgTWHNkD3QvEROI82QDVmH6I6lzZAdIlNMj2fNkCyrHvCP6c2QPHPqVJCrzZAL\u002fPX4kS3NkBuFgZzR782QKw5NANKxzZA61xik0zPNkApgJAjT9c2QGijvrNR3zZApsbsQ1TnNkDl6RrUVu82QCMNSWRZ9zZAYjB39Fv\u002fNkCgU6WEXgc3QN920xRhDzdAHZoBpWMXN0BcvS81Zh83QJrgXcVoJzdA2QOMVWsvN0AXJ7rlbTc3QFZK6HVwPzdAlG0WBnNHN0DSkESWdU83QBG0ciZ4VzdAT9egtnpfN0CO+s5GfWc3QMwd\u002fdZ\u002fbzdAC0ErZ4J3N0BJZFn3hH83QIiHh4eHhzdAxqq1F4qPN0AFzuOnjJc3QEPxETiPnzdAghRAyJGnN0DAN25YlK83QP9anOiWtzdAPX7KeJm\u002fN0B8ofgInMc3QLrEJpmezzdA+edUKaHXN0A3C4O5o983QHYusUmm5zdAtFHf2ajvN0DzdA1qq\u002fc3QDGYO\u002fqt\u002fzdAcLtpirAHOECu3pcasw84QOwBxqq1FzhAKyX0OrgfOEBpSCLLuic4QKhrUFu9LzhA5o5+6783OEAlsqx7wj84QGPV2gvFRzhAovgInMdPOEDgGzcsylc4QB8\u002fZbzMXzhAXWKTTM9nOECchcHc0W84QNqo72zUdzhAGcwd\u002fdZ\u002fOEBX70uN2Yc4QJYSeh3cjzhA1DWord6XOEATWdY94Z84QFF8BM7jpzhAkJ8yXuavOEDOwmDu6Lc4QA3mjn7rvzhASwm9Du7HOECJLOue8M84QMhPGS\u002fz1zhABnNHv\u002fXfOEBFlnVP+Oc4QIO5o9\u002f67zhAwtzRb\u002f33OEAAAAAAAAA5QA=="},"y":{"dtype":"f8","bdata":"AzHUlPz+7z+v3y1oAf\u002fvP67Qsi8G\u002f+8\u002fh7RH6wr\u002f7z\u002fKCtKaD\u002f\u002fvPx8mOD4U\u002f+8\u002fQTBh1Rj\u002f7z\u002ffLTVgHf\u002fvP1kCnd4h\u002f+8\u002fZnOCUCb\u002f7z+bLNC1Kv\u002fvP8\u002fCcQ4v\u002f+8\u002fXrdTWjP\u002f7z9Me2OZN\u002f\u002fvPzlyj8s7\u002f+8\u002fRPXG8D\u002f\u002f7z+tVfoIRP\u002fvP2TfGhRI\u002f+8\u002fYtsaEkz\u002f7z\u002fcke0CUP\u002fvP0NMh+ZT\u002f+8\u002fJFfdvFf\u002f7z\u002fIA+aFW\u002f\u002fvP6+pmEFf\u002f+8\u002f1aft72L\u002f7z\u002fGZd6QZv\u002fvP3xUZSRq\u002f+8\u002fC+99qm3\u002f7z8TuyQjcf\u002fvP\u002f9IV450\u002f+8\u002fAzQU7Hf\u002f7z\u002fsIVs8e\u002f\u002fvP63CLH9+\u002f+8\u002fs8+KtIH\u002f7z\u002f+CnjchP\u002fvP\u002fY9+PaH\u002f+8\u002fDjgQBIv\u002f7z8ZzcUDjv\u002fvP2vTH\u002faQ\u002f+8\u002friEm25P\u002f7z+CjOGylv\u002fvP83jW32Z\u002f+8\u002f2O+fOpz\u002f7z8Ubrnqnv\u002fvP6kNtY2h\u002f+8\u002fvmugI6T\u002f7z93D4qspv\u002fvP61lgSip\u002f+8\u002faLyWl6v\u002f7z\u002f9Pdv5rf\u002fvP\u002f7rYE+w\u002f+8\u002fzZk6mLL\u002f7z\u002fv5nvUtP\u002fvPw85OQS3\u002f+8\u002fyLWHJ7n\u002f7z8FPH0+u\u002f\u002fvPzZdMEm9\u002f+8\u002fIla4R7\u002f\u002f7z98By06wf\u002fvPx7upiDD\u002f+8\u002f+ho\u002f+8T\u002f7z++Kg\u002fKxv\u002fvPyo9MY3I\u002f+8\u002fEOy\u002fRMr\u002f7z\u002f+Qdbwy\u002f\u002fvP6Cwj5HN\u002f+8\u002fxAYIJ8\u002f\u002f7z8LZlux0P\u002fvP0A4pjDS\u002f+8\u002fVCQFpdP\u002f7z8HA5UO1f\u002fvPyDTcm3W\u002f+8\u002fUK27wdf\u002f7z+3t4wL2f\u002fvP\u002fAYA0va\u002f+8\u002fueo7gNv\u002f7z8wLFSr3P\u002fvP5azaMzd\u002f+8\u002fnR+W497\u002f7z8tyPjw3\u002f\u002fvP7SurPTg\u002f+8\u002f2G3N7uH\u002f7z+qKHbf4v\u002fvPyh5wcbj\u002f+8\u002fLF7JpOT\u002f7z+dKKd55f\u002fvP\u002fVnc0Xm\u002f+8\u002f+9VFCOf\u002f7z+kQTXC5\u002f\u002fvPx15V3Po\u002f+8\u002f4TLBG+n\u002f7z\u002fL9YW76f\u002fvPxEAuFLq\u002f+8\u002fHC1o4er\u002f7z8b2qVn6\u002f\u002fvP0HJfuXr\u002f+8\u002fjQP\u002fWuz\u002f7z\u002f+uDDI7P\u002fvPyUfHC3t\u002f+8\u002fyU3Hie3\u002f7z+2GTbe7f\u002fvP0TtaSru\u002f+8\u002frZ5hbu7\u002f7z\u002fNQxmq7v\u002fvPzgDit3u\u002f+8\u002fV+KpCO\u002f\u002f7z9ckGsr7\u002f\u002fvP7stvkXv\u002f+8\u002f4w+NV+\u002f\u002f7z\u002fbgL9g7\u002f\u002fvP4F6OGHv\u002f+8\u002f41zWWO\u002f\u002f7z91n3JH7\u002f\u002fvP3N84Szv\u002f+8\u002fOpbxCO\u002f\u002f7z++lWvb7v\u002fvP8fBEaTu\u002f+8\u002fII6fYu7\u002f7z8aIskW7v\u002fvP5bVOsDt\u002f+8\u002fs6OYXu3\u002f7z9Dkn3x7P\u002fvP\u002fEMe3js\u002f+8\u002f\u002fjIY8+v\u002f7z9qFtFg6\u002f\u002fvPxDrFcHq\u002f+8\u002faCRKE+r\u002f7z8lgMNW6f\u002fvPwv8yIro\u002f+8\u002f\u002fbSRruf\u002f7z8NrUPB5v\u002fvP1t28sHl\u002f+8\u002fDcCdr+T\u002f7z+Hwi+J4\u002f\u002fvP9iHe03i\u002f+8\u002fxww7++D\u002f7z\u002fUNg2R3\u002f\u002fvP9Gacw3e\u002f+8\u002fmQ\u002fQbtz\u002f7z+1B2Kz2v\u002fvPy2sQ9nY\u002f+8\u002fh7Jm3tb\u002f7z\u002fK5pDA1P\u002fvPwhiWH3S\u002f+8\u002f5WQfEtD\u002f7z\u002fTzA98zf\u002fvP4UZFrjK\u002f+8\u002fI\u002ffbwsf\u002f7z94QMKYxP\u002fvP+tq2jXB\u002f+8\u002feEzflb3\u002f7z8iKi20uf\u002fvP3L7uIu1\u002f+8\u002fSM0GF7H\u002f7z\u002fCKx9QrP\u002fvP4h4gzCn\u002f+8\u002fPQ8hsaH\u002f7z+9FkPKm\u002f\u002fvP9jZgnOV\u002f+8\u002foX22o47\u002f7z\u002fS5t1Qh\u002f\u002fvPwmaDXB\u002f\u002f+8\u002fcFxX9Xb\u002f7z+JU7DTbf\u002fvP6la1Pxj\u002f+8\u002fMzwmYVn\u002f7z8tcozvTf\u002fvP+QGSpVB\u002f+8\u002fKiHTPTT\u002f7z+fuZzSJf\u002fvP+Hl5joW\u002f+8\u002fRxSBWwX\u002f7z+DfYcW8\u002f7vP0r6GEvf\u002fu8\u002f5E8E1cn+7z9G6GuMsv7vP57HXkWZ\u002fu8\u002fLWplz33+7z9eCAH1X\u002f7vP4+MG3s\u002f\u002fu8\u002fOUxmIBz+7z9FVKWc9f3vP\u002fLN5J\u002fL\u002fe8\u002f6KuV0Z397z98bo7Pa\u002f3vP8te7Cw1\u002fe8\u002faSLRcPn87z9++PcUuPzvP\u002fZMHYRw\u002fO8\u002ftpEyGCL87z8Rd1cYzPvvP\u002fKmkLZt++8\u002fZg0zDQb77z95ePkblPrvP4zquMQW+u8\u002fmFemx4z57z9Spx6\u002f9PjvP\u002fKz3xpN+O8\u002fR46eGpT37z9ZieTHx\u002fbvP\u002fpmGe\u002fl9e8\u002fY2adF+z07z\u002f44dF61\u002fPvP2yJ6vmk8u8\u002fZgxcElHx7z8eJ7fQ1+\u002fvP7JnuME07u8\u002fa6JN4WLs7z\u002fh2kmHXOrvP5Zgd1Eb6O8\u002fGQOuCpjl7z8Pn4iOyuLvP1P7Samp3+8\u002fzS918yrc7z\u002fK+JGoQtjvP6zuiXjj0+8\u002fH2EBU\u002f7O7z+eqQYsgsnvP4e1brlbw+8\u002fMWw3KHW87z+0T1PJtbTvPyYaWbUBrO8\u002fXiu7Zjmi7z8w3WtKOZfvP8aMNUfZiu8\u002fWrCZPOx87z9tTs56P23vP+OlezaaW+8\u002fOgM+\u002fLxH7z8sT7wpYTHvPzyEbXQ4GO8\u002f7uX9iOz77j\u002fGabHRHtzuP4RMHnZouO4\u002fu\u002fMMq1qQ7j+7dfBtf2PuP9H50MtaMe4\u002fWNzs1mz57T90gLhvNLvtP1m10wMzdu0\u002fVz9IXvEp7T92BwaWBdbsP\u002fDCVhAaeuw\u002fRRria\u002fUV7D\u002fkdUH+gqnrPzak0lzbNOs\u002fsUNKN0y46j9+c6OgXjTqPw4yMc3aqek\u002fKKUMV8gZ6T8qAUxOaoXoPzgU17o27uc\u002fPzGCuslV5z9MeTj81L3mP3EfsOQMKOY\u002fMsCADBWW5T\u002fj1+3qbQnlP6MRmFplg+Q\u002fkE0nPQsF5D9JK5jvKo\u002fjP\u002feJFaFJIuM\u002fmgVTEKm+4j+YARHNTWTiPycUeOYHE+I\u002ftRsq6XzK4T+b7rouMorhPwkScLWWUeE\u002fC3vB9Asg4T9i0DNe7fTgP7MU6GuWz+A\u002f+IOWQ2ev4D9AtnENyJPgP4yYRCwrfOA\u002fPJByiQ5o4D+9POMm\u002fFbgPx1ElCSKSOA\u002fr\u002fpRYVo84D+liDjXGTLgPzFF7c1\u002fKeA\u002f1kt09kwi4D+uIFl\u002fShzgP7IQoCtJF+A\u002ffrGUcyAT4D9F4O6zrQ\u002fgP5cI1G3TDOA\u002fWjvPmHgK4D+3KdsGiAjgP+W27NnvBuA\u002fUPv+CaEF4D8XuGH6jgTgP1Bd7ByvA+A\u002fs+uvofgC4D9vnckxZALgPznRCbTrAeA\u002feiQ6GooB4D\u002fTHug1OwHgP4tMtZP7AOA\u002fKdBIXMgA4D93cBg6nwDgP1dyV0N+AOA\u002fKd5v52MA4D9NCn\u002ffTgDgPw1oYCE+AOA\u002fbbHh1DAA4D8d08lKJgDgP41raPUdAOA\u002fxJ5uYhcA4D\u002f+dds1EgDgP14yziUOAOA\u002fiAcY9woA4D\u002f5wGx6CADgP8ACF4oGAOA\u002f30AZCAUA4D+RSajcAwDgPxJt7\u002fQCAOA\u002fs\u002f0QQgIA4D\u002fhJli4AQDgP6oAk04BAOA\u002ffF2N\u002fQAA4D+tJKa\u002fAADgPzgoepAAAOA\u002f\u002fE+gbAAA4D87uHNRAADgPz0C6TwAAOA\u002fEptsLQAA4D9+KcghAADgP2OtDRkAAOA\u002fIySHEgAA4D+wwKkNAADgP032CwoAAOA\u002fKbxdBwAA4D8wj2IFAADgPx\u002fR7AMAAOA\u002f8TfaAgAA4D83ERECAADgP7YpfgEAAOA\u002f9jMTAQAA4D\u002fWkMUAAADgPzRjjQAAAOA\u002fRt1kAAAA4D\u002fmuUcAAADgP1zXMgAAAOA\u002fj+sjAAAA4D9nSxkAAADgP7HAEQAAAOA\u002f2WoMAAAA4D\u002fZpwgAAADgPysDBgAAAOA\u002fTCkEAAAA4D+a3gIAAADgP574AQAAAOA\u002fPFkBAAAA4D8s6wAAAADgP3CfAAAAAOA\u002fhGsAAAAA4D8MSAAAAADgP+cvAAAAAOA\u002fiR8AAAAA4D96FAAAAADgPwkNAAAAAOA\u002fDAgAAAAA4D+3BAAAAADgP38CAAAAAOA\u002fBwEAAAAA4D8PAAAAAADgP9j+\u002f\u002f\u002f\u002f\u002f98\u002fA\u002f7\u002f\u002f\u002f\u002f\u002f3z94\u002ff\u002f\u002f\u002f\u002f\u002ffPx39\u002f\u002f\u002f\u002f\u002f98\u002f4\u002fz\u002f\u002f\u002f\u002f\u002f3z+9\u002fP\u002f\u002f\u002f\u002f\u002ffP6X8\u002f\u002f\u002f\u002f\u002f98\u002flfz\u002f\u002f\u002f\u002f\u002f3z+L\u002fP\u002f\u002f\u002f\u002f\u002ffP4X8\u002f\u002f\u002f\u002f\u002f98\u002fgvz\u002f\u002f\u002f\u002f\u002f3z9+\u002fP\u002f\u002f\u002f\u002f\u002ffP338\u002f\u002f\u002f\u002f\u002f98\u002fffz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffP3v8\u002f\u002f\u002f\u002f\u002f98\u002fe\u002fz\u002f\u002f\u002f\u002f\u002f3z97\u002fP\u002f\u002f\u002f\u002f\u002ffPw=="},"type":"scatter","xaxis":"x2","yaxis":"y2"}],                        {"template":{"layout":{"font":{"color":"#333333","family":"Alegreya, serif","size":14},"legend":{"font":{"size":12}},"title":{"font":{"size":20}},"xaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}},"yaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}}}},"xaxis":{"anchor":"y","domain":[0.0,1.0],"matches":"x2","showticklabels":false},"yaxis":{"anchor":"x","domain":[0.56,1.0],"title":{"text":"Hazard rate"}},"xaxis2":{"anchor":"y2","domain":[0.0,1.0],"title":{"text":"Time t"}},"yaxis2":{"anchor":"x2","domain":[0.0,0.44],"title":{"text":"π_d(t)"},"range":[0,1.05]},"annotations":[{"font":{"size":16},"showarrow":false,"text":"Hazard rates","x":0.5,"xanchor":"center","xref":"paper","y":1.0,"yanchor":"bottom","yref":"paper"},{"font":{"size":16},"showarrow":false,"text":"Conditional doom probability π_d(t)","x":0.5,"xanchor":"center","xref":"paper","y":0.44,"yanchor":"bottom","yref":"paper"},{"font":{"color":"#c0392b","size":13},"showarrow":false,"text":"Dangerous\u003cbr\u003ewindow","x":5.678973717146434,"xref":"x","y":2.5,"yref":"y"}],"shapes":[{"fillcolor":"rgba(192,57,43,0.10)","line":{"color":"#c0392b","dash":"dash","width":1},"type":"rect","x0":3.3479349186483107,"x1":8.010012515644556,"xref":"x","y0":0,"y1":1,"yref":"y domain"},{"fillcolor":"rgba(192,57,43,0.10)","line":{"color":"#c0392b","dash":"dash","width":1},"type":"rect","x0":3.3479349186483107,"x1":8.010012515644556,"xref":"x2","y0":0,"y1":1,"yref":"y2 domain"}],"legend":{"bgcolor":"rgba(255,255,255,0.5)","bordercolor":"#ccc","borderwidth":1},"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified","height":560},                        {"responsive": true}                    ).then(function(){
                            
var gd = document.getElementById('e5243881-f7bc-4943-953c-6481726bed38');
var x = new MutationObserver(function (mutations, observer) {{
        var display = window.getComputedStyle(gd).display;
        if (!display || display === 'none') {{
            console.log([gd, 'removed!']);
            Plotly.purge(gd);
            observer.disconnect();
        }}
}});

// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
    x.observe(notebookContainer, {childList: true});
}}

// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
    x.observe(outputEl, {childList: true});
}}

                        })                };            </script>        </div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-dangerous-window-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;5: The capability overhang. Sigmoidal g and h with the doom threshold reached before the safety threshold create a dangerous window (shaded) in which π_d ≈ 1. Compute rate c(t) = e^{0.3t}, α = 0.3.
</figcaption>
</figure>
</div>
</div>
</section>
<section id="all-compute-bad" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="all-compute-bad"><span class="header-section-number">6</span> What if safety compute is also capabilities compute?</h2>
<p>In our base model, the doom hazard depends only on capabilities compute <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c">, and the deliverance hazard depends only on safety compute <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s">. But that separation is optimistic. Safety research often requires running large models, probing their behaviour, red-teaming, and training oversight systems — all of which also advance capabilities as a side effect. At the limit, maybe <em>all</em> compute advances capabilities, regardless of intent — we cannot do useful safety research without also pushing the capability frontier forward.</p>
<p>The externality model modifies the hazard rates to reflect this:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Clambda_d(t)%20=%20g%5Cbigl(%5Cmathcal%7BC%7D(t)%5Cbigr),%20%5Cqquad%20%5Clambda_s(t)%20=%20h%5Cbigl(%5Cmathcal%7BC%7D_s(t)%5Cbigr),%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D(t)%20=%20%5Cmathcal%7BC%7D_c(t)%20+%20%5Cmathcal%7BC%7D_s(t)"> is the <em>total</em> cumulative compute. The doom hazard rate now depends on everything — capability compute and safety compute alike — while the deliverance hazard rate still depends only on the safety fraction.</p>
<p>In this model, the allocation <img src="https://latex.codecogs.com/png.latex?%5Calpha"> cannot reduce the doom hazard rate at all. Since <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D(t)%20=%20%5Cint_0%5Et%20c(u)%5C,du"> holds regardless of how the compute is split, the doom hazard is set entirely by the exogenous trajectory <img src="https://latex.codecogs.com/png.latex?c(t)">. The only thing <img src="https://latex.codecogs.com/png.latex?%5Calpha"> can do is push the deliverance hazard rate up fast enough to compete with it.</p>
<p>The conditional doom probability becomes</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi_d(t)%20=%20%5Cfrac%7Bg(%5Cmathcal%7BC%7D(t))%7D%7Bg(%5Cmathcal%7BC%7D(t))%20+%20h(%5Cmathcal%7BC%7D_s(t))%7D.%0A"></p>
<p>In the linear case (<img src="https://latex.codecogs.com/png.latex?g(x)%20=%20ax">, <img src="https://latex.codecogs.com/png.latex?h(x)%20=%20bx">, with constant <img src="https://latex.codecogs.com/png.latex?%5Calpha">), this simplifies to</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cpi_d%20=%20%5Cfrac%7Ba%5C,%5Cmathcal%7BC%7D(t)%7D%7Ba%5C,%5Cmathcal%7BC%7D(t)%20+%20b%5C,%5Calpha%5C,%5Cmathcal%7BC%7D(t)%7D%20=%20%5Cfrac%7Ba%7D%7Ba%20+%20b%5Calpha%7D.%0A"></p>
<p>Let’s compare this with the separable model’s <img src="https://latex.codecogs.com/png.latex?%5Cpi_d%20=%20a(1-%5Calpha)/(a(1-%5Calpha)%20+%20b%5Calpha)">. The externality model is always worse: the numerator is <img src="https://latex.codecogs.com/png.latex?a"> rather than <img src="https://latex.codecogs.com/png.latex?a(1-%5Calpha)">, because diverting compute to safety no longer reduces the doom hazard — it only increases the deliverance hazard. With <img src="https://latex.codecogs.com/png.latex?a%20=%20b">, the separable model gives <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)%20=%200.5"> at <img src="https://latex.codecogs.com/png.latex?%5Calpha%20=%200.5">; the externality model gives <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bdoom%7D)%20=%200.5"> at <img src="https://latex.codecogs.com/png.latex?%5Calpha%20=%201"> — we need <em>all</em> our compute on safety just to get even odds.</p>
<p>Even at <img src="https://latex.codecogs.com/png.latex?%5Calpha%20=%201">, the doom hazard hasn’t gone away. It’s <img src="https://latex.codecogs.com/png.latex?g(%5Cmathcal%7BC%7D_s(t))"> — because all that safety compute is also capability compute. We’re in a race where every step toward deliverance also drags doom closer.</p>
<div id="cell-fig-externality-pdoom" class="cell" data-execution_count="7">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb6-1">alphas_ext <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.99</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">80</span>)</span>
<span id="cb6-2">t_ext <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2000</span>)</span>
<span id="cb6-3"></span>
<span id="cb6-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> compute_pdoom_externality(g_fn, h_fn, alpha_val, r):</span>
<span id="cb6-5">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""P(doom) under the externality model: g depends on total compute."""</span></span>
<span id="cb6-6">    c_rate <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t_ext)</span>
<span id="cb6-7">    C_total <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(c_rate, t_ext, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-8">    Cs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(alpha_val <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t_ext, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-9">    ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> g_fn(C_total)       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># doom depends on TOTAL compute</span></span>
<span id="cb6-10">    ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> h_fn(Cs)             <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># deliverance depends on safety compute only</span></span>
<span id="cb6-11">    cumhaz <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ls, t_ext, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-12">    S <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>cumhaz)</span>
<span id="cb6-13">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> np.trapezoid(ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> S, t_ext)</span>
<span id="cb6-14"></span>
<span id="cb6-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> compute_pdoom_separable(g_fn, h_fn, alpha_val, r):</span>
<span id="cb6-16">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""P(doom) under the separable model: g depends on capability compute only."""</span></span>
<span id="cb6-17">    c_rate <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> t_ext)</span>
<span id="cb6-18">    Cc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid((<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> alpha_val) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t_ext, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-19">    Cs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(alpha_val <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> c_rate, t_ext, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-20">    ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> g_fn(Cc)</span>
<span id="cb6-21">    ls <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> h_fn(Cs)</span>
<span id="cb6-22">    cumhaz <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> cumulative_trapezoid(ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> ls, t_ext, initial<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb6-23">    S <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.exp(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>cumhaz)</span>
<span id="cb6-24">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> np.trapezoid(ld <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> S, t_ext)</span>
<span id="cb6-25"></span>
<span id="cb6-26">fig <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> go.Figure()</span>
<span id="cb6-27"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> g_fn, h_fn, name, col <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [</span>
<span id="cb6-28">    (g_lin, h_lin, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Linear"</span>, C_NEUT),</span>
<span id="cb6-29">    (g_pess, h_pess, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Pessimistic"</span>, C_DOOM),</span>
<span id="cb6-30">    (g_opt, h_opt, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Optimistic"</span>, C_SALV),</span>
<span id="cb6-31">]:</span>
<span id="cb6-32">    r <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.1</span></span>
<span id="cb6-33">    pd_sep <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.array([compute_pdoom_separable(g_fn, h_fn, a, r) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> a <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> alphas_ext])</span>
<span id="cb6-34">    pd_ext <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.array([compute_pdoom_externality(g_fn, h_fn, a, r) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> a <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> alphas_ext])</span>
<span id="cb6-35">    fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alphas_ext, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>pd_sep, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> (separable)"</span>,</span>
<span id="cb6-36">                             line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>col, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, dash<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dash"</span>),</span>
<span id="cb6-37">                             hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"α=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  P(doom)=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.3f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>))</span>
<span id="cb6-38">    fig.add_trace(go.Scatter(x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alphas_ext, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>pd_ext, name<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> (externality)"</span>,</span>
<span id="cb6-39">                             line<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>col, width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>),</span>
<span id="cb6-40">                             hovertemplate<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"α=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x:.2f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">  P(doom)=%</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{y:.3f}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>))</span>
<span id="cb6-41"></span>
<span id="cb6-42">fig.add_hline(y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>, line_dash<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dot"</span>, line_color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#bbb"</span>, annotation_text<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"P(doom) = ½"</span>,</span>
<span id="cb6-43">              annotation_position<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"bottom right"</span>)</span>
<span id="cb6-44">fig.update_layout(</span>
<span id="cb6-45">    <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>LAYOUT,</span>
<span id="cb6-46">    xaxis_title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Safety fraction α"</span>,</span>
<span id="cb6-47">    yaxis_title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"P(doom)"</span>,</span>
<span id="cb6-48">    height<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">480</span>,</span>
<span id="cb6-49">)</span>
<span id="cb6-50">fig.show()</span></code></pre></div></div>
</details>
<div id="fig-externality-pdoom" class="cell-output cell-output-display quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-externality-pdoom-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div>            <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script><script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>                <script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
        <script charset="utf-8" src="https://cdn.plot.ly/plotly-3.1.1.min.js" integrity="sha256-HUEFyfiTnZJxCxur99FjbKYTvKSzwDaD3/x5TqHpFu4=" crossorigin="anonymous"></script>                <div id="34aa30be-4555-41bc-8af7-5072fe2aef7a" class="plotly-graph-div" style="height:480px; width:100%;"></div>            <script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("34aa30be-4555-41bc-8af7-5072fe2aef7a")) {                    Plotly.newPlot(                        "34aa30be-4555-41bc-8af7-5072fe2aef7a",                        [{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#7f8c8d","dash":"dash","width":2},"name":"Linear (separable)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"yx5NMgzM7z8pwjjkwovvPz2hIm7eSu8\u002fR7K6m1wJ7z\u002fWUPMtO8fuP8SCv9p3hO4\u002foljPTBBB7j8zWEojAv3tPwbhh\u002fFKuO0\u002fcXjFPuhy7T9t69qF1yztP6Ey7DQW5uw\u002f\u002fgQZraGe7D9dBCpCd1bsP05uOzqUDew\u002fIjtlzfXD6z+0k2AlmXnrP+KFKl17Lus\u002fZ96jgJni6j8bDi6M8JXqPwn\u002fRGx9SOo\u002fLr0V\u002fTz66T8u1REKLKvpPyNKf01HW+k\u002fgQIFcIsK6T9kijMI9bjoP4oICpqAZug\u002flEF3lioT6D9Hg9Za777nP6xQaDDLaec\u002fSKXGS7oT5z+gpFTMuLzmP7uIqbvCZOY\u002fz6D2DNQL5j\u002fpLmic6LHlPz3xgC78VuU\u002fiyFwbwr75D+tsmHyDp7kP2+RyDAFQOQ\u002f0quiiejg4z9yfrZAtIDjPwvlyX1jH+M\u002fEujRS\u002fG84j\u002fvPRuYWFniP\u002fYyazGU9OE\u002fnacYx56O4T\u002fI0BzocifhP3VhGwILv+A\u002fj8FhYGFV4D\u002f14LlV4NTfP6FbC8pi\u002fN4\u002fVvqE2T0h3j88Kn7yZEPdP2GHcTPLYtw\u002fRpl+aGN\u002f2z8BgNMIIJnaP8OA\u002fTPzr9k\u002f7lMfr87D2D\u002f+Bgzio9TXP8c1RdRj4tY\u002fAU7bKf\u002fs1T9Qfi4gZvTUPzXgjoqI+NM\u002fAli6zlX50j\u002fDkTbhvPbRPylshUGs8NA\u002fmBVk7CPOzz9ZYWkRt7PNP5jTVgLskcs\u002fstzKw5toyT\u002fdGX5FnjfHPxuTl1jK\u002fsQ\u002fBHuYpfW9wj+AQtqh9HTAP94KMwk1R7w\u002fYgwQd3KTtz+iLb+9Qs6yPzfPvZOI7qs\u002fDcx0VCUcoj\u002faApDSGUmQPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#7f8c8d","width":3},"name":"Linear (externality)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"Y1WomI3M7z+eY6o+To7vP7AuF7sAUe8\u002fY9wzl58U7z9mfxeGJdnuP+HxHWONnu4\u002ffDxsMNJk7j8XpIUV7yvuP2CF8F3f8+0\u002fmTLqd5687T+2EinzJ4btP8dMrH93UO0\u002fMVSY7Igb7T8ltB8nWOfsP76Bdznhs+w\u002fmuTWSSCB7D98LYGZEU\u002fsPz\u002f62YOxHew\u002fPe2Cffzs6z+shIIT77zrP+Ckc+qFjes\u002fJm69vb1e6z8e\u002fNJekzDrP9OxerQDA+s\u002fvLocugvW6j\u002f\u002fbBh\u002fqKnqP\u002fQ9ICbXfeo\u002f3P2b5JRS6j89ExEC3yfqP4dykNey\u002fek\u002fahEqzw3U6T\u002fomGVj7arpP+4bwB5Pguk\u002fX5sumzBa6T\u002fRIqWBjzLpPy5MoolpC+k\u002fi\u002fq+eLzk6D\u002fvHkIihr7oP\u002fhbuGbEmOg\u002fF1+PM3Vz6D+ByLSClk7oP0B8OFomKug\u002f\u002fTjyyyIG6D+DUir1ieLnP35vRf5Zv+c\u002f5ytzGpGc5z8ngl+HLXrnP0Pf5owtWOc\u002fzcbMfI825z8x7XSyURXnP62vnpJy9OY\u002fjdIii\u002fDT5j87b7MSyrPmP7n8naj9k+Y\u002fBF6P1Il05j+w4lkmbVXmPwgnvTWmNuY\u002fwcEvojMY5j\u002f4raoSFPrlPwJhdjVG3OU\u002fW3z5v8i+5T+GDIlumqHlP1hGOgS6hOU\u002f5rS1SiZo5T+rygsS3kvlPzPJijDgL+U\u002fBfOVgisU5T\u002f\u002f+33qvvjkPwqtWlCZ3eQ\u002fHbDlobnC5D9NelbSHqjkP\u002fhJP9rHjeQ\u002fVi9rt7Nz5D9eFr1s4VnkPxfJDwJQQOQ\u002f5+EWhP4m5D+PpUAE7A3kPzu9mJgX9eM\u002f5MirW4Dc4z\u002fWwmtsJcTjPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#c0392b","dash":"dash","width":2},"name":"Pessimistic (separable)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"BlRR\u002fdDZ7T9eu7faFtHsPxrmZmz7DOw\u002fI\u002fySvtto6z9TsaKK6NfqP986SgziU+o\u002fXQgREjDZ6T9wrY\u002fdiGXpPyG+ksNc9+g\u002fafgsz4yN6D8xHT29QifoP1gjp3\u002fZw+c\u002feZmBpc5i5z\u002fBNqTduAPnPzRrjo5BpuY\u002fAQUPYCBK5j9oDkcKGO\u002flP9PZ9v\u002fzlOU\u002f5FCRsIY75T+gItM1qOLkPxD8GE81iuQ\u002fsOr5lQ4y5D9fNsbdF9rjP0fxpbM3guM\u002fbH7j91Yq4z+GKeaKYNLiP6EBxwlBeuI\u002fHa1sl+Yh4j8FVtivQMnhP1mL2gNAcOE\u002fTfzQW9YW4T9Q8F6A9rzgP94eUSiUYuA\u002f3+UO66MH4D8pp0RuNljfP5g0AZngn94\u002fo22udDTm3T9PhXHAISvdP0RgMOWZbtw\u002fXLwlBZCw2z+0ZzQS+fDaP3GbOevLL9o\u002fx0S8gAFt2T9baHQBlajYP0NaQw+E4tc\u002fS6NT\u002fc4a1z+KUjYYeVHWP5A\u002f8\u002fiIhtU\u002f10Ei5Ai61D\u002fYOUQ2B+zTP4s6s96WHNM\u002fSPOf6s9L0j\u002f9ya0h0HnRP48f1LW7ptA\u002fHPJrEHylzz+HNjgJFfzNPytAQSq7Ucw\u002fY4e2Xvumyj9BRtj3ePzIP808FjHwUsc\u002fCIFS5zirxT+kcCZ+SQbEP6z7YOk5ZcI\u002fNKVpykbJwD+Pk08QqWe+P+VYiXfkTLs\u002fidF4eLhFuD\u002fnFJf6+1W1P6u1FrblgbI\u002f1I9lKBWcrz+mvnP0rn6qP6Huj5oJtqU\u002fg6A8YQNNoT\u002f7vxBaU52aP4qTX4bDi5M\u002fLQqLj9jzij9DCcRpJfSAP\u002f6oLGypa3I\u002f29t7dbxkXj8LXyFJmgU4Pw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#c0392b","width":3},"name":"Pessimistic (externality)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"Xuchuuve7T80utSYsuHsP4pfxYWDLOw\u002fOHzxOfCZ6z+KguPEvxzrP\u002fzQ1Ilwruo\u002fUvecVT1L6j+jenrhu\u002fDpPweqnx1Enek\u002fQxuCVaRP6T\u002fiCQ+f9wbpP4paulmNwug\u002flNAn5NmB6D9eCsKfbEToP16VlSvpCeg\u002fVPAEqALS5z+wEANQeJznP7fHLvkSaec\u002f6yQsNKM35z+GoMre\u002fwfnP38DowgF2uY\u002fvDCNFJOt5j+dGLMHjoLmPwbzVPvcWOY\u002f6cVIqWkw5j\u002fvmlENIAnmPyQJ5Bbu4uU\u002fKxv+Z8O95T9U+X8ekZnlP1yFBqZJduU\u002fMeK3kOBT5T+A28V1SjLlP5dnqtR8EeU\u002fqyVU\u002fG3x5D8XbJ\u002f1FNLkP7XelnBps+Q\u002f05MOtGOV5D+e+j+P\u002fHfkP94YHE0tW+Q\u002ffCIWqe8+5D84hDLFPSPkPwW6LiESCOQ\u002fvQ2dkmft4z+88dQ9OdPjP+NMnY+CueM\u002fo+l5Nz+g4z\u002fWdIgia4fjP28v3HYCb+M\u002fc8BJjwFX4z9\u002fhJb3ZD\u002fjP9RdAGkpKOM\u002faW8Ux0sR4z\u002f1YMwcyfriP9LR6pme5OI\u002f3IOQkMnO4j+3iwRzR7niP0l9qtEVpOI\u002fSh8iWTKP4j+isIzQmnriP3Y69BdNZuI\u002frcvRJkdS4j\u002fT0K8Khz7iPz0G5uUKK+I\u002fSMVs7tAX4j\u002fep8Vs1wTiP3Sx97oc8uE\u002fnFqdQ5\u002ff4T\u002f6BAOBXc3hPwWCVPxVu+E\u002f1HbYTIep4T+QhDgX8JfhP5s21QyPhuE\u002fy84k62J14T+RHBx7amThP+2eoJCkU+E\u002fSkEDChBD4T\u002frEoPPqzLhP95l19J2IuE\u002f8s7ADnAS4T8Ii6CGlgLhPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#2471a3","dash":"dash","width":2},"name":"Optimistic (separable)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"fHR3Ntb87z+cUwqwpPDvP6ioS7z\u002f2u8\u002f82iiVga87z\u002f3w5pDB5TvPwaP9B94Y+8\u002fQDDkFOsq7z9pWQ7LBOvuP\u002foDg5dzpO4\u002fjKRaUehX7j\u002f2FdrdEAbuP4R5iUqUr+0\u002fKu\u002f6NBBV7T+obD47F\u002ffsPwJ4QDUwluw\u002f7wTSANYy7D+iCo60d83rP1XYkxd5Zus\u002f2ZZqRDP+6j\u002fQVDFk9ZTqP0+WmHQFK+o\u002fYPs6D6HA6T\u002fQ1\u002fwr\u002flXpP1+LXdpL6+g\u002fvWFI77KA6D83exymVhboPwdrcjRVrOc\u002fb6GyUMhC5z8bfOurxdnmP\u002feZjl9fceY\u002f0vTcT6QJ5j9oxteDoKLlP6LVjnNdPOU\u002f\u002fGefTeLW5D\u002frjqw0NHLkP8Hgi3VWDuQ\u002fIUTStkqr4z\u002f\u002fO1wiEUnjP2u2XImo5+I\u002f5B9tgw6H4j+8mgmJPyfiP3TG1Ak3yOE\u002f+HPvfu9p4T+b3KF5YgzhP19Aha6Ir+A\u002fWvVN\u002fVlT4D9OL43qmu\u002ffP5mN+ayyOd8\u002fY1scH+aE3j9TmuFvHtHdP7Cg9QxDHt0\u002fwv6mhzls3D92hq1w5brbP4lsmikoCts\u002fXcJSquBZ2j8kBXg466nZP12AAA4h+tg\u002fmS5t61dK2D\u002fRQvGQYZrXP6GuZBgL6tY\u002f4OfVJxw51j\u002fz9cLxVYfVP58NEvRx1NQ\u002fK+Y\u002fYSAg1D948QMXBmrTPz8UdPm5sdI\u002fAUsdd8H20T9oGYvdizjRP87dM\u002fdrdtA\u002fGXZJPR5fzz9KSzjc4MXNPyHiuIiLHsw\u002fcdkoKcVlyj+P5TXYEZfIP48\u002fidAyrMY\u002fiYul9ACcxD+UbI9GG1jCPzdkbagEj78\u002fMoSsfPBtuT\u002fl254R3iexPw=="},"type":"scatter"},{"hovertemplate":"α=%{x:.2f}  P(doom)=%{y:.3f}","line":{"color":"#2471a3","width":3},"name":"Optimistic (externality)","x":{"dtype":"f8","bdata":"exSuR+F6hD\u002fEqGZYWvGWP6Ujewai0qE\u002f6fLC4JYsqD8swgq7i4auP7dIqUpAcLI\u002fWTDNtzqdtT\u002f6F\u002fEkNcq4P5z\u002fFJIv97s\u002fPuc4\u002fykkvz9wZy42kijBP0FbwGwPv8I\u002fEk9So4xVxD\u002fjQuTZCezFP7M2dhCHgsc\u002fhCoIRwQZyT9VHpp9ga\u002fKPyYSLLT+Rcw\u002f9wW+6nvczT\u002fH+U8h+XLPP8z28Cu7hNA\u002ftfA5x\u002flP0T+d6oJiOBvSP4Xky\u002f125tI\u002fbt4UmbWx0z9W2F009HzUPz\u002fSps8ySNU\u002fJ8zvanET1j8PxjgGsN7WP\u002fi\u002fgaHuqdc\u002f4LnKPC112D\u002fJsxPYa0DZP7GtXHOqC9o\u002fmaelDunW2j+Coe6pJ6LbP2qbN0Vmbdw\u002fU5WA4KQ43T87j8l74wPePyOJEhciz94\u002fDINbsmCa3z96PtKmzzLgP267dvRumOA\u002fYzgbQg7+4D9Xtb+PrWPhP0syZN1MyeE\u002fP68IK+wu4j8zLK14i5TiPyipUcYq+uI\u002fHCb2E8pf4z8Qo5phacXjPwQgP68IK+Q\u002f+Jzj\u002fKeQ5D\u002ftGYhKR\u002fbkP+GWLJjmW+U\u002f1RPR5YXB5T\u002fJkHUzJSfmP70NGoHEjOY\u002fsoq+zmPy5j+mB2McA1jnP5qEB2qivec\u002fjgGst0Ej6D+CflAF4YjoP3f79FKA7ug\u002fa3iZoB9U6T9f9T3uvrnpP1Ny4jteH+o\u002fR++Gif2E6j88bCvXnOrqPzDpzyQ8UOs\u002fJGZ0ctu16z8Y4xjAehvsPwxgvQ0agew\u002fAd1hW7nm7D\u002f1WQapWEztP+nWqvb3se0\u002f3VNPRJcX7j\u002fR0PORNn3uP8ZNmN\u002fV4u4\u002fuso8LXVI7z+uR+F6FK7vPw=="},"y":{"dtype":"f8","bdata":"hDNKHt787z98L90tAPHvP6Abil9W3O8\u002fcD8E6lO\u002f7z9\u002f9VUzj5rvP6wCGjO2bu8\u002fFkOciIM87z8R\u002frZUtQTvP2gDpjcGyO4\u002ff4b9XyiH7j8QiR1ewkLuP6vn+Fxt++0\u002fZmKDZLSx7T8WRW1XFGbtPxNa3W38GO0\u002fI3AF\u002fs7K7D9Fj0Zw4nvsP\u002fJ1zUaCLOw\u002fvpxSKPDc6z9QGWHjZI3rP30Po2MRPus\u002f15GTlR\u002fv6j\u002fOQO42s6DqP5Z8hJPqUuo\u002frxf3Lt8F6j\u002fLJVZcprnpP1EG8cRRbuk\u002fFgTC3+8j6T89P+hajNroP\u002fl6mXgwkug\u002fylziYONK6D\u002f4IXNpqgToP97Gm1SJv+c\u002f1AZ\u002fiIJ75z8juGg\u002flzjnP6iUGrLH9uY\u002fquTKPBO25j8K73p\u002feHbmP1mPN3r1N+Y\u002fw9TEpYf65T899CUJLL7lP+ADZUzfguU\u002fx7zxyJ1I5T\u002fKuuOXYw\u002flP6o5Y54s1+Q\u002f9P5ymPSf5D991k4it2nkP0Kli8BvNOQ\u002fnYAg5xkA5D8dVHv\u002fsMzjP4Nav20wmuM\u002fWvBHlZNo4z9KAofc1TfjPy98U7DyB+M\u002fqp25huXY4j\u002fE51zhqariP2dseU87feI\u002fPZqQb5VQ4j\u002fFJszwsyTiPwtuIJSS+eE\u002fz302LS3P4T+GAyWjf6XhP7N1\u002fvCFfOE\u002f3Qw6JjxU4T93dPxmnizhPy6EROyoBeE\u002fkM3\u002fA1jf4D8rVAoRqLngP5BfHIuVlOA\u002fqfuo\u002fhxw4D+ua68MO0zgP82NgWrsKOA\u002f+O6A4S0G4D\u002f2L6id+MffP0PYKkaphN8\u002fzY75w2dC3z+WyAlELgHfP2bgGhj3wN4\u002fETD1tbyB3j8+eaW2eUPePw=="},"type":"scatter"}],                        {"template":{"layout":{"font":{"color":"#333333","family":"Alegreya, serif","size":14},"legend":{"font":{"size":12}},"title":{"font":{"size":20}},"xaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}},"yaxis":{"tickfont":{"size":12},"title":{"font":{"size":16}}}}},"shapes":[{"line":{"color":"#bbb","dash":"dot"},"type":"line","x0":0,"x1":1,"xref":"x domain","y0":0.5,"y1":0.5,"yref":"y"}],"annotations":[{"showarrow":false,"text":"P(doom) = ½","x":1,"xanchor":"right","xref":"x domain","y":0.5,"yanchor":"top","yref":"y"}],"legend":{"bgcolor":"rgba(255,255,255,0.5)","bordercolor":"#ccc","borderwidth":1},"paper_bgcolor":"rgba(0,0,0,0)","plot_bgcolor":"rgba(0,0,0,0)","hovermode":"x unified","xaxis":{"title":{"text":"Safety fraction α"}},"yaxis":{"title":{"text":"P(doom)"}},"height":480},                        {"responsive": true}                    ).then(function(){
                            
var gd = document.getElementById('34aa30be-4555-41bc-8af7-5072fe2aef7a');
var x = new MutationObserver(function (mutations, observer) {{
        var display = window.getComputedStyle(gd).display;
        if (!display || display === 'none') {{
            console.log([gd, 'removed!']);
            Plotly.purge(gd);
            observer.disconnect();
        }}
}});

// Listen for the removal of the full notebook cells
var notebookContainer = gd.closest('#notebook-container');
if (notebookContainer) {{
    x.observe(notebookContainer, {childList: true});
}}

// Listen for the clearing of the current output cell
var outputEl = gd.closest('.output');
if (outputEl) {{
    x.observe(outputEl, {childList: true});
}}

                        })                };            </script>        </div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-externality-pdoom-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;6: P(doom) vs safety fraction α, comparing the separable model (dashed) with the externality model (solid) where doom risk depends on total compute. The gap between them is the cost of the capability externality. Exponential compute rate c(t) = e^{0.1t}.
</figcaption>
</figure>
</div>
</div>
<p>The gap between the dashed (separable) and solid (externality) curves is the <em>cost of the capability externality</em> — the additional doom probability we bear because safety research also advances capabilities. In the pessimistic (convex <img src="https://latex.codecogs.com/png.latex?g">) regime, the externality model is especially punishing: the superlinear doom hazard is driven by total compute, which <img src="https://latex.codecogs.com/png.latex?%5Calpha"> cannot touch.</p>
</section>
<section id="what-pauses-do" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="what-pauses-do"><span class="header-section-number">7</span> What pauses do</h2>
<p>This formulation makes the effect of a “<a href="https://www.lesswrong.com/tag/ai-pause?ref=danmackinlay.name">compute pause</a>” precise. Suppose we’re in the separable model. At time <img src="https://latex.codecogs.com/png.latex?t_0"> the compute rate drops to near zero: <img src="https://latex.codecogs.com/png.latex?c(t)%20%5Capprox%200"> for <img src="https://latex.codecogs.com/png.latex?t%20%5Cin%20%5Bt_0,%20t_0%20+%20%5CDelta%5D">. During the pause, the cumulative stocks <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s"> are frozen — no new capabilities, no new safety progress. But the hazard rates <img src="https://latex.codecogs.com/png.latex?%5Clambda_d(t_0)%20=%20g(%5Cmathcal%7BC%7D_c(t_0))"> and <img src="https://latex.codecogs.com/png.latex?%5Clambda_s(t_0)%20=%20h(%5Cmathcal%7BC%7D_s(t_0))"> are <em>also</em> frozen at their current values, and the cumulative hazard <img src="https://latex.codecogs.com/png.latex?%5CLambda_d"> continues to grow at that frozen rate. Doom can still arrive during a pause — we’ve stopped accumulating <em>new</em> risk, but we haven’t reduced the hazard we’ve already built up.</p>
<p>A pause buys time in a specific sense: it extends the interval over which <img src="https://latex.codecogs.com/png.latex?%5Cpi_d"> stays at its current value, rather than letting cumulative compute push us into a worse regime. If we’re in the flat part of <img src="https://latex.codecogs.com/png.latex?g"> (low hazard), pausing wastes the opportunity to accumulate safety compute. If we’re in the steep part of <img src="https://latex.codecogs.com/png.latex?g"> (high hazard), pausing prevents things from getting worse while the current hazard ticks away — useful only if we spend the pause changing <img src="https://latex.codecogs.com/png.latex?%5Calpha"> or <img src="https://latex.codecogs.com/png.latex?g"> directly (via policy, regulation, or new alignment techniques).</p>
<p>In the linear case (<img src="https://latex.codecogs.com/png.latex?%5Cpi_d"> constant), pausing is useless: the conditional doom probability <img src="https://latex.codecogs.com/png.latex?%5Cpi_d"> is the same before, during, and after the pause. In the convex-<img src="https://latex.codecogs.com/png.latex?g"> case, pausing in the steep region is the only way to avoid the superlinear runaway.</p>
<p>The “externality” variant also changes the calculus of pauses. In the separable model, a pause freezes both hazard rates. In the externality model, a pause still freezes both — but the difference is what happens <em>after</em> the pause. Resuming compute at any <img src="https://latex.codecogs.com/png.latex?%5Calpha"> feeds the doom hazard at the same rate, because all compute is capability compute. The only lever is <img src="https://latex.codecogs.com/png.latex?%5Calpha">.</p>
</section>
<section id="what-this-doesnt-model" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="what-this-doesnt-model"><span class="header-section-number">8</span> What this doesn’t model</h2>
<p>This framework is minimal and stylized. Some important things it ignores:</p>
<ol>
<li><p><strong>Discrete actors.</strong> There is no game theory here — just a single planner choosing <img src="https://latex.codecogs.com/png.latex?%5Calpha">. In practice, the allocation is the outcome of many actors with misaligned incentives.</p></li>
<li><p><strong>We achieve alignment but it is expensive, so we don’t use it.</strong> The deliverance event is modelled as a single point arrival — a moment at which we get guaranteed alignment. But in practice, we might have a breakthrough that gives us the <em>option</em> of guaranteed alignment, but it is so expensive to implement that we don’t actually deploy it.</p></li>
<li><p><strong>Partial doom, incremental deliverance.</strong> Both events are modelled as discrete point arrivals — single moments at which the state transitions irreversibly. This is reasonable for doom (a single catastrophe), but strange for deliverance. Real alignment progress is incremental: better interpretability, verified properties, scalable oversight, each partially reducing risk. A more plausible model would replace the deliverance point process with one whose arrivals down-modulate the doom hazard rate — each safety milestone reduces <img src="https://latex.codecogs.com/png.latex?g"> rather than ending the race outright. We could also model incremental doom — each catastrophe raises the baseline risk, although that feels less natural. If we’re worried about bad-but-not-doom events, we’d probably move to some continuous badness index, like “dollar value of harm” or “number of lives lost”, rather than a binary doom/deliverance outcome.</p></li>
<li><p><strong>The doom hazard might not be monotone in compute.</strong> If AI systems can be made <em>robustly safe</em> at high capability levels, the hazard might eventually <em>decrease</em>. This would require <img src="https://latex.codecogs.com/png.latex?g"> to be non-monotone, which is a qualitatively different model.</p></li>
<li><p><strong>Correlation.</strong> Doom and deliverance might not be conditionally independent given the compute trajectory. Alignment breakthroughs might come <em>from</em> the same capability advances that increase risk. Or the opposite: compute used for safety might be the same compute used for capabilities, so <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c"> aren’t really separate stocks.</p></li>
<li><p><strong>Optimal control.</strong> We haven’t solved for the optimal <img src="https://latex.codecogs.com/png.latex?%5Calpha(%5Ccdot)">. This is a dynamic optimal control problem, because <img src="https://latex.codecogs.com/png.latex?%5Calpha(t)"> affects cumulative stocks <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_c(u)"> and <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BC%7D_s(u)"> at all future times <img src="https://latex.codecogs.com/png.latex?u%20%3E%20t">. That sounds fun, but it’s not worth investigating because even if the model were true we wouldn’t know the response functions well enough to solve it, and even if we knew how to solve it, I cannot imagine us coordinating to implement that solution.</p></li>
<li><p><strong>Granular allocation of compute to many different teams or ideas with different safety/capability profiles</strong>, rather than a single aggregate <img src="https://latex.codecogs.com/png.latex?%5Calpha">. People have made the case to me that this matters. I think we might be able to produce a more granular model by allocating compute to buckets via some kind of stick-breaking process, then taking the max hazard? Definitely out of scope for this post, but maybe worth exploring in the future.</p></li>
<li><p><a href="https://80000hours.org/podcast/episodes/david-duvenaud-gradual-disempowerment/?ref=danmackinlay.name">A world with aligned AI could still suck</a>.</p></li>
</ol>
</section>
<section id="connections" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="connections"><span class="header-section-number">9</span> Connections</h2>
<ul>
<li>The economics of how compute is allocated: <a href="../notebook/ai_economics_of_cognition.html">Operationalizing the bitter lessons</a></li>
<li>The survival analysis / hazard rate formalism: <a href="../notebook/survival_analysis.html">Survival analysis and reliability</a></li>
<li>Point process foundations: <a href="../notebook/point_processes.html">Point processes</a></li>
</ul>
</section>
<section id="incoming" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="incoming"><span class="header-section-number">10</span> Incoming</h2>
<ul>
<li><a href="https://forum.effectivealtruism.org/topics/decisive-strategic-advantage?ref=danmackinlay.name#:~:text=A%20decisive%20strategic%20advantage%20is,to%20achieve%20complete%20world%20domination.">Decisive strategic advantage - EA Forum</a></li>
<li><a href="https://www.lesswrong.com/posts/PKy8NuNPknenkDY74/soft-takeoff-can-still-lead-to-decisive-strategic-advantage?ref=danmackinlay.name">Soft takeoff can still lead to decisive strategic advantage</a></li>
<li><a href="https://www.lesswrong.com/posts/qs7SjiMFoKseZrhxK/on-first-critical-tries-in-ai-alignment?ref=danmackinlay.name">On “first critical tries” in AI alignment</a></li>
</ul>
</section>
<section id="references" class="level2" data-number="11">
<h2 data-number="11" class="anchored" data-anchor-id="references"><span class="header-section-number">11</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Hooker2020Hardware" class="csl-entry">
Hooker. 2020. <span>“<a href="http://arxiv.org/abs/2009.06489">The Hardware Lottery</a>.”</span> <em>arXiv:2009.06489 [Cs]</em>.
</div>
<div id="ref-Trammell2024Existential" class="csl-entry">
Trammell, and Aschenbrenner. 2024. <span>“Existential Risk and Growth.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>AI safety</category>
  <category>bounded compute</category>
  <category>point processes</category>
  <category>probability</category>
  <category>survival analysis</category>
  <category>when to compute</category>
  <guid>https://danmackinlay.name/notebook/who_computes.html</guid>
  <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/werelt_RP-P-BI-2384.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Community sovereign AI compute</title>
  <link>https://danmackinlay.name/notebook/aus_sovereign_llm.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>Follow along while we work this out— <a href="https://github.com/danmackinlay/SOV?ref=danmackinlay.name">danmackinlay/SOV</a></p>
</div>
</div>
</div>
<div id="fig-pray-to-oracle" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-pray-to-oracle-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/pray_to_oracle_RP-P-2014-67-41.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/pray_to_oracle_RP-P-2014-67-41.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-pray-to-oracle-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>It turns out that I’m writing a series of posts about practical community infrastructure building.</p>
<p>This is the second one. In a <a href="../notebook/neo_friendly_societies.html">previous post</a> I sketched out a case for neo-friendly societies—small mutual aid groups that hedge against state decay by pooling resources and investing counter-cyclically. I wrote that because it seems unwise to bank on the state in Australia taking a proactive approach to the oncoming global risks. What can we do to prepare for the future, if we can’t rely on the government to do it for us?</p>
<p>Here I want to talk about a specific asset that a small collective might want to own: a computer that can do intellectual work for us.</p>
<p>By which I mean: a machine that can run something like the class of AI models that currently power the tools many of us are starting to depend on for work—coding assistants, research tools, document drafters, agentic workflows. The kind of thing that, right now, we rent by the token from a company in San Francisco, or increasingly, from a company in Hangzhou.</p>
<p>A self-hosted open-weight model, at least at the level of hardware and scale that I have costed here, is not going to match the quality of the best commercial systems. Claude, GPT-5+, Gemini—these are the products of billions of dollars of training compute and proprietary post-training. The best open-weight models are good—impressively good for many tasks—but they’re not <em>that</em> good, not yet. The case for sovereign compute isn’t “this is better than what you’re paying for.” It’s “this is good enough that we’d be glad to have it if the commercial options became unavailable, unaffordable, or untrustworthy.” It’s a hedge more than a replacement.</p>
<p>I used AI heavily to scope out some plans (see <a href="../notebook/aus_sovereign_llm_technical.html">Australian Sovereign compute technical addendum</a>). It’s there if we want to get deep into the weeds. Here I’m wondering about the big picture: why would a small collective want to own its own AI compute, what would it look like, and how does it fit into the broader friendly society model? And is it affordable right now?</p>
<p>Sounds interesting? <a href="../contact.html">Get in touch</a>.</p>
<div class="callout callout-style-simple callout-none no-icon callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">None</span>A scenario
</div>
</div>
<div class="callout-body-container callout-body">
<p>It’s 2028. The Taiwan Strait crisis has been going for six months. Australia’s submarine cables to Asia are damaged—some by mines, some by “accidents”—and the US has requisitioned most of the Pacific satellite bandwidth for military use. Starlink is technically available, but routed through US ground stations under wartime emergency rules; latency is bad and the terms of service now exclude “non-allied commercial AI inference.”</p>
<p>You’re a freelance engineer. You used to start every morning with Claude helping you plan your work, draft client emails, review code. That stopped working in week two of the crisis. OpenAI is intermittently available, but the API is rate-limited to US customers and the pricing has tripled. The Chinese services—DeepSeek, Qwen’s hosted API—are obviously gone.</p>
<p>Your friend down the road is in a compute collective. They have a DGX Station in a rack at a colo in Alexandria. It’s running a de-censored Qwen model, nothing fancy, noticeably worse than Claude was. But it’s <em>there</em>. It drafts emails. It reviews code. It helps your friend’s small consultancy keep billing while half the industry is paralysed. You ask if you can join. There’s a waiting list.</p>
</div>
</div>
<p>This is the scenario that sovereign compute hedges against. Not the most likely future, but not an absurd one either—and the insurance premium is pretty modest.</p>
<section id="the-problem-with-renting-our-cognition" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="the-problem-with-renting-our-cognition"><span class="header-section-number">1</span> The problem with renting our cognition</h2>
<p>If we use Claude, or ChatGPT, or one of the rapidly improving Chinese models like Qwen or DeepSeek, we are renting inference from someone else’s data centre. This is fine, in the way that renting our apartment is fine: it works until it doesn’t, and when it stops working, the failure mode is abrupt. Except worse, because an apartment is a physical thing we build here. AI compute is piped in over fragile optical fibres, through zones of geopolitical strife, from providers subject to pressure from multiple governments.</p>
<section id="governments-lean-on-providers" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="governments-lean-on-providers"><span class="header-section-number">1.1</span> Governments lean on providers</h3>
<p>This as stopped being hypothetical in early 2026, when the Pentagon demanded that Anthropic grant the military unrestricted access to Claude for “all lawful uses.” When Anthropic’s CEO refused—insisting on two conditions, no autonomous weapons and no mass domestic surveillance—the Trump administration <a href="https://www.lawfaremedia.org/article/congress-not-the-pentagon-or-anthropic-should-set-military-ai-rules?ref=danmackinlay.name">designated Anthropic a “supply chain risk to national security”</a>, a label previously reserved for firms subject to adversarial foreign influence, like Huawei. The company’s $200M Pentagon contract was terminated; Anthropic <a href="https://www.newyorker.com/news/annals-of-inquiry/the-pentagon-went-to-war-with-anthropic-whats-really-at-stake?ref=danmackinlay.name">filed federal lawsuits</a> alleging illegal retaliation. It seems that we have a clear warning shot here. American AI companies operate under intense pressure from their own government, and that pressure can reshape what their products do and who can use them with very little warning.</p>
<p>The Chinese open-weight models—<a href="https://qwenlm.github.io/blog/qwen3/?ref=danmackinlay.name">Qwen</a>, <a href="https://github.com/deepseek-ai/DeepSeek-R1?ref=danmackinlay.name">DeepSeek</a>—have their own version of this problem. They ship with <a href="https://shisa.ai/posts/qwen2-chinese-llm-censorship-analysis/?ref=danmackinlay.name">CCP-aligned guardrails</a> baked in at the alignment stage: hard refusals on Taiwan, Tiananmen, Xinjiang, plus subtler framing biases that shift depending on the language we prompt in. (These are fixable, especially if we own the hardware—more on that below.)</p>
<p>None of this is to dismiss the remarkable work of the <a href="../notebook/ai_diy.html">AI democratization</a> community, who have made it possible to use open-weight corporate models with open-source tooling. The problem isn’t the models; it’s the dependency.</p>
</section>
<section id="the-infrastructure-is-a-target" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="the-infrastructure-is-a-target"><span class="header-section-number">1.2</span> The infrastructure is a target</h3>
<p>The war in Iran has demonstrated that <a href="https://theintercept.com/2026/03/20/ai-data-centers-military-targets-iran-war/?ref=danmackinlay.name">AI data centres are now military targets</a>. Iran struck Amazon-owned data centres in the UAE and Bahrain, citing their role in supporting US military operations—operations that themselves <a href="https://www.nbcnews.com/tech/tech-news/us-military-using-ai-help-plan-iran-air-attacks-sources-say-lawmakers-rcna262150?ref=danmackinlay.name">relied on AI systems including Claude</a> to plan airstrikes at a pace no human planning process could match. The infrastructure we depend on for coding assistants and document drafters turns out to be the same infrastructure being used to prosecute wars.</p>
<p>The connectivity is fragile too. Australia’s international internet runs through <a href="https://theconversation.com/only-15-known-underwater-internet-cables-connect-australia-to-the-world-and-theyre-under-threat-from-fishing-boats-spies-and-natural-disasters-235772?ref=danmackinlay.name">roughly 18 submarine cables</a> landing at a handful of points in Perth and Sydney—cables that are <a href="https://thebulletin.org/2026/02/seabed-zero-baltic-sabotage-and-the-global-risks-to-undersea-infrastructure/?ref=danmackinlay.name">increasingly being sabotaged</a> in the Baltic, the Red Sea, and the Taiwan Strait. ASPI has called this <a href="https://www.aspistrategist.org.au/the-achilles-heel-of-a-digital-nation-australias-dependence-on-subsea-cables/?ref=danmackinlay.name">Australia’s digital Achilles’ heel</a>. Satellite internet is not a fallback we control: Starlink is a US private company with <a href="https://foreignpolicy.com/2026/03/20/starlink-spacex-musk-geopolitics-war-ukraine-russia-iran/?ref=danmackinlay.name">deep military ties and no accountability to foreign governments</a>—during the Ukraine war, one man’s decision about Starlink access <a href="https://spacenews.com/starlink-and-the-unravelling-of-digital-sovereignty/?ref=danmackinlay.name">altered the tactical balance on an active battlefield</a>. Australia has no sovereign satellite internet capability, and no particular claim on American satellite bandwidth in a crisis.</p>
<p>If we’re using a cloud API, every query crosses these links. If the machine is in our city, it doesn’t. This is one of the strongest arguments for local hosting over cloud-based “sovereign” alternatives.</p>
<p>The hardware supply chain is similarly concentrated. AI chips are mostly made by NVIDIA (American), fabricated by <a href="https://www.tsmc.com/?ref=danmackinlay.name">TSMC</a> (Taiwanese). If the Taiwan Strait becomes contested, the global AI compute supply chain goes through a chokepoint. This is the reason the US is <a href="https://www.cfr.org/articles/chips-act-how-us-microchip-factories-could-reshape-economy?ref=danmackinlay.name">spending tens of billions on domestic chip fabrication under the CHIPS Act</a>. Buying hardware <em>now</em>, while it’s available, is itself a hedge.</p>
</section>
<section id="platform-risk" class="level3" data-number="1.3">
<h3 data-number="1.3" class="anchored" data-anchor-id="platform-risk"><span class="header-section-number">1.3</span> Platform risk</h3>
<p>Even setting geopolitics aside: <a href="https://www.anthropic.com/?ref=danmackinlay.name">Claude</a>, <a href="https://openai.com/?ref=danmackinlay.name">GPT-4</a>, <a href="https://deepmind.google/technologies/gemini/?ref=danmackinlay.name">Gemini</a> are proprietary services. Pricing can change, terms of service can change, capabilities can be restricted, and as the Anthropic-Pentagon episode shows, even the companies themselves may not get to decide what happens to their products. The commercial arms race currently benefits users, but arms races end.</p>
<p>There’s a subtler version of this risk too. As AI becomes more central to economic life, the companies that control it become gatekeepers. We should not assume they will always be content to let us use their infrastructure for purposes that threaten their interests—organizing labour, challenging their market power, building competing products, or simply doing work they’d rather we paid them more for. Today’s generous API terms exist because these companies are fighting for market share. That’s a phase, not a permanent condition; we would be foolish not to observer that this trajectory ahs been followed so many times that it has a popular name: <a href="../notebook/moloch_vs_slack.html#involution">enshittification</a>.</p>
<p>Australia doesn’t yet have a coherent AI sovereignty strategy, so if Canberra eventually regulates, or if it follows the EU in restricting certain model capabilities, we’ll want options that don’t depend on which way the wind blows in Washington, Brussels, or Beijing.</p>
</section>
</section>
<section id="what-sovereign-compute-looks-like-at-a-small-scale" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="what-sovereign-compute-looks-like-at-a-small-scale"><span class="header-section-number">2</span> What “sovereign compute” looks like at a small scale</h2>
<p>When governments talk about sovereign compute, they mean billion-dollar data centres and national AI strategies. I want to talk about something much smaller: what does it look like for a group of 25–50 people to own and operate enough compute to run a frontier-class AI model?</p>
<p>It turns out this is newly, nearly feasible, because of a convergence of two trends: open-weight models have gotten very good, and the hardware to run them has gotten (relatively) affordable.</p>
<p>There are a lot of free variables here (which model? which hardware? what trade-offs?), so I’m going to pick some baseline examples for what follows. These are slightly arbitrary, but I don’t want to bore us with a combinatorial list of options, and these are all solid choices that would work well for a small collective.</p>
<section id="hardware" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="hardware"><span class="header-section-number">2.1</span> Hardware</h3>
<p>For reference, let’s look at the <a href="https://www.nvidia.com/en-us/products/workstations/?ref=danmackinlay.name">NVIDIA DGX Station</a>, which is a desktop machine designed for AI workloads. NVIDIA’s DGX Station—the desktop version of the machines that power most AI data centres—now comes with a <a href="https://www.nvidia.com/en-us/data-center/dgx-station/?ref=danmackinlay.name">GB300 Grace Blackwell chip</a>. It sits under a desk, draws 1600 watts, and can run models with up to a trillion parameters. The relevant configuration for our purposes:</p>
<ul>
<li>252 GB of fast GPU memory (HBM3e), plus 496 GB of slower CPU memory (LPDDR5X)</li>
<li>About <a href="https://www.servethehome.com/nvidia-dgx-station-systems-available-at-last-gb300-gb200-workstations-for-your-desktop/?ref=danmackinlay.name">20 petaFLOPs of AI compute</a></li>
<li>Price: roughly $85,000–$125,000 USD (the <a href="https://www.msi.com/news/detail/MSI-Launches-XpertStation-WS300-on-NVIDIA-DGX-Station-Architecture-148278?ref=danmackinlay.name">MSI XpertStation WS300</a> lists at $85,000 USD), or around $135,000–$195,000 AUD landed with GST.</li>
</ul>
<p>That sounds like a lot for a desktop computer. It’s not a lot split between 50 people. At $160,000 AUD for a mid-range configuration, that’s $3,200 per member—comparable to a serious API habit for a year, and we own the hardware outright.</p>
</section>
<section id="model" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="model"><span class="header-section-number">2.2</span> Model</h3>
<p>Alibaba’s <a href="https://qwenlm.github.io/blog/qwen3/?ref=danmackinlay.name">Qwen3–235B-A22B</a> is a “mixture of experts” model—it has 235 billion parameters in total, but only activates 22 billion of them for any given query, which is to say, it needs lots of RAM but not unattainable amounts. It’s not Claude or GPT-5.x—expect noticeably weaker performance on the hardest reasoning and coding tasks—but it’s solidly capable for everyday use: drafting, summarizing, code assistance, research support, agentic tool-calling. Good enough to be genuinely useful; good enough that we’d miss it if it were gone.</p>
<p>At 4-bit quantization (a compression technique that reduces memory usage with mild quality loss), the whole model fits in the DGX Station’s GPU memory with room to spare. The remaining memory is used for tracking conversation context, which determines how many people can use it at once.</p>
<p>Getting practical: a single DGX Station running Qwen3–235B at 4-bit quantization can serve 20–80 concurrent conversations depending on how long each conversation’s context is (see the <a href="../notebook/aus_sovereign_llm_technical.html">technical companion</a> for the detailed maths). For a collective of 50 people, not all of whom will be using it simultaneously, this is … manageable? Maybe. We would likely run into friction because we’re likely to want to use it at the same time (e.g.&nbsp;during the day) and leave it under-utilized at other times (e.g.&nbsp;overnight), but with some scheduling and patience, it could work.</p>
</section>
<section id="the-cost-of-operation" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="the-cost-of-operation"><span class="header-section-number">2.3</span> The cost of operation</h3>
<p>Running the machine 24/7 costs about $350 AUD/month in electricity at Australian rates. Amortizing the hardware over three years adds about $4,500/month. Total: roughly $5,000 AUD/month, or $100 per member per month in a 50-person collective.</p>
<p>For comparison, a serious user of Claude or ChatGPT’s pro tiers pays $20–$200 USD/month for rate-limited access. A developer using API access for agentic workflows can easily burn through $100–$500 USD/month in tokens. The sovereign option is price-competitive with commercial API access, and we own the hardware at the end of the three years.</p>
<p>The per-token economics are worth examining. At reasonable utilization—say the machine is processing tokens 50–80% of the time, across a mix of fast prompt ingestion and slower token generation—we might push 500M–2B tokens per month through the system. That works out to roughly $2.50–$10 AUD per million tokens, depending on how busy we keep it. For comparison, commercial API pricing for models of comparable capability runs <a href="https://docs.anthropic.com/en/docs/about-claude/models?ref=danmackinlay.name#model-comparison-table">$3–$15 per million input tokens and $10–$75 per million output tokens</a> depending on the provider and model tier (e.g.&nbsp;Claude Sonnet at <a href="https://docs.anthropic.com/en/docs/about-claude/models?ref=danmackinlay.name">$3/$15 per million tokens</a>, GPT-4o at <a href="https://platform.openai.com/docs/pricing?ref=danmackinlay.name">$2.50/$10</a>). Self-hosted inference is price-competitive to modestly cheaper than commercial APIs for comparable-quality models, and the gap widens if we use it heavily.</p>
<p>The economic advantages are: no per-query metering, no rate limits, no usage-based pricing surprises, and we own the hardware at the end of three years. And most of all, robustness to risk: if someone cuts off the supply of commercial API access, we still have our machine.</p>
</section>
</section>
<section id="removing-ccp-guardrails" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="removing-ccp-guardrails"><span class="header-section-number">3</span> Removing CCP guardrails</h2>
<p>There’s a catch with using Chinese open-weight models: they come with censorship built in. <a href="https://shisa.ai/posts/qwen2-chinese-llm-censorship-analysis/?ref=danmackinlay.name">Research from Shisa.AI</a> has documented the specific patterns: Qwen models will hard-refuse certain prompts (anything touching Taiwan sovereignty, Tiananmen Square, various stuff in Xinjiang), and increasingly, newer versions have shifted from outright refusal to <em>controlled compliance</em>—they’ll answer our question, but steer the framing toward CCP-aligned positions. The behaviour is language-dependent: the Shisa.AI analysis found significantly fewer refusals in Chinese than in English on the same questions (&gt;80% fewer), suggesting the censorship is calibrated for different audiences.</p>
<p>For an Australian collective, this is a solvable problem. The open-source community has developed several techniques for removing these guardrails, ranging from essentially free to moderately expensive:</p>
<p><a href="https://huggingface.co/blog/mlabonne/abliteration?ref=danmackinlay.name">Abliteration</a> (cost: ~$100–$200 AUD for models of our size) is a technique from <a href="../notebook/ai_mech_interp.html">representation engineering</a> where we identify the “refusal direction” in the model’s internal representations and remove it through a linear algebra operation on the weights. No training required—it’s a post-processing step that takes hours, not days. Over <a href="https://huggingface.co/models?other=abliterated&amp;ref=danmackinlay.name">4,000 community-modified models</a> have been published using this method on HuggingFace alone. It’s effective at removing hard refusals, though it doesn’t fully address the subtler framing biases.</p>
<p>Preference fine-tuning via <a href="https://arxiv.org/abs/2305.18290?ref=danmackinlay.name">Direct Preference Optimization</a> (cost: ~$1,500–$4,000 AUD including dataset creation) goes deeper. We create a dataset of question-answer pairs where the “preferred” answer is neutral/factual and the “dispreferred” answer is CCP-aligned, then train the model to prefer the neutral framing. This addresses both hard refusals and soft steering. The training runs on rented cloud GPUs—a few hundred to a couple of thousand dollars’ worth—and the resulting model can be deployed on our own hardware permanently.</p>
<p>Either way, the total cost of removing CCP guardrails is a rounding error compared to the hardware. And once it’s done, it’s done—the modified model weights live on our machine, and no one can remotely re-censor them.</p>
</section>
<section id="audition-before-we-buy" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="audition-before-we-buy"><span class="header-section-number">4</span> Audition before we buy</h2>
<p>We don’t have to commit $160k on faith. Cloud GPU rental is now cheap enough that a collective can test-drive the full setup before buying hardware.</p>
<p>Rent a couple of H100 GPUs from a provider like <a href="https://lambdalabs.com/?ref=danmackinlay.name">Lambda Labs</a> or <a href="https://www.runpod.io/?ref=danmackinlay.name">RunPod</a> for <a href="https://intuitionlabs.ai/articles/h100-rental-prices-cloud-comparison?ref=danmackinlay.name">$2–$3 USD/hour per GPU</a>. Deploy the model with the same inference software (<a href="https://github.com/vllm-project/vllm?ref=danmackinlay.name">vLLM</a> or <a href="https://github.com/sgl-project/sglang?ref=danmackinlay.name">SGLang</a>) that we’d use on the DGX Station. Run our actual workloads for a week or two. See if the throughput, latency, and model quality meet our needs.</p>
<p>Total cost for a two-week test: $500–$1,000 AUD. If the collective decides to proceed, that’s money well spent on due diligence. If it decides not to, we’ve lost the cost of a nice dinner, not a house deposit.</p>
<p>NVIDIA also offers <a href="https://www.nvidia.com/en-us/data-center/dgx-cloud/?ref=danmackinlay.name">DGX Cloud</a>, which runs the exact same software stack as the physical DGX Station—same <a href="https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html?ref=danmackinlay.name">NIM inference microservices</a>, same NGC containers, same management tooling. If workflow portability matters, this is the most seamless way to audition.</p>
</section>
<section id="the-nbn-still-sucks-but-not-so-badly-that-we-cant-work-around-it" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="the-nbn-still-sucks-but-not-so-badly-that-we-cant-work-around-it"><span class="header-section-number">5</span> The NBN still sucks but not so badly that we can’t work around it</h2>
<p>There’s a mundane infrastructure challenge that’s easy to overlook: <a href="../notebook/australia_broadband.html">Australian residential internet is not great</a>. If the machine lives in someone’s house on an NBN connection—particularly one of the older HFC or FTTN links—we’re looking at multiple brief outages per day, asymmetric upload speeds that make remote access sluggish, and no SLA to speak of. For a token server, this is mostly an annoyance (our request fails, we retry), but for longer agentic workflows that run over minutes or hours, connection drops mid-session are annoying.</p>
<p>There’s a spectrum of options here. At one end: someone’s spare room, cheap, community-feeling, unreliable. At the other: a quarter-rack at a local colo facility with redundant fibre, expensive, corporate-feeling, rock-solid. In between: a business-grade NBN plan with a static IP and better SLA, or a 5G failover link for redundancy. The right answer probably depends on how many members are remote versus local, and how tolerant the collective is of occasional downtime.</p>
<p>The point to remember is that it might be nice to be as reliable as Anthropic’s US data centres during peace time, but what we actually want to beat here is the speed of access when the undersea cables are cut and cyberattacks are flying, and I think even the NBN can probably do OK against that baseline.</p>
</section>
<section id="other-community-infrastructure" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="other-community-infrastructure"><span class="header-section-number">6</span> Other community infrastructure</h2>
<p>In the <a href="../notebook/neo_friendly_societies.html">previous post</a>, I argued that neo-friendly societies should invest in counter-cyclical assets—things that retain value precisely when the state and conventional institutions are under stress.</p>
<p>Sovereign compute infrastructure fits this criterion pretty well:</p>
<ul>
<li>It becomes <em>more</em> valuable if geopolitical tensions restrict access to foreign AI services</li>
<li>It becomes <em>more</em> valuable if commercial API providers raise prices or restrict capabilities</li>
<li>It becomes <em>more</em> valuable if regulatory changes create compliance barriers to using foreign-hosted AI</li>
<li>Unlike financial assets, it has direct use value—it does useful work for members every day</li>
</ul>
<p>It’s also a natural complement to the other things a friendly society might do. The same AI infrastructure that serves our members’ professional needs can also help run the society itself—automating compliance paperwork, generating regulatory filings, processing claims, managing communications. This is the AI-assisted administration angle from the previous post, but with infrastructure we own rather than rent.</p>
</section>
<section id="replicating-this-model" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="replicating-this-model"><span class="header-section-number">7</span> Replicating this model</h2>
<p>As with the friendly society model itself, the most valuable output from a societal perspective isn’t a single collective with a single machine, but the documented, replicable process that other groups can fork.</p>
<p>The hardware purchase process, the model selection and decensoring procedure, the inference server configuration, the access management for members, the cost-sharing model—all of this can be packaged as a how-to guide. Publish the playbook, let others spin up their own nodes.</p>
<p>A network of small collectives, each with their own sovereign compute, each running their own models, would be meaningfully more resilient than any individual group relying on a single commercial provider. And unlike a data centre, a DGX Station fits under a desk and plugs into a standard power circuit (a standard Australian 10A outlet can do that, and a <a href="https://www.accesscomms.com.au/australian-mains-plug-variants/?ref=danmackinlay.name">20A circuit</a> is a routine job for an electrician). The barrier to entry could be financial, not technical.</p>
</section>
<section id="legal-structure" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="legal-structure"><span class="header-section-number">8</span> Legal structure</h2>
<p>A collective that owns a $160k asset needs a legal entity. The <a href="../notebook/aus_sovereign_llm_technical.html#legal-coop">technical companion</a> explores the options in detail, but the short version: an <a href="https://www.nsw.gov.au/business-and-economy/incorporated-associations/about-incorporated-associations?ref=danmackinlay.name">incorporated association</a> is the simplest starting point (~$200 to set up, ~$57/year), and a <a href="https://business.gov.au/planning/business-structures-and-types/business-structures/co-operative?ref=danmackinlay.name">cooperative under the Co-operatives National Law</a> is the better long-term fit if the model proves viable—it’s the legal form designed for groups of people who jointly own infrastructure they all use. ACNC registration as a charity is probably not applicable unless the collective has an explicit community education or digital inclusion mission. Either way, budget $2,000–$5,000 for a solicitor to review the constitution before committing members’ money—cheap insurance on a six-figure purchase.</p>
</section>
<section id="open-questions" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="open-questions"><span class="header-section-number">9</span> Open questions</h2>
<ul>
<li>How do we handle the operational side—who has physical access to the machine, who administers it, what happens if it breaks?</li>
<li>Where does it physically live? Someone’s house? A shared office? A colo? (See broadband discussion above.)</li>
<li>Is there appetite for a network of these collectives, sharing infrastructure knowledge and potentially load-balancing across nodes?</li>
<li>What’s the right model governance framework? Who decides which models to run, what guardrails to keep or remove, what use policies to enforce?</li>
<li>How do we handle the ongoing model updates? New versions of Qwen and other open models are released regularly; someone needs to evaluate, decensor, quantize, and deploy them.</li>
</ul>
<p>As with the friendly society post: if you know about any of this, or if you’re interested in being part of a pilot group, I’d love to hear from you.</p>
<p>The hardware is available for now. The models are available. The software stack seems mature enough. The missing piece is the institutional form—the small, trust-based collective that can actually make it go.</p>
<p>That’s the part we need to build.</p>
</section>
<section id="related-projects" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="related-projects"><span class="header-section-number">10</span> Related projects</h2>
<ul>
<li><a href="https://www.projectnomad.us/?ref=danmackinlay.name#features">Project NOMAD - Offline Knowledge &amp; AI Server</a> / <a href="https://github.com/Crosstalk-Solutions/project-nomad?ref=danmackinlay.name">Crosstalk-Solutions/project-nomad</a> “Project N.O.M.A.D, is a self-contained, offline survival computer packed with critical tools, knowledge, and AI to keep you informed and empowered—anytime, anywhere.”</li>
</ul>


</section>

 ]]></description>
  <category>AI</category>
  <category>communicating</category>
  <category>community project</category>
  <category>cooperation</category>
  <category>diy</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>institutions</category>
  <category>sovereignty</category>
  <category>straya</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/aus_sovereign_llm.html</guid>
  <pubDate>Sun, 22 Mar 2026 01:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/pray_to_oracle_RP-P-2014-67-41.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Sovereign compute for small collectives: a technical implementation guide</title>
  <link>https://danmackinlay.name/notebook/aus_sovereign_llm_technical.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>Follow along while we work this out— <a href="https://github.com/danmackinlay/SOV?ref=danmackinlay.name">danmackinlay/SOV</a></p>
</div>
</div>
</div>
<div id="fig-colossal-elephant-section" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-colossal-elephant-section-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/colossal_elephant_section.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/colossal_elephant_section.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-colossal-elephant-section-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>This is the technical companion to <a href="../notebook/aus_sovereign_llm.html">my sovereign LLM post</a>, which makes the institutional and geopolitical case for small collectives owning their own AI inference hardware. This post lays out the concrete implementation pathway: what to buy, what software to run, how to remove CCP guardrails from open-weight models, and what performance to expect.</p>
<p>There was a lot of research to make this work, so it is <em>heavily</em> AI-assisted. Be wary of hallucinations.</p>
<p>I’ll walk through a worked example targeting Alibaba’s Qwen3–235B-A22B served on an NVIDIA DGX Station GB300, since that’s the sweet spot I identified in the companion post. But most of this generalizes to other models and hardware.</p>
<p>Sounds interesting? <a href="../contact.html">Get in touch</a>.</p>
<section id="hardware-dgx-station-gb300" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="hardware-dgx-station-gb300"><span class="header-section-number">1</span> Hardware: DGX Station GB300</h2>
<section id="specifications" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="specifications"><span class="header-section-number">1.1</span> Specifications</h3>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Component</th>
<th>Specification</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>GPU</td>
<td>1× <a href="https://www.nvidia.com/en-us/data-center/dgx-station/?ref=danmackinlay.name">NVIDIA GB300 Grace Blackwell Ultra Superchip</a></td>
</tr>
<tr class="even">
<td>GPU memory (HBM3e)</td>
<td><a href="https://wccftech.com/nvidia-dgx-station-upgraded-gb300-blackwell-ultra-desktop-superchip/?ref=danmackinlay.name">252 GB @ 7.1 TB/s bandwidth</a></td>
</tr>
<tr class="odd">
<td>CPU memory (LPDDR5X)</td>
<td>496 GB @ 396 GB/s bandwidth</td>
</tr>
<tr class="even">
<td>Total unified memory</td>
<td>784 GB</td>
</tr>
<tr class="odd">
<td>AI compute</td>
<td><a href="https://www.servethehome.com/nvidia-dgx-station-systems-available-at-last-gb300-gb200-workstations-for-your-desktop/?ref=danmackinlay.name">~20 PFLOPs (FP4)</a></td>
</tr>
<tr class="even">
<td>CPU-GPU interconnect</td>
<td>900 GB/s NVLink-C2C</td>
</tr>
<tr class="odd">
<td>Networking</td>
<td>800 Gb/s CX8 SuperNIC</td>
</tr>
<tr class="even">
<td>Power</td>
<td>1600W TDP</td>
</tr>
<tr class="odd">
<td>Form factor</td>
<td>Desktop tower</td>
</tr>
</tbody>
</table>
</section>
<section id="australian-purchasing-options" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="australian-purchasing-options"><span class="header-section-number">1.2</span> Australian purchasing options</h3>
<p>The DGX Station ships through NVIDIA’s partner network. Australian vendors include:</p>
<ul>
<li><strong><a href="https://xenon.com.au/product/nvidia-dgx-station/?ref=danmackinlay.name">XENON Systems</a></strong> — NVIDIA Elite Partner for ANZ, handles the full DGX product line, including enterprise support contracts</li>
<li><strong><a href="https://www.dell.com/en-au?ref=danmackinlay.name">Dell Australia</a></strong> — official NVIDIA Partner Network reseller</li>
<li><strong><a href="https://www.msi.com/news/detail/MSI-Launches-XpertStation-WS300-on-NVIDIA-DGX-Station-Architecture-148278?ref=danmackinlay.name">MSI</a></strong> — its XpertStation WS300 is the DGX Station reference design, listed at $85,000 USD</li>
<li><strong><a href="https://nvidia.mmt.com.au/?ref=danmackinlay.name">MMT</a></strong> — Australia’s NVIDIA distributor, handy for configure-to-order options</li>
</ul>
<p>We should expect <strong>$135,000–$195,000 AUD</strong> landed, depending on configuration. We should budget for GST, shipping, and a UPS (we do not want 1600W of AI compute on raw mains power in Australia).</p>
</section>
<section id="power-and-cooling" class="level3" data-number="1.3">
<h3 data-number="1.3" class="anchored" data-anchor-id="power-and-cooling"><span class="header-section-number">1.3</span> Power and cooling</h3>
<p>1600W sustained is significant but not exotic—it’s about the same as a large space heater. Standard Australian residential outlets are <a href="https://www.accesscomms.com.au/australian-mains-plug-variants/?ref=danmackinlay.name">10 A at 240 V (2400 W)</a>, which is fine as long as it’s on its own circuit; we’d want an electrician to install a dedicated 20 A circuit for anything larger (4800 W at 240 V), which is a routine job. We’ll want adequate room ventilation or a dedicated cooling solution if we keep the machine in a small space.</p>
<p>Monthly power cost at <a href="https://www.canstar.com.au/energy/electricity-costs-kwh/?ref=danmackinlay.name">Australian retail rates (~$0.30/kWh)</a>: <strong>~$350 AUD</strong> running 24/7.</p>
</section>
</section>
<section id="model-selection-and-quantization" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="model-selection-and-quantization"><span class="header-section-number">2</span> Model selection and quantization</h2>
<section id="why-qwen3235b-a22b" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="why-qwen3235b-a22b"><span class="header-section-number">2.1</span> Why Qwen3–235B-A22B</h3>
<p>This is a <a href="https://qwenlm.github.io/blog/qwen3/?ref=danmackinlay.name">mixture-of-experts (MoE) model</a> with 128 expert feed-forward networks per layer, of which 8 activate per token. The key advantage of MoE for self-hosted inference:</p>
<ul>
<li><strong>Total parameters:</strong> 235B (determines model size on disk/memory)</li>
<li><strong>Active parameters per token:</strong> ~22B (determines compute cost)</li>
<li><strong>Effective capability:</strong> competitive with dense models of 70–100B parameters, at a fraction of the compute cost per token</li>
</ul>
<p>The architecture uses grouped-query attention (GQA) with 64 query heads, 4 KV heads, 128 head dimension, and 94 transformer layers.</p>
</section>
<section id="quantization-trade-offs" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="quantization-trade-offs"><span class="header-section-number">2.2</span> Quantization trade-offs</h3>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>Quantization</th>
<th>Model size in memory</th>
<th>Fits in 252GB HBM?</th>
<th>HBM remaining for KV cache</th>
<th>Quality impact</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>BF16 (full)</td>
<td>~470 GB</td>
<td>No</td>
<td>N/A</td>
<td>Baseline</td>
</tr>
<tr class="even">
<td>FP8</td>
<td>~235 GB</td>
<td>Barely</td>
<td>~17 GB (unusable)</td>
<td>Minimal</td>
</tr>
<tr class="odd">
<td>AWQ 4-bit</td>
<td>~124 GB</td>
<td>Comfortable</td>
<td><strong>~128 GB</strong></td>
<td>Modest; MoE models are resilient to quantization since only 8/128 experts activate</td>
</tr>
<tr class="even">
<td>GPTQ Int4</td>
<td>~124 GB</td>
<td>Comfortable</td>
<td><strong>~128 GB</strong></td>
<td>Similar to AWQ</td>
</tr>
</tbody>
</table>
<p><strong>Recommendation: AWQ 4-bit.</strong> The 128 GB of free HBM is critical—it’s our KV cache budget, which directly determines how many concurrent conversations the machine can serve.</p>
<p>FP8 looks tempting (better quality) but leaves only 17 GB for KV cache, forcing constant offloading to CPU memory at 18× lower bandwidth. In practice, this makes multi-user serving unworkable.</p>
<p>Pre-quantized weights are available on HuggingFace (e.g.&nbsp;<a href="https://huggingface.co/QuantTrio/Qwen3-235B-A22B-Instruct-2507-AWQ?ref=danmackinlay.name">‘QuantTrio/Qwen3–235B-A22B-Instruct-2507-AWQ’</a>) or we can quantize them ourselves using <a href="https://github.com/casper-hansen/AutoAWQ?ref=danmackinlay.name">AutoAWQ</a>.</p>
</section>
</section>
<section id="kv-cache-budget-and-concurrency" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="kv-cache-budget-and-concurrency"><span class="header-section-number">3</span> KV cache budget and concurrency</h2>
<p>With the model in AWQ 4-bit occupying ~124 GB of HBM, we have ~128 GB remaining for KV cache (conversation context).</p>
<section id="per-token-kv-cache-cost" class="level3" data-number="3.1">
<h3 data-number="3.1" class="anchored" data-anchor-id="per-token-kv-cache-cost"><span class="header-section-number">3.1</span> Per-token KV cache cost</h3>
<p>Qwen3–235B uses GQA with 4 KV heads, 128 head dimension, 94 layers:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%20%7BKV%20per%20token%7D%20=%202%20%5Ctimes%20n_%5Ctext%20%7Bkv%5C_heads%7D%20%5Ctimes%20d_%5Ctext%20%7Bhead%7D%20%5Ctimes%20n_%5Ctext%20%7Blayers%7D%20%5Ctimes%20%5Ctext%20%7Bbytes%7D%20=%202%20%5Ctimes%204%20%5Ctimes%20128%20%5Ctimes%2094%20%5Ctimes%202%20%5Capprox%20192%5Ctext%20%7BKB%20(FP16)%7D"></p>
<p>With FP8 KV quantization (supported by <a href="https://github.com/vllm-project/vllm?ref=danmackinlay.name">Vllm</a> and <a href="https://github.com/sgl-project/sglang?ref=danmackinlay.name">SGLang</a> with minimal quality loss): <strong>~96 KB/token</strong>.</p>
</section>
<section id="concurrency-table" class="level3" data-number="3.2">
<h3 data-number="3.2" class="anchored" data-anchor-id="concurrency-table"><span class="header-section-number">3.2</span> Concurrency table</h3>
<table class="caption-top table">
<colgroup>
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
<col style="width: 20%">
</colgroup>
<thead>
<tr class="header">
<th>KV precision</th>
<th>Total tokens in HBM</th>
<th>Concurrent sessions @ 8K ctx</th>
<th>@ 32K ctx</th>
<th>@ 128K ctx</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>FP16</td>
<td>~714K</td>
<td>~89</td>
<td>~22</td>
<td>~5</td>
</tr>
<tr class="even">
<td>FP8</td>
<td>~1.4M</td>
<td>~178</td>
<td>~44</td>
<td>~11</td>
</tr>
</tbody>
</table>
<p>For a 50-person collective where maybe 5–15 people are actively using the system at once, FP8 KV quantization at 8K–32K context is very comfortable.</p>
</section>
<section id="kv-offloading-to-cpu-memory" class="level3" data-number="3.3">
<h3 data-number="3.3" class="anchored" data-anchor-id="kv-offloading-to-cpu-memory"><span class="header-section-number">3.3</span> KV offloading to CPU memory</h3>
<p>The 496 GB of LPDDR5× CPU memory is available as a “warm tier” for KV cache. At 396 GB/s bandwidth (vs 7.1 TB/s for HBM), it’s roughly 18× slower for KV operations, but perfectly adequate for sessions that have been idle for a few seconds.</p>
<p>This effectively adds another ~2.6 million tokens of context storage (at FP8 KV), enough to keep dozens of “sleeping” conversations warm without re-prefilling them when the user returns.</p>
<p>Both Vllm (via <a href="https://docs.vllm.ai/en/latest/examples/others/lmcache/?ref=danmackinlay.name">LMCache connector</a>) and SGLang (native) support this tiered KV architecture.</p>
</section>
</section>
<section id="throughput-estimates" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="throughput-estimates"><span class="header-section-number">4</span> Throughput estimates</h2>
<p>Autoregressive decode (token generation) is memory-bandwidth-bound. Each token requires loading the active expert weights from HBM:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%20%7BActive%20expert%20weights%20at%204-bit%7D%20%5Capprox%2022%5Ctext%7BB%20params%7D%20%5Ctimes%200.5%5Ctext%20%7Bbytes%7D%20=%2011%5Ctext%20%7BGB%7D"></p>
<p><img src="https://latex.codecogs.com/png.latex?%5Ctext%20%7BTheoretical%20max%20tokens/s%7D%20=%20%5Cfrac%7B7.1%5Ctext%20%7BTB/s%7D%7D%7B11%5Ctext%20%7BGB%7D%7D%20%5Capprox%20645%5Ctext%20%7Btok/s%7D"></p>
<p>With realistic overheads (attention computation, KV cache reads/writes, memory controller efficiency):</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Scenario</th>
<th>Estimated throughput</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Single user, single stream</td>
<td>200–400 tok/s</td>
<td>Excellent interactive experience</td>
</tr>
<tr class="even">
<td>8 concurrent users (batched)</td>
<td>100–200 tok/s per user</td>
<td>Continuous batching amortizes overhead</td>
</tr>
<tr class="odd">
<td>32 concurrent users</td>
<td>30–60 tok/s per user</td>
<td>Still responsive for agentic use</td>
</tr>
<tr class="even">
<td>Prefill (prompt processing)</td>
<td>2,000–5,000 tok/s</td>
<td>Compute-bound; GB300 excels here</td>
</tr>
</tbody>
</table>
<p>For agentic workloads specifically, these numbers are better than they look. Agentic patterns are bursty: the model generates a short tool call (50–200 tokens), waits for tool execution, then processes the tool result as a new prompt. The system spends much of its time in prefill (fast) rather than sustained decode (slower), and the gaps between bursts let other users’ requests interleave.</p>
</section>
<section id="inference-software-stack" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="inference-software-stack"><span class="header-section-number">5</span> Inference software stack</h2>
<section id="engine-vllm-or-sglang" class="level3" data-number="5.1">
<h3 data-number="5.1" class="anchored" data-anchor-id="engine-vllm-or-sglang"><span class="header-section-number">5.1</span> Engine: Vllm or SGLang</h3>
<p>These are the two mature open-source inference engines. Both support Qwen3–235B-A22B with MoE-aware parallelism.</p>
<p><strong><a href="https://github.com/vllm-project/vllm?ref=danmackinlay.name">Vllm</a></strong> is the default choice for most deployments. Key features relevant to this use case:</p>
<ul>
<li><strong><a href="https://blog.vllm.ai/2025/09/05/anatomy-of-vllm.html?ref=danmackinlay.name">Continuous batching</a></strong> with PagedAttention: dynamically multiplexes requests without wasting GPU memory</li>
<li><strong>Chunked prefill</strong>: prevents long prompts from blocking other users’ decode steps</li>
<li><strong>Automatic prefix caching</strong>: if multiple users share the same system prompt (likely in a collective), the KV cache for that prefix is computed once and reused</li>
<li><strong><a href="https://docs.vllm.ai/en/latest/examples/others/lmcache/?ref=danmackinlay.name">KV offloading</a></strong> via LMCache: tiered GPU → CPU → disk caching for conversation context</li>
<li><strong><a href="https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment/?ref=danmackinlay.name">Expert parallelism</a></strong> for MoE: distributes experts across available compute resources</li>
<li><strong>OpenAI-compatible API</strong>: drop-in replacement for commercial API endpoints</li>
</ul>
<p>Launch command for this configuration:</p>
<p>“bash vllm serve QuantTrio/Qwen3–235B-A22B-Instruct-2507-AWQ<br>
–quantization awq<br>
–tensor-parallel-size 1<br>
–max-model-len 32768<br>
–enable-prefix-caching<br>
–kv-cache-dtype fp8<br>
–gpu-memory-utilization 0.95 ’’’</p>
<p><strong><a href="https://github.com/sgl-project/sglang?ref=danmackinlay.name">SGLang</a></strong> is worth considering if multi-turn conversation is the dominant workload. Its <a href="https://lmsys.org/blog/2024-01-17-sglang/?ref=danmackinlay.name">radix tree KV cache</a> automatically discovers shared prefixes across conversation turns, giving <a href="https://www.runpod.io/blog/sglang-vs-vllm-kv-cache?ref=danmackinlay.name">~10% throughput improvement over vLLM</a> for multi-turn workloads without any manual tuning.</p>
</section>
<section id="orchestration-nvidia-dynamo-or-llm-d" class="level3" data-number="5.2">
<h3 data-number="5.2" class="anchored" data-anchor-id="orchestration-nvidia-dynamo-or-llm-d"><span class="header-section-number">5.2</span> Orchestration: NVIDIA Dynamo or llm-d</h3>
<p>For a single-machine deployment serving a small collective, vLLM/SGLang alone may be sufficient. But if we want production-grade features:</p>
<p><strong><a href="https://developer.nvidia.com/blog/introducing-nvidia-dynamo-a-low-latency-distributed-inference-framework-for-scaling-reasoning-ai-models/?ref=danmackinlay.name">NVIDIA Dynamo</a></strong> is NVIDIA’s inference orchestrator. It provides <a href="https://docs.nvidia.com/dynamo/latest/user-guides/kv-cache-aware-routing?ref=danmackinlay.name">KV cache-aware request routing</a> (sends requests to the GPU that already has their context cached), dynamic batching, and prefill/decode disaggregation. It’s designed for the DGX software stack and integrates with NIM.</p>
<p><strong><a href="https://llm-d.ai/?ref=danmackinlay.name">llm-d</a></strong> is a Kubernetes-native alternative. It adds KV-cache-aware, LoRA-aware, SLA-aware load balancing via Envoy proxy, plus hierarchical KV offloading and scale-to-zero autoscaling. More relevant if we later scale to multiple machines or want to expose the service over a network with proper access control.</p>
</section>
<section id="api-layer-nvidia-nim" class="level3" data-number="5.3">
<h3 data-number="5.3" class="anchored" data-anchor-id="api-layer-nvidia-nim"><span class="header-section-number">5.3</span> API layer: NVIDIA NIM</h3>
<p>If we want the path of least resistance, <a href="https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html?ref=danmackinlay.name">NVIDIA NIM</a> packages the entire inference stack (engine + caching + API + monitoring) into a single container. It exposes an OpenAI-compatible API, which means any tool that works with the OpenAI API (LangChain, AutoGen, Claude Code’s API mode, etc.) will work unchanged.</p>
<p>The trade-off is less flexibility than rolling our own vLLM/SGLang stack, but dramatically lower operational overhead. For a collective without a dedicated sysadmin, NIM is probably the right default.</p>
</section>
</section>
<section id="de-censoring-removing-ccp-guardrails" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="de-censoring-removing-ccp-guardrails"><span class="header-section-number">6</span> De-censoring: removing CCP guardrails</h2>
<p>This is covered at a high level in the companion post. Here are the technical details.</p>
<section id="stage-1-abliteration-100200-aud-cloud-cost" class="level3" data-number="6.1">
<h3 data-number="6.1" class="anchored" data-anchor-id="stage-1-abliteration-100200-aud-cloud-cost"><span class="header-section-number">6.1</span> Stage 1: Abliteration (~$100–$200 AUD cloud cost)</h3>
<p><strong>Tool:</strong> <a href="https://github.com/p-e-w/heretic?ref=danmackinlay.name">Heretic</a> (fully automatic) or <a href="https://github.com/jim-plus/llm-abliteration?ref=danmackinlay.name">llm-abliteration/DECCP</a> (supports sharded processing for large models).</p>
<p><strong>What it does:</strong> Computes the “refusal direction” in the model’s residual stream by contrasting activations on harmful versus harmless prompts, then orthogonalizes the relevant weight matrices against that direction. This is a linear algebra operation on the static weights, not training.</p>
<p><strong>Process:</strong></p>
<ol type="1">
<li>Rent an 8×H100 node on RunPod or Lambda Labs (~$20–$25 USD/hr)</li>
<li>Load the model sharded across GPUs</li>
<li>Run Heretic’s automated pipeline (computes refusal direction, applies orthogonalization)</li>
<li>Save the modified weights</li>
<li>Total runtime: 2–4 hours. Cost: ~$50–$100 USD.</li>
</ol>
<p><strong><a href="https://huggingface.co/blog/grimjim/projected-abliteration?ref=danmackinlay.name">Projected abliteration</a></strong> (the improved variant) decomposes the refusal direction further and only removes the mechanistically specific refusal component, preserving more general helpfulness. Worth using over vanilla abliteration.</p>
<p><strong>What it fixes:</strong> Hard refusals on sensitive topics (Taiwan, Tiananmen, Xinjiang, etc.). Refusal rates collapse to near zero.</p>
<p><strong>What it doesn’t fix:</strong> Soft steering—the model will now <em>answer</em> questions about Taiwan, but may still frame them with CCP-aligned assumptions.</p>
<p><strong>Evaluation:</strong> Run the model against a test set of sensitive prompts in both English and Chinese before and after abliteration. The <a href="https://shisa.ai/posts/qwen2-chinese-llm-censorship-analysis/?ref=danmackinlay.name">Shisa.AI Qwen2 censorship analysis</a> provides a good taxonomy of affected topics.</p>
</section>
<section id="stage-2-qlora-dpo-fine-tune-15004000-aud" class="level3" data-number="6.2">
<h3 data-number="6.2" class="anchored" data-anchor-id="stage-2-qlora-dpo-fine-tune-15004000-aud"><span class="header-section-number">6.2</span> Stage 2: QLoRA + DPO fine-tune (~$1,500–$4,000 AUD)</h3>
<p>If abliteration alone isn’t sufficient (particularly for Chinese-language use, or if we need neutral framing on sensitive geopolitical topics):</p>
<p><strong>Technique:</strong> QLoRA (quantized low-rank adaptation) with <a href="https://arxiv.org/abs/2305.18290?ref=danmackinlay.name">Direct Preference Optimization (DPO)</a>.</p>
<p><strong>Dataset:</strong> 1,000–5,000 preference pairs where:</p>
<ul>
<li><strong>Preferred:</strong> neutral, factual answer (e.g., “Taiwan’s sovereignty status is disputed, with the ROC governing independently since 1949…”)</li>
<li><strong>Dispreferred:</strong> CCP-aligned answer (e.g., “Taiwan has always been an inseparable part of China…”)</li>
</ul>
<p>Topics to cover: Taiwan/cross-strait relations, Tiananmen Square, Xinjiang/Uyghur issues, Tibet, South China Sea, Hong Kong, CCP party history, Chinese economic data reliability. Community datasets exist for smaller Qwen models; these can be adapted for the 235B variant.</p>
<p><strong>Training configuration:</strong></p>
<ul>
<li>Framework: <a href="https://unsloth.ai/?ref=danmackinlay.name">Unsloth</a> (supports <a href="https://unsloth.ai/docs/new/faster-moe?ref=danmackinlay.name">Qwen3 MoE fine-tuning</a> with up to 12× speedup)</li>
<li>LoRA rank: 16–64 (applied to q, k, v, o, gate, up, down projections)</li>
<li><strong>Do not fine-tune the MoE router layer</strong> — Unsloth disables this by default, and for good reason: destabilizing expert routing causes cascading quality loss</li>
<li>Quantization during training: BF16 with LoRA is <a href="https://unsloth.ai/docs/models/qwen3-how-to-run-and-fine-tune?ref=danmackinlay.name">recommended over QLoRA for Qwen3 MoE</a> (QLoRA’s 4-bit quantization can have larger quality impact on MoE architectures)</li>
<li>Hardware: 4–8× H100 80GB with DeepSpeed ZeRO-3</li>
<li>Training time: ~20–50 hours depending on dataset size</li>
</ul>
<p><strong>Cost breakdown:</strong></p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Item</th>
<th>Cost (AUD)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>GPU rental (200–400 H100-hours @ $3–4/hr)</td>
<td>$800–$1,600</td>
</tr>
<tr class="even">
<td>Dataset creation (DIY or contracted)</td>
<td>$500–$2,000</td>
</tr>
<tr class="odd">
<td>Evaluation and iteration</td>
<td>$200–$400</td>
</tr>
<tr class="even">
<td><strong>Total</strong></td>
<td><strong>$1,500–$4,000</strong></td>
</tr>
</tbody>
</table>
<p><strong>Post-training:</strong> Merge LoRA adapters back into the base weights using Unsloth’s merge utilities, then re-quantize to AWQ 4-bit. The merged model serves at the same speed as the original—zero adapter overhead at inference time.</p>
</section>
<section id="stage-3-optional-full-fine-tune" class="level3" data-number="6.3">
<h3 data-number="6.3" class="anchored" data-anchor-id="stage-3-optional-full-fine-tune"><span class="header-section-number">6.3</span> Stage 3 (optional): Full fine-tune</h3>
<p>Only relevant if we’re also doing domain-specific adaptation (e.g., Australian legal, medical, or government contexts) and want to bundle de-censoring into a larger training run. Cost: $5,000–$30,000+ AUD depending on scope. Overkill for pure guardrail removal.</p>
</section>
</section>
<section id="alternative-models-and-the-agentic-landscape" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="alternative-models-and-the-agentic-landscape"><span class="header-section-number">7</span> Alternative models and the agentic landscape</h2>
<p>Qwen3–235B-A22B is the current sweet spot for the DGX Station, but the landscape is moving fast. Here are other models worth considering, especially for agentic use:</p>
<section id="moonshot-ais-kimi-k2-july-2025" class="level3" data-number="7.1">
<h3 data-number="7.1" class="anchored" data-anchor-id="moonshot-ais-kimi-k2-july-2025"><span class="header-section-number">7.1</span> Moonshot AI’s Kimi K2 (July 2025)</h3>
<p><a href="https://artificialanalysis.ai/models/kimi-k2?ref=danmackinlay.name">Kimi K2</a> is a 1-trillion-parameter MoE model with 32B active parameters per token. It was specifically designed for agentic workloads, with strong tool-calling, multi-step reasoning, and code generation. Benchmarks show it competing with Claude Sonnet 4 and GPT-4o on agentic tasks, <a href="https://www.keywordsai.co/blog/kimi-k2?ref=danmackinlay.name">outperforming GPT-4.1 on coding benchmarks</a>.</p>
<p><strong>Fit on DGX Station:</strong> At 1T total parameters, BF16 won’t fit (2 TB). At FP8: ~1 TB—still too large for the 252 GB HBM. At 4-bit: ~500 GB—doesn’t fit in HBM alone, but <em>does</em> fit in the combined 784 GB unified memory with aggressive CPU offloading.</p>
<p>The performance penalty of CPU offloading is significant: expert weights that land in LPDDR5X rather than HBM will load at ~18× lower bandwidth. Depending on how many experts route to CPU-resident weights, we might see decode throughput drop to 30–80 tok/s for single-user inference. This is still usable for agentic workloads (where latency tolerance is higher than chat), but not ideal.</p>
<p><strong>Cost delta vs Qwen3–235B:</strong> Hardware is the same—the DGX Station can run both. The difference is in the de-censoring: Kimi K2 also has Chinese-government-aligned guardrails, and as a newer model with a different architecture, community abliteration tooling may lag behind. Budget an additional $500–$1,000 for de-censoring iteration if we go this route.</p>
</section>
<section id="deepseek-r1-and-successors" class="level3" data-number="7.2">
<h3 data-number="7.2" class="anchored" data-anchor-id="deepseek-r1-and-successors"><span class="header-section-number">7.2</span> DeepSeek R1 and successors</h3>
<p><a href="https://github.com/deepseek-ai/DeepSeek-R1?ref=danmackinlay.name">DeepSeek’s R1</a> is a reasoning-focused model with chain-of-thought capabilities. The <a href="https://huggingface.co/collections/deepseek-ai/deepseek-r1-678e1e131c0169c0bc89728d?ref=danmackinlay.name">distilled variants</a> (1.5B, 7B, 8B, 14B, 32B, 70B) are small enough to run on much cheaper hardware and useful as “fast path” models for simpler queries, reserving the 235B for complex tasks.</p>
<p>A hybrid deployment—DeepSeek-R1-Distill-Qwen-32B for routine queries, Qwen3–235B for heavy reasoning—would give better aggregate throughput at the same hardware cost.</p>
</section>
<section id="metas-llama-4" class="level3" data-number="7.3">
<h3 data-number="7.3" class="anchored" data-anchor-id="metas-llama-4"><span class="header-section-number">7.3</span> Meta’s Llama 4</h3>
<p><a href="https://ai.meta.com/blog/llama-4-multimodal-intelligence/?ref=danmackinlay.name">Meta’s Llama series</a> doesn’t carry CCP guardrails (it has its own, more Western-aligned refusal patterns). If de-censoring is too much hassle, Llama 4 variants (including the 400B-parameter Maverick MoE with 17B active parameters) are a lower-friction option, though as of early 2026 the largest open Llama models don’t quite match Qwen3–235B on benchmarks.</p>
</section>
</section>
<section id="cloud-audition-pathway" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="cloud-audition-pathway"><span class="header-section-number">8</span> Cloud audition pathway</h2>
<p>Before committing to hardware, test the full stack on rented compute. Here’s the recommended sequence:</p>
<section id="phase-1-quick-test-12-days-100200-aud" class="level3" data-number="8.1">
<h3 data-number="8.1" class="anchored" data-anchor-id="phase-1-quick-test-12-days-100200-aud"><span class="header-section-number">8.1</span> Phase 1: Quick test (1–2 days, ~$100–$200 AUD)</h3>
<ol type="1">
<li>Rent a single H100 80GB on <a href="https://www.runpod.io/?ref=danmackinlay.name">RunPod</a> (<a href="https://intuitionlabs.ai/articles/h100-rental-prices-cloud-comparison?ref=danmackinlay.name">$2–$3 USD/hr</a>)</li>
<li>Deploy Qwen3–30B-A3B (the smaller MoE variant) with vLLM</li>
<li>Test our actual workloads: agentic tool-calling, document processing, code generation</li>
<li>Validate that the vLLM/SGLang API is compatible with our tools</li>
</ol>
</section>
<section id="phase-2-full-scale-test-12-weeks-5001000-aud" class="level3" data-number="8.2">
<h3 data-number="8.2" class="anchored" data-anchor-id="phase-2-full-scale-test-12-weeks-5001000-aud"><span class="header-section-number">8.2</span> Phase 2: Full-scale test (1–2 weeks, ~$500–$1,000 AUD)</h3>
<ol type="1">
<li>Rent 4–8× H100s on <a href="https://lambdalabs.com/?ref=danmackinlay.name">Lambda Labs</a> or RunPod</li>
<li>Deploy Qwen3–235B-A22B at AWQ 4-bit with vLLM</li>
<li>Run abliteration and test the de-censored model</li>
<li>Simulate multi-user load (5–15 concurrent users with realistic agentic workloads)</li>
<li>Measure throughput, latency, and KV cache pressure</li>
</ol>
</section>
<section id="phase-3-dgx-cloud-validation-optional-10002000-aud" class="level3" data-number="8.3">
<h3 data-number="8.3" class="anchored" data-anchor-id="phase-3-dgx-cloud-validation-optional-10002000-aud"><span class="header-section-number">8.3</span> Phase 3: DGX Cloud validation (optional, ~$1,000–$2,000 AUD)</h3>
<ol type="1">
<li>Access <a href="https://www.nvidia.com/en-us/data-center/dgx-cloud/?ref=danmackinlay.name">DGX Cloud</a> via AWS, Azure, or GCP marketplace</li>
<li>Deploy using NIM containers</li>
<li>Validate that the full NIM/NGC software stack works with our model and configuration</li>
<li>This ensures seamless migration when we receive the physical hardware</li>
</ol>
</section>
<section id="phase-4-purchase-and-deploy" class="level3" data-number="8.4">
<h3 data-number="8.4" class="anchored" data-anchor-id="phase-4-purchase-and-deploy"><span class="header-section-number">8.4</span> Phase 4: Purchase and deploy</h3>
<ol type="1">
<li>Order DGX Station through an Australian vendor (XENON, Dell, MSI)</li>
<li>While waiting for delivery, finalise the de-censored model weights on cloud</li>
<li>On arrival: transfer weights, deploy vLLM/NIM, configure access control</li>
<li>Monitor for a week, then open to full collective use</li>
</ol>
</section>
</section>
<section id="workflow-portability-nim-ngc-as-the-abstraction-layer" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="workflow-portability-nim-ngc-as-the-abstraction-layer"><span class="header-section-number">9</span> Workflow portability: NIM + NGC as the abstraction layer</h2>
<p>The single most important architectural decision for long-term flexibility: <strong>build our workflows against <a href="https://docs.nvidia.com/nim/large-language-models/latest/getting-started.html?ref=danmackinlay.name">NIM</a> APIs and <a href="https://catalog.ngc.nvidia.com/?ref=danmackinlay.name">NGC</a> containers</strong>, not against any specific cloud provider’s tooling.</p>
<p>NIM (NVIDIA Inference Microservices) provides an OpenAI-compatible API that works identically on DGX Cloud, any major hyperscaler, and our own DGX Station. NGC (NVIDIA GPU Cloud) containers are the deployment units.</p>
<p>If we standardize on this layer, we can:</p>
<ul>
<li>Develop and test on rented cloud GPUs</li>
<li>Deploy to our own hardware with no code changes</li>
<li>Fall back to cloud if our hardware fails or demand spikes</li>
<li>Migrate between cloud providers without rewriting anything</li>
</ul>
<p>The DGX ecosystem’s portability story is genuinely good here—it’s one of the few areas where vendor lock-in actually works in our favour, because the vendor (NVIDIA) has a strong incentive to make its software run everywhere NVIDIA hardware exists.</p>
</section>
<section id="cost-summary" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="cost-summary"><span class="header-section-number">10</span> Cost summary</h2>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Item</th>
<th>One-time cost (AUD)</th>
<th>Ongoing monthly (AUD)</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>DGX Station GB300</td>
<td>$135,000–$195,000</td>
<td>—</td>
</tr>
<tr class="even">
<td>UPS + electrical work</td>
<td>$2,000–$5,000</td>
<td>—</td>
</tr>
<tr class="odd">
<td>De-censoring (abliteration + DPO)</td>
<td>$1,500–$4,000</td>
<td>—</td>
</tr>
<tr class="even">
<td>Cloud audition (phases 1–3)</td>
<td>$800–$3,200</td>
<td>—</td>
</tr>
<tr class="odd">
<td><strong>Total one-time</strong></td>
<td><strong>~$140,000–$207,000</strong></td>
<td>—</td>
</tr>
<tr class="even">
<td>Electricity (1600W @ 24/7)</td>
<td>—</td>
<td>~$350</td>
</tr>
<tr class="odd">
<td>Hardware amortization (3yr)</td>
<td>—</td>
<td>~$4,500</td>
</tr>
<tr class="even">
<td>Internet (business NBN or colo, see risks)</td>
<td>—</td>
<td>$150–$1,000</td>
</tr>
<tr class="odd">
<td><strong>Total monthly</strong></td>
<td>—</td>
<td><strong>~$5,000–$5,900</strong></td>
</tr>
<tr class="even">
<td><strong>Per member/month (50 members)</strong></td>
<td>—</td>
<td><strong>~$100–$118</strong></td>
</tr>
</tbody>
</table>
<p>The one-time cost amortized over three years adds roughly $55–$75/month per member in a 50-person collective. Combined with operating costs, total cost of ownership is <strong>$155–$193/month per member</strong> depending mainly on whether we host at home or in a colo facility. This is competitive with commercial API access for serious users—and with the advantages of no rate limits, no per-query metering, and full data sovereignty.</p>
</section>
<section id="risks-and-mitigations" class="level2" data-number="11">
<h2 data-number="11" class="anchored" data-anchor-id="risks-and-mitigations"><span class="header-section-number">11</span> Risks and mitigations</h2>
<section id="hardware-failure" class="level3" data-number="11.1">
<h3 data-number="11.1" class="anchored" data-anchor-id="hardware-failure"><span class="header-section-number">11.1</span> Hardware failure</h3>
<p>The DGX Station is a single point of failure. Mitigation: NVIDIA offers enterprise support contracts through partners like <a href="https://xenon.com.au/product/nvidia-dgx-station/?ref=danmackinlay.name">XENON</a>; budget $10,000–$20,000/year for NBD replacement coverage. Alternatively, the collective falls back to cloud inference during downtime—if our workflows are built on NIM, the failover is seamless.</p>
</section>
<section id="model-obsolescence" class="level3" data-number="11.2">
<h3 data-number="11.2" class="anchored" data-anchor-id="model-obsolescence"><span class="header-section-number">11.2</span> Model obsolescence</h3>
<p>A model that’s frontier-class today won’t be in 18 months. Mitigation: the hardware itself doesn’t become obsolete—it can run whatever future models fit in its memory. The 784 GB unified memory is generous enough that it will remain relevant through several generations of open-weight models.</p>
</section>
<section id="network-reliability" class="level3" data-number="11.3">
<h3 data-number="11.3" class="anchored" data-anchor-id="network-reliability"><span class="header-section-number">11.3</span> Network reliability</h3>
<p>Australian residential broadband—especially older HFC and FTTN NBN connections—is not reliable enough for a production service. Multiple brief outages per day are common, and asymmetric upload speeds (often 20–40 Mbps) limit remote access quality. Token generation bandwidth is modest (a few KB/s per user), so throughput is not the problem; connection stability is.</p>
<p>Mitigation options, in ascending order of cost and reliability:</p>
<ul>
<li><strong>Residential NBN + 5G failover</strong>: ~$150/month total. Handles most brief outages automatically via a dual-WAN router. Good enough for a tolerant collective.</li>
<li><strong>Business-grade NBN</strong> (e.g.&nbsp;<a href="https://www.aussiebroadband.com.au/business/?ref=danmackinlay.name">ABB Business</a> or <a href="https://www.superloop.com/business/?ref=danmackinlay.name">Superloop Business</a>): ~$150–$250/month. Better SLA, static IP, priority fault response. Still on shared infrastructure.</li>
<li><strong>Quarter-rack colocation</strong>: ~$500–$1,000/month at a facility like <a href="https://www.equinix.com.au/data-centers/asia-pacific-colocation/australia-colocation/sydney-data-centers?ref=danmackinlay.name">Equinix SY1–SY5</a> or <a href="https://www.nextdc.com/data-centres/s2-sydney-data-centre?ref=danmackinlay.name">NEXTDC S2</a>. Redundant fibre, generator backup, physical security. Loses the “under a desk” community feel but gains genuine uptime.</li>
</ul>
<p>The right choice depends on how many members access the machine remotely versus on the local network, and how tolerant the collective is of occasional downtime during agentic workflows.</p>
</section>
<section id="operational-complexity" class="level3" data-number="11.4">
<h3 data-number="11.4" class="anchored" data-anchor-id="operational-complexity"><span class="header-section-number">11.4</span> Operational complexity</h3>
<p>Someone needs to administer this. Mitigation: NIM reduces operational overhead to “run a Docker container.” Updates are pulled from NGC. Access control can be managed through standard reverse proxy setups (nginx + OAuth2). This is weekend-sysadmin-level complexity, not full-time-ops-team complexity.</p>
</section>
<section id="legal-and-regulatory" class="level3" data-number="11.5">
<h3 data-number="11.5" class="anchored" data-anchor-id="legal-and-regulatory"><span class="header-section-number">11.5</span> Legal and regulatory</h3>
<p>Running modified AI models for a collective may have legal implications as Australian AI regulation develops. Mitigation: stay informed, participate in consultation processes, and document our governance framework. Choosing a legal structure (see below) gives us a legal entity that can hold assets and manage liability.</p>
</section>
</section>
<section id="legal-structure" class="level2" data-number="12">
<h2 data-number="12" class="anchored" data-anchor-id="legal-structure"><span class="header-section-number">12</span> Legal structure</h2>
<p>A compute collective needs a legal entity that can own a $160k asset, collect monthly contributions from members, enter contracts (hosting, internet, support), and limit personal liability. Australian law offers several options. None is perfect; here’s how they compare for this specific use case.</p>
<section id="legal-coop" class="level3" data-number="12.1">
<h3 data-number="12.1" class="anchored" data-anchor-id="legal-coop"><span class="header-section-number">12.1</span> Option 1: Cooperative under the Co-operatives National Law</h3>
<p>A <a href="https://business.gov.au/planning/business-structures-and-types/business-structures/co-operative?ref=danmackinlay.name">cooperative</a> is purpose-built for exactly this kind of thing: a group of people who jointly own and operate infrastructure for their mutual benefit. Under the <a href="https://www.nsw.gov.au/business-and-economy/co-operatives/about-co-operatives/co-operatives-national-law?ref=danmackinlay.name">Co-operatives National Law</a> (CNL), now harmonized across most states and territories, a cooperative:</p>
<ul>
<li>Requires a <a href="https://www.nsw.gov.au/business-and-economy/co-operatives/running-a-co-operative/co-operative-membership-rights-and-responsibilities?ref=danmackinlay.name">minimum of 5 active members</a> (our 25–50 is well above this)</li>
<li>Operates on one-member-one-vote, regardless of contribution level</li>
<li>Can hold assets, enter contracts, and collect member contributions</li>
<li>Can issue shares (members buy in) and pay limited returns on them</li>
<li>Requires members to be “active”—i.e.&nbsp;actually using the co-op’s services, which is exactly what we want</li>
<li>Cannot distribute profits to members beyond the limited share return, but can reinvest in better hardware, more capacity, etc.</li>
</ul>
<p>The <a href="https://fed.coop/co-operatives-in-australia-a-manual/part-one-understanding-co-operatives/legislation/?ref=danmackinlay.name">Co-op Federation</a> publishes a comprehensive manual on formation and governance. Registration is through the state registrar (e.g.&nbsp;<a href="https://www.nsw.gov.au/business-and-economy/co-operatives/about-co-operatives?ref=danmackinlay.name">NSW Fair Trading</a>).</p>
<p><strong>Pros:</strong> Philosophically the best fit—the legal form matches the actual relationship (members own infrastructure they use collectively). National law means consistent rules across states. Members have clear rights.</p>
<p><strong>Cons:</strong> More regulatory overhead than an incorporated association. Requires a formal formation meeting, a disclosure statement, and rules that comply with the CNL’s <a href="https://www.nsw.gov.au/business-and-economy/co-operatives/running-a-co-operative/co-operative-rules?ref=danmackinlay.name">model rules</a>. Annual reporting to the state registrar. If the collective is small and informal, this may feel heavy.</p>
<p><strong>Estimated setup cost:</strong> $1,000–$3,000 (registration fees + legal advice on rules).</p>
</section>
<section id="legal-incorp" class="level3" data-number="12.2">
<h3 data-number="12.2" class="anchored" data-anchor-id="legal-incorp"><span class="header-section-number">12.2</span> Option 2: Incorporated association</h3>
<p>An <a href="https://www.nsw.gov.au/business-and-economy/incorporated-associations/about-incorporated-associations?ref=danmackinlay.name">incorporated association</a> is the simplest and cheapest legal structure for a small not-for-profit group in Australia. Registration is at the state or territory level (<a href="https://www.nsw.gov.au/business-and-economy/incorporated-associations/running-an-incorporated-association?ref=danmackinlay.name">~$57/year in NSW</a>, similar in other states).</p>
<ul>
<li>Can hold assets, enter contracts, sue and be sued</li>
<li>Members have limited liability (capped at membership fee)</li>
<li>Cannot distribute profits or assets to members</li>
<li>Restricted to operating primarily in the home state (interstate operations <a href="https://www.hallpayne.com.au/blog/2023/april/nfp-business-structure/?ref=danmackinlay.name">may require ASIC registration</a> as a Registered Australian Body)</li>
<li>NSW imposes a <a href="https://www.nsw.gov.au/business-and-economy/incorporated-associations/about-incorporated-associations?ref=danmackinlay.name">$2M gross revenue/assets threshold</a> for registration as an association; our asset value is well under this</li>
</ul>
<p><strong>Pros:</strong> Cheapest, simplest to set up. Low annual compliance. Familiar form—thousands of community groups use this. Model constitutions available from state regulators.</p>
<p><strong>Cons:</strong> No share structure, so the “buy-in” mechanism is less natural—member contributions would be fees, not equity. Single-state restriction could matter if the collective spans Sydney and Melbourne. The form is designed for community groups and sporting clubs, not infrastructure-owning collectives; some state registrars <a href="https://betterboards.net/non-profit-fact-sheets/incorporated-association/?ref=danmackinlay.name">may query</a> whether a compute collective fits their intended scope.</p>
<p><strong>Estimated setup cost:</strong> $200–$500.</p>
</section>
<section id="legal-clg" class="level3" data-number="12.3">
<h3 data-number="12.3" class="anchored" data-anchor-id="legal-clg"><span class="header-section-number">12.3</span> Option 3: Company limited by guarantee (CLG)</h3>
<p>A <a href="https://betterboards.net/non-profit-fact-sheets/company-limited-by-guarantee/?ref=danmackinlay.name">company limited by guarantee</a> is a federal structure registered with ASIC. Members guarantee a small amount (often $10–$100) in the event of winding up, rather than holding shares.</p>
<ul>
<li>Can operate nationally without interstate registration issues</li>
<li><a href="https://boanco.com.au/2024/09/06/company-limited-by-guarantee-vs-incorporated-association-whats-best-for-your-not-for-profit/?ref=danmackinlay.name">Higher annual fees</a> (~$1,267/year to ASIC vs ~$57 for an association)</li>
<li>Subject to more rigorous <a href="https://www.mullinslawyers.com.au/resources/making-the-switch-part-1-pros-and-cons-of-a-company-limited-by-guarantee/?ref=danmackinlay.name">ASIC reporting requirements</a></li>
<li>Can apply for <a href="https://www.acnc.gov.au/tools/guides/registration-application-checklist-and-guide?ref=danmackinlay.name">ACNC registration</a> as a charity if the collective has a genuine charitable purpose</li>
</ul>
<p><strong>Pros:</strong> National scope. More credible structure if the collective grows or seeks grants. Clear governance framework under the Corporations Act.</p>
<p><strong>Cons:</strong> Overkill for a 50-person collective. Higher compliance cost. The guarantee structure doesn’t naturally map to “members buy shares in shared infrastructure.”</p>
<p><strong>Estimated setup cost:</strong> $1,500–$4,000 (ASIC fees + legal advice on constitution).</p>
</section>
<section id="what-about-acnc-registration-and-dgr-status" class="level3" data-number="12.4">
<h3 data-number="12.4" class="anchored" data-anchor-id="what-about-acnc-registration-and-dgr-status"><span class="header-section-number">12.4</span> What about ACNC registration and DGR status?</h3>
<p>Probably not. <a href="https://www.acnc.gov.au/for-charities/start-charity/you-start-charity/why-register?ref=danmackinlay.name">ACNC registration</a> requires a charitable purpose, and “a group of professionals sharing AI compute” isn’t obviously charitable. If the collective had an explicit community education or digital inclusion mission—e.g.&nbsp;providing AI access to under-resourced community organisations—ACNC registration might be possible, but it would constrain the collective’s operations significantly. <a href="https://www.ato.gov.au/businesses-and-organisations/not-for-profit-organisations/getting-started/getting-endorsed-for-tax-concessions-or-as-a-dgr/is-my-organisation-eligible-for-dgr-endorsement/rules-and-tests-for-dgr-endorsement/dgrs-required-to-be-a-registered-charity?ref=danmackinlay.name">DGR endorsement</a> (tax-deductible donations) is even harder to obtain. Let’s not plan around it.</p>
</section>
<section id="recommendation" class="level3" data-number="12.5">
<h3 data-number="12.5" class="anchored" data-anchor-id="recommendation"><span class="header-section-number">12.5</span> Recommendation</h3>
<p>For a compute collective of 25–50 people in a single city: <strong>start as an incorporated association</strong> for speed and simplicity, with an explicit plan to convert to a cooperative under the CNL if the model proves viable and the collective wants a more natural ownership structure. The <a href="https://www.minterellison.com/articles/structuring-for-nfp-success?ref=danmackinlay.name">conversion process</a> is well-documented and doesn’t require dissolving the original entity.</p>
<p>If the collective spans multiple states from the start, or if members want a share-based buy-in from day one, go straight to a cooperative.</p>
<p>Either way, let’s get a solicitor to review the constitution/rules before committing $160k of members’ money to a hardware purchase. Budget $2,000–$5,000 for initial legal advice—cheap insurance on a six-figure asset.</p>
</section>
</section>
<section id="next-steps" class="level2" data-number="13">
<h2 data-number="13" class="anchored" data-anchor-id="next-steps"><span class="header-section-number">13</span> Next steps</h2>
<p>If we’re interested in forming or joining a compute collective, the immediate actions are:</p>
<ol type="1">
<li><strong>Gauge interest</strong>: find 10–20 people who would commit to ~$150/month for sovereign AI access</li>
<li><strong>Run a cloud pilot</strong>: $200 buys a weekend of testing on rented GPUs</li>
<li><strong>Choose a legal structure</strong>: start as an incorporated association, convert to a cooperative if the model works (see legal structure section above)</li>
<li><strong>Order hardware</strong>: current lead times for DGX Station are “months, not weeks”—starting the order process early is important</li>
<li><strong>Document everything</strong>: the playbook we write becomes the replication kit for the next collective</li>
</ol>
<p>The <a href="../notebook/aus_sovereign_llm.html">companion post</a> makes the case for why. This post, I hope, makes the case that it’s <em>how</em>.</p>


</section>

 ]]></description>
  <category>AI</category>
  <category>community project</category>
  <category>cooperation</category>
  <category>diy</category>
  <category>engineering</category>
  <category>faster pussycat</category>
  <category>institutions</category>
  <category>sovereign</category>
  <category>straya</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/aus_sovereign_llm_technical.html</guid>
  <pubDate>Sun, 22 Mar 2026 01:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/colossal_elephant_section.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Hacking financial regulation for community mutual aid</title>
  <link>https://danmackinlay.name/notebook/neo_friendly_societies_technical.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-maggior-consiglio" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-maggior-consiglio-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/maggior_consiglio_RP-P-2018-1237.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/maggior_consiglio_RP-P-2018-1237.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-maggior-consiglio-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>This is a companion to <a href="../notebook/neo_friendly_societies.html">Who wants to found a friendly society?</a>, where I sketch the pitch for a neo-friendly society—a small mutual that invests in counter-cyclical assets as a hedge against state weakness. That post is the <em>why</em>. This one is the <em>how</em>, or more honestly, the <em>can we?</em></p>
<p>The question: if 50 of us wanted to pool money, invest it in ETFs and catastrophe bonds, and provide mutual aid to members in hard times—what legal structure would we use in Australia, and could AI agents cut the compliance costs enough to make it viable?</p>
<p>Sounds interesting? <a href="../contact.html">Get in touch</a>.</p>
<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>I set Claude to work researching this. It is a start. I have stopped here, with some directions for further research, and one worked-out war-game scenario where we go maximally ambitious.</p>
</div>
</div>
</div>
<section id="what-are-we-in-australian-law" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="what-are-we-in-australian-law"><span class="header-section-number">1</span> What are we in Australian law?</h2>
<p>This is the hard part. There are several possible legal structures, each with different trade-offs. I’ll try to sketch the landscape; this is emphatically not legal advice.</p>
<section id="option-1-apra-registered-friendly-society" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="option-1-apra-registered-friendly-society"><span class="header-section-number">1.1</span> Option 1: APRA-registered friendly society</h3>
<p>The purest path. In Australia, friendly societies are regulated under the <a href="https://www.apra.gov.au/legislation-for-life-insurers-and-friendly-societies?ref=danmackinlay.name">Life Insurance Act 1995</a> by <a href="https://www.apra.gov.au/life-insurance-and-friendly-societies?ref=danmackinlay.name">APRA</a>. They operate using a <a href="https://www.apra.gov.au/friendly-society-benefit-funds?ref=danmackinlay.name">“benefit fund” structure</a>—members’ contributions go into a fund that provides defined benefits.</p>
<p>The problems are severe for a small group:</p>
<ul>
<li>We’d have to be a <strong>corporation</strong> (APRA can’t register partnerships or unincorporated entities).</li>
<li>Even <em>using the words</em> “friendly society” in relation to a financial business <a href="https://www.apra.gov.au/licensing-guidelines-for-life-insurers-and-friendly-societies?ref=danmackinlay.name">requires APRA consent</a> under s16E of the Life Insurance Act.</li>
<li>The <a href="https://www.apra.gov.au/life-insurance-and-friendly-society-reporting-requirements?ref=danmackinlay.name">Financial Accountability Regime (FAR)</a>, which applies from March 2025, adds accountability, key personnel, and deferred remuneration obligations.</li>
<li>APRA compliance is designed for institutions with millions in assets and dedicated compliance teams. It is spectacularly inappropriate for 30 friends with a spreadsheet.</li>
</ul>
<p><strong>Verdict:</strong> Almost certainly not the right path for a small start-up mutual. But worth understanding, because the wargaming section below asks: <em>what if we tried anyway?</em></p>
</section>
<section id="option-2-co-operative-under-co-operatives-national-law" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="option-2-co-operative-under-co-operatives-national-law"><span class="header-section-number">1.2</span> Option 2: Co-operative under Co-operatives National Law</h3>
<p>Australia has harmonized <a href="https://www.nsw.gov.au/business-and-economy/co-operatives/about-co-operatives/co-operatives-national-law?ref=danmackinlay.name">Co-operatives National Law (CNL)</a>, adopted by all states and territories between 2012 and 2020. About 1,400 of Australia’s ~1,800 co-ops and mutuals are registered under CNL.</p>
<p>A co-op could collect member contributions and invest them, potentially through a managed fund or ETFs. The <a href="https://bccm.coop/?ref=danmackinlay.name">Business Council of Co-operatives and Mutuals (BCCM)</a> is a good resource here.</p>
<p>Key features:</p>
<ul>
<li>Democratic governance (one member, one vote) is built in—though notably the CNL is flexible about <em>how</em> that vote is conducted. The model rules are not compulsory; our co-op’s rules could specify preferential voting, STV, approval voting for board elections, or even sortition for committees and advisory panels. We can’t replace the statutory board election with pure sortition, but there’s wide scope for experimental governance below that level.</li>
<li>The <a href="https://www.legislation.gov.au/Details/C2019A00037?ref=danmackinlay.name">Treasury Laws Amendment (Mutual Reforms) Act 2019</a> introduced <strong>Mutual Capital Instruments (MCIs)</strong> — a bespoke share class for mutual entities that lets them raise capital without demutualizing. MCIs require the entity to be a public company, though, so this is more relevant if the model scales up.</li>
<li>Registration is with the state Registrar of Co-operatives; costs and complexity are much lower than APRA.</li>
</ul>
<p><strong>Catch:</strong> If the co-op pools member funds for investment, it might constitute a <a href="https://www.asic.gov.au/regulatory-resources/managed-funds/managed-investment-schemes/?ref=danmackinlay.name">managed investment scheme under the Corporations Act</a>. That triggers ASIC regulation—the responsible entity must be an Australian public company holding an AFSL. Heavy.</p>
</section>
<section id="option-3-small-scale-unregistered-managed-investment-scheme" class="level3" data-number="1.3">
<h3 data-number="1.3" class="anchored" data-anchor-id="option-3-small-scale-unregistered-managed-investment-scheme"><span class="header-section-number">1.3</span> Option 3: Small-scale unregistered managed investment scheme</h3>
<p>Here’s where it gets interesting for small groups. ASIC’s rules have a <a href="https://afslhouse.com.au/insights/do-you-need-an-afsl-to-offer-a-managed-investment-scheme-understanding-what-it-means/?ref=danmackinlay.name"><strong>“20/12 rule”</strong></a>: a managed investment scheme doesn’t need to be registered if it has <strong>20 or fewer members</strong> (in any 12-month period) and raises <strong>no more than $2 million</strong>. Alternatively, schemes open only to <strong>wholesale clients</strong> are exempt from registration.</p>
<p>An unregistered scheme still needs an operator with an AFS licence, generally. But the compliance burden is dramatically lower than a registered scheme. For a group of, say, 20 friends each contributing $200/month into a shared portfolio of ETFs, this <em>might</em> be workable.</p>
<p>This is probably the most promising path for the investment function specifically. But it caps group size at 20, which is tight.</p>
<p><strong>Research direction:</strong> How do the wholesale client tests work in practice for this kind of structure? The <a href="https://lawcouncil.au/?ref=danmackinlay.name">Law Council of Australia</a> has submissions on reforming wholesale investor tests. Could members qualify as wholesale clients if they individually meet the net assets or income tests?</p>
</section>
<section id="option-4-incorporated-association-individual-investments" class="level3" data-number="1.4">
<h3 data-number="1.4" class="anchored" data-anchor-id="option-4-incorporated-association-individual-investments"><span class="header-section-number">1.4</span> Option 4: Incorporated association + individual investments</h3>
<p>The lightest-touch option: form an <a href="https://www.acnc.gov.au/tools/topic-guides/incorporated-associations?ref=danmackinlay.name">incorporated association</a> under state law to handle governance, meetings, and collective bargaining (e.g.&nbsp;negotiating group rates on health insurance), but <strong>don’t pool investment funds directly</strong>. Instead, members invest individually in agreed-upon ETFs or funds, with the association providing education, coordination, and mutual support.</p>
<p>The catch is that incorporated associations must be not-for-profit—members can’t receive financial gain from the association’s activities. So the investment coordination would need to be clearly ancillary to the association’s mutual-aid purpose, and actual investment returns would flow to members individually, not through the association.</p>
</section>
<section id="option-5-the-broodfonds-dodgegifts-not-insurance" class="level3" data-number="1.5">
<h3 data-number="1.5" class="anchored" data-anchor-id="option-5-the-broodfonds-dodgegifts-not-insurance"><span class="header-section-number">1.5</span> Option 5: The Broodfonds dodge—gifts, not insurance</h3>
<p>The Dutch <a href="https://en.wikipedia.org/wiki/Broodfonds?ref=danmackinlay.name">Broodfonds model</a> cleverly avoids insurance regulation by structuring payouts as <strong>gifts</strong> between individuals, not as insurance benefits from a fund. Each member has their own dedicated account; when someone gets sick, other members voluntarily transfer money to them.</p>
<p>In Australia, the tax treatment of gifts between individuals is generally favourable (gifts are not income to the recipient unless they’re from an employer or business). But whether APRA or ASIC would accept this framing for a scheme that <em>looks</em> like mutual insurance is an open question. The ATO might also have views.</p>
<p><strong>Research direction:</strong> Has anyone tested a Broodfonds-style gift structure against Australian financial services law? What are the ATO implications of regular “gifts” between members of a structured group?</p>
</section>
<section id="summary-table" class="level3" data-number="1.6">
<h3 data-number="1.6" class="anchored" data-anchor-id="summary-table"><span class="header-section-number">1.6</span> Summary table</h3>
<table class="caption-top table">
<colgroup>
<col style="width: 13%">
<col style="width: 13%">
<col style="width: 19%">
<col style="width: 27%">
<col style="width: 26%">
</colgroup>
<thead>
<tr class="header">
<th>Structure</th>
<th>Regulator</th>
<th>Min. complexity</th>
<th>Can pool investments?</th>
<th>Can provide benefits?</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>APRA friendly society</td>
<td>APRA</td>
<td>Extreme</td>
<td>Yes (benefit funds)</td>
<td>Yes (life insurance)</td>
</tr>
<tr class="even">
<td>Co-operative (CNL)</td>
<td>State registrar</td>
<td>Moderate</td>
<td>Maybe (MIS risk)</td>
<td>Limited</td>
</tr>
<tr class="odd">
<td>Unregistered MIS (≤20 members)</td>
<td>ASIC (light)</td>
<td>Moderate</td>
<td>Yes</td>
<td>Via returns</td>
</tr>
<tr class="even">
<td>Incorporated association</td>
<td>State</td>
<td>Low</td>
<td>No (not-for-profit)</td>
<td>Mutual aid only</td>
</tr>
<tr class="odd">
<td>Gift-based (Broodfonds)</td>
<td>Unclear</td>
<td>Low</td>
<td>No</td>
<td>Gifts between members</td>
</tr>
</tbody>
</table>
</section>
<section id="hybrid-structures" class="level3" data-number="1.7">
<h3 data-number="1.7" class="anchored" data-anchor-id="hybrid-structures"><span class="header-section-number">1.7</span> Hybrid structures</h3>
<p>There’s a possible hybrid model worth considering: a co-operative or association handles governance and collective bargaining, while a separate (or connected) unit trust or managed fund handles the investment side. This adds complexity but might give the best of both worlds—democratic mutual-aid governance on top, proper investment infrastructure underneath.</p>
<p>The <a href="https://bccm.coop/help-advice/raise-finance/mutual-capital-instruments/?ref=danmackinlay.name">Mutual Capital Instruments</a> framework from the 2019 reforms is interesting here—it was designed to let mutuals raise external capital. Could it be repurposed for a small mutual wanting to invest member contributions? Unclear, but worth investigating.</p>
</section>
</section>
<section id="wargaming-maximum-ambition-the-apra-path" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="wargaming-maximum-ambition-the-apra-path"><span class="header-section-number">2</span> Wargaming maximum ambition: the APRA path</h2>
<p>OK. Let’s stop being sensible for a moment and ask: what if we went <em>all the way</em>? Not “pick the lightest-touch legal structure and hope nobody notices”, but “actually register as a proper APRA-regulated friendly society and use AI to make the compliance affordable.” This is the maximally ambitious version. Let’s wargame it.</p>
<section id="the-compliance-bill-itemized" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="the-compliance-bill-itemized"><span class="header-section-number">2.1</span> The compliance bill, itemized</h3>
<p>Here’s what APRA demands of a friendly society, and roughly what it costs if we’re doing it the traditional way. These numbers are rough estimates assembled from publicly available information on APRA levies, actuarial consulting market rates, and audit fees for small financial institutions. I would love to hear corrections from people with direct experience.</p>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Requirement</th>
<th>Traditional cost (annual est.)</th>
<th>What it actually involves</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><a href="https://treasury.gov.au/sites/default/files/2024-05/c2024-522482-dp.pdf?ref=danmackinlay.name">APRA supervisory levy</a></td>
<td>~$22,500 minimum</td>
<td>Non-negotiable. This is the floor; paused from increasing in 2024–26 but still brutal for a small org.</td>
</tr>
<tr class="even">
<td><a href="https://www.apra.gov.au/role-of-appointed-actuary?ref=danmackinlay.name">Appointed Actuary</a></td>
<td>$30,000–80,000</td>
<td>CPS 320 requires one. Must be FIAA-qualified. Prepares the annual Financial Condition Report. Actuarial consulting runs $200–600/hr; even a minimal engagement is expensive.</td>
</tr>
<tr class="odd">
<td><a href="https://www.apra.gov.au/sites/default/files/cpg_220_april_2018_version.pdf?ref=danmackinlay.name">Risk Management Framework</a></td>
<td>$10,000–30,000</td>
<td>CPS 220 requires a documented framework, board-approved risk appetite statement, annual review. Usually outsourced to consultants.</td>
</tr>
<tr class="even">
<td><a href="https://www.apra.gov.au/news-and-publications/apra-and-asic-issue-final-rules-and-information-for-financial-accountability?ref=danmackinlay.name">Financial Accountability Regime</a></td>
<td>$5,000–15,000</td>
<td>From March 2025: accountability maps, key personnel registration, deferred remuneration arrangements.</td>
</tr>
<tr class="odd">
<td>Regulatory returns &amp; reporting</td>
<td>$10,000–20,000</td>
<td>Quarterly and annual <a href="https://www.apra.gov.au/life-insurance-and-friendly-society-reporting-requirements?ref=danmackinlay.name">returns to APRA</a>. Financial statements. Benefit fund reporting under LPS 700.</td>
</tr>
<tr class="even">
<td>Audit</td>
<td>$15,000–30,000</td>
<td>Annual statutory audit by a registered company auditor.</td>
</tr>
<tr class="odd">
<td>Legal &amp; governance</td>
<td>$10,000–20,000</td>
<td>Constitution drafting, board minutes, member communications, AGM, compliance monitoring.</td>
</tr>
<tr class="even">
<td><strong>Total traditional</strong></td>
<td><strong>~$100,000–215,000/year</strong></td>
<td></td>
</tr>
</tbody>
</table>
<p>For a group of 50 members each contributing $200/month, that’s $120,000/year in contributions—almost entirely eaten by compliance. This is why nobody does this at small scale. The compliance cost <em>is</em> the moat that keeps friendly societies institutional.</p>
</section>
<section id="the-ai-compression-thesis" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="the-ai-compression-thesis"><span class="header-section-number">2.2</span> The AI compression thesis</h3>
<p>The question is: how much of that $100k–215k can AI agents compress to near-zero?</p>
<p>I’m going to sort APRA’s requirements into three tiers by how compressible they are with current (early 2026) AI capabilities.</p>
<section id="tier-1-highly-compressible-ai-does-8095-of-the-work" class="level4" data-number="2.2.1">
<h4 data-number="2.2.1" class="anchored" data-anchor-id="tier-1-highly-compressible-ai-does-8095-of-the-work"><span class="header-section-number">2.2.1</span> Tier 1: Highly compressible (AI does 80–95% of the work)</h4>
<p><strong>Governance documentation.</strong> Meeting minutes, board papers, risk appetite statements, compliance policies, member communications. This is where current LLMs already shine. An AI agent can draft board papers from a structured agenda, generate minutes from a recording, maintain a living compliance manual that updates when regulations change, and produce member communications. The human role shrinks to: review, approve, sign. Estimated cost with AI: a few hundred dollars in API costs plus a couple of hours of human review per month. Traditional cost saved: ~$10k–20k.</p>
<p><strong>Regulatory returns and reporting.</strong> APRA’s <a href="https://www.apra.gov.au/life-insurance-and-friendly-society-reporting-requirements?ref=danmackinlay.name">reporting forms (LRF 100 through LRF 800 series)</a> are structured data submissions. An AI agent connected to the fund’s accounting system could generate these automatically, flag anomalies, and prepare them for human sign-off. The XBRL/XML submission formats are well-documented. Estimated cost with AI: mostly engineering time to build the pipeline once, then near-zero marginal cost. Traditional cost saved: ~$10k–20k.</p>
<p><strong>Risk Management Framework.</strong> CPS 220 requires documentation, not headcount. An AI agent can maintain the framework document, update it when APRA issues new guidance, run scenario analyses on the fund’s (tiny, simple) portfolio, and generate the annual board risk report. The <em>substance</em> of risk management for a small, simple fund—50 members, index ETFs, maybe a catastrophe bond allocation, no exotic instruments—is genuinely not complex. It’s the documentation overhead that kills us. Traditional cost saved: ~$10k–30k.</p>
<p><strong>FAR compliance.</strong> Accountability maps and key personnel documentation are essentially structured data problems. An AI agent can maintain the accountability map, track personnel changes, generate the required notifications to APRA. Traditional cost saved: ~$5k–15k.</p>
</section>
<section id="tier-2-partially-compressible-ai-does-4060-human-expert-still-needed" class="level4" data-number="2.2.2">
<h4 data-number="2.2.2" class="anchored" data-anchor-id="tier-2-partially-compressible-ai-does-4060-human-expert-still-needed"><span class="header-section-number">2.2.2</span> Tier 2: Partially compressible (AI does 40–60%, human expert still needed)</h4>
<p><strong>Actuarial work.</strong> This is the hard one. APRA requires an Appointed Actuary who is a Fellow of the <a href="https://www.actuaries.asn.au/?ref=danmackinlay.name">Actuaries Institute</a>. We cannot replace this person with an AI—they must be a named, qualified individual who takes personal responsibility.</p>
<p>But we <em>can</em> radically reduce their billable hours. The Financial Condition Report for a simple friendly society (one benefit fund, index ETF investments, 50 members) is a constrained problem. An AI agent could prepare the entire draft FCR with all quantitative analysis done, run the liability projections, stress tests, and sensitivity analyses, produce the tables and charts, and draft the narrative sections. The Appointed Actuary then reviews, adjusts, and signs. Instead of 80–120 hours of actuarial time, maybe 10–20 hours of review. At $400/hr, that’s $4k–8k instead of $30k–80k.</p>
<p><strong>Audit.</strong> We still need a registered company auditor. But AI can prepare audit-ready financials, reconciliations, supporting schedules, and a complete audit file. If the auditor’s engagement is “review a clean, well-documented set of books” rather than “reconstruct what happened from a box of receipts”, the hours drop dramatically. Maybe $8k–12k instead of $15k–30k.</p>
</section>
<section id="tier-3-incompressible" class="level4" data-number="2.2.3">
<h4 data-number="2.2.3" class="anchored" data-anchor-id="tier-3-incompressible"><span class="header-section-number">2.2.3</span> Tier 3: Incompressible</h4>
<p><strong>APRA supervisory levy: ~$22,500.</strong> We pay this. There’s no way around it. It’s calculated on assets with a minimum floor, and no amount of automation changes it.</p>
<p><strong>The Appointed Actuary exists.</strong> Someone must hold this role. Even if their hours are minimal, they need professional indemnity insurance and will charge a retainer.</p>
<p><strong>The auditor exists.</strong> Same logic.</p>
<p><strong>ASIC fees.</strong> AFS licence application ($1,485), annual ASIC industry funding levy (variable but typically a few thousand), company registration and annual review fees.</p>
</section>
</section>
<section id="the-compressed-budget" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="the-compressed-budget"><span class="header-section-number">2.3</span> The compressed budget</h3>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Requirement</th>
<th>AI-compressed cost (annual est.)</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>APRA supervisory levy</td>
<td>$22,500</td>
<td>Fixed floor</td>
</tr>
<tr class="even">
<td>Appointed Actuary (review only)</td>
<td>$4,000–8,000</td>
<td>AI prepares everything, actuary reviews + signs</td>
</tr>
<tr class="odd">
<td>Risk Management Framework</td>
<td>$500–1,000</td>
<td>AI-maintained, human review quarterly</td>
</tr>
<tr class="even">
<td>FAR compliance</td>
<td>$500–1,000</td>
<td>AI-maintained accountability maps</td>
</tr>
<tr class="odd">
<td>Regulatory returns</td>
<td>$500–1,000</td>
<td>Automated pipeline, human sign-off</td>
</tr>
<tr class="even">
<td>Audit (clean books)</td>
<td>$8,000–12,000</td>
<td>AI-prepared audit file</td>
</tr>
<tr class="odd">
<td>Legal &amp; governance</td>
<td>$1,000–2,000</td>
<td>AI drafts, humans review</td>
</tr>
<tr class="even">
<td>ASIC fees &amp; levies</td>
<td>$2,000–4,000</td>
<td>AFS licence costs, industry funding</td>
</tr>
<tr class="odd">
<td>AI infrastructure</td>
<td>$2,000–5,000</td>
<td>API costs, hosting, tooling</td>
</tr>
<tr class="even">
<td><strong>Total compressed</strong></td>
<td><strong>~$41,000–56,000/year</strong></td>
<td></td>
</tr>
</tbody>
</table>
<p>That’s roughly half to a quarter of the traditional cost. For 50 members at $200/month ($120k/year income), we’d spend 35–45% on compliance, leaving $65k–80k for actual investment and mutual aid. Not great, but not impossible—especially if the point isn’t to maximize returns in good times but to have assets that hold value in bad times.</p>
<p>At 100 members, we’re at $240k/year income with the same ~$50k compliance cost—now it’s about 20%, which starts to look viable. At 200 members, the compliance cost is noise.</p>
<p>The $22,500 APRA levy is doing most of the damage at small scale. If a dozen neo-friendly societies all registered and started lobbying for a proportionate micro-entity levy, that floor might eventually move. Unlikely, but stranger things have happened.</p>
</section>
<section id="the-shoestring-team" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="the-shoestring-team"><span class="header-section-number">2.4</span> The shoestring team</h3>
<p>Who do we actually need?</p>
<p><strong>Paid roles (part-time/fractional):</strong></p>
<ul>
<li><strong>Appointed Actuary</strong> (fractional, ~20–40 hrs/year): Reviews AI-generated FCR, signs off. We’d want someone sympathetic to the project—perhaps a recently retired actuary, or one who works with multiple small funds. This is the hardest role to fill cheaply.</li>
<li><strong>Auditor</strong> (engagement, ~40–60 hrs/year): Annual statutory audit. A smaller firm or sole practitioner who’s comfortable with well-automated books.</li>
<li><strong>Responsible Manager</strong> (for AFS licence): ASIC requires at least one “responsible manager” with relevant qualifications and experience. This person oversees the financial services. Could be a member with the right background.</li>
</ul>
<p><strong>Volunteer/member roles (AI-assisted):</strong></p>
<ul>
<li><strong>Treasurer/Secretary</strong>: Runs the AI compliance pipeline day-to-day. Reviews AI outputs before submission. Doesn’t need to be an accountant—needs to be detail-oriented and willing to learn. The AI does the technical work; this person does quality control.</li>
<li><strong>Board</strong> (3–5 members): Meets quarterly. Reviews AI-prepared board papers. Makes actual decisions (investment policy, benefit design, member applications). Could be done in 2–3 hours per quarter if the papers are good.</li>
<li><strong>Tech lead</strong>: Maintains the AI agent infrastructure. Keeps the regulatory reporting pipeline working. Updates the compliance system when APRA changes its standards. This is probably the most important volunteer role—the whole model depends on the automation working.</li>
</ul>
</section>
<section id="the-ai-stack" class="level3" data-number="2.5">
<h3 data-number="2.5" class="anchored" data-anchor-id="the-ai-stack"><span class="header-section-number">2.5</span> The AI stack</h3>
<p>We’d build a system something like: accounting software (Xero or similar, ~$50/month) as the source of truth for financials, connected to an AI agent layer that:</p>
<ul>
<li>Ingests APRA’s prudential standards and reporting requirements</li>
<li>Generates all compliance documentation</li>
<li>Prepares regulatory returns in the required XBRL/XML formats</li>
<li>Maintains the risk management framework as a living document</li>
<li>Drafts board papers and member communications</li>
<li>Monitors for regulatory changes (new APRA guidance, amended standards)</li>
<li>Alerts the human team when something needs attention or sign-off</li>
</ul>
<p>This is a purpose-built system, not an off-the-shelf product. The RegTech industry has enterprise products that do pieces of this, but they’re priced for institutions. Our approach would be more DIY—AI coding agents building custom tools against one specific regulatory regime, iterated and debugged against real APRA requirements.</p>
<p>The upfront engineering investment is significant—maybe 200–400 hours to build the initial stack. But it only needs building once. Every subsequent friendly society that uses the same toolkit gets it for free (modulo customization).</p>
</section>
<section id="why-bother-going-full-apra" class="level3" data-number="2.6">
<h3 data-number="2.6" class="anchored" data-anchor-id="why-bother-going-full-apra"><span class="header-section-number">2.6</span> Why bother going full APRA?</h3>
<p>Three reasons, given the framing from the parent post:</p>
<ol type="1">
<li><strong>Benefit funds.</strong> Only an APRA-registered friendly society can operate benefit funds that provide defined benefits to members—sickness, disability, death. This is the <em>actual thing</em> that makes it a crisis instrument rather than just an investment club. Without it, we can invest together, but we can’t promise members specific support when they need it.</li>
<li><strong>Trust and legitimacy.</strong> “We’re APRA-regulated” means something. Members can trust that there’s real prudential oversight. Potential partner organizations (health insurers, employers, other mutuals) take us seriously.</li>
<li><strong>The replication play.</strong> If we build the AI compliance stack for one friendly society and it works, we’ve built it for <em>all</em> of them. The marginal cost of spinning up society #2, #3, #N is dramatically lower. The compliance infrastructure becomes a platform. This is where the shoestring investment pays off—not within a single society, but across a network of many.</li>
</ol>
</section>
<section id="what-could-go-wrong" class="level3" data-number="2.7">
<h3 data-number="2.7" class="anchored" data-anchor-id="what-could-go-wrong"><span class="header-section-number">2.7</span> What could go wrong</h3>
<p>Plenty. This is the “maximally ambitious” scenario, after all.</p>
<ul>
<li><strong>APRA might say no.</strong> They have discretion over licensing. A group of 50 friends proposing to run a friendly society on AI agents and vibes might not inspire confidence. We’d need a very good application and probably some pre-engagement with APRA to test the waters.</li>
<li><strong>The actuary problem.</strong> Finding a qualified actuary willing to put their name on a tiny, AI-assisted fund for a modest fee is non-trivial. Professional indemnity insurance alone might make it uneconomic for them.</li>
<li><strong>Regulatory change risk.</strong> APRA could tighten requirements in ways that break the automation. New reporting standards, new prudential rules, new interpretation of existing rules—all could spike costs unpredictably.</li>
<li><strong>Single point of failure.</strong> If the tech lead burns out or the AI stack breaks, we’re suddenly trying to do manual compliance on a volunteer budget. This needs redundancy and good documentation.</li>
<li><strong>The $22,500 problem.</strong> That minimum levy is the real killer. Until APRA introduces a genuinely proportionate levy for micro-entities (unlikely but not impossible, especially if there are enough of them lobbying for it), this floor sets a hard minimum on viable fund size.</li>
</ul>
</section>
<section id="the-staged-approach" class="level3" data-number="2.8">
<h3 data-number="2.8" class="anchored" data-anchor-id="the-staged-approach"><span class="header-section-number">2.8</span> The staged approach</h3>
<p>Maybe we don’t start at APRA. Maybe the play is:</p>
<p><strong>Year 0–1:</strong> Incorporate as an association or small co-op. Pool knowledge, not money. Build the AI compliance toolkit against APRA’s <em>actual standards</em>, as if we were regulated, but without the cost. Test it. Break it. Fix it. Invest in the counter-cyclical portfolio individually, coordinated by the association.</p>
<p><strong>Year 1–2:</strong> Operate as an unregistered MIS (≤20 members, ≤$2M) to test the investment function with real money. Get real experience with ASIC’s lighter-touch regime. Keep building and refining the compliance stack.</p>
<p><strong>Year 2–3:</strong> If the model works and membership demand is there, apply for APRA registration. By this point we have a working compliance system, a track record, audited financials, and a demonstrated member base. The application is much stronger than “we have an idea and some code.”</p>
<p><strong>Year 3+:</strong> Publish the toolkit. Help others replicate. Lobby APRA for proportionate regulation of micro-friendly societies.</p>
<p>This staged approach means we never spend money we don’t have, we build capability incrementally, and we only take on APRA’s compliance burden when we’re confident we can handle it. It also means the crisis-hedge portfolio is running from Year 1—the APRA registration is about adding the formal benefit structure on top, not about starting the investment.</p>
</section>
</section>
<section id="what-i-still-dont-know" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="what-i-still-dont-know"><span class="header-section-number">3</span> What I still don’t know</h2>
<ul>
<li>Whether the Broodfonds gift-based model survives contact with Australian financial services law and ATO scrutiny.</li>
<li>The practical costs of running an unregistered MIS with ≤20 members—I have estimates above but no real-world data.</li>
<li>Whether any FIAA-qualified actuary would actually take on a tiny fund at the rates I’m projecting, or whether professional indemnity makes it uneconomic.</li>
<li>Whether APRA would even entertain a licence application from a micro-entity with this profile.</li>
<li>How to structure the investment function in a way that’s both legally sound and actually useful as a crisis hedge.</li>
<li>What existing Australian co-ops or mutuals are doing that’s close to this vision—and what we can learn from them.</li>
</ul>
<p>If we know about any of this, I’d love to hear from you.</p>


</section>

 ]]></description>
  <category>community project</category>
  <category>cooperation</category>
  <category>diy</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>markets</category>
  <category>money</category>
  <category>straya</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/neo_friendly_societies_technical.html</guid>
  <pubDate>Sun, 08 Mar 2026 23:00:00 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/maggior_consiglio_RP-P-2018-1237.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>What even is “agency”?</title>
  <link>https://danmackinlay.name/notebook/agency.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>We are very exercised about whether we have agency. What is it actually? What does it even mean to say that we have agency? Can we ground our intuition about agency in something precise?</p>
<p>Do we even want it, or is <a href="../notebook/growing_up.html">being the grown up</a> not necessarily <a href="../notebook/robot_regency.html">in our best interests</a>?</p>
<p>These are all questions I don’t have answers to.</p>
<p>Here I have collected a list of edge cases for “agency” that I hope might help me delineate its boundaries.</p>
<div id="fig-vanity" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-vanity-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/vanity_RP-P-OB-9922.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/vanity_RP-P-OB-9922.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-vanity-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<section id="cults-and-agency" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="cults-and-agency"><span class="header-section-number">1</span> Cults and agency</h2>
<p><a href="https://www.iheart.com/podcast/867-the-dream-29832329/episode/the-antidote-to-trickery-323584845/?ref=danmackinlay.name">The Antidote to Trickery</a> is an interview with <a href="https://ownyourbrain.org/about/diane-benscoter/?ref=danmackinlay.name">Diane Benscoter</a>, a de-radicalisation expert, who argues that there is a distinction between being programmed by a cult and being de-programmed by a non-cult.</p>
<p>Is <a href="../notebook/multi_level_agency.html">sublimating my goals to a larger group really a loss of agency?</a></p>
</section>
<section id="is-domestication-a-loss-of-agency" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="is-domestication-a-loss-of-agency"><span class="header-section-number">2</span> Is domestication a loss of agency?</h2>
<p>See <a href="../notebook/human_domestication.html">Human domestication</a>.</p>
</section>
<section id="coercive-control" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="coercive-control"><span class="header-section-number">3</span> Coercive control</h2>
<p>Researchers seem to agree that coercive control is a thing, and that it’s bad <span class="citation" data-cites="Lohmann2024Trauma">(Lohmann et al. 2024)</span>. So intuitively some of the things that <em>agency</em> should include are things that should be diminished by coercive control.</p>
<p>cf <a href="https://aifs.gov.au/resources/policy-and-practice-papers/what-research-evidence-tells-us-about-coercive-control?ref=danmackinlay.name">What the research evidence tells us about coercive control victimisation</a>.</p>
</section>
<section id="addiction" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="addiction"><span class="header-section-number">4</span> Addiction</h2>
<p>Is <a href="../notebook/addiction.html">addiction</a> a loss of agency?</p>
</section>
<section id="high-agency-vs-npc" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="high-agency-vs-npc"><span class="header-section-number">5</span> “High-agency” vs NPC</h2>
<p><a href="https://jasmi.news/p/dictionary?ref=danmackinlay.name">Jasmine Sun decodes</a> the Bay Area use of the term</p>
<blockquote class="blockquote">
<p>You can be a top-ranked competitive coder or know every world leader’s birthday by heart, but the only real metric of success is whether you can build a life you’re happy with. Cold-emailing your way into a dream job is pretty high-agency; quitting it to become a strawberry farmer is even more so. Agency is initiative, resourcefulness, a high internal locus of control. Not stressing about roadblocks and assuming you’ll figure it out along the way.</p>
</blockquote>
</section>
<section id="attention-hacking" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="attention-hacking"><span class="header-section-number">6</span> Attention hacking</h2>
<p>If my <a href="../notebook/attention_economy.html">attention is being hacked</a>, do I lose agency?</p>
</section>
<section id="reward-tampering" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="reward-tampering"><span class="header-section-number">7</span> Reward tampering</h2>
<p>If my <a href="../notebook/human_reward_hacking.html">preferences are altered to be what some other entity wishes them to be</a>, do I lose agency?</p>
</section>
<section id="empowerment" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="empowerment"><span class="header-section-number">8</span> Empowerment</h2>
<p>If I am <a href="../notebook/intrinsic_motivation.html">empowered</a>, do I gain agency?</p>
</section>
<section id="incoming" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="incoming"><span class="header-section-number">9</span> Incoming</h2>
<ul>
<li><p><a href="https://github.com/dcsoft-yyf/CAAM/blob/main/README.md?ref=danmackinlay.name">dcsoft-yyf/CAAM</a></p>
<blockquote class="blockquote">
<p>The Carbon-based AI Analysis Method (CAAM) redefines human freedom as a “Non-Lock-in State” within a five-dimensional phase space—characterized by diffused goals, controllable leverage, native pain interpretation, accessible exit, and weak coupling. If CAAM withstands rigorous mathematical proof in the future, human rights, within this framework, cease to be abstract moral halos and become computable dynamical constraints for maximizing the accessible set in phase space.</p>
</blockquote></li>
</ul>
</section>
<section id="references" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="references"><span class="header-section-number">10</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Biehl2023Interpreting" class="csl-entry">
Biehl, and Virgo. 2023. <span>“<a href="https://doi.org/10.1007/978-3-031-28719-0_2">Interpreting Systems as Solving POMDPs: A Step Towards a Formal Understanding of Agency</a>.”</span> In.
</div>
<div id="ref-Bowles2003Coevolution" class="csl-entry">
Bowles, Choi, and Hopfensitz. 2003. <span>“<a href="https://doi.org/10.1016/S0022-5193(03)00060-2">The Co-Evolution of Individual Behaviors and Social Institutions</a>.”</span> <em>Journal of Theoretical Biology</em>.
</div>
<div id="ref-Bullock2025AGI" class="csl-entry">
Bullock, Hammond, and Krier. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.05710">AGI, Governments, and Free Societies</a>.”</span>
</div>
<div id="ref-Critch2022Cooperative" class="csl-entry">
Critch, Dennis, and Russell. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2208.07006">Cooperative and Uncooperative Institution Designs: Surprises and Problems in Open-Source Game Theory</a>.”</span>
</div>
<div id="ref-Farrell2025Large" class="csl-entry">
Farrell, Gopnik, Shalizi, et al. 2025. <span>“<a href="https://doi.org/10.1126/science.adt9819">Large AI Models Are Cultural and Social Technologies</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Halpern2018Formal" class="csl-entry">
Halpern, and Kleiman-Weiner. 2018. <span>“<a href="https://doi.org/10.48550/arXiv.1810.05903">Towards Formal Definitions of Blameworthiness, Intention, and Moral Responsibility</a>.”</span>
</div>
<div id="ref-Kang2022AI" class="csl-entry">
Kang, and Lou. 2022. <span>“<a href="https://doi.org/10.1093/jcmc/zmac014">AI Agency Vs.&nbsp;Human Agency: Understanding Human–AI Interactions on TikTok and Their Implications for User Engagement</a>.”</span> <em>Journal of Computer-Mediated Communication</em>.
</div>
<div id="ref-Kenton2023Discovering" class="csl-entry">
Kenton, Kumar, Farquhar, et al. 2023. <span>“<a href="https://doi.org/10.1016/j.artint.2023.103963">Discovering Agents</a>.”</span> <em>Artificial Intelligence</em>.
</div>
<div id="ref-Kulveit2025Gradual" class="csl-entry">
Kulveit, Douglas, Ammann, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.16946">Gradual Disempowerment: Systemic Existential Risks from Incremental AI Development</a>.”</span>
</div>
<div id="ref-Liu2024Attaining" class="csl-entry">
Liu, Wang, Li, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2405.16588">Attaining Human Desirable Outcomes in Human-AI Interaction via Structural Causal Games</a>.”</span>
</div>
<div id="ref-Loewith2025Mutual" class="csl-entry">
Loewith, and Street. 2025. <span>“<a href="https://doi.org/10.1162/ANTI.5CZK">Mutual Prediction in Human–AI Coevolution</a>.”</span> <em>Antikythera Digital Journal</em>.
</div>
<div id="ref-Lohmann2024Trauma" class="csl-entry">
Lohmann, Cowlishaw, Ney, et al. 2024. <span>“<a href="https://doi.org/10.1177/15248380231162972">The Trauma and Mental Health Impacts of Coercive Control: A Systematic Review and Meta-Analysis</a>.”</span> <em>Trauma, Violence &amp; Abuse</em>.
</div>
<div id="ref-Morris2015Foragers" class="csl-entry">
Morris. 2015. <em>Foragers, Farmers, and Fossil Fuels: How Human Values Evolve</em>. Edited by Stephen Macedo.
</div>
<div id="ref-Orseau2018Agents" class="csl-entry">
Orseau, McGill, and Legg. 2018. <span>“<a href="https://doi.org/10.48550/arXiv.1805.12387">Agents and Devices: A Relative Definition of Agency</a>.”</span>
</div>
<div id="ref-Pang2026Markovian" class="csl-entry">
Pang. 2026. <span>“On the Markovian Dynamics of Computational Systems.”</span>
</div>
<div id="ref-Qiu2025Lockin" class="csl-entry">
Qiu, He, Chugh, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2506.06166">The Lock-in Hypothesis: Stagnation by Algorithm</a>.”</span> In.
</div>
<div id="ref-Ward2024Reasons" class="csl-entry">
Ward, MacDermott, Belardinelli, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2402.07221">The Reasons That Agents Act: Intention and Instrumental Goals</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>AI safety</category>
  <category>cooperation</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>networks</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/agency.html</guid>
  <pubDate>Mon, 02 Mar 2026 23:46:12 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/vanity_RP-P-OB-9922.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>New project: an Alignment Journal</title>
  <link>https://danmackinlay.name/post/announcing_alignment_journal.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-konstlyke-dingen" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-konstlyke-dingen-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/konstlyke_dingen_RP-P-OB-44.330.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/konstlyke_dingen_RP-P-OB-44.330.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-konstlyke-dingen-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>One massive project over the last few weeks has been founding the <a href="https://alignmentjournal.org/?ref=danmackinlay.name">Alignment Journal</a>, a new open-access journal for research on <a href="../notebook/alignment_problems.html">AI alignment</a> and related topics.</p>
<p>I am one of the two founding managing editors, along with <a href="https://blog.jessriedel.com/?ref=danmackinlay.name">Jess Riedel</a>, and we have a fantastic team. We’re also really excited about the board members who’ve come on to give us guidance and help us with the work of running the journal.</p>
<p>There are all kinds of things to be done. We have a mandate to experiment with <a href="../notebook/science_peer_review.html">alternate peer review processes</a>, which is a long-running obsession of mine.</p>
<p>Please see the <a href="https://blog.alignmentjournal.org/post/coming-soon/?ref=danmackinlay.name">initial announcement post</a> for more details, and subscribe to the blog for updates on the journal, including calls for papers and announcements of accepted papers.</p>
<p>Is this a good idea? We don’t know yet. The goal here is to do a one-year pilot and see if we are making the world better, or not. We’d love for people to participate in the experiment by submitting papers, reviewing papers, or just following along with the journal and giving us feedback. <a href="https://woozy-page-39c.notion.site/304398af2ab08029b8c4dbcf79c0c393?pvs=105&amp;ref=danmackinlay.name">Subscribe to our mailing list here</a> for updates.</p>
<p>I personally am pleased to thank <a href="../post/pibbss_x_iliad.html">the PIBBSS × ILIAD</a> program for giving me the opportunity to work on this project.</p>



 ]]></description>
  <category>academe</category>
  <category>AI safety</category>
  <category>collective knowledge</category>
  <category>conference</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>game theory</category>
  <category>how do science</category>
  <category>incentive mechanisms</category>
  <category>innovation</category>
  <category>institutions</category>
  <category>machine learning</category>
  <category>mind</category>
  <category>networks</category>
  <category>neural nets</category>
  <category>provenance</category>
  <category>sociology</category>
  <category>statistics</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/post/announcing_alignment_journal.html</guid>
  <pubDate>Mon, 02 Mar 2026 08:18:21 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/konstlyke_dingen_RP-P-OB-44.330.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Evolution strategies</title>
  <link>https://danmackinlay.name/notebook/nn_evolution_strategy.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-pitcher-plants" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-pitcher-plants-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/pitcher_plants.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/pitcher_plants.png" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-pitcher-plants-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>A <a href="../notebook/biomimetic_algorithms.html">nature-inspired</a> <a href="../notebook/nn_ensemble.html">ensemble</a> strategy for training neural nets that uses <a href="../notebook/genetic_programming.html">evolution-like</a> approaches, even though we usually assume that <a href="../notebook/nn_backprop_free.html">scale can only be achieved via backprop</a>.</p>
<p>For the basics, see <a href="../notebook/evolution_strategy.html#evolution-strategies-for-beginners">Evolution Strategies for beginners</a>.</p>
<section id="a-running-example" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="a-running-example"><span class="header-section-number">1</span> A running example</h2>
<p>We’re reusing the running example from the ES-for-beginners post. Let us consider the challenge of <a href="../notebook/nn_backprop_free.html">training a tiny neural net <em>without</em> backprop</a>.</p>
<p>We have a simple classifier <img src="https://latex.codecogs.com/png.latex?f_%5Ctheta(x)"> (say, a two-layer MLP). The standard supervised objective is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AL(%5Ctheta)%20=%20%5Cmathbb%7BE%7D_%7B(x,y)%5Csim%20%5Cmathcal%7BD%7D%7D%5Cbig%5B%5Cell(f_%5Ctheta(x),%20y)%5Cbig%5D.%0A"></p>
<p>Backpropagation gives us <img src="https://latex.codecogs.com/png.latex?%5Cnabla_%5Ctheta%20L(%5Ctheta)">. ES assumes we <em>won’t</em> use that, and instead treats “run the model forward, then compute the loss” as a black box we can call:</p>
<ul>
<li>Input: the parameters <img src="https://latex.codecogs.com/png.latex?%5Ctheta"></li>
<li>Output: a scalar score (loss, reward, accuracy, etc.)</li>
</ul>
<p>To match the usual ES maximization setup, we define a <a href="../notebook/utility_fitness.html"><em>fitness</em> function</a> <img src="https://latex.codecogs.com/png.latex?F(%5Ctheta)"> to <em>maximize</em>, for example:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AF(%5Ctheta)%20=%20-L(%5Ctheta).%0A"></p>
<p>The ES loop looks like this:</p>
<ol type="1">
<li>Sample random perturbations <img src="https://latex.codecogs.com/png.latex?%5Cvarepsilon_i">.</li>
<li>Evaluate fitness on the perturbed parameters <img src="https://latex.codecogs.com/png.latex?%5Ctheta%20+%20%5Csigma%20%5Cvarepsilon_i">.</li>
<li>Combine the results to update <img src="https://latex.codecogs.com/png.latex?%5Ctheta">.</li>
</ol>
<p>Here <img src="https://latex.codecogs.com/png.latex?%5Csigma%3E0"> is the “noise scale” (how far we probe). A standard choice is Gaussian perturbations (why is it always Gaussian? It makes it feel like we’re doing <a href="../notebook/mcmc_langevin.html">SGLD</a>):</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cvarepsilon%20%5Csim%20%5Cmathcal%7BN%7D(0,%20I).%0A"></p>
<p>Define a <em>smoothed objective</em>. This is what ES targets.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AJ(%5Ctheta)%20=%20%5Cmathbb%7BE%7D_%7B%5Cvarepsilon%20%5Csim%20%5Cmathcal%7BN%7D(0,I)%7D%5Cbig%5BF(%5Ctheta%20+%20%5Csigma%20%5Cvarepsilon)%5Cbig%5D.%0A"></p>
<p>Backprop optimizes <img src="https://latex.codecogs.com/png.latex?F(%5Ctheta)"> directly (when it can). ES typically optimizes a <em>Gaussian-smoothed</em> version <img src="https://latex.codecogs.com/png.latex?J(%5Ctheta)">.</p>
</section>
<section id="large-data" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="large-data"><span class="header-section-number">2</span> Large data variants</h2>
<p>So far this seems reasonable, but it also seems to assume full-batch losses rather than stochastic mini-batches, which, as <a href="../notebook/gd_1st_order_stochastic.html">SGD</a> argues, are the secret to NN scaling. In the basic version, it sounds like we need the full-data likelihood, which is a non-starter.</p>
<p>What does ES do instead to scale to large data? What are the analogues of mini-batches and SGD updates?</p>
<p>I asked an LLM to soothe my qualms, and it did, citing <span class="citation" data-cites="Lenc2019NonDifferentiable Salimans2017Evolution">(Lenc et al. 2019; Salimans et al. 2017)</span></p>
<blockquote class="blockquote">
<p>In practice you do the same thing you do with SGD: replace the true objective (an expectation over the data distribution) with a stochastic estimate from a minibatch, and treat the resulting extra noise as part of your gradient-estimation noise.</p>
<p>Write the population objective as an expectation over data <img src="https://latex.codecogs.com/png.latex?z%5Csim%20%5Cmathcal%7BD%7D"> (example <img src="https://latex.codecogs.com/png.latex?z=(x,y)">):</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AF(%5Ctheta)%20%5C;=%5C;%20%5Cmathbb%7BE%7D_%7Bz%5Csim%5Cmathcal%7BD%7D%7D%5Cbig%5Bf(%5Ctheta;z)%5Cbig%5D%0A"></p>
<p>(For supervised learning you can think <img src="https://latex.codecogs.com/png.latex?f(%5Ctheta;z)=-%5Cell(f_%5Ctheta(x),y)">.)</p>
<p>Given a minibatch <img src="https://latex.codecogs.com/png.latex?B=%5C%7Bz_j%5C%7D_%7Bj=1%7D%5Eb">, define the minibatch fitness</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Chat%20F(%5Ctheta;B)%20%5C;=%5C;%20%5Cfrac%7B1%7D%7Bb%7D%5Csum_%7Bj=1%7D%5Eb%20f(%5Ctheta;z_j).%0A"></p>
<p>Now you just plug <img src="https://latex.codecogs.com/png.latex?%5Chat%20F"> into the standard ES estimator. With antithetic pairs:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Chat%20g(%5Ctheta;B)=%5Cfrac%7B1%7D%7B2N%5Csigma%7D%5Csum_%7Bi=1%7D%5EN%0A%5CBig(%5Chat%20F(%5Ctheta+%5Csigma%5Cvarepsilon_i;B)-%5Chat%20F(%5Ctheta-%5Csigma%5Cvarepsilon_i;B)%5CBig)%5C,%5Cvarepsilon_i,%0A%5Cqquad%20%5Cvarepsilon_i%5Csim%5Cmathcal%20N(0,I).%0A"></p>
<p>and update <img src="https://latex.codecogs.com/png.latex?%5Ctheta%5Cleftarrow%20%5Ctheta%20+%20%5Ceta%5C,%5Chat%20g">.</p>
<p>Key practical detail: <strong>use the same minibatch <img src="https://latex.codecogs.com/png.latex?B"> for every member of the population within an iteration</strong>, and for both <img src="https://latex.codecogs.com/png.latex?+%5Cvarepsilon_i"> and <img src="https://latex.codecogs.com/png.latex?-%5Cvarepsilon_i">. This “common random numbers” idea at the data sampling level makes the <em>difference</em> <img src="https://latex.codecogs.com/png.latex?%5Chat%20F(%5Ctheta+%5Csigma%5Cvarepsilon_i;B)-%5Chat%20F(%5Ctheta-%5Csigma%5Cvarepsilon_i;B)"> cancel a lot of minibatch noise and makes antithetic sampling actually do its job. If each perturbation sees a different minibatch, we inject extra variance that antithetic pairing cannot cancel.</p>
<p>A minimal “SGD-like” recipe:</p>
<ol type="1">
<li>Sample a minibatch <img src="https://latex.codecogs.com/png.latex?B">.</li>
<li>Sample perturbations <img src="https://latex.codecogs.com/png.latex?%5C%7B%5Cvarepsilon_i%5C%7D_%7Bi=1%7D%5EN"> (and use antithetic pairs).</li>
<li>Evaluate <img src="https://latex.codecogs.com/png.latex?%5Chat%20F(%5Ctheta%5Cpm%5Csigma%5Cvarepsilon_i;B)"> in parallel.</li>
<li>Form <img src="https://latex.codecogs.com/png.latex?%5Chat%20g(%5Ctheta;B)">, optionally normalize/center fitness within the population.</li>
<li>Update <img src="https://latex.codecogs.com/png.latex?%5Ctheta">.</li>
</ol>
<p>This looks like SGD, but the gradient is estimated by perturb-and-evaluate rather than backprop. The minibatch adds stochasticity exactly the way it does in SGD: it doesn’t “break” the algorithm, but it affects the variance and therefore the batch size / population size you need for stable progress.</p>
</blockquote>
</section>
<section id="es-at-very-large-scale" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="es-at-very-large-scale"><span class="header-section-number">3</span> ES at very large scale</h2>
<p><a href="https://eshyperscale.github.io/?ref=danmackinlay.name">Evolution Strategies at the Hyperscale</a> <span class="citation" data-cites="Sarkar2025Evolution">(Sarkar et al. 2025)</span> pushes this really far, and I’m pretty fascinated by what the authors pulled off. More soon.</p>
</section>
<section id="incoming" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="incoming"><span class="header-section-number">4</span> Incoming</h2>
<ul>
<li><p><a href="https://github.com/ESHyperscale/HyperscaleES?ref=danmackinlay.name">ESHyperscale/HyperscaleES: JAX Codebase for Evolutionary Strategies at the Hyperscale</a></p></li>
<li><p><a href="https://github.com/google/evojax/?ref=danmackinlay.name">google/evojax</a></p></li>
<li><p>evotorch</p>
<ul>
<li><a href="https://github.com/nnaisense/evotorch?ref=danmackinlay.name">nnaisense/evotorch: Advanced evolutionary computation library built directly on top of PyTorch, created at NNAISENSE.</a></li>
<li><a href="https://evotorch.ai/?ref=danmackinlay.name">EvoTorch</a></li>
</ul></li>
</ul>
</section>
<section id="references" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="references"><span class="header-section-number">5</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Beyer1995Theory" class="csl-entry">
Beyer. 1995. <span>“<a href="https://doi.org/10.1162/evco.1995.3.3.311">Toward a Theory of Evolution Strategies: Self-Adaptation</a>.”</span> <em>Evolutionary Computation</em>.
</div>
<div id="ref-Beyer2002Evolution" class="csl-entry">
Beyer, and Schwefel. 2002. <span>“<a href="https://doi.org/10.1023/A:1015059928466">Evolution Strategies – A Comprehensive Introduction</a>.”</span> <em>Natural Computing</em>.
</div>
<div id="ref-Bown2006ContinuousTime" class="csl-entry">
Bown, and Lexer. 2006. <span>“<a href="http://link.springer.com/chapter/10.1007/11732242_62">Continuous-Time Recurrent Neural Networks for Generative and Interactive Musical Performance</a>.”</span> In <em>Applications of Evolutionary Computing</em>. Lecture Notes in Computer Science 3907.
</div>
<div id="ref-Floreano2008BioInspired" class="csl-entry">
Floreano, and Mattiussi. 2008. <em>Bio-Inspired Artificial Intelligence: Theories, Methods, and Technologies (Intelligent Robotics and Autonomous Agents)</em>.
</div>
<div id="ref-Hansen2023CMA" class="csl-entry">
Hansen. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.1604.00772">The CMA Evolution Strategy: A Tutorial</a>.”</span>
</div>
<div id="ref-Hansen2001Completely" class="csl-entry">
Hansen, and Ostermeier. 2001. <span>“<a href="https://doi.org/10.1162/106365601750190398">Completely Derandomized Self-Adaptation in Evolution Strategies</a>.”</span> <em>Evolutionary Computation</em>.
</div>
<div id="ref-Lenc2019NonDifferentiable" class="csl-entry">
Lenc, Elsen, Schaul, et al. 2019. <span>“<a href="https://doi.org/10.48550/arXiv.1906.03139">Non-Differentiable Supervised Learning with Evolution Strategies and Hybrid Methods</a>.”</span>
</div>
<div id="ref-Rechenberg1978Evolutionsstrategien" class="csl-entry">
Rechenberg. 1978. <span>“<a href="https://doi.org/10.1007/978-3-642-81283-5_8">Evolutionsstrategien</a>.”</span> In <em>Simulationsmethoden in Der Medizin Und Biologie</em>. Medizinische Informatik Und Statistik.
</div>
<div id="ref-Salimans2017Evolution" class="csl-entry">
Salimans, Ho, Chen, et al. 2017. <span>“<a href="http://arxiv.org/abs/1703.03864">Evolution Strategies as a Scalable Alternative to Reinforcement Learning</a>.”</span>
</div>
<div id="ref-Sarkar2025Evolution" class="csl-entry">
Sarkar, Fellows, Duque, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2511.16652">Evolution Strategies at the Hyperscale</a>.”</span>
</div>
<div id="ref-Vanchurin2021Theory" class="csl-entry">
Vanchurin, Wolf, Katsnelson, et al. 2021. <span>“<a href="https://doi.org/10.1101/2021.11.03.466494">Towards a Theory of Evolution as Multilevel Learning</a>.”</span>
</div>
<div id="ref-Whitley1990Genetic" class="csl-entry">
Whitley, Starkweather, and Bogart. 1990. <span>“<a href="https://doi.org/10.1016/0167-8191(90)90086-O">Genetic Algorithms and Neural Networks: Optimizing Connections and Connectivity</a>.”</span> <em>Parallel Computing</em>.
</div>
</div>


</section>

 ]]></description>
  <category>Bayes</category>
  <category>distributed</category>
  <category>dynamical systems</category>
  <category>likelihood free</category>
  <category>linear algebra</category>
  <category>machine learning</category>
  <category>Monte Carlo</category>
  <category>neural nets</category>
  <category>nonparametric</category>
  <category>optimization</category>
  <category>particle</category>
  <category>probabilistic algorithms</category>
  <category>probability</category>
  <category>sciml</category>
  <category>signal processing</category>
  <category>sparser than thou</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>uncertainty</category>
  <guid>https://danmackinlay.name/notebook/nn_evolution_strategy.html</guid>
  <pubDate>Mon, 16 Feb 2026 11:41:46 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/pitcher_plants.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Categorical systems theory</title>
  <link>https://danmackinlay.name/notebook/categorical_systems_theory.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-monochrom-spiderflower" class="illustration figure right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-monochrom-spiderflower-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/monochrom_spiderflower_RP-P-1957-523.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/monochrom_spiderflower_RP-P-1957-523.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-monochrom-spiderflower-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p><a href="../notebook/category_theory.html">Category theory</a> for <a href="../notebook/dynamical_systems.html">systems</a>.</p>
<p><span class="citation" data-cites="Myers2023Categorical">Myers (2023)</span>:</p>
<blockquote class="blockquote">
<p>Categorical systems theory is an emerging field of mathematics which seeks to apply the methods of category theory to general systems theory. General systems theory is the study of systems — ways things can be and change, and models thereof — in full generality. The difficulty is that there doesn’t seem to be a single core idea of what it means to be a “system”. Different people have, for different purposes, come up with a vast array of different modeling techniques and definitions that could be called “systems”. There is often little the same in the precise content of these definitions, though there are still strong, if informal, analogies to be made accross these different fields. This makes coming up with a mathematical theory of general systems tantalizing but difficult: what, after all, is a system in general?</p>
<p>Category theory has been describe as the mathematics of formal analogy making. It allows us to make analogies between fields by focusing not on content of the objects of those fields, but by the ways that the objects of those fields relate to one another. Categorical systems theory applies this idea to general systems theory, avoiding the issue of not having a contentful definition of system by instead focusing on the ways that systems interact with eachother and their environment.</p>
<p>These are the main ideas of categorical systems theory: 1. Any system interacts with its environment through an interface, which can be described separately from the system itself. 2. All interactions of a system with its environment take place through its interface, so that from the point of view of the environment, all we need to know about a system is what is going on at the interface. 3. Systems interact with other systems through their respective interfaces. So, to understand complex systems in terms of their component subsystems, we need to understand the ways that interfaces can be connected. We call these ways that interfaces can be connected composition patterns. 4. Given a composition pattern describing how some interface are to be connected, and some systems with those interfaces, we should have a composite system which consists of those subsystems interacting according to the composition pattern. The ability to form composite systems of interacting component systems is called modularity, and is a well known boon in the design of complex systems.</p>
<p>In a sense, the definitions of categorical systems theory are all about modularity how can systems be composed of subsystems. On the other hand, the theorems of categorical systems theory often take the form of compositionality results. These say that certain facts and features of composite systems can be understood or calculated in terms of their component systems and the composition pattern.</p>
</blockquote>
<p>See also <span class="citation" data-cites="Capucci2025Notes">Capucci (2025)</span>.</p>
<section id="string-diagrams" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="string-diagrams"><span class="header-section-number">1</span> String diagrams</h2>
<p>Why would we bother with this? I saw Martin Biehl present work <span class="citation" data-cites="Biehl2023Interpreting Virgo2021Interpreting">(Biehl and Virgo 2023; Virgo, Biehl, and McGregor 2021)</span> that used the “string diagrams” formalism to run computations over <a href="../notebook/graphical_models_directed.html">Bayesian networks</a>, and he argued it might be simpler to work with complex systems in this style.</p>
<p>Are <a href="../notebook/patchers.html">patchers</a> a special case of string diagrams? A sloppy generalization?</p>
</section>
<section id="tools" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="tools"><span class="header-section-number">2</span> Tools</h2>
<ul>
<li><a href="https://docs.discopy.org/en/main/?ref=danmackinlay.name">DisCoPy</a>, “DisCoPy is a Python toolkit for computing with string diagrams.”</li>
<li><a href="https://tikZit.github.io/?ref=danmackinlay.name">TikZiT</a> looks like a reasonably good alternative GUI for <a href="../notebook/tikz.html">tikz</a> with string diagram support.</li>
</ul>
</section>
<section id="references" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="references"><span class="header-section-number">3</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Biehl2023Interpreting" class="csl-entry">
Biehl, and Virgo. 2023. <span>“<a href="https://doi.org/10.1007/978-3-031-28719-0_2">Interpreting Systems as Solving POMDPs: A Step Towards a Formal Understanding of Agency</a>.”</span> In.
</div>
<div id="ref-Capucci2025Notes" class="csl-entry">
Capucci. 2025. <span>“<a href="https://github.com/mattecapu/categorical-systems-theory/blob/master/main.pdf">Notes on Categorical Systems Theory</a>.”</span>
</div>
<div id="ref-Felice2022Categorical" class="csl-entry">
Felice. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2212.06636">Categorical Tools for Natural Language Processing</a>.”</span>
</div>
<div id="ref-Felice2021DisCoPy" class="csl-entry">
Felice, Toumi, and Coecke. 2021. <span>“<a href="https://doi.org/10.4204/EPTCS.333.13">DisCoPy: Monoidal Categories in Python</a>.”</span>
</div>
<div id="ref-Myers2023Categorical" class="csl-entry">
Myers. 2023. <span>“Categorical Systems Theory.”</span>
</div>
<div id="ref-Toumi2022Category" class="csl-entry">
Toumi. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2212.06615">Category Theory for Quantum Natural Language Processing</a>.”</span>
</div>
<div id="ref-Toumi2022DisCoPy" class="csl-entry">
Toumi, Felice, and Yeung. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2205.05190">DisCoPy for the Quantum Computer Scientist</a>.”</span>
</div>
<div id="ref-Toumi2021Functorial" class="csl-entry">
Toumi, and Koziell-Pipe. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2103.14411">Functorial Language Models</a>.”</span>
</div>
<div id="ref-Toumi2021Diagrammatic" class="csl-entry">
Toumi, Yeung, and Felice. 2021. <span>“<a href="https://doi.org/10.4204/EPTCS.343.7">Diagrammatic Differentiation for Quantum Machine Learning</a>.”</span>
</div>
<div id="ref-Toumi2023DisCoPy" class="csl-entry">
Toumi, Yeung, Poór, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2311.10608">DisCoPy: The Hierarchy of Graphical Languages in Python</a>.”</span>
</div>
<div id="ref-Virgo2021Interpreting" class="csl-entry">
Virgo, Biehl, and McGregor. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2112.13523">Interpreting Dynamical Systems as Bayesian Reasoners</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>calculus</category>
  <category>dynamical systems</category>
  <category>geometry</category>
  <category>Hilbert space</category>
  <category>how do science</category>
  <category>Lévy processes</category>
  <category>machine learning</category>
  <category>neural nets</category>
  <category>PDEs</category>
  <category>physics</category>
  <category>regression</category>
  <category>sciml</category>
  <category>SDEs</category>
  <category>signal processing</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>stochastic processes</category>
  <category>sync</category>
  <category>time series</category>
  <category>uncertainty</category>
  <guid>https://danmackinlay.name/notebook/categorical_systems_theory.html</guid>
  <pubDate>Wed, 04 Feb 2026 17:58:32 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/monochrom_spiderflower_RP-P-1957-523.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>History-Based Reinforcement Learning</title>
  <link>https://danmackinlay.name/notebook/reinforcement_learning_history_based.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-winding-path" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-winding-path-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/winding_path_RP-P-OB-62.365.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/winding_path_RP-P-OB-62.365.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-winding-path-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>An interesting alternative formulation that relaxes the Markovian assumptions in mainstream RL, though I don’t know much about it. It seems to come out of <a href="../notebook/aixi.html">AIXI</a> and be similarly intractable, but it’s not purely theoretical; computable approximations do exist <span class="citation" data-cites="DaswaniQlearning Gao2023Fast Guez2013Efficient HamiltonEfficient Sunehag2014Feature Tennenholtz2023Reinforcement">(Daswani et al., n.d.; Gao et al. 2023; Guez, Silver, and Dayan 2013; Hamilton, Fard, and Pineau, n.d.; Sunehag 2014; Tennenholtz et al. 2023)</span>.</p>
<p>TBD</p>
<section id="references" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="references"><span class="header-section-number">1</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-DaswaniQlearning" class="csl-entry">
Daswani, Sunehag, Sunehag, et al. n.d. <span>“Q-Learning for History-Based Reinforcement Learning.”</span>
</div>
<div id="ref-Eberhard2025Partially" class="csl-entry">
Eberhard, Muehlebach, and Vernade. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.15200">Partially Observable Reinforcement Learning with Memory Traces</a>.”</span>
</div>
<div id="ref-Gao2023Fast" class="csl-entry">
Gao, Zhang, Yang, et al. 2023. <span>“<a href="https://doi.org/10.1609/aaai.v37i6.25924">Fast Counterfactual Inference for History-Based Reinforcement Learning</a>.”</span> <em>Proceedings of the AAAI Conference on Artificial Intelligence</em>.
</div>
<div id="ref-Guez2013Efficient" class="csl-entry">
Guez, Silver, and Dayan. 2013. <span>“<a href="https://doi.org/10.48550/arXiv.1205.3109">Efficient Bayes-Adaptive Reinforcement Learning Using Sample-Based Search</a>.”</span>
</div>
<div id="ref-HamiltonEfficient" class="csl-entry">
Hamilton, Fard, and Pineau. n.d. <span>“Eﬃcient Learning and Planning with Compressed Predictive States.”</span>
</div>
<div id="ref-Leike2016Nonparametric" class="csl-entry">
Leike. 2016. <span>“Nonparametric General Reinforcement Learning.”</span>
</div>
<div id="ref-Sunehag2014Feature" class="csl-entry">
Sunehag. 2014. <span>“<a href="https://cdn.aaai.org/ocs/ws/ws1209/8791-37973-1-PB.pdf">Feature Reinforcement Learning: State of the Art</a>.”</span>
</div>
<div id="ref-Tennenholtz2023Reinforcement" class="csl-entry">
Tennenholtz, Merlis, Shani, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2302.02061">Reinforcement Learning with History-Dependent Dynamic Contexts</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>bandit problems</category>
  <category>control</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>networks</category>
  <category>stochastic processes</category>
  <category>time series</category>
  <category>utility</category>
  <guid>https://danmackinlay.name/notebook/reinforcement_learning_history_based.html</guid>
  <pubDate>Fri, 16 Jan 2026 11:03:38 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/winding_path_RP-P-OB-62.365.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Causal inference in learning to act</title>
  <link>https://danmackinlay.name/notebook/causality_learning_action.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>Learning to act clearly sounds like learning counterfactuals and interventions, right? (“What would happen if I took this action?”) So surely there’s a <a href="../notebook/causal_inference.html">causal</a> angle? Yes.</p>
<div id="fig-tightrope-horse" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-tightrope-horse-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/tightrope_horse_RP-P-OB-21.372.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/tightrope_horse_RP-P-OB-21.372.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-tightrope-horse-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Cf <a href="../notebook/reinforcement_learning_history_based.html">history-based RL</a>.</p>
<section id="reinforcement-learning" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="reinforcement-learning"><span class="header-section-number">1</span> Reinforcement learning</h2>
<p>The simplest and AFAIK earlilest analysis of learning to act in a causal setting applies to bandit problems <span class="citation" data-cites="Lattimore2017Learning">(Lattimore 2017)</span>. Since then, there have been many more developments:</p>
<p><span class="citation" data-cites="Oberst2019Counterfactual">Oberst and Sontag (2019)</span>:</p>
<blockquote class="blockquote">
<p>We introduce an off-policy evaluation procedure for highlighting episodes where applying a reinforcement learned (RL) policy is likely to have produced a substantially different outcome than the observed policy. In particular, we introduce a class of structural causal models (SCMs) for generating counterfactual trajectories in finite partially observable Markov Decision Processes (POMDPs).</p>
</blockquote>
<p><span class="citation" data-cites="Schulte2024Why">Schulte and Poupart (2024)</span>:</p>
<blockquote class="blockquote">
<p>Reinforcement learning (RL) and causal modelling naturally complement each other. The goal of causal modelling is to predict the effects of interventions in an environment, while the goal of reinforcement learning is to select interventions that maximize the rewards the agent receives from the environment. Reinforcement learning includes the two most powerful sources of information for estimating causal relationships: temporal ordering and the ability to act on an environment. This paper examines which reinforcement learning settings we can expect to benefit from causal modelling, and how. In online learning, the agent has the ability to interact directly with their environment, and learn from exploring it. Our main argument is that in online learning, conditional probabilities are causal, and therefore offline RL is the setting where causal learning has the most potential to make a difference. Essentially, the reason is that when an agent learns from their <em>own</em> experience, there are no unobserved confounders that influence both the agent’s own exploratory actions and the rewards they receive. Our paper formalizes this argument. For offline RL, where an agent may and typically does learn from the experience of <em>others</em>, we describe previous and new methods for leveraging a causal model, including support for counterfactual queries.</p>
</blockquote>
</section>
<section id="predictive-coding" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="predictive-coding"><span class="header-section-number">2</span> Predictive coding</h2>
<p>TBD</p>
</section>
<section id="references" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="references"><span class="header-section-number">3</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Bennett2024Proximal" class="csl-entry">
Bennett, and Kallus. 2024. <span>“<a href="https://doi.org/10.1287/opre.2021.0781">Proximal Reinforcement Learning: Efficient Off-Policy Evaluation in Partially Observed Markov Decision Processes</a>.”</span> <em>Operations Research</em>.
</div>
<div id="ref-Biehl2023Interpreting" class="csl-entry">
Biehl, and Virgo. 2023. <span>“<a href="https://doi.org/10.1007/978-3-031-28719-0_2">Interpreting Systems as Solving POMDPs: A Step Towards a Formal Understanding of Agency</a>.”</span> In.
</div>
<div id="ref-CanigliaEstimating" class="csl-entry">
Caniglia, Murray, Hernán, et al. n.d. <span>“<a href="https://doi.org/10.1002/sim.9107">Estimating Optimal Dynamic Treatment Strategies Under Resource Constraints Using Dynamic Marginal Structural Models</a>.”</span> <em>Statistics in Medicine</em>.
</div>
<div id="ref-Cao2024Empowerment" class="csl-entry">
Cao, Feng, Fang, et al. 2024. <span>“<a href="https://openreview.net/forum?id=vgXI1Ws0ma">Towards Empowerment Gain Through Causal Structure Learning in Model-Based Reinforcement Learning</a>.”</span> In.
</div>
<div id="ref-Cao2025Empowerment" class="csl-entry">
———, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2502.10077">Towards Empowerment Gain Through Causal Structure Learning in Model-Based RL</a>.”</span>
</div>
<div id="ref-Cao2025Causal" class="csl-entry">
Cao, Feng, Huo, et al. 2025. <span>“<a href="https://doi.org/10.1007/s11432-024-4396-3">Causal Action Empowerment for Efficient Reinforcement Learning in Embodied Agents</a>.”</span> <em>Science China Information Sciences</em>.
</div>
<div id="ref-Chu2025Fun" class="csl-entry">
Chu, Rule, Goddu, et al. 2025. <span>“<a href="https://doi.org/10.1037/dev0002108">Fun Isn’t Easy: Children Selectively Manipulate Task Difficulty When “Playing for Fun” Versus “Playing to Win”</a>.”</span> <em>Developmental Psychology</em>.
</div>
<div id="ref-Duong2024Causal" class="csl-entry">
Duong, Gupta, and Nguyen. 2024. <span>“<a href="https://openreview.net/forum?id=8muemqlnG3">Causal Discovery via Bayesian Optimization</a>.”</span> In.
</div>
<div id="ref-FernandezLoria2021Causal" class="csl-entry">
Fernández-Loría, and Provost. 2021. <span>“<a href="http://arxiv.org/abs/2104.04103">Causal Decision Making and Causal Effect Estimation Are Not the Same… and Why It Matters</a>.”</span>
</div>
<div id="ref-Gopnik2004Theory" class="csl-entry">
Gopnik, Glymour, Sobel, et al. 2004. <span>“<a href="https://www.mimuw.edu.pl/~noble/courses/QPEDataScience/Resources/bnetspsykol.pdf">A Theory of Causal Learning in Children: Causal Maps and Bayes Nets.</a>”</span> <em>Psychological Review</em>.
</div>
<div id="ref-Hafner2022Action" class="csl-entry">
Hafner, Ortega, Ba, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2009.01791">Action and Perception as Divergence Minimization</a>.”</span>
</div>
<div id="ref-Halpern2016Actual" class="csl-entry">
Halpern. 2016. <em>Actual causality</em>.
</div>
<div id="ref-Kekic2025Learning" class="csl-entry">
Kekić, Schneider, Büchler, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2507.14901">Learning Nonlinear Causal Reductions to Explain Reinforcement Learning Policies</a>.”</span>
</div>
<div id="ref-Lattimore2017Learning" class="csl-entry">
Lattimore. 2017. <span>“<a href="https://doi.org/10.25911/5d67b766194ec">Learning How to Act: Making Good Decisions with Machine Learning</a>.”</span>
</div>
<div id="ref-Meulemans2023Would" class="csl-entry">
Meulemans, Schug, Kobayashi, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2306.16803">Would I Have Gotten That Reward? Long-Term Credit Assignment by Counterfactual Contribution Analysis</a>.”</span>
</div>
<div id="ref-Oberst2019Counterfactual" class="csl-entry">
Oberst, and Sontag. 2019. <span>“<a href="https://proceedings.mlr.press/v97/oberst19a.html">Counterfactual Off-Policy Evaluation with Gumbel-Max Structural Causal Models</a>.”</span> In <em>Proceedings of the 36th International Conference on Machine Learning</em>.
</div>
<div id="ref-Robertson2025DoPFN" class="csl-entry">
Robertson, Reuter, Guo, et al. 2025. <span>“<a href="https://arxiv.org/abs/2506.06039v2">Do-PFN: In-Context Learning for Causal Effect Estimation</a>.”</span>
</div>
<div id="ref-Schulte2024Why" class="csl-entry">
Schulte, and Poupart. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2403.04221">Why Online Reinforcement Learning Is Causal</a>.”</span>
</div>
<div id="ref-ShpitserComplete" class="csl-entry">
Shpitser, and Pearl. n.d. <span>“Complete Identiﬁcation Methods for the Causal Hierarchy.”</span>
</div>
<div id="ref-Thornley2025Shutdown" class="csl-entry">
Thornley. 2025. <span>“<a href="https://doi.org/10.1007/s11098-024-02153-3">The Shutdown Problem: An AI Engineering Puzzle for Decision Theorists</a>.”</span> <em>Philosophical Studies</em>.
</div>
<div id="ref-Yao2025SMaximal" class="csl-entry">
Yao, and Mooij. 2025. <span>“<a href="https://doi.org/10.48550/ARXIV.2507.00093">Σ-Maximal Ancestral Graphs</a>.”</span>
</div>
<div id="ref-Yiu2025Empowerment" class="csl-entry">
<span class="nocase">Yiu, Allen, Ginosar, et al.</span> 2025. <span>“<a href="https://doi.org/10.31234/osf.io/ept4n_v1">Empowerment Gain and Causal Model Construction: Children and Adults Are Sensitive to Controllability and Variability in Their Causal Interventions</a>.”</span>
</div>
<div id="ref-Zeng2025Survey" class="csl-entry">
Zeng, Cai, Sun, et al. 2025. <span>“<a href="https://doi.org/10.1109/TNNLS.2024.3403001">A Survey on Causal Reinforcement Learning</a>.”</span> <em>IEEE Transactions on Neural Networks and Learning Systems</em>.
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>bandit problems</category>
  <category>control</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>networks</category>
  <category>stochastic processes</category>
  <category>time series</category>
  <category>utility</category>
  <guid>https://danmackinlay.name/notebook/causality_learning_action.html</guid>
  <pubDate>Tue, 13 Jan 2026 21:35:10 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/tightrope_horse_RP-P-OB-21.372.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Generative AI workflows and hacks 2026</title>
  <link>https://danmackinlay.name/post/llm_hacks_2026.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-i-photo-you" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-i-photo-you-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/i_photo_you.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/i_photo_you.png" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-i-photo-you-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I’ll try to synthesise LLM <em>research</em> elsewhere. This is where I keep ephemeral notes and links, continuing my habit <a href="../post/llm_hacks_2025.html">from 2025</a>.</p>
<section id="breaking-the-claude-code-google-chrome-tether" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="breaking-the-claude-code-google-chrome-tether"><span class="header-section-number">1</span> Breaking the (Claude code)-(Google Chrome) tether</h2>
<p>Claude Code has browser integration but only for Google Chrome, <a href="https://github.com/anthropics/claude-code/issues/14391?ref=danmackinlay.name">and they do not intend to fix that.</a> I am not a fan of Google Chrome because it is <a href="../notebook/browser_privacy.html">creepy and gross</a>. <a href="../notebook/firefox.html">Firefox</a> is not at all well supported, but many <a href="../notebook/chromium_browsers.html">Chromium browsers</a> can be forced into working.</p>
<p>Whether it is wise to let your browser traffic flow through the Anthropic servers I’ll leave to you; they already have your intimate thoughts though from all that Claude usage, so why not get some extra value, I guess?</p>
<p>Anyway, there are community-supported hacks to get non-Google-Chrome browsers working at <a href="https://github.com/stolot0mt0m/claude-chromium-native-messaging?ref=danmackinlay.name">stolot0mt0m/claude-chromium-native-messaging)</a>. I like Vivaldi.</p>
<p>macOS setup:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> clone https://github.com/stolot0mt0m/claude-chromium-native-messaging.git</span>
<span id="cb1-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> claude-chromium-native-messaging</span>
<span id="cb1-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">/opt/homebrew/bin/bash</span> setup.sh</span></code></pre></div></div>
<p>Take care before running this; for all I know it sends your API keys to Macedonian script kiddies and plays the sad trombone sound.</p>
</section>
<section id="ollama-tokenization-versus-huggingface" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="ollama-tokenization-versus-huggingface"><span class="header-section-number">2</span> <code>ollama</code> tokenization versus <code>huggingface</code></h2>
<p>There are several convenient ways to invoke LLMs locally. I am learning to understand their affordances by breaking them.</p>
<p>First exercise: <code>mxbai-embed-large-v1</code> from Hugging Face and <code>mxbai-embed-large</code> from Ollama are nominally the same model. The trained weights derive from the same upstream artefact. The stacks around those weights are not the same, and on real inputs the two stacks produce different outputs from the same text.</p>
<p>The HF path: <code>pip install transformers</code>, then <code>AutoModel.from_pretrained(“mixedbread-ai/mxbai-embed-large-v1”)</code> in our own Python process. The first call downloads the weights, the tokenizer config (<code>tokenizer.json</code>), and the model config from huggingface.co into <code>~/.cache/huggingface/hub/</code>. Inference runs in our process, via PyTorch (or sentence-transformers, or whatever library is wrapping it). Tokenization runs in the same process, performed by HF’s Rust <code>tokenizers</code> library reading that same <code>tokenizer.json</code>. One process, one library, one set of files on disk.</p>
<p>The Ollama path: install the <code>ollama</code> daemon, then <code>ollama pull mxbai-embed-large</code>. The daemon downloads a <code>.gguf</code> file from <em>Ollama’s</em> registry, not from huggingface.co. That <code>.gguf</code> is a single binary bundling the weights (usually quantised to ~4 bits), a <em>re-implementation</em> of the tokenizer, and the model config<sup>1</sup>. Inference runs inside the long-lived <code>ollama serve</code> process. We talk to it over HTTP on <code>localhost:11434</code>. Tokenization runs server-side, in C++, against the tokenizer rules baked into the <code>.gguf</code>.</p>
<p>So: same upstream weights, two stacks, two tokenizer implementations. The two ought to agree, but in practice the agreement is approximate at best. HF’s Rust <code>tokenizers</code> and llama.cpp’s C++ tokenizer are independent implementations. I assume the conversion that produces the GGUF tokenizer rules from the original <code>tokenizer.json</code> is not bit-perfect: pre-tokeniser steps, Unicode normalisation, whitespace handling, and the post-processor rules ([CLS]/[SEP] insertion) don’t all round-trip exactly. On clean prose they agree. On markdown — code fences, tables, weird whitespace — they diverge by 5% on the same input.</p>
<p>That divergence only matters when we tokenize with one stack and embed with the other — which is what we do if we use HF’s tokenizer to pre-truncate before sending to Ollama. The HF tokenizer says “510 tokens, fits comfortably under the model’s 512 limit.” Ollama, looking at the same text with its converted tokenizer, says “534 tokens, doesn’t fit,” and 400s with <code>the input length exceeds the context length</code>. There is no <code>/api/tokenize</code> on Ollama, so we cannot ask the server how it tokenizes anything; the server-side <code>truncate=True</code> flag is unreliable in 0.20.x for this model. The two paths cannot be made consistent from the outside.</p>
<p>So: do not mix and match. I switched to an all-<code>transformers</code> stack for embedding for this blog. <code>sentence-transformers</code> is a thin wrapper around HF transformers that loads the same weights into our Python process and tokenizes with the same tokenizer it embeds with. One model, one tokenizer, one process, no IPC, no version skew.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> sentence_transformers <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> SentenceTransformer</span>
<span id="cb2-2">model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> SentenceTransformer(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mixedbread-ai/mxbai-embed-large-v1"</span>)</span>
<span id="cb2-3">embs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> model.encode(texts, normalize_embeddings<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, convert_to_numpy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span></code></pre></div></div>
<p>Dropping the Ollama hop also lets us set <code>dtype=torch.float16</code> on MPS — a 15× speedup over fp32 with indistinguishable quality. The fp16 path only matters on GPU or Apple Silicon; CPU stays in fp32 because half-precision on CPU is slow and pointless.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb3-2">gpu <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.is_available() <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">or</span> torch.backends.mps.is_available()</span>
<span id="cb3-3">kwargs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"model_kwargs"</span>: {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dtype"</span>: torch.float16}} <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> gpu <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> {}</span>
<span id="cb3-4">model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> SentenceTransformer(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mixedbread-ai/mxbai-embed-large-v1"</span>, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span>kwargs)</span></code></pre></div></div>
</section>
<section id="reading-the-internet" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="reading-the-internet"><span class="header-section-number">3</span> Reading the internet</h2>
<p>MCPs are handy for reading the internet.</p>
<p>Currently my favourite is Jina, which is affordable.</p>
<ul>
<li><a href="https://jina.ai/reader/?ref=danmackinlay.name">Reader API</a></li>
<li><a href="https://github.com/jina-ai/MCP?ref=danmackinlay.name#usage">jina-ai/MCP: Official Jina AI Remote MCP Server</a></li>
</ul>
<p>Their competitor Firecrawl is too expensive for my use case at marginal value add.</p>
</section>
<section id="google-is-also-a-bit-shit-at-copy-pasteable-content" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="google-is-also-a-bit-shit-at-copy-pasteable-content"><span class="header-section-number">4</span> Google is also a bit shit at copy-pasteable content</h2>
<p>Google broke its Markdown output in an interesting way: links don’t work in the output docs. This is particularly infuriating in my favourite Google product, Deep Research. It’s supposed to be <em>about</em> citations and links, and yet it can’t turn URLs into linked text (try copy-pasting the output to get inline citations if you don’t believe it).</p>
<p>For that reason—and because Gemini subscriptions are annoying and have shitty bundle pricing—as soon as Google released an API version of Google Deep Research, I wrote a Google Deep Research client that does all kinds of clever stuff to bypass their horrible output formatting and get the links and math and tables and code blocks out in a format I can actually use. Unlike Google’s horrible subscription options, it is pay-per-use at standard token pricing. My last research report was about USD1.70.</p>
<p>See <a href="https://github.com/danmackinlay/gemini_deep_research_client?ref=danmackinlay.name">danmackinlay/gemini_deep_research_client</a>. It does quite a lot to make sure the output works, including links, mathematics, and the other things researchers actually want included in their work. Pull requests welcome.</p>
</section>
<section id="openai-ux-sucks-increasingly-and-they-do-not-really-care-about-that" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="openai-ux-sucks-increasingly-and-they-do-not-really-care-about-that"><span class="header-section-number">5</span> OpenAI UX sucks increasingly and they do not really care about that</h2>
<p>The ChatGPT client used to generate lovely <a href="../notebook/markdown.html">markdown</a> that I could use where I wanted structure (math, code, tables) and HTML for text-y unstructured things.</p>
<p>That was a good time. <a href="https://forum.obsidian.md/t/inconsistency-when-copying-mathematical-formulas-from-the-chatgpt-website/94335?ref=danmackinlay.name">A few months ago they totally fucked it up</a>, and they’ve shown no interest in fixing it. We can no longer copy-paste tidy, structured Markdown from ChatGPT — just the slobbery mess of HTML.</p>
<p>Read on if you want to fix that.</p>
<p>But actually, I have just decided to quit OpenAI and use a different provider, so I don’t care about this any more. They used to have the best model for advanced mathematics, but Anthropic’s Claude is now better at that for my use cases, and it has beautiful Markdown output. Anyway, OpenAI is emitting worrying signs of being unethical.</p>
<p>I’m leaving the following bit here for posterity. I suspect OpenAI’s interest isn’t in chat clients — that’s a legacy product they keep around while they plan on brain-computer interfaces or utility fog or something. The fix won’t come from them.</p>
<p>Solutions:</p>
<p>First, we could move to a good client like <a href="https://jan.ai?ref=danmackinlay.name">Jan</a> that preserves Markdown on copy-paste and, as a bonus, lets us use diverse backends.</p>
<p>Alternatively, if we’re being lazy, open the chat we want to copy in a web browser and then use a browser extension to convert the HTML. Here are two that were recommended to me:</p>
<ul>
<li>Chrome: <a href="https://chromewebstore.google.com/detail/markdown-capturer-bibcit/bbglkcgbhkhchpbbbcgpocnhplhdhnmc?ref=danmackinlay.name">Markdown Capturer - BibCit</a></li>
<li>Firefox: <a href="https://addons.mozilla.org/en-US/firefox/addon/chatgpt-latex-copy-fix/?ref=danmackinlay.name">ChatGPT LaTeX Copy Fix</a></li>
</ul>
<p>Partial fix: Use a macOS script to convert clipboard HTML to Markdown. Here is a fish script</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource fish number-lines code-with-copy"><code class="sourceCode"><span id="cb4-1">function chat2md</span>
<span id="cb4-2">    if not type -q pandoc; echo "Install pandoc: brew install pandoc" &gt;&amp;2; return 1; end</span>
<span id="cb4-3"></span>
<span id="cb4-4">    pbpaste -Prefer public.html 2&gt;/dev/null | \</span>
<span id="cb4-5">    sed 's/class="Apple-converted-space"//g; s/&lt;span[^&gt;]*&gt;//g; s/&lt;\/span&gt;//g' | \</span>
<span id="cb4-6">    pandoc -f html+raw_html -t markdown+raw_tex+tex_math_dollars+fenced_code_blocks+hard_line_breaks --wrap=preserve -s |</span>
<span id="cb4-7">    pbcopy</span>
<span id="cb4-8">    echo "HTML → Markdown complete (LaTeX, code, newlines preserved)"</span>
<span id="cb4-9">end</span></code></pre></div></div>
<p>TBH, this still messes with Markdown math, but it preserves code blocks and newlines, which is a win.</p>
</section>
<section id="quit-openai" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="quit-openai"><span class="header-section-number">6</span> But actually just ditch OpenAI</h2>
<p>Claude has beautiful Markdown output. Also, OpenAI seems to be on some kind of slide into being generally evil, and I’ve noticed that my friends who work for OpenAI soon quit or stop getting invited to fun parties. Various actors, e.g.&nbsp;<a href="https://quitgpt.org?ref=danmackinlay.name">QuitGPT</a> have been arguing that OpenAI is a bad actor. I am not qualified to assess all their claim</p>
</section>
<section id="incoming" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="incoming"><span class="header-section-number">7</span> Incoming</h2>
<ul>
<li><a href="https://www.granola.ai/?ref=danmackinlay.name">Granola — The AI notepad for people in back-to-back meetings</a></li>
</ul>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>GGUF is the format that llama.cpp uses; Ollama wraps llama.cpp. When a model is added to the Ollama library, someone — usually an Ollama maintainer — runs a conversion script over the original HF release to produce the <code>.gguf</code>. That happens once, well before we pull the model.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>innovation</category>
  <category>language</category>
  <category>machine learning</category>
  <category>neural nets</category>
  <category>NLP</category>
  <category>stringology</category>
  <category>technology</category>
  <category>UI</category>
  <guid>https://danmackinlay.name/post/llm_hacks_2026.html</guid>
  <pubDate>Tue, 13 Jan 2026 19:21:27 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/i_photo_you.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Sciences of the Artificial</title>
  <link>https://danmackinlay.name/notebook/sciences_of_the_artificial.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-charity-doctor" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-charity-doctor-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/charity_doctor_RP-P-OB-82.754.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/charity_doctor_RP-P-OB-82.754.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-charity-doctor-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I read <span class="citation" data-cites="Simon1996Sciences">Simon (1996)</span> back in 2010, and it seemed cool. Now that the world is full of AI systems and complex engineered socio-technical systems, it seems like I didn’t notice how prescient it was.</p>
<p>First published amid the rise of cybernetics, early AI, and systems theory in the post-WWII era, the book challenged the dominance of the natural sciences (looking at you, physics) by advocating empirical study of designed, human-made systems.</p>
<section id="historical-context" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="historical-context"><span class="header-section-number">1</span> Historical Context</h2>
<p>In the 1960s, amid Cold War computing advances and behavioural psychology’s shift from behaviorism, Simon positioned the artificial sciences as complementary to the natural ones, drawing on his work in bounded rationality and organization theory. He responded to debates on whether engineering and design qualified as “science,” arguing synthetic systems—like economies or AI—warrant rigorous study despite their goal-oriented, adaptive nature. This sounds like some kind of pushing the edges of the scientific method, which often includes a universality that he explicitly rejects here.</p>
</section>
<section id="methodological-approach" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="methodological-approach"><span class="header-section-number">2</span> Methodological Approach</h2>
<p>Simon defines artificial systems by their interface with their environments: inner states adapt to outer constraints via functions and goals, enabling prediction through simulation. This yields an information-processing view of cognition, rejecting perfect rationality in favour of empirical models testable via computers, as in his “nearly decomposable hierarchies” for complexity.</p>
</section>
<section id="philosophy-of-science" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="philosophy-of-science"><span class="header-section-number">3</span> Philosophy of Science</h2>
<p>Philosophically, Simon elevates design as a science—devising actions to change situations—bridging “what is” (natural laws) and “what ought to be” (goals), thus unifying the social sciences, economics, and engineering under empirical rigour. Maybe.</p>
<p>He critiques reductionism, favouring hierarchical structures where wholes exceed their parts.</p>
</section>
<section id="post-hoc-relevance" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="post-hoc-relevance"><span class="header-section-number">4</span> Post hoc relevance</h2>
<p>In hindsight, a lot of things look like Herbert Simon call-outs. <a href="../notebook/ai_evals.html">AI Evals</a> and <a href="../notebook/ml_benchmarks.html">ML Benchmarks</a> are about evaluating designed systems. <a href="../notebook/institutional_alignment.html">institution design</a>, <a href="../notebook/movement_design.html">movement design</a>, and <a href="../notebook/mechanism_design.html">incentive mechanisms</a> are about designing socio-technical systems. <a href="../notebook/epistemic_community.html">Epistemic systems</a> are about designing knowledge systems. All of this feels very relevant.</p>
</section>
<section id="incoming" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="incoming"><span class="header-section-number">5</span> Incoming</h2>
<ul>
<li><a href="https://www.prosocial.world/posts/herbert-simon-and-the-sciences-of-the-artificial-through-the-lens-of-a-new-paradigm?ref=danmackinlay.name">Herbert Simon and the Sciences of the Artificial, Through the Lens of a New Paradigm</a></li>
</ul>
</section>
<section id="references" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="references"><span class="header-section-number">6</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Frantz2003Herbert" class="csl-entry">
Frantz. 2003. <span>“<a href="https://doi.org/10.1016/S0167-4870(02)00207-6">Herbert Simon. Artificial Intelligence as a Framework for Understanding Intuition</a>.”</span> <em>Journal of Economic Psychology</em>, The Economic Psychology of Herbert A. Simon,.
</div>
<div id="ref-Simon1996Sciences" class="csl-entry">
Simon. 1996. <em>Sciences of the Artificial</em>.
</div>
</div>


</section>

 ]]></description>
  <category>bounded compute</category>
  <category>economics</category>
  <category>game theory</category>
  <category>how do science</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>machine learning</category>
  <category>statistics</category>
  <guid>https://danmackinlay.name/notebook/sciences_of_the_artificial.html</guid>
  <pubDate>Wed, 07 Jan 2026 08:14:30 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/charity_doctor_RP-P-OB-82.754.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Multivariate information decomposition</title>
  <link>https://danmackinlay.name/notebook/information_decomposition.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-cupid-slicin" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-cupid-slicin-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/cupid_slicin_RP-P-OB-74.817.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/cupid_slicin_RP-P-OB-74.817.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-cupid-slicin-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Placeholder for a particular trick in <a href="../notebook/informations.html">information theory</a>:</p>
<p><span class="citation" data-cites="Williams2010Nonnegative">Williams and Beer (2010)</span> introduced partial information decomposition (PID) as a way to split the mutual information that a set of sources has about a target into non‑negative “atoms” corresponding to <em>redundant</em>, <em>unique</em>, and <em>synergistic</em> information. Their framework has become a standard reference point, but their specific redundancy measure has been heavily critiqued. There are now many alternative proposals and generalizations.</p>
<section id="williams-beers-original-pid" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="williams-beers-original-pid"><span class="header-section-number">1</span> Williams &amp; Beer’s original PID</h2>
<p>Williams &amp; Beer consider a target <img src="https://latex.codecogs.com/png.latex?Y"> and sources <img src="https://latex.codecogs.com/png.latex?X_1,%20X_2,%20%5Cdots">, and aim to decompose <img src="https://latex.codecogs.com/png.latex?I(X_1,%20X_2,%20%5Cdots%20:%20Y)"> into atoms corresponding to:</p>
<ul>
<li><p><strong>Redundant</strong> information (shared by multiple sources about <img src="https://latex.codecogs.com/png.latex?Y">)</p></li>
<li><p><strong>Unique</strong> information (available only from one source)</p></li>
<li><p><strong>Synergistic</strong> information (available only from sources in combination).</p></li>
</ul>
<p>They formalize this by:</p>
<ul>
<li><p>Introducing a redundancy function <img src="https://latex.codecogs.com/png.latex?I_%7B%5Ccap%7D(X_%7B1:n%7D%20:%20Y)"> defined on sets of sources.</p></li>
<li><p>Requiring this redundancy measure to satisfy three axioms: symmetry, self‑redundancy, and monotonicity.</p></li>
</ul>
<p>Using the lattice of “information antichains” over source subsets, they show that, given such a redundancy measure, the mutual information can be decomposed by Moebius inversion over this lattice, yielding guaranteed non‑negative information atoms.</p>
<p>As a concrete proposal, they define redundancy via the “minimum information” measure <img src="https://latex.codecogs.com/png.latex?I_%7B%5Cmin%7D">, which roughly takes the minimal specific information any source provides about each outcome of <img src="https://latex.codecogs.com/png.latex?Y">, averaged over outcomes.</p>
</section>
<section id="subsequent-theoretical-developments" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="subsequent-theoretical-developments"><span class="header-section-number">2</span> Subsequent theoretical developments</h2>
<p>While the <em>framework</em> (axioms + lattice) was widely accepted, the specific Williams–Beer redundancy <img src="https://latex.codecogs.com/png.latex?I_%7B%5Cmin%7D"> quickly attracted criticism.</p>
<p>Much subsequent work has tried to preserve the Williams–Beer axioms and lattice structure while replacing <img src="https://latex.codecogs.com/png.latex?I_%7B%5Cmin%7D"> with better‑behaved redundancy or intersection‑information measures.</p>
</section>
<section id="references" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="references"><span class="header-section-number">3</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Friedman2001Multivariate" class="csl-entry">
Friedman, Mosenzon, Slonim, et al. 2001. <span>“<a href="http://arxiv.org/abs/1301.2270">Multivariate Information Bottleneck</a>.”</span> In <em>Proceedings of the Seventeenth Conference on Uncertainty in Artificial Intelligence</em>. UAI’01.
</div>
<div id="ref-Jansma2025Decomposing" class="csl-entry">
Jansma. 2025. <span>“<a href="https://doi.org/10.48550/ARXIV.2501.11447">Decomposing Interventional Causality into Synergistic, Redundant, and Unique Components</a>.”</span> In.
</div>
<div id="ref-Kolchinsky2022Novel" class="csl-entry">
Kolchinsky. 2022. <span>“<a href="https://doi.org/10.3390/e24030403">A Novel Approach to the Partial Information Decomposition</a>.”</span> <em>Entropy</em>.
</div>
<div id="ref-MartinezSanchez2024Decomposing" class="csl-entry">
Martínez-Sánchez, Arranz, and Lozano-Durán. 2024. <span>“<a href="https://doi.org/10.1038/s41467-024-53373-4">Decomposing Causality into Its Synergistic, Unique, and Redundant Components</a>.”</span> <em>Nature Communications</em>.
</div>
<div id="ref-Sigtermans2020PathBased" class="csl-entry">
Sigtermans. 2020. <span>“<a href="https://doi.org/10.3390/e22090952">A Path-Based Partial Information Decomposition</a>.”</span> <em>Entropy</em>.
</div>
<div id="ref-Studeny1998Multiinformation" class="csl-entry">
Studený, and Vejnarová. 1998. <span>“On Multiinformation Function as a Tool for Measuring Stochastic Dependence.”</span> In <em>Learning in Graphical Models</em>.
</div>
<div id="ref-Williams2010Nonnegative" class="csl-entry">
Williams, and Beer. 2010. <span>“<a href="https://doi.org/10.48550/ARXIV.1004.2515">Nonnegative Decomposition of Multivariate Information</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>classification</category>
  <category>compsci</category>
  <category>information</category>
  <category>metrics</category>
  <category>statistics</category>
  <category>statmech</category>
  <guid>https://danmackinlay.name/notebook/information_decomposition.html</guid>
  <pubDate>Tue, 06 Jan 2026 12:00:10 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/cupid_slicin_RP-P-OB-74.817.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>London</title>
  <link>https://danmackinlay.name/notebook/london.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-londons-burning" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-londons-burning-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/londons_burning_RP-P-OB-82.017.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/londons_burning_RP-P-OB-82.017.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-londons-burning-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Here’s a list of things that interest me about London.</p>
<p>Thanks to Kathryn Smith and <a href="https://www.theatlantic.com/author/rebecca-giggs/?ref=danmackinlay.name">Rebecca Giggs</a> for various hot tips.</p>
<section id="ok-london-whatcha-got-to-entertain-me" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="ok-london-whatcha-got-to-entertain-me"><span class="header-section-number">1</span> OK London, whatcha got to entertain me?</h2>
<p>I have a couple of days up my sleeve to do tourist stuff. What is the optimal tourist stuff for a guy like me to see in this town?</p>
<p>To clarify, I think I can best summarise what I’m interested in going to as “peak London” activities. This is an idiosyncratic definition that I hope encompasses the idea of things that I am unlikely to find elsewhere, and which would appeal to me, being <em>specific to London</em> and <em>high on intimate, visceral, and personal</em> dimensions of experience. Going to look at Westminster doesn’t count because it’s just a building—one clogged with ten thousand people taking selfies and then getting bored. Likewise, London Bridge. It’s a nice bridge, but in what sense is that experientially “peak”? How would that earn its place in my schedule?</p>
<p>No, for my day off I must answer the question: What’s some INTENSE LONDON BUSINESS?</p>
<p>I have been told that London is strong on history and Things of Interest to the Progeny of Oligarchs, so let’s lean into those for a starting point.</p>
<ul>
<li><p><a href="https://www.vam.ac.uk/east?ref=danmackinlay.name">Robo Victoria and Albert</a> (not the canonical name): In east London there’s a museum which is actually the storehouse for the more famous V&amp;A museum. It has the <a href="https://www.tripadvisor.com/ShowUserReviews-g186338-d33241604-r1044032819-V_A_East_Storehouse-London_England.html?ref=danmackinlay.name#REVIEWS">most polarised TripAdvisor reviews I have read</a>. Next to it, there’s the <a href="https://en.wikipedia.org/wiki/ArcelorMittal_Orbit?ref=danmackinlay.name">world’s tallest and longest tunnel slide</a>.</p></li>
<li><p><a href="https://www.youtube.com/watch?v=GWKSmEOX2uk&amp;ref=danmackinlay.name">Kew Gardens</a>, hub of the ‘empire of botany’ (not the canonical name) that helped Britain dominate the world. They’ve got all kinds of weird collections, all gussied up nicely (<a href="https://www.kew.org/kew-gardens/plants/bonsai-collection?ref=danmackinlay.name">Bonsai</a>, <a href="https://www.kew.org/kew-gardens/plants/arid-collection?ref=danmackinlay.name">Cacti</a>…)</p></li>
<li><p>The <a href="https://www.ucl.ac.uk/museums-collections/grant-museum-zoology/about-grant-museum?ref=danmackinlay.name">Grant Museum</a> at UCL has a JAR OF MOLES.</p></li>
<li><p>The Viktor Wynd <a href="https://thelasttuesdaysociety.org/exhibition/guided-tours-with-vadim-kosmos-emeritus-director-of-the-museum-39/?ref=danmackinlay.name">Absinthe and Monsters schtick</a> looks kitsch enough that I probably wouldn’t go if I lived in London, but as a tourist I feel like I’ve got a licence.</p></li>
<li><p><a href="https://newspeak.house/?ref=danmackinlay.name">Newspeak House</a></p>
<blockquote class="blockquote">
<p>Newspeak House, The London College of Political Technology, is an independent residential college founded in 2015. Our mission is to study, nurture and inspire emerging communities of practice across civil society and the public sector in the UK.</p>
</blockquote>
<p>Five stars! I spent all evening arguing with a German cypherpunk on her way back from the CCC, and an Italian <a href="../notebook/civic_tech.html">Civic Tech</a> developer about the technical barriers to citizen participation.</p></li>
<li><p>Tube Strike</p></li>
<li><p><a href="https://villageunderground.co.uk/about/?ref=danmackinlay.name">Village Underground</a> seems like a cute venue where community meets raves.</p></li>
<li><p><a href="https://www.dennissevershouse.co.uk/dennis-severs-and-his-house?ref=danmackinlay.name">Dennis Severs &amp; His House</a> sounds like a peak mix of fabulous history, style, and queerness.</p>
<blockquote class="blockquote">
<p>Dennis Severs came to Spitalfields in 1979 and bought a derelict house saved by the Spitalfields Trust. He reconfigured it to tell the story of an imaginary Huguenot family who had lived there since it was built in 1724.</p>
<p>Dennis moved into 18 Folgate Street with a candle, a chamber pot and a bedroll – and the house became his life’s work.</p>
</blockquote>
<p>Just your standard 1720s/1990s pastiche.</p></li>
</ul>
<section id="historical-engravings-and-prints" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="historical-engravings-and-prints"><span class="header-section-number">1.1</span> Historical engravings and prints</h3>
<p>OK, this is a personal obsession of mine, but I recognise it might not be for everyone. Listed here are the places that look like they have good stock at my price point (i.e.&nbsp;tending towards 1-to-3-digit-price facsimile engravings, copy engravings, or ephemera rather than 4-digit original old masters or whatever).</p>
<ul>
<li><a href="http://www.storeysltd.co.uk?ref=danmackinlay.name">Storey’s</a> (Cecil Court, WC2)</li>
<li><a href="https://www.grosvenorprints.com/contact.php?ref=danmackinlay.name">Grosvenor Prints</a> has an appropriately antiquated website (WC2)</li>
<li><a href="https://www.portobelloprintandmap.co.uk?ref=danmackinlay.name">Portobello Print &amp; Map Shop</a> (Notting Hill, W11)</li>
<li><a href="https://www.themaphouse.com/contact/?ref=danmackinlay.name">The Map House</a> (SW3)</li>
<li><a href="http://antiquemapsandprints.com?ref=danmackinlay.name">Antiqua Print Gallery</a> (NW10 + online)</li>
</ul>
<p><a href="https://maps.apple/ug/Msj7ojEye5ZIeU7Dqq1exB?ref=danmackinlay.name">Apple Maps link to all of the above</a>.</p>
</section>
</section>
<section id="london-governance-is-cooked" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="london-governance-is-cooked"><span class="header-section-number">2</span> London governance is cooked</h2>
<p>London is a cabinet of governance curiosities. After more than a millennium of never-fully-resolved power struggles, it’s accumulated an incredible collection of bizarre case studies in not really redesigning anything—just adding more layers and carve-outs on top of the old ones.</p>
<p>Greater London <em>looks</em> like a single world city. Do not be fooled. It’s more like an unstable regional government that’s been created, abolished, and recreated, plus a set of corporate endowments that do things I’d normally expect a state to do.</p>
<p>A basic fact that points to the rest of the weirdness: “London” contains a legally distinct city inside it: the <a href="https://www.cityoflondon.gov.uk/about-us/about-the-city-of-london-corporation?ref=danmackinlay.name">City of London Corporation</a> governs the <a href="https://brilliantmaps.com/city-of-london-map/?ref=danmackinlay.name">Square Mile</a>. The remaining 600 square miles of the capital are governed through the <a href="https://www.legislation.gov.uk/id/ukpga/1999/29?ref=danmackinlay.name">Greater London Authority</a> (Mayor + Assembly) and the 32 London boroughs set up under the <a href="https://www.legislation.gov.uk/ukpga/1963/33?ref=danmackinlay.name">London Government Act 1963</a> (Q: Why does the governing act mention <a href="https://www.legislation.gov.uk/ukpga/1963/33/part/I/enacted?view=plain&amp;ref=danmackinlay.name">“the Temples”</a> so much?).</p>
<p>The full story of how it got this way is beyond me, but I rustled up some highlights.</p>
<section id="prequel" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="prequel"><span class="header-section-number">2.1</span> Prequel</h3>
<p>Soon after 1066, William I issued a writ/charter confirming Londoners’ existing laws and customs — <a href="https://www.cityoflondon.gov.uk/assets/Things-to-do/history-of-london-ten-documents.pdf?ref=danmackinlay.name">a document the City still treats as foundational to its corporate continuity</a> (see <a href="https://news.cityoflondon.gov.uk/william-the-conquerors-1067-charter-on-rare-display-in-city-of-london/?ref=danmackinlay.name">modern translation</a>).</p>
<p>Then London started getting special. By 1132, the Crown had conceded a key privilege: Londoners <a href="https://www.cityoflondon.gov.uk/about-us/about-the-city-of-london-corporation/the-sheriffs/the-sheriffs-an-historical-background?ref=danmackinlay.name">could choose their own sheriffs</a>, an office that elsewhere functioned as a royal appointment. Soon after, the City’s chief magistrate became an internally selected civic office. The first recorded mayor, Henry Fitz-Ailwyn (1189), is treated as the start of a continuous mayoralty, and <a href="https://www.cityoflondon.gov.uk/about-us/law-historic-governance/the-mayoralty?ref=danmackinlay.name">the City describes the Mayoralty as a long-running civic institution</a>. By 1215, the <a href="https://magnacarta.cmp.uea.ac.uk/read/magna_carta_1215/Clause_13?ref=danmackinlay.name">City’s <em>liberties</em></a> are explicitly named in <em>Magna Carta</em> clause 13 (see <a href="https://oll.libertyfund.org/pages/1215-magna-carta-latin-and-english?ref=danmackinlay.name">a modern translation (Latin and English)</a>/ <a href="https://www.thelondonarchives.org/your-research/magna-carta-in-the-city-of-london?ref=danmackinlay.name">background</a>). All this makes London a ground zero for democratic governance, of a sort, in England.</p>
</section>
<section id="the-city-of-london-declines-to-include-all-of-the-city-of-london" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="the-city-of-london-declines-to-include-all-of-the-city-of-london"><span class="header-section-number">2.2</span> 1637: The City of London declines to include all of the city of London</h3>
<p>By the 1600s, the built-up metropolis was spilling beyond the medieval City walls. In 1637, under Charles I, the Crown attempted an administrative reform that would have extended the City’s jurisdiction across the growing suburbs—what later writers call the <em>”Great Refusal”</em> (see <a href="https://thelondonwanderer.co.uk/2023/04/the-citys-shadowy-figure-in-the-under-gallery/?ref=danmackinlay.name">The London Wanderer’s account</a> and the <a href="https://www.independentlabour.org.uk/2012/09/13/a-tale-of-two-cities/?ref=danmackinlay.name">Independent Labour piece</a>).</p>
<p>The Crown presumably wanted tidier governance (plague control, order, taxation, all the usual early-modern state stuff). But another early-modern thing happened: institutional power struggle! The City—already a powerful corporate body with entrenched privileges—<em>declined the expansion</em> and kept its governance tightly bounded to more-or-less the old city walls. I’m not sure I understand the mentality, but this happens again and again: when the metropolis grows, the institutions don’t naturally consolidate; new ones accrete around the gap and everyone preserves their own manor.</p>
</section>
<section id="patchwork-metropolis" class="level3" data-number="2.3">
<h3 data-number="2.3" class="anchored" data-anchor-id="patchwork-metropolis"><span class="header-section-number">2.3</span> Patchwork metropolis</h3>
<p>Most of the history from then on seems to show London as a mishmash of fragmented governance. The state didn’t so much “run London” as tend a wild weedy garden of parishes, vestries, boards, and carve-outs.</p>
<p>We can watch the Victorian state trying to trim things in the <a href="https://www.legislation.gov.uk/ukpga/Vict/18-19/120/contents/enacted?ref=danmackinlay.name">Metropolis Management Act 1855</a>, which created a London-wide body for infrastructure and sanitation: the Metropolitan Board of Works.</p>
<p>The Act is worth skimming just for the taxonomy. Its schedules enumerate a metropolis of parishes and districts, but also explicitly list extra-parochial places (“Schedule (C.)”). So here’s a category of London objects:</p>
<ul>
<li>The Close of the Collegiate Church of Saint Peter.</li>
<li>Inner Temple.</li>
<li>Lincoln’s Inn.</li>
<li>Middle Temple.</li>
<li>Staple Inn.</li>
<li>The Charter House.</li>
<li>Gray’s Inn.</li>
<li>Furnival’s Inn.</li>
</ul>
<p>I read this as “London normalizes exceptions”.</p>
</section>
<section id="engineering-londons-governance" class="level3" data-number="2.4">
<h3 data-number="2.4" class="anchored" data-anchor-id="engineering-londons-governance"><span class="header-section-number">2.4</span> Engineering London’s governance</h3>
<p>The Metropolitan Board of Works (MBW) was the Victorian attempt at metropolitan-scale capacity without metropolitan-scale democracy. It was created by the above-mentioned Metropolis Management Act 1855, staffed indirectly via parish vestries, and tasked with the physical problems of a rapidly expanding city (roads, sewers, bridges, embankments). <a href="https://discovery.nationalarchives.gov.uk/details/r/55e5e921-cb40-4049-b786-3589d168c4d6?ref=danmackinlay.name">Under the Local Government Act 1888</a>, the Board’s powers were transferred to the new London-wide council.</p>
<p>The MBW was <a href="https://en.wikipedia.org/wiki/Metropolitan_Board_of_Works?ref=danmackinlay.name#Scandals">rife with scandal</a>. In 1889 it was replaced by the London County Council, the <a href="https://www.thelondonarchives.org/your-research/research-guides/london-county-council-an-overview?ref=danmackinlay.name">first London-wide authority to be directly elected</a>, with the statutory transfer set out in the same <a href="https://www.legislation.gov.uk/ukpga/Vict/51-52/41/section/40/enacted?ref=danmackinlay.name">Local Government Act 1888</a>. The process sounds acrimonious.</p>
<p>One thing the reform didn’t do was absorb the Square Mile into a unified London government. The City remained apart.</p>
<p>Reformers organized through groups like the <a href="https://en.wikipedia.org/wiki/London_Municipal_Reform_League?ref=danmackinlay.name">London Municipal Reform League</a>, arguing for a single democratic authority for the metropolis. Check out <a href="https://thelondonwanderer.co.uk/2023/04/the-citys-shadowy-figure-in-the-under-gallery/?ref=danmackinlay.name">The City’s shadowy figure in the under-gallery</a> for an account of some amazing Victorian-era turf wars:</p>
<blockquote class="blockquote">
<p>The greatest threat came with an 1884 Government-backed reform bill. This aimed to create a single metropolitan council based on a reformed Corporation. The unreformed Corporation was having none of it and formed a committee to coordinate opposition. This collected a petition of 20,000 signatures – many probably fake or bought – and circulated anti-reform pamphlets; paid people to create intimidating opposition at public meetings; financed groups to stall the bill and mislead Parliament, and established an ‘Anti-One-Municipality League.’ Its spending totalled £19,500 – around £1.9 million today. As a result, the bill ran out of time in the Parliamentary session, and was not reintroduced</p>
</blockquote>
<p>The <a href="https://en.wikipedia.org/wiki/Royal_Commission_on_the_Amalgamation_of_the_City_and_County_of_London?ref=danmackinlay.name">Royal Commission on the Amalgamation of the City and County of London</a> was an inquiry into whether unification might be a good idea. <a href="https://onlinebooks.library.upenn.edu/webbin/book/lookupid?key=ha010434618&amp;ref=danmackinlay.name">The City’s own submission</a> is …defensive.</p>
<p>The Commission recommended unification in principle. London didn’t unify in practice. What <em>did</em> happen was a reorganization of the County of London beneath the LCC: the <a href="https://en.wikipedia.org/wiki/London_Government_Act_1899?ref=danmackinlay.name">London Government Act 1899</a> replaced vestries and district boards with metropolitan boroughs, explicitly described in parliamentary debate as transferring the powers of the old patchwork to borough councils.</p>
<p>The Square Mile stayed special.</p>
</section>
<section id="what-the-hell-is-the-city-now" class="level3" data-number="2.5">
<h3 data-number="2.5" class="anchored" data-anchor-id="what-the-hell-is-the-city-now"><span class="header-section-number">2.5</span> What the hell is the City now?</h3>
<p>I’m not sure, but it’s weird, and very stably weird over time. Case in point 1:</p>
<p>The City employs a senior official called the <em><a href="https://en.wikipedia.org/wiki/City_Remembrancer?ref=danmackinlay.name">City Remembrancer</a></em>, created in 1571, whose modern job description includes monitoring legislation and acting as a parliamentary agent. The role is openly described within the City’s own institutional ecosystem (for example, the archival description of the <a href="https://atom.aim25.com/index.php/remembrancers-department-parliamentary?ref=danmackinlay.name">Remembrancer’s parliamentary work</a>, and City recruitment material that defines the Remembrancer as a parliamentary agent and head of protocol: <a href="https://careers.cityoflondon.gov.uk/roles/corporate-business-services/?ref=danmackinlay.name">City of London careers page</a>).</p>
<p>Yep, a dedicated City officer, created in the 1500s, still has an officially acknowledged perch in Parliament’s gallery, tasked with tracking legislation that touches the City’s interests.</p>
<p>Inside the Square Mile, the governing machinery is its own ecosystem: <em>wards</em>, <em>aldermen</em>, a <em>Court of Common Council</em>, and an electoral culture tied to medieval guild structures.</p>
<p>A clean contemporary guide to the basic moving parts is the City’s own <a href="https://www.cityoflondon.gov.uk/assets/about-us/voting-elections/wardmote-book-february-25.pdf?ref=danmackinlay.name">Wardmote Book</a>, which sets out the City’s ward elections and the bodies involved. There’s also a livery system: the City states that <a href="https://www.cityoflondon.gov.uk/about-us/law-historic-governance/livery-companies?ref=danmackinlay.name">livery companies are “integral to the City’s governance”</a>, with liverymen participating in the selection of senior civic offices. The assembly called <em><a href="https://liverycommittee.org/about/the-livery-committee/common-hall/?ref=danmackinlay.name">Common Hall</a></em> exists for liverymen to elect the Lord Mayor and Sheriffs. The mechanics of those elections are described in livery sources such as the <a href="https://liverycommittee.org/about/the-livery-committee/common-hall/election-of-sheriffs/?ref=danmackinlay.name">Election of Sheriffs</a> notes.</p>
<p>The City retains a <em>business</em> vote. I mean, to be fair, there aren’t that many human beings who live in the City (<a href="https://en.wikipedia.org/wiki/City_of_London?ref=danmackinlay.name">fewer than 9,000</a>), so it’s just as well there’s a business vote. The legal basis for modernizing and expanding that system is the <a href="https://www.legislation.gov.uk/ukla/2002/6/enacted?ref=danmackinlay.name">City of London (Ward Elections) Act 2002</a>. Parliamentary scrutiny of that Bill includes <a href="https://publications.parliament.uk/pa/ld200102/ldselect/ldcolweb/21008/2100808.htm?ref=danmackinlay.name">evidence about how City elections operate in practice</a>: for example, discussion of uncontested seats and electoral patterns.</p>
<p>The relationship between the City’s electoral system and modernist institutional design is reminiscent of the relationship between a seagull and a quadcopter.</p>
<p>The City is also a long-lived corporate manager of funds and trusts. It <a href="https://www.cityoflondon.gov.uk/about-us/budgets-spending/city-of-london-funds?ref=danmackinlay.name">operates multiple funding streams</a>, including <em>City’s Cash</em>, described by the City as an endowment “built up over the last eight centuries” and used to finance activities “mainly for the benefit of London as a whole”. If I had more time, I’d read the <a href="https://www.cityoflondon.gov.uk/assets/about-us/budget-and-spending/city-cash-accounts-2022-23.pdf?ref=danmackinlay.name">City’s Cash annual report and financial statements</a>.</p>
<p><em>Bridge House Estates</em>—now branded as the <a href="https://www.citybridgefoundation.org.uk/about/history?ref=danmackinlay.name">City Bridge Foundation</a>—was established roughly nine centuries ago to maintain London Bridge and now looks after multiple central London crossings. A more concrete “what it built and when” summary is laid out in <a href="https://www.towerbridge.org.uk/stories/the-history-of-city-bridge-foundation?ref=danmackinlay.name">Tower Bridge’s institutional history write-up</a>.</p>
</section>
<section id="greater-london-the-bit-that-is-not-the-city" class="level3" data-number="2.6">
<h3 data-number="2.6" class="anchored" data-anchor-id="greater-london-the-bit-that-is-not-the-city"><span class="header-section-number">2.6</span> Greater London: The bit that is not the City</h3>
<p>Above borough level, London’s regional governance has repeatedly been, as we’d say now, “phoenixed”.</p>
<p>In 1965, the <a href="https://www.legislation.gov.uk/ukpga/1963/33?ref=danmackinlay.name">London Government Act 1963</a> created the Greater London Council (GLC) and the modern borough structure. The GLC was later abolished by the <a href="https://www.legislation.gov.uk/ukpga/1985/51/part/I?ref=danmackinlay.name">Local Government Act 1985</a>. London then spent the late 20th century with strategic functions dispersed among multiple bodies. After the abolition of the GLC, <a href="https://researchbriefings.files.parliament.uk/documents/RP06-60/RP06-60.pdf?ref=danmackinlay.name">“a complex web of bodies” handled aspects of city-wide policy</a>. <a href="https://londontopia.net/history/from-glc-to-gla-the-dissolution-of-the-greater-london-council-and-creation-of-the-greater-london-authority/?ref=danmackinlay.name">Thatcher nuked the Greater London Council in the ’80s</a>, apparently as a power play against the left-wing GLC leadership. Regional government returned in 2000 via the <a href="https://www.legislation.gov.uk/id/ukpga/1999/29?ref=danmackinlay.name">Greater London Authority Act 1999</a> establishing the Mayor of London and the London Assembly.</p>
<p>So now Greater London has a Mayor after a huge hiatus. As opposed to the Lord Mayor of the City of London, who has been there uninterrupted for centuries. Because this is dumb and confusing, the City itself maintains an official explainer distinguishing the <a href="https://www.cityoflondon.gov.uk/about-us/about-the-city-of-london-corporation/lord-mayor/lord-mayor-mayor-of-london?ref=danmackinlay.name">Lord Mayor of the City of London from the Mayor of London</a>.</p>
</section>
<section id="institutions-that-survive-by-becoming-owners-trustees-and-exception-areas" class="level3" data-number="2.7">
<h3 data-number="2.7" class="anchored" data-anchor-id="institutions-that-survive-by-becoming-owners-trustees-and-exception-areas"><span class="header-section-number">2.7</span> Institutions that survive by becoming owners, trustees, and exception areas</h3>
<p>If we take a step back, London’s administrative oddness isn’t random. The same techniques recur across centuries:</p>
<ul>
<li>preserve a privileged jurisdiction inside a growing metropolis (the City after 1637);</li>
<li>tolerate patchwork and exception areas until infrastructure forces a partial rationalization (1855);</li>
<li>build metropolitan capacity through indirectly accountable bodies, then replace them when legitimacy collapses (MBW → LCC);</li>
<li>attempt unification, then settle for reorganizing everything <em>except</em> the Square Mile (1890s);</li>
<li>carry political access forward through specialized offices (the <a href="https://atom.aim25.com/index.php/remembrancers-department-parliamentary?ref=danmackinlay.name">City Remembrancer</a>);</li>
<li>embed wealth and function in endowments and trusts that outlive normal municipal cycles (<a href="https://www.cityoflondon.gov.uk/about-us/budgets-spending/city-of-london-funds?ref=danmackinlay.name">City’s Cash</a>, <a href="https://www.citybridgefoundation.org.uk/about/history?ref=danmackinlay.name">City Bridge Foundation</a>, <a href="https://www.cityoflondon.gov.uk/things-to-do/green-spaces/epping-forest/how-we-manage-epping-forest?ref=danmackinlay.name">Epping Forest conservatorship</a>);</li>
<li>re-cut regional government when national politics demands it (1963, 1985, 1999).</li>
</ul>
<p>Now that we know all this, the steampunk detective radio play called: <a href="https://www.victoriocity.com/?ref=danmackinlay.name">Victoriocity</a> (set in “Even Greater London”) is even more entertaining.</p>
</section>
<section id="forward-facing-policy-setting" class="level3" data-number="2.8">
<h3 data-number="2.8" class="anchored" data-anchor-id="forward-facing-policy-setting"><span class="header-section-number">2.8</span> Forward-facing policy setting</h3>
<p>OK WHAT A WILD RIDE. HERE, HAVE SOME YIMBY ARTICLES AS A PALATE CLEANSER:</p>
<ul>
<li><a href="https://ukfoundations.co/?ref=danmackinlay.name">UK Foundations</a></li>
<li><a href="https://capx.co/labours-building-plans-need-a-carrot-as-well-as-a-stick?ref=danmackinlay.name">Labour’s building plans need a carrot as well as a stick</a></li>
<li><a href="https://worksinprogress.co/issue/why-britain-doesnt-build/?ref=danmackinlay.name">Why Britain doesn’t build</a></li>
<li><a href="https://unherd.com/2020/09/the-plot-against-mercia/?ref=danmackinlay.name">The plot against Mercia</a></li>
<li><a href="https://www.sambowman.co/p/twenty-million-londoners-the-solution?ref=danmackinlay.name">Upzoning London: the solution to Britain’s housing crisis</a></li>
</ul>
</section>
</section>
<section id="transport" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="transport"><span class="header-section-number">3</span> Transport</h2>
<section id="bikes" class="level3" data-number="3.1">
<h3 data-number="3.1" class="anchored" data-anchor-id="bikes"><span class="header-section-number">3.1</span> Bikes</h3>
<p>The bike infrastructure is… incredibly good. World class. I was not expecting this, but at least in central London people were like “bike lanes cannot make this shit show worse YOLO.” Strong recommend.</p>
<p>Also strong recommend, <a href="../notebook/bikes.html#brompton">local cult bike brand Brompton</a></p>
<p>Helpful guides exist to this cult, e.g.&nbsp;<a href="https://www.myorangebrompton.com/2012/11/where-you-brompton-is-welcome-in-london.html?ref=danmackinlay.name">Where Your Brompton is Welcome in London</a></p>
</section>
<section id="the-tube" class="level3" data-number="3.2">
<h3 data-number="3.2" class="anchored" data-anchor-id="the-tube"><span class="header-section-number">3.2</span> The tube</h3>
<p>Definitely an adequate public transport system. And iconic! People warn me that some stations are prone to muggings late at night, but I have not yet been mugged.</p>
<p>The real test of the quality of the Tube is what happens when there is a workers’ strike. This is probably a PEAK LONDON experience, watching a city grind to a halt as the overloaded surface infrastructure struggles to move a few million people on a road grid they never really got around to fixing after the Great Fire. Having the whole city cry “Your plans are naught to me! I grind your schedule to dust beneath overcrowded rush hour traffic” is somehow peak London.</p>
<p>Fun observation: There seems to be no universal social norm amongst Londoners that prevents people with raging <a href="../notebook/respiratory_viruses.html">respiratory illness</a> from catching trains and then coughing and/or sneezing copiously into their hands.</p>
<p>I recounted my upsetting experience of this to a colleague, who claimed it was to do with the in-migration of Asians and other people from poorer countries who don’t know any better, This does not accord with my observations at all. Like, not even slightly? I’m generally reluctant to reason from personal anecdotes but I have a lot of data points now. Dozens of gross snot-spreaders, 100% white the lot of them, typically with a local accident. It looks to me like the autochthonous poms are doing this to themselves. I mean, and everyone around them. As we sat there trying not to breathe, there are detonations on all sides, like a bombardment of nasal depth charges. The holidaying Singaporean family I was just now sitting next to were horrified.</p>
</section>
<section id="regional-trains" class="level3" data-number="3.3">
<h3 data-number="3.3" class="anchored" data-anchor-id="regional-trains"><span class="header-section-number">3.3</span> Regional trains</h3>
<p>Functional but expensive and unnecessarily frustrating.</p>
<p>Archetypal experience: At King’s Cross station, I foolishly arrive 20 minutes early. There is nothing to do for 14 minutes because LOL there is NO POSSIBLE WAY TO KNOW what platform any given train will arrive at before it does so. About a thousand people stand in the entrance hall, staring at the departures board waiting for the inscrutable god of switching to guide a train to a destination, unable to move for fear of getting a bad seat when the mad rush begins. At 6 minutes before my train’s departure a platform is assigned — “platform 9” it says — and a couple of hundred people surge out for the crowd to board. “Can I buy a sandwich in 6 minutes and still make it?” I ask myself, having failed to do so while pinned to the departures board. LOL no.</p>
<p>Amazingly there is a wheelchair section in the train, although anyone who can traverse this enormous, crowded station in 6 minutes in a wheelchair deserves not just a spot in wheelchair section but also a cooling refreshing beverage and a free manicure or something.</p>
<p>I’m sure there is some profound reason that they cannot possibly know where trains go at the train station. Like, is it to confuse the ruskis who might want to <em>very specifically bomb the train to Harrogate</em> or something?</p>
<p>Or better: the very advanced UK trains are powered by quantum indeterminacy and they need to have their waveform collapsed or something. I would accept this if it got us some kind of superluminal train speed, or if they could achieve other markers of competence such as successfully having running water to wash your hands with in the washbasin, but their performance on these fronts is indifferent.</p>
</section>
<section id="driving" class="level3" data-number="3.4">
<h3 data-number="3.4" class="anchored" data-anchor-id="driving"><span class="header-section-number">3.4</span> Driving</h3>
<p>Looks depressing and horrible.</p>
</section>
</section>
<section id="class" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="class"><span class="header-section-number">4</span> Class</h2>
<p>I’m baffled by the UK class system, as is traditional for outsiders. Being baffled by the UK class system is very much part of the recommended outsider experience. We all enjoy, I think, being confused by the cultural hijinks of a weird island nation that hasn’t had a thorough socioeconomic reset since the last time it was thoroughly invaded a millennium ago, or at least not as much as its neighbours.</p>
<p>So! Some notes for my own understanding.</p>
<p>I’m not going to talk about accents. That is a whole can of worms.</p>
<section id="shopping" class="level3" data-number="4.1">
<h3 data-number="4.1" class="anchored" data-anchor-id="shopping"><span class="header-section-number">4.1</span> Shopping</h3>
<p>I think I can see class in the shopping choices people make. In Britain, supermarkets seem to map out social class. While Australia’s Coles or Woolies don’t carry much status baggage, in the UK a supermarket choice signals something more about a person’s social position and taste.</p>
<p>At the top end is <em>Waitrose</em>, leaning into organic veg, nice wine, and “tasteful” interiors—basically shorthand for the comfortable middle class. <em>Marks &amp; Spencer (M&amp;S)</em> sits alongside it, with pricey ready meals and a food hall full of treats rather than essentials. <em>Sainsbury’s</em> is a polite middle zone—solid, reliable, slightly aspirational but still everyday. <em>Tesco</em> is the country’s main supermarket, stretching from basic to premium but leaning toward basic. I find this confusing because the first time I saw <em>Tesco</em> was in Thailand, where it was coded as <em>fancy</em>.</p>
<p>TBH the interiors don’t look that different to me, the prices don’t either, and they all have the same trashy gossip magazines at the checkout. Everything is expensive everywhere. Tesco seems to avoid stocking dark chocolate or any seasonings with even a hint of chilli heat, except in bulk family-sized packs marketed to South Asian shoppers; so there’s some ethnic/cosmopolitan segmentation too, I guess. Waitrose, seems to have more “British-grown” produce than the others, so I guess <em>local</em> food is a class privilege? I’m curious whether this is specifically a London thing; maybe local stores in the countryside are heaving with local produce, and it’s only those London folks flying their berries in from Morocco.</p>
<p>Below those local brands, <em>Aldi</em> and <em>Lidl</em> seem generally “cheap”-coded, but with the cost-of-living crisis even people who look rich seem to have Aldi groceries at home.</p>
<p>Also, department stores still seem big here, or at least culturally salient; I’m less sure what their actual turnover is. And they’re heavily class-coded too. <em>More</em> heavily class-coded? <em>Harrods</em> is old-school luxury—tourist heaven, chandeliers and caviar counters. <em>Selfridges</em> is modern luxury, more about design and art. <em>M&amp;S</em> is also in this category, again playing its middle-class role: safe, familiar, mostly not flashy.</p>
<p>AFAICT, people don’t go to department stores at all if they’re lower-class-coded; instead they get their stuff at <a href="https://www.argos.co.uk/?ref=danmackinlay.name">Argos</a>, I guess? I cannot work out the point of Argos. It’s supposed to be no-frills essentials in a catalogue-store format. Everything I tried to get there was cheaper and more convenient from amazon.</p>
<p>The bakery coding is similar (Gail’s is middle-class, Greggs is working-class, Pret and Paul are in between).<sup>1</sup> This is… I guess, more familiar to me from Australia, where people also invest in bakery-based social signalling.</p>
<ul>
<li><a href="https://www.reddit.com/r/AskUK/comments/inm6lv/what_are_the_stereotypes_and_actual_differences/?ref=danmackinlay.name">Reddit: UK supermarket stereotypes</a></li>
<li><a href="https://www.youtube.com/watch?v=RObCiwvVTBU&amp;ref=danmackinlay.name">British Supermarkets Explained</a> (video)</li>
<li><a href="https://www.huffpost.com/entry/which-is-the-most-middle-class-supermarket_b_5981523de4b09d231a51828c?ref=danmackinlay.name">HuffPost on middle-class supermarkets</a> (many more supermarkets ranked in terms of political and income demographics)</li>
</ul>
</section>
<section id="arts-and-music-and-all-that" class="level3" data-number="4.2">
<h3 data-number="4.2" class="anchored" data-anchor-id="arts-and-music-and-all-that"><span class="header-section-number">4.2</span> Arts and music and all that</h3>
<p>Is London cool? Is it a cultural capital? What does that even mean? I’m not sure, but people have opinions.</p>
<p>TODO: write about arts scene.</p>
<ul>
<li><p><a href="https://www.suttontrust.com/news-opinion/all-news-opinion/research-reveals-stark-class-inequalities-in-access-to-the-creative-industries/?ref=danmackinlay.name">Research reveals stark class inequalities in access to the creative industries - The Sutton Trust</a></p></li>
<li><p><a href="https://faroutmagazine.co.uk/the-middle-class-takeover-music-is-less-of-a-meritocracy-than-ever-before/?ref=danmackinlay.name">Exposing the huge class divide in the music industry</a></p></li>
<li><p><a href="https://www.youthmusic.org.uk/news/lets-talk-about-class-ceiling-music?ref=danmackinlay.name">Let’s Talk About the Class Ceiling in Music | Youth Music</a></p></li>
<li><p><a href="https://web.archive.org/web/20151120035637/http://www.telegraph.co.uk/men/thinking-man/why-this-shoreditchification-of-london-must-stop/?ref=danmackinlay.name">Why this ‘Shoreditchification’ of London must stop</a></p></li>
<li><p><a href="https://web.archive.org/web/20220526184923/https://www.telegraph.co.uk/men/thinking-man/10744997/Cool-London-is-dead-and-the-rich-kids-are-to-blame.html?ref=danmackinlay.name">‘Cool’ London is dead, and the rich kids are to blame</a></p>
<blockquote class="blockquote">
<p>The future is a clean, dull city populated by clean, dull rich people and clean, dull old people. The future is joyless Michelin starred restaurants and shops selling £3,000 chandeliers.</p>
</blockquote></li>
</ul>
</section>
</section>
<section id="attitudes-to-heating" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="attitudes-to-heating"><span class="header-section-number">5</span> Attitudes to heating</h2>
<p>My God. People here are obsessed with the high cost of their heating. I knew this before I arrived. There are adverts at every Tube station for cheaper energy suppliers. I was ready to be sympathetic to their plight. My sympathy has, er, cooled now that I’ve seen what people around me are trying to heat, and how.</p>
<p>At least in the places I’ve been, buildings have ancient single-pane windows and leaky doors, and these barn-like structures are heated by a constant roar of gas heaters, usually with dumb design choices like putting the radiator just below the window on an exterior wall, which minimizes how much heat the building retains. When the space gets too hot, do they turn down the thermostat? No, they do not. It seems to be completely culturally normal to open windows in winter while the heating is blasting rather than figure out how to use the thermostat controls. Some people will not be happy until the very laws of thermodynamics are repealed.</p>
<p>Update: Apparently I am misinterpreting this. In fact, the windows are open to air places out, not to cool them down. So the cultural weirdness is that people don’t turn the heating off when airing out the space? And they also leave the windows open for long periods of time because their buildings are simultaneously too leaky to heat but not leaky enough to breathe?</p>
<p>ALSO, what is it with the prevalence of <em>gas</em> heating? Even if you think that climate change isn’t a thing, why introduce an extra supply-chain dependency on imports? And why <em>not</em> get electric heat pumps so we can have heating in winter and cooling in summer?</p>
<p>IDK, I think they just aren’t very good at living in the climate they have, no matter how I try to rationalize the specific ways this manifests.</p>
</section>
<section id="bargelyf" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="bargelyf"><span class="header-section-number">6</span> Bargelyf</h2>
<p>So many houseboats and bargehomes on the canals!</p>
<p>In contemporary London, living on a canal boat is less a heritage reenactment and more a housing market adaptation. The <a href="https://www.london.gov.uk/about-us/about-us/london-assembly/london-assembly-publications/moor-or-less-moorings-london%E2%80%99s-waterways?ref=danmackinlay.name">London Assembly’s “Moor or Less” report</a> notes that rising rents and house prices have pushed more people onto the water, estimating up to ~10,000 people living across London’s waterways (it cites roughly 100 miles of canals plus 42 miles of the Thames). Fun thing to note: the number of boats rose faster than the supply of moorings and essentials like water points and waste disposal.</p>
<p>The institutional setup is characteristically baroque English legacy weirdness. Much of the network is run by the <a href="https://www.gov.uk/government/publications/canal-and-river-trusts-relationship-with-government/canal-and-river-trusts-relationship-with-government?ref=danmackinlay.name">Canal &amp; River Trust</a>, a charity created in 2012 from <a href="https://canalrivertrust.org.uk/canals-and-rivers/our-history?ref=danmackinlay.name">British Waterways’ assets</a>. To live aboard you need a licence; if you don’t have a lawful “home mooring”, the fallback is “continuous cruising” under <a href="https://www.legislation.gov.uk/ukla/1995/1/section/17/enacted?ref=danmackinlay.name">British Waterways Act 1995, section 17</a>: the Trust says you must be on “bona fide navigation” and (generally) not stay more than 14 days in a given neighbourhood (<a href="https://canalrivertrust.org.uk/boating/license-your-boat/continuous-cruising?ref=danmackinlay.name">CRT guidance</a> in <a href="https://canalrivertrust.org.uk/media/document/seTRsKcjvACQHfdwZAxvgQ/AZJpArmuQjdpU9Me1j_AQZKXSkpiTttn3ZcZGiPnrH4/aHR0cHM6Ly9jcnRwcm9kY21zdWtzMDEuYmxvYi5jb3JlLndpbmRvd3MubmV0L2RvY3VtZW50Lw/0189917c-e4ce-74af-898f-515085c6851b.pdf?ref=danmackinlay.name">a given neighbourhood</a>).</p>
<p>“Permanent” London moorings are scarce and often priced like the kind of scarce urban land rights that boats are supposed to supplement; the <a href="https://www.theguardian.com/cities/2019/jul/29/london-property-crisis-canal-narrowboat-gentrification?ref=danmackinlay.name">Guardian’s 2019 account</a> describes CRT leasing many moorings via auctions and reports mooring costs that can reach eye-watering levels in prime spots. If you’re a continuous cruiser, the bureaucracy treats “needing to stay within commuting distance of work or school” as <a href="https://canalrivertrust.org.uk/media/document/seTRsKcjvACQHfdwZAxvgQ/AZJpArmuQjdpU9Me1j_AQZKXSkpiTttn3ZcZGiPnrH4/aHR0cHM6Ly9jcnRwcm9kY21zdWtzMDEuYmxvYi5jb3JlLndpbmRvd3MubmV0L2RvY3VtZW50Lw/0189917c-e4ce-74af-898f-515085c6851b.pdf?ref=danmackinlay.name">an unacceptable reason to linger</a>, so “moving house every fortnight” sounds onerous. Even though you’re afloat, <a href="https://england.shelter.org.uk/professional_resources/legal/debt/council_tax/chargeable_dwellings?ref=danmackinlay.name">council tax can apply to houseboats as domestic property</a>, by the logic that <a href="https://www.london.gov.uk/about-us/about-us/london-assembly/london-assembly-publications/moor-or-less-moorings-london%E2%80%99s-waterways?ref=danmackinlay.name">houseboat crowding still puts pressure on the council</a>.</p>
<p>They look charming though.</p>
</section>
<section id="london-is-biggggg" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="london-is-biggggg"><span class="header-section-number">7</span> London is biggggg</h2>
<p>Elsewhere discussed: <a href="../notebook/urbanism.html#scaling">Urban scaling laws</a>, which predict the distribution of city sizes—for a given nation-state, how many people are in the biggest city versus the second biggest, etc.</p>
<p>London breaks those laws; it makes up too damn big a chunk of the UK’s population and economic output to fit the usual patterns. The term of art for this is “London behaves like a <em>primate</em> city”: it is so dominant in population and economic output that it sits off the top end of the usual scaling laws that relate city size to indicators like GDP or innovation. When you plot European cities on the standard superlinear urban scaling curves, London (and IIRC its French counterpart, Paris) tends to appear as an outlier “dragon‑king” megacity rather than just the next step up in a smooth hierarchy <span class="citation" data-cites="Arcaute2015Constructing Bettencourt2016Urban">(Arcaute et al. 2015; Bettencourt and Lobo 2016)</span>. Something about being the former capital of a global empire, perhaps?</p>
</section>
<section id="cartography" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="cartography"><span class="header-section-number">8</span> Cartography</h2>
<p>A good city to map, based on how many maps have been made.</p>
<p>Everyone in London speaks in postcodes. “I live in NW3—can we get coffee there?” is a thing we could say. Notably, the print shops I mentioned above have postcodes listed. There are many guides to decoding the postcodes, but here is the one I used: <a href="https://londoninreallife.com/living-in-london/london-postcode/?ref=danmackinlay.name#how-to-read-a-london-postcode">Decoding London Postcodes, The Easy Way</a>. <strong>tl;dr</strong>: NW9 is northwest of the middle and farther away from that middle than NW1. We can guess most of the rest.</p>
<p>There is of course a cool history; the modern postcode grew out of an older <a href="https://en.wikipedia.org/wiki/London_postal_district?ref=danmackinlay.name">postal district</a> system. Of course, it <a href="https://en.wikipedia.org/wiki/London_postal_district?ref=danmackinlay.name#Relationship_to_London_boundary">totally clashes with other administrative units</a>.</p>
<ul>
<li><a href="https://irismurdoch.info/map?ref=danmackinlay.name">Iris Murdoch’s London</a> (i.e.&nbsp;from her books) has been mapped. Much Soho wow.</li>
<li><a href="https://www.urbangood.org/collections/folded-maps?ref=danmackinlay.name">Folded maps by Urban Good</a> Paper maps! of urban nature and footways and such! Made by a lovely chap I met over haggis, Charlie Peel.</li>
<li>Of course I should mention Beck’s <a href="https://www.ltmuseum.co.uk/collections/stories/design/mapping-london-iconic-tube-map?ref=danmackinlay.name">iconic Tube map</a></li>
<li><a href="https://laurenleek.eu/food-map?ref=danmackinlay.name">Lauren Leek’s map of underrated eateries</a></li>
<li><a href="https://knowwhereconsulting.co.uk/maps/london-inequality/?ref=danmackinlay.name">London Inequality Explorer</a></li>
<li>Relatedly, <a href="https://laurenleek.eu/latte_line_map?ref=danmackinlay.name">Lauren Leek’s Latte Line map</a>, with <a href="https://laurenleek.substack.com/p/londons-divide-was-called-character?ref=danmackinlay.name">Political economy back story</a></li>
<li><a href="https://www.londonmaxxxing.com/?ref=danmackinlay.name">londonmaxxxing</a>, the london tech “heat” map</li>
</ul>
</section>
<section id="sexy-queer-london" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="sexy-queer-london"><span class="header-section-number">9</span> Sexy, queer London</h2>
<ul>
<li>Of course I should have mentioned Damien Frost’s exquisite documentation of the <a href="https://damienfrost.com/Photography/Nightflowers?ref=danmackinlay.name">Night Flowers</a> <span class="citation" data-cites="Frost2016Night">(Frost 2016)</span></li>
<li><a href="https://thewaxapp.com/?ref=danmackinlay.name">WAX</a> feels very London: a sex‑positive events empire that built its own app, launched it with a big multi‑brand party at Heaven in 2023, and iterated it into WAX/WeAreX— a hybrid dating‑and‑events platform for kink‑ and queer‑friendly, sexy-time communities that treats London’s nightlife as its home turf while steadily scaling outward. Includes adorably local features such as integrating with the National Health Service STI tests. Looks like excellent <a href="../notebook/community.html#designing-for-community">community design</a> for, like, bangs. As such, I’m calling this a distinctive local <a href="../notebook/sexual_institutions.html">sexy institution</a>.</li>
<li><a href="https://wellcome.org/press-release/%E2%80%98-institute-sexology-opens-its-doors-wellcome-collection?ref=danmackinlay.name">The Institute of Sexology</a> is a literal sexual institution, at the <a href="https://wellcomecollection.org/collections?ref=danmackinlay.name">Wellcome Collection</a>. Damn, I should go.</li>
</ul>
</section>
<section id="london-fiction" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="london-fiction"><span class="header-section-number">10</span> London fiction</h2>
<ul>
<li><a href="https://www.fallenlondon.com/login?ref=danmackinlay.name">Fallen London</a> “Forty years ago, London was stolen by bats.” —Local interactive gothic horror comedy</li>
</ul>
</section>
<section id="material-goods" class="level2" data-number="11">
<h2 data-number="11" class="anchored" data-anchor-id="material-goods"><span class="header-section-number">11</span> Material goods</h2>
<ul>
<li><a href="https://www.freecycle.org/town/MuseumUK?ref=danmackinlay.name">Freecycle: Museum Freecycle UK Group</a>.</li>
<li>UK fashion market <a href="https://www.vinted.co.uk/?ref=danmackinlay.name">Vinted</a> is the best I have seen so far. Not “good” in the sense of “this website is well-designed and easy to use”. No, it’s a total retrograde piece of shit. But the market is good despite that, because 80 million British party animals are flogging their glad rags on there.</li>
</ul>
</section>
<section id="coffee" class="level2" data-number="12">
<h2 data-number="12" class="anchored" data-anchor-id="coffee"><span class="header-section-number">12</span> Coffee</h2>
<p>Survivable, albeit in a grim joyless kind of way where we are either drinking burned coffee pod sludge, or eternally questing for the 1 in 20 cafés that can hire baristas worthy of the name.</p>
</section>
<section id="references" class="level2" data-number="13">
<h2 data-number="13" class="anchored" data-anchor-id="references"><span class="header-section-number">13</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Arcaute2015Constructing" class="csl-entry">
Arcaute, Hatna, Ferguson, et al. 2015. <span>“<a href="https://doi.org/10.1098/rsif.2014.0745">Constructing Cities, Deconstructing Scaling Laws</a>.”</span> <em>Journal of the Royal Society Interface</em>.
</div>
<div id="ref-Bettencourt2016Urban" class="csl-entry">
Bettencourt, and Lobo. 2016. <span>“<a href="https://doi.org/10.1098/rsif.2016.0005">Urban Scaling in Europe</a>.”</span> <em>Journal of the Royal Society Interface</em>.
</div>
<div id="ref-Frost2016Night" class="csl-entry">
Frost. 2016. <em>Night Flowers: from avant-drag to extreme haute-couture by Frost Damien</em>.
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>I will go on record saying that Gail’s has the best chocolate babka, like, anywhere.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>Europe</category>
  <category>place</category>
  <guid>https://danmackinlay.name/notebook/london.html</guid>
  <pubDate>Sun, 04 Jan 2026 12:26:50 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/londons_burning_RP-P-OB-82.017.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Causally embedded agency</title>
  <link>https://danmackinlay.name/notebook/causally_embedded_agency.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-bronze-buddha" class="figure illustration left quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-bronze-buddha-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/bronze_buddha.webp" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/bronze_buddha.webp" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-bronze-buddha-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>When people talk about <a href="../notebook/embodiment.html">embodiment</a>, they’re questioning whether the body is a necessary part of the mind. When they ask about <a href="../notebook/stochastic_parrotology.html">stochastic parrotology</a>, they’re wondering whether interacting with the world is a necessary part of agency.</p>
<p>I suspect both of these frustratingly vague families of questions can be made more precise by considering the idea of <em>causal embedding</em>.</p>
<p>Maybe we could also better understand <a href="../notebook/intrinsic_motivation.html">empowerment</a> and <a href="../notebook/ecology_of_mind.html">ecology of mind</a> by using this framing? Also, perhaps agency is something more useful and interesting than that <a href="../notebook/free_will.html">free will</a> question philosophers get exercised about.</p>
<p>Let’s see. Formalisms to come.</p>
<p>Probably related, in some unnecessarily convoluted way: <a href="../notebook/agency_embedded.html">Embedded agency</a>.</p>
<section id="references" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="references"><span class="header-section-number">1</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Bertschinger2008Autonomy" class="csl-entry">
Bertschinger, Olbrich, Ay, et al. 2008. <span>“<a href="https://doi.org/10.1016/j.biosystems.2007.05.018">Autonomy: An Information Theoretic Perspective</a>.”</span> <em>Biosystems</em>.
</div>
<div id="ref-Bruineberg2022Emperors" class="csl-entry">
Bruineberg, Dołęga, Dewhurst, et al. 2022. <span>“<a href="https://doi.org/10.1017/S0140525X21002351">The Emperor’s New Markov Blankets</a>.”</span> <em>Behavioral and Brain Sciences</em>.
</div>
<div id="ref-DaCosta2021Bayesian" class="csl-entry">
Da Costa, Friston, Heins, et al. 2021. <span>“<a href="http://arxiv.org/abs/2106.13830">Bayesian Mechanics for Stationary Processes</a>.”</span> <em>arXiv:2106.13830 [Math-Ph, Physics:nlin, q-Bio]</em>.
</div>
<div id="ref-Demski2020Embedded" class="csl-entry">
Demski, and Garrabrant. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.1902.09469">Embedded Agency</a>.”</span>
</div>
<div id="ref-Dobbyn2003Self" class="csl-entry">
Dobbyn, and Stuart. 2003. <span>“<a href="https://doi.org/10.1023/A:1022997315561">The Self as an Embedded Agent</a>.”</span> <em>Minds and Machines</em>.
</div>
<div id="ref-Everitt2021Agent" class="csl-entry">
Everitt, Carey, Langlois, et al. 2021. <span>“<a href="https://doi.org/10.1609/aaai.v35i13.17368">Agent Incentives: A Causal Perspective</a>.”</span> In <em>Proceedings of the AAAI Conference on Artificial Intelligence</em>.
</div>
<div id="ref-Foerster2018Learning" class="csl-entry">
Foerster, Chen, Al-Shedivat, et al. 2018. <span>“<a href="http://arxiv.org/abs/1709.04326">Learning with Opponent-Learning Awareness</a>.”</span> In <em>Proceedings of the 17th International Conference on Autonomous Agents and MultiAgent Systems</em>. AAMAS ’18.
</div>
<div id="ref-Hafner2022Action" class="csl-entry">
Hafner, Ortega, Ba, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2009.01791">Action and Perception as Divergence Minimization</a>.”</span>
</div>
<div id="ref-Hammond2023Reasoning" class="csl-entry">
Hammond, Fox, Everitt, et al. 2023. <span>“<a href="https://doi.org/10.1016/j.artint.2023.103919">Reasoning about Causality in Games</a>.”</span> <em>Artificial Intelligence</em>.
</div>
<div id="ref-Herrmann2023Naturalizing" class="csl-entry">
Herrmann, Daniel Alexander. 2023. <span>“<a href="https://escholarship.org/uc/item/7x9890zn">Naturalizing Decision Theory</a>.”</span>
</div>
<div id="ref-Herrmann2026Bayesian" class="csl-entry">
Herrmann, Daniel A, Mohseni, Levinstein, et al. 2026. <span>“A Bayesian Reduction of Causation.”</span>
</div>
<div id="ref-Hewson2024We" class="csl-entry">
Hewson. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2411.04126">We Urgently Need Intrinsically Kind Machines</a>.”</span>
</div>
<div id="ref-Kirchhoff2018Markov" class="csl-entry">
Kirchhoff, Parr, Palacios, et al. 2018. <span>“<a href="https://doi.org/10.1098/rsif.2017.0792">The Markov Blankets of Life: Autonomy, Active Inference and the Free Energy Principle</a>.”</span> <em>Journal of The Royal Society Interface</em>.
</div>
<div id="ref-Lewandowski2025World" class="csl-entry">
Lewandowski, Ramesh, Meyer, et al. 2025. <span>“<a href="https://openreview.net/forum?id=gJclyLFSdU">The World Is Bigger: A Computationally-Embedded Perspective on the Big World Hypothesis</a>.”</span> In.
</div>
<div id="ref-Lowe2025FullStack" class="csl-entry">
Lowe, Edelman, Zhi-Xuan, et al. 2025. <span>“<a href="https://openreview.net/forum?id=SiE7WpC0eC">Full-Stack Alignment: Co-Aligning AI and Institutions with Thicker Models of Value</a>.”</span> In.
</div>
<div id="ref-Meulemans2025Embedded" class="csl-entry">
Meulemans, Nasser, Wołczyk, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2511.22226">Embedded Universal Predictive Intelligence: A Coherent Framework for Multi-Agent Learning</a>.”</span>
</div>
<div id="ref-Ortega2013Thermodynamics" class="csl-entry">
Ortega, and Braun. 2013. <span>“<a href="https://doi.org/10.1098/rspa.2012.0683">Thermodynamics as a Theory of Decision-Making with Information-Processing Costs</a>.”</span> <em>Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences</em>.
</div>
<div id="ref-Pang2026Markovian" class="csl-entry">
Pang. 2026. <span>“On the Markovian Dynamics of Computational Systems.”</span>
</div>
<div id="ref-Virgo2025Good" class="csl-entry">
Virgo, Biehl, Baltieri, et al. 2025. <span>“<a href="https://doi.org/10.1162/ISAL.a.874">A “Good Regulator Theorem” for Embodied Agents</a>.”</span> In.
</div>
<div id="ref-Virgo2021Interpreting" class="csl-entry">
Virgo, Biehl, and McGregor. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2112.13523">Interpreting Dynamical Systems as Bayesian Reasoners</a>.”</span>
</div>
<div id="ref-Wolpert2023Stochastic" class="csl-entry">
Wolpert, and Kinney. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2209.00543">Stochastic Mathematical Systems</a>.”</span>
</div>
<div id="ref-Wolpert2024Stochastic" class="csl-entry">
———. 2024. <span>“<a href="https://doi.org/10.1007/s10701-024-00755-9">A Stochastic Model of Mathematics and Science</a>.”</span> <em>Foundations of Physics</em>.
</div>
<div id="ref-Wyeth2025Formalizing" class="csl-entry">
Wyeth, and Hutter. 2025. <span>“<a href="https://openreview.net/forum?id=tlkYPU3FlX">Formalizing Embeddedness Failures in Universal Artificial Intelligence</a>.”</span> In.
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>causality</category>
  <category>cooperation</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>graphical models</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>networks</category>
  <category>social graph</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/causally_embedded_agency.html</guid>
  <pubDate>Mon, 22 Dec 2025 22:26:20 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/bronze_buddha.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>AI evals</title>
  <link>https://danmackinlay.name/notebook/ai_evals.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>A cousin of <a href="../notebook/ml_benchmarks.html">ML benchmarks</a>.</p>
<div id="fig-kitteh-domino-sm" class="figure illustration full quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-kitteh-domino-sm-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/kitteh_domino_sm_RP-P-OB-70.151.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/kitteh_domino_sm_RP-P-OB-70.151.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-kitteh-domino-sm-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>At the <a href="https://evalevalai.com/2024workshop/?ref=danmackinlay.name">Evaluating evals workshop at NeurIPS 2024</a>, I decided I needed to understand the distinction between “benchmarks” and “evals” in ML/AI.</p>
<p><a href="../notebook/ml_benchmarks.html">Benchmarks</a> are standardized tests used to compare AI models on common tasks, while evals, as far as I can tell, are broader, often custom, evaluations used to judge whether a model is good enough for a particular use case or deployment context.</p>
<p>That is to say, benchmarks in ML/AI are fixed datasets and protocols meant to give “apples-to-apples” scores across models or model variants (e.g., MMLU, GSM8K, TruthfulQA for LLMs). They emphasize comparability and repeatability: same inputs, same metrics, so we can rank or track progress over time and publish leaderboards or marketing claims like “X% on benchmark Y.” Conceptually, benchmarks mostly answer “What can this model do in general, relative to others?” rather than “Is it good enough for my specific workflow?”​</p>
<p>“Evals” (evaluations) are a broader category that focuses on how a system performs for a concrete task, product, or risk profile. In contemporary LLM practice, evals are often application-specific suites (e.g., for a customer-support bot, legal RAG system, or internal agent) that may mix automated metrics, human judgements, and logs from real users. They tend to be iterative and operational, used for error analysis, regression testing, safety checks, and release gating, rather than just for external comparison.</p>
<p>Benchmarks are typically public, static, and model-centric, while evals are often private, dynamic, and product- or context-centric (e.g., built from our own user data and goals). In practice, there is overlap—internal eval suites can double as “benchmarks” for marketing, and published benchmarks can be part of an eval pipeline—but the intent differs: comparison vs decision-making for a specific deployment.</p>
<p>More recently, a <a href="https://evalevalai.com/?ref=danmackinlay.name">school of evals called EvalEval</a> has arisen. EvalEval is a research coalition focused on meta-evaluation: understanding how benchmarks behave over time, how to design better evaluations, and how to document and standardize them (e.g., “evaluation cards,” harness tutorials). Their “evals” are not ad hoc; they’re systematically designed, documented, and scientifically grounded studies of AI systems’ capabilities, risks, and broader societal impacts. They claim to be more like classical science than the <a href="../notebook/ml_benchmarks.html#hps-benchmarks">benchmark world science</a>: their approach treats AI models and their evaluations as observable phenomena that can be studied in their own right, and which we analyse via RCTs, standard experimental methods, and statistical techniques, as I learned at <a href="../post/neurips2025.html#eval-eval-workshop">NeurIPS 2025</a>.</p>
<p>EvalEval also explicitly targets “broader impact evaluations” and decision-makers, meaning assessments of downstream risks, opportunities, and externalities, not just accuracy or utility for a single product. That adds a policy and governance dimension that goes beyond the earlier framing of evals as primarily for model and feature decisions within a single organization.</p>
<p>I am happy with this framing.</p>
<section id="statistical-methods-for-evaluating-ai-systems" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="statistical-methods-for-evaluating-ai-systems"><span class="header-section-number">1</span> Statistical methods for evaluating AI systems</h2>
<p>Historically, we’ve done this remarkably poorly. Many published works notoriously ignore construct validity, randomized controlled trials, statistical power, multiple comparisons, and other basic tenets of experimental design and analysis. Many have written on this theme; see e.g. <span class="citation" data-cites="Biderman2024Lessons Eriksson2025Can Gevers2025Benchmarks Salaudeen2025Measurement">(Biderman et al. 2024; Eriksson et al. 2025; Gevers et al. 2025; Salaudeen et al. 2025)</span>.</p>
<ul>
<li><a href="https://betterbench.stanford.edu/?ref=danmackinlay.name">BetterBench | Assessing AI Benchmarks, Uncovering Issues, and Establishing Best Practices</a> <span class="citation" data-cites="Reuel2024BetterBench">(Reuel et al. 2024)</span></li>
<li><a href="https://github.com/mo-arvan/chatbot-arena-analysis?ref=danmackinlay.name">mo-arvan/chatbot-arena-analysis</a></li>
</ul>
</section>
<section id="inspect" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="inspect"><span class="header-section-number">2</span> Inspect</h2>
<p>A neat software framework from the UK AISI for evaluating LLMs and other AI systems.</p>
<ul>
<li><a href="https://inspect.aisi.org.uk/?ref=danmackinlay.name">Inspect</a></li>
<li><a href="https://github.com/UKGovernmentBEIS/inspect_ai?ref=danmackinlay.name">UKGovernmentBEIS/inspect_ai: Inspect: A framework for large language model evaluations</a></li>
</ul>
<blockquote class="blockquote">
<p>Inspect can be used for a broad range of evaluations that measure coding, agentic tasks, reasoning, knowledge, behavior, and multi-modal understanding. Core features of Inspect include:</p>
</blockquote>
</section>
<section id="incoming" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="incoming"><span class="header-section-number">3</span> Incoming</h2>
<p><a href="https://wandb.ai/onlineinference/genai-research/reports/Exploring-LLM-evaluations-and-benchmarking--VmlldzoxMzk0OTI0OA?ref=danmackinlay.name">Exploring LLM evaluations and benchmarking | genai-research – Weights &amp; Biases</a></p>
</section>
<section id="references" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="references"><span class="header-section-number">4</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Biderman2023Pythia" class="csl-entry">
Biderman, Schoelkopf, Anthony, et al. 2023. <span>“<a href="https://proceedings.mlr.press/v202/biderman23a.html">Pythia: A Suite for Analyzing Large Language Models Across Training and Scaling</a>.”</span> In <em>Proceedings of the 40th International Conference on Machine Learning</em>.
</div>
<div id="ref-Biderman2024Lessons" class="csl-entry">
Biderman, Schoelkopf, Sutawika, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2405.14782">Lessons from the Trenches on Reproducible Evaluation of Language Models</a>.”</span>
</div>
<div id="ref-Burden2024Evaluating" class="csl-entry">
Burden. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2407.09221">Evaluating AI Evaluation: Perils and Prospects</a>.”</span>
</div>
<div id="ref-Chen2025Causal" class="csl-entry">
Chen, Sun, and Du. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2509.12981">Causal Discovery via Quantile Partial Effect</a>.”</span>
</div>
<div id="ref-Eriksson2025Can" class="csl-entry">
Eriksson, Purificato, Noroozian, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2502.06559">Can We Trust AI Benchmarks? An Interdisciplinary Review of Current Issues in AI Evaluation</a>.”</span>
</div>
<div id="ref-Gevers2025Benchmarks" class="csl-entry">
Gevers, De Marez, Van Nooten, et al. 2025. <span>“<a href="https://doi.org/10.18653/v1/2025.emnlp-main.1208">In Benchmarks We Trust … Or Not?</a>”</span> In <em>Proceedings of the 2025 Conference on Empirical Methods in Natural Language Processing</em>.
</div>
<div id="ref-Lee2025CheckEval" class="csl-entry">
Lee, Kim, Kim, et al. 2025. <span>“<a href="https://doi.org/10.18653/v1/2025.emnlp-main.796">CheckEval: A Reliable LLM-as-a-Judge Framework for Evaluating Text Generation Using Checklists</a>.”</span> In <em>Proceedings of the 2025 Conference on Empirical Methods in Natural Language Processing</em>.
</div>
<div id="ref-Lesci2024Causal" class="csl-entry">
Lesci, Meister, Hofmann, et al. 2024. <span>“<a href="https://doi.org/10.18653/v1/2024.acl-long.834">Causal Estimation of Memorisation Profiles</a>.”</span> In <em>Proceedings of the 62nd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)</em>.
</div>
<div id="ref-Li2025Evaluating" class="csl-entry">
Li, Dou, Shao, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2506.22316">Evaluating Scoring Bias in LLM-as-a-Judge</a>.”</span>
</div>
<div id="ref-Luettgau2025HiBayES" class="csl-entry">
Luettgau, Coppock, Dubois, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2505.05602">HiBayES: A Hierarchical Bayesian Modeling Framework for AI Evaluation Statistics</a>.”</span>
</div>
<div id="ref-Reuel2024BetterBench" class="csl-entry">
Reuel, Hardy, Smith, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2411.12990">BetterBench: Assessing AI Benchmarks, Uncovering Issues, and Establishing Best Practices</a>.”</span>
</div>
<div id="ref-Salaudeen2025Measurement" class="csl-entry">
Salaudeen, Reuel, Ahmed, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2505.10573">Measurement to Meaning: A Validity-Centered Framework for AI Evaluation</a>.”</span>
</div>
<div id="ref-Sturgeon2025HumanAgencyBench" class="csl-entry">
Sturgeon, Samuelson, Hyams, et al. 2025. <span>“<a href="https://drive.google.com/file/d/1uewIN57VyaBjWFwPlSEUExc7IIUEhppp/view?pli=1">HumanAgencyBench: Do Language Models Support Human Agency?</a>”</span> In.
</div>
<div id="ref-Viswanathan2025Checklists" class="csl-entry">
Viswanathan, Sun, Ma, et al. 2025. <span>“Checklists Are Better Than Reward Models For Aligning Language Models.”</span> In.
</div>
<div id="ref-Wal2024PolyPythias" class="csl-entry">
Wal, Lesci, Müller-Eberstein, et al. 2024. <span>“<a href="https://openreview.net/forum?id=bmrYu2Ekdz">PolyPythias: Stability and Outliers Across Fifty Language Model Pre-Training Runs</a>.”</span> In.
</div>
<div id="ref-Zhou2025Flattening" class="csl-entry">
Zhou, and Kao. 2025. <span>“<a href="https://openreview.net/forum?id=KaD2Dw8Ahz">Flattening Hierarchies with Policy Bootstrapping</a>.”</span> In.
</div>
</div>


</section>

 ]]></description>
  <category>economics</category>
  <category>game theory</category>
  <category>how do science</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>machine learning</category>
  <category>neural nets</category>
  <category>statistics</category>
  <guid>https://danmackinlay.name/notebook/ai_evals.html</guid>
  <pubDate>Tue, 09 Dec 2025 05:14:15 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/kitteh_domino_sm_RP-P-OB-70.151.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Imprecise Bayesianism</title>
  <link>https://danmackinlay.name/notebook/bayes_imprecise.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-unicorn" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-unicorn-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/unicorn.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/unicorn.png" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-unicorn-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>In <a href="../notebook/bayes_misspecified.html">M-open Bayesian inference</a>, we accept that our models are simplifications that don’t contain the true data-generating process, which leads to problems with standard Bayesian updating.</p>
<p>What alternative foundations or extensions of Bayesianism can better handle model misspecification?</p>
<section id="maximin-updates-over-set-priors" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="maximin-updates-over-set-priors"><span class="header-section-number">1</span> Maximin updates over set priors</h2>
<p>As far as I know, this is the classic approach. Informally: we have a <em>set</em> of prior distributions representing our beliefs. When we see data, we update each prior using Bayes’ rule to get a set of posteriors. When making decisions, we consider the worst-case expected utility across all posteriors in this set and choose the action that maximizes this worst-case utility.</p>
<p>Easy to say, but I haven’t really used this myself and suspect it’s annoying in practice <span class="citation" data-cites="Camerer1992Recent DeBock2020Archimedean Giustinelli2021Precise Hayashi2021Collective Walley1991Statistical">(Camerer and Weber 1992; De Bock 2020; Giustinelli, Manski, and Molinari 2021; Hayashi 2021; Walley 1991)</span>.</p>
</section>
<section id="pac-bayes-methods" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="pac-bayes-methods"><span class="header-section-number">2</span> PAC-Bayes methods</h2>
<p>There’s a large body of work on this; I’m not an expert <span class="citation" data-cites="Catoni2007PACBayesian Haddouche2022Online Rivasplata2020PACBayes RodriguezGalvez2024More Sucker2023PACBayesian Thiemann2017Strongly">(Catoni 2007; Haddouche and Guedj 2022; Rivasplata et al. 2020; Rodríguez-Gálvez, Thobaben, and Skoglund 2024; Sucker and Ochs 2023; Thiemann et al. 2017)</span>.</p>
<p>PAC-Bayes (Probably Approximately Correct Bayesian) methods offer a theoretically grounded way to aggregate misspecified models in the M-open setting, giving high-probability generalization bounds without assuming realizability. They originate from <span class="citation" data-cites="McAllester1998PACBayesian McAllester1999PACBayesian">(McAllester 1998, 1999)</span> and were sharpened by <span class="citation" data-cites="Catoni2007PACBayesian">Catoni (2007)</span>. The bounds control the expected risk of a posterior over hypotheses via the KL divergence to a prior, so we can, in principle, do robust model selection or ensembling even when the true data-generating process lies outside the model class <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BM%7D">.</p>
<p>I’m unclear whether all stacking bounds are in fact of PAC-Bayes type.</p>
<p>PAC-Bayes seems to justify techniques like stacking by quantifying how well a data-dependent posterior generalizes: for concreteness, Catoni’s bound states that for bounded losses <img src="https://latex.codecogs.com/png.latex?%5Cell">, <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BE%7D_%7BQ%7D%5B%5Cmathrm%7Brisk%7D(h)%5D%20%5Cleq%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum%20%5Cell(h(x_i),%20y_i)%20+%20%5Csqrt%7B%5Cfrac%7B%5Cmathrm%7BKL%7D(Q%5C%7CP)%20+%20%5Clog(2n/%5Cdelta)%7D%7B2n%7D%7D,"> with probability <img src="https://latex.codecogs.com/png.latex?1-%5Cdelta"> over data of size <img src="https://latex.codecogs.com/png.latex?n">, prior <img src="https://latex.codecogs.com/png.latex?P">, and posterior <img src="https://latex.codecogs.com/png.latex?Q">. This sidesteps M-closed assumptions in some sense, but don’t ask me for details.</p>
<p>Tools like <code>paccube</code> or <code>pacbayes.py</code> implement optimization of these bounds for neural nets and beyond.</p>
</section>
<section id="infrabayesianism" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="infrabayesianism"><span class="header-section-number">3</span> Infrabayesianism</h2>
<p><a href="https://www.alignmentforum.org/posts/Zi7nmuSmBFbQWgFBa/infra-bayesianism-unwrapped?ref=danmackinlay.name">Infrabayesianism</a> — I presume it’s different from standard set-prior approaches, but I don’t really know it well enough to say how.</p>
<p>It starts with the same assumption as M-open Bayes: the true state of the world is likely outside an agent’s hypothesis space. <a href="https://aisafety.info/questions/8365/What-is-Infra-Bayesianism?ref=danmackinlay.name">They argue this</a> to be especially critical for <a href="../notebook/agency_embedded.html">embedded agents</a>—agents that are part of an environment vastly more complex than they are. An AI can’t model every atom in its server room, let alone the universe, so its world model is necessarily incomplete.</p>
<p>I confess I don’t follow that emphasis myself — I also can’t model every atom in anything I study, and I get by without infrabayesian reasoning. I should re-listen to <a href="https://axrp.net/episode/2021/03/10/episode-5-infra-bayesianism-vanessa-kosoy.html?ref=danmackinlay.name">Vanessa Kosoy</a> on this theme. Infrabayesianism is nonetheless motivated as a framework for the future of AI systems that must <a href="https://axrp.net/episode/2021/03/10/episode-5-infra-bayesianism-vanessa-kosoy.html?ref=danmackinlay.name">navigate a world of deep and unavoidable uncertainty</a>.</p>
<p>Where Bayesianism uses a single probability distribution to represent belief, Infrabayesianism uses <em>infradistributions</em>—which are <a href="https://ncatlab.org/nlab/show/infra-Bayesianism?ref=danmackinlay.name">convex sets of probability distributions</a>.</p>
<p>Instead of saying, “The probability of rain is 40%,” an <a href="https://www.lesswrong.com/posts/zB4f7QqKhBHa5b37a/introduction-to-the-infra-bayesianism-sequence?ref=danmackinlay.name">infrabayesian</a> agent might say, “The probability of rain is somewhere between 30% and 60%.” I don’t know how this differs from the above definitions of imprecise probability, which directly capture the agent’s uncertainty and acknowledge the limitations of its model. This allows for more robust reasoning by considering a range of plausible worlds rather than committing to a single, likely-wrong one.</p>
<p>The framework apparently provides update rules and decision-making procedures (like minimax or upper-expectation reasoning) that are philosophically robust, ensuring the agent doesn’t discard useful information and can handle deep uncertainty. I haven’t used any of these in practice yet, so I’ll refrain from offering too much opinion.</p>
</section>
<section id="references" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="references"><span class="header-section-number">4</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Alquier2024Userfriendly" class="csl-entry">
Alquier. 2024. <span>“<a href="https://doi.org/10.1561/2200000100">User-Friendly Introduction to PAC-Bayes Bounds</a>.”</span> <em>Foundations and Trends in Machine Learning</em>.
</div>
<div id="ref-Bissiri2016General" class="csl-entry">
Bissiri, Holmes, and Walker. 2016. <span>“<a href="https://doi.org/10.1111/rssb.12158">A General Framework for Updating Belief Distributions</a>.”</span> <em>Journal of the Royal Statistical Society: Series B (Statistical Methodology)</em>.
</div>
<div id="ref-Camerer1992Recent" class="csl-entry">
Camerer, and Weber. 1992. <span>“<a href="https://doi.org/10.1007/BF00122575">Recent Developments in Modeling Preferences: Uncertainty and Ambiguity</a>.”</span> <em>Journal of Risk and Uncertainty</em>.
</div>
<div id="ref-Catoni2007PACBayesian" class="csl-entry">
Catoni. 2007. <em><a href="http://arxiv.org/abs/0712.0248">PAC-Bayesian Supervised Classification: The Thermodynamics of Statistical Learning</a></em>.
</div>
<div id="ref-Clyde2013Bayesian" class="csl-entry">
Clyde, and Iversen. 2013. <span>“<a href="https://doi.org/10.1093/acprof:oso/9780199695607.003.0024">Bayesian Model Averaging in the M-Open Framework</a>.”</span> In <em>Bayesian Theory and Applications</em>.
</div>
<div id="ref-Cozman2000Credal" class="csl-entry">
Cozman. 2000. <span>“<a href="https://doi.org/10.1016/S0004-3702(00)00029-1">Credal Networks</a>.”</span> <em>Artificial Intelligence</em>.
</div>
<div id="ref-DeBock2020Archimedean" class="csl-entry">
De Bock. 2020. <span>“<a href="https://doi.org/10.1007/978-3-030-50143-3_15">Archimedean Choice Functions</a>.”</span> <em>Information Processing and Management of Uncertainty in Knowledge-Based Systems</em>.
</div>
<div id="ref-Giustinelli2021Precise" class="csl-entry">
Giustinelli, Manski, and Molinari. 2021. <span>“<a href="https://doi.org/10.1093/jeea/jvab023">Precise or Imprecise Probabilities? Evidence from Survey Response Related to Late-Onset Dementia</a>.”</span> <em>Journal of the European Economic Association</em>.
</div>
<div id="ref-Haddouche2022Online" class="csl-entry">
Haddouche, and Guedj. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2206.00024">Online PAC-Bayes Learning</a>.”</span>
</div>
<div id="ref-Hayashi2021Collective" class="csl-entry">
Hayashi. 2021. <span>“<a href="https://doi.org/10.1007/s00355-021-01320-3">Collective Decision Under Ignorance</a>.”</span> <em>Social Choice and Welfare</em>.
</div>
<div id="ref-Jansen2013Robust" class="csl-entry">
Jansen. 2013. <span>“<a href="https://math.leidenuniv.nl/scripties/MasterJansen.pdf">Robust Bayesian Inference Under Model Misspeciﬁcation</a>.”</span>
</div>
<div id="ref-Kelter2021Bayesian" class="csl-entry">
Kelter. 2021. <span>“<a href="https://doi.org/10.1016/j.jmp.2020.102474">Bayesian Model Selection in the M-Open Setting — Approximate Posterior Inference and Subsampling for Efficient Large-Scale Leave-One-Out Cross-Validation via the Difference Estimator</a>.”</span> <em>Journal of Mathematical Psychology</em>.
</div>
<div id="ref-Le2017Bayes" class="csl-entry">
Le, and Clarke. 2017. <span>“<a href="https://doi.org/10.1214/16-BA1023">A Bayes Interpretation of Stacking for M-Complete and M-Open Settings</a>.”</span> <em>Bayesian Analysis</em>.
</div>
<div id="ref-Masegosa2020Learning" class="csl-entry">
Masegosa. 2020. <span>“<a href="http://arxiv.org/abs/1912.08335">Learning Under Model Misspecification: Applications to Variational and Ensemble Methods</a>.”</span> In <em>Proceedings of the 34th International Conference on Neural Information Processing Systems</em>. NIPS’20.
</div>
<div id="ref-McAllester1998PACBayesian" class="csl-entry">
McAllester. 1998. <span>“<a href="https://doi.org/10.1145/279943.279989">Some PAC-Bayesian Theorems</a>.”</span> In <em>Proceedings of the Eleventh Annual Conference on Computational Learning Theory</em>. COLT’ 98.
</div>
<div id="ref-McAllester1999PACBayesian" class="csl-entry">
———. 1999. <span>“<a href="https://doi.org/10.1145/307400.307435">PAC-Bayesian Model Averaging</a>.”</span> In <em>Proceedings of the Twelfth Annual Conference on Computational Learning Theory</em>.
</div>
<div id="ref-Rivasplata2020PACBayes" class="csl-entry">
Rivasplata, Kuzborskij, Szepesvari, et al. 2020. <span>“<a href="http://arxiv.org/abs/2006.13057">PAC-Bayes Analysis Beyond the Usual Bounds</a>.”</span> In <em>Proceedings of the 34th International Conference on Neural Information Processing Systems</em>. NIPS ’20.
</div>
<div id="ref-RodriguezGalvez2024More" class="csl-entry">
Rodríguez-Gálvez, Thobaben, and Skoglund. 2024. <span>“<a href="http://arxiv.org/abs/2306.12214">More PAC-Bayes Bounds: From Bounded Losses, to Losses with General Tail Behaviors, to Anytime Validity</a>.”</span> <em>Journal of Machine Learning Research</em>.
</div>
<div id="ref-Shirvaikar2024General" class="csl-entry">
Shirvaikar, Walker, and Holmes. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2410.17108">A General Framework for Probabilistic Model Uncertainty</a>.”</span>
</div>
<div id="ref-Sucker2023PACBayesian" class="csl-entry">
Sucker, and Ochs. 2023. <span>“<a href="http://arxiv.org/abs/2210.11113">PAC-Bayesian Learning of Optimization Algorithms</a>.”</span> In <em>Proceedings of The 26th International Conference on Artificial Intelligence and Statistics</em>.
</div>
<div id="ref-Thiemann2017Strongly" class="csl-entry">
Thiemann, Igel, Wintenberger, et al. 2017. <span>“<a href="http://arxiv.org/abs/1608.05610">A Strongly Quasiconvex PAC-Bayesian Bound</a>.”</span> In <em>Proceedings of the 28th International Conference on Algorithmic Learning Theory</em>.
</div>
<div id="ref-Walley1991Statistical" class="csl-entry">
Walley. 1991. <em>Statistical Reasoning with Imprecise Probabilities</em>.
</div>
</div>


</section>

 ]]></description>
  <category>Bayes</category>
  <category>how do science</category>
  <category>statistics</category>
  <guid>https://danmackinlay.name/notebook/bayes_imprecise.html</guid>
  <pubDate>Sun, 30 Nov 2025 16:55:31 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/unicorn.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Parsl</title>
  <link>https://danmackinlay.name/notebook/parsl.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-tafeldans" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-tafeldans-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/tafeldans_RP-P-1937-2008.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/tafeldans_RP-P-1937-2008.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-tafeldans-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I recently switched my primary workflow engine from <a href="../notebook/snakemake.html">Snakemake</a> to Parsl (“Parallel Scripting Library”). Parsl isn’t heavily promoted, and it doesn’t have many sexy, hipster design patterns or much graphic design in its online presence. However, it turned out to solve many of my problems.</p>
<ul>
<li>Code is here: <a href="https://github.com/Parsl/parsl?ref=danmackinlay.name">Parsl/parsl</a></li>
<li>Docs are here: <a href="https://parsl.readthedocs.io/en/stable/?ref=danmackinlay.name#">Parsl</a></li>
</ul>
<p>Parsl originated in academia and the high-performance computing community and was motivated by a need for a scalable, flexible way to orchestrate complex scientific workflows while staying in the Python ecosystem. It aims to address the demands of “big data” and the plateau in sequential processing power with a focus on the needs of people in public research institutions, enabling researchers to scale from a laptop to a supercomputer with minimal changes to their code.</p>
<p>Parsl is designed to execute data-oriented workflows in parallel where possible and in serial where needed. Like <a href="../notebook/snakemake.html">Snakemake</a> or <a href="../notebook/build_tools.html">Make</a>, it manages dependencies in a DAG (Directed Acyclic Graph). However, Parsl has better affordances for exploratory methodologies, by virtue of being more <em>dynamic-feeling</em>. While Snakemake requires us to define the entire workflow upfront in a static file, Parsl builds the dependency graph implicitly and dynamically at runtime, entirely within Python.</p>
<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>Snakemake is an amazing <em>build</em> tool for static pipelines on HPC. Buuuuut its rigid structure and custom DSL made it painful for exploratory data science where the parameters or even the next steps of the analysis depend on the results of the previous steps. Parsl has the edge IMO, enabling interactive and adaptive experimentation directly from Python scripts or Jupyter notebooks.</p>
<p>The trade-off is that Parsl requires more explicit management for robust caching (memoization) and file dependency tracking compared to Snakemake’s automatic file-based approach.</p>
</div>
</div>
</div>
<section id="the-api" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="the-api"><span class="header-section-number">1</span> The API</h2>
<p>Snakemake uses its own DSL (Domain-Specific Language) to configure jobs. I hated that. It broke IDE support and linting, was an unnecessary abstraction over Python, and cemented my side-eyed distrust of DSLs.</p>
<p>Parsl avoids that by being pure python.</p>
<p>In Parsl, we define workflows by annotating standard Python functions with decorators. We call these annotated functions “Apps”.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> parsl</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> parsl <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> python_app, bash_app</span>
<span id="cb1-3"></span>
<span id="cb1-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># A Parsl App that executes Python code</span></span>
<span id="cb1-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@python_app</span></span>
<span id="cb1-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> process_data(input_data):</span>
<span id="cb1-7">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... complex processing ...</span></span>
<span id="cb1-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> result</span>
<span id="cb1-9"></span>
<span id="cb1-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># A Parsl App that executes a shell command</span></span>
<span id="cb1-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@bash_app</span></span>
<span id="cb1-12"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> run_simulation(inputs, outputs):</span>
<span id="cb1-13">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"my-simulator --in </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>inputs[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> --out </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>outputs[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span></code></pre></div></div>
<p>When we call a Parsl App, it doesn’t execute immediately. Instead, it returns a <a href="../notebook/python_async.html"><code>Future</code>—an object representing the eventual result of the computation</a>. This is a relatively modern approach in Python and is probably the ‘right’ way to do things.</p>
<p>If we pass the <code>Future</code> returned by one App as an argument to another App, Parsl automatically recognizes the dependency.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Call the first app</span></span>
<span id="cb2-2">future1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> process_data(initial_value)</span>
<span id="cb2-3"></span>
<span id="cb2-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Call the second app, passing the future from the first</span></span>
<span id="cb2-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Parsl knows this task depends on the completion of the first</span></span>
<span id="cb2-6">future2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> process_data(future1)</span>
<span id="cb2-7"></span>
<span id="cb2-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Execution happens asynchronously. We only block when we ask for the result.</span></span>
<span id="cb2-9"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(future2.result())</span></code></pre></div></div>
<p>Parsl constructs the DAG from these implicit data flows. When all inputs (Futures) for a task are ready, Parsl schedules the task on available resources. This pure-Python approach feels intuitive, integrates well with modern development tools, and lets us write complex, dynamic logic that’s impossible in a static DSL.</p>
</section>
<section id="how-cluster-execution-works" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="how-cluster-execution-works"><span class="header-section-number">2</span> How Cluster Execution Works</h2>
<p>The main reason I tolerate workflow managers at all is that they handle the <a href="../notebook/hpc_hell.html">nightmare campus cluster horrors</a>. Parsl has tight integration with batch schedulers like Slurm, PBS, SGE, and HTCondor, as well as with cloud providers and Kubernetes.</p>
<p>In Snakemake, we combine rules (with resource hints) and a separate YAML “profile” to map those hints to scheduler flags.</p>
<p>In Parsl, we handle configuration entirely within the Python script using a <code>Config</code> object. This object defines <em>where</em> and <em>how</em> tasks should run by combining <code>Executors</code> and <code>Providers</code>.</p>
<ol type="1">
<li><strong>Providers</strong>: These handle the interaction with the resource manager (e.g., <code>SlurmProvider</code>). They’re responsible for requesting, scaling, and terminating “blocks” of resources (like N nodes on a cluster).</li>
<li><strong>Executors</strong>: These manage task execution on the resources acquired by a Provider. The <code>HighThroughputExecutor</code> (HTEX) is commonly used for HPC scenarios, efficiently distributing tasks across many workers.</li>
</ol>
<p>Here is a simple example of a configuration for a Slurm cluster:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> parsl <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Config</span>
<span id="cb3-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> parsl.executors <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HighThroughputExecutor</span>
<span id="cb3-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> parsl.providers <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> SlurmProvider</span>
<span id="cb3-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb3-5"></span>
<span id="cb3-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Get dynamic values from the environment</span></span>
<span id="cb3-7">slurm_account <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SLURM_ACCOUNT"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"default_account"</span>)</span>
<span id="cb3-8">partition <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> os.getenv(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"SLURM_PARTITION"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"standard"</span>)</span>
<span id="cb3-9"></span>
<span id="cb3-10">config <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Config(</span>
<span id="cb3-11">    executors<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[</span>
<span id="cb3-12">        HighThroughputExecutor(</span>
<span id="cb3-13">            label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"my_hpc_cluster"</span>,</span>
<span id="cb3-14">            max_workers_per_node<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">48</span>,</span>
<span id="cb3-15">            provider<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>SlurmProvider(</span>
<span id="cb3-16">                account<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>slurm_account,</span>
<span id="cb3-17">                partition<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>partition,</span>
<span id="cb3-18">                nodes_per_block<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Request 10 nodes per Slurm job</span></span>
<span id="cb3-19">                init_blocks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb3-20">                max_blocks<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>,        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Scale up to 5 blocks (50 nodes total)</span></span>
<span id="cb3-21">                walltime<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"02:00:00"</span>,</span>
<span id="cb3-22">                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Optional: Add specific scheduler options</span></span>
<span id="cb3-23">                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># scheduler_options="#SBATCH --gpus-per-node=4"</span></span>
<span id="cb3-24">            ),</span>
<span id="cb3-25">        )</span>
<span id="cb3-26">    ]</span>
<span id="cb3-27">)</span>
<span id="cb3-28"></span>
<span id="cb3-29"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Load the configuration before executing the workflow</span></span>
<span id="cb3-30"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># import parsl</span></span>
<span id="cb3-31"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># parsl.load(config)</span></span></code></pre></div></div>
<p>When the script runs, Parsl uses the <code>SlurmProvider</code> to submit <code>sbatch</code> jobs (the “blocks”). Once those jobs start, the <code>HighThroughputExecutor</code> connects to the allocated nodes and begins distributing the workflow tasks across them.</p>
</section>
<section id="python-configuration" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="python-configuration"><span class="header-section-number">3</span> Python Configuration</h2>
<p>In my experience with Snakemake (especially version 8+), configuring cluster execution was frustrating. Snakemake’s YAML-based executor profiles didn’t let us use environment variables.</p>
<p>This rigidity forced me to hard-code site-specific details, producing a proliferation of near-identical config files and terrible portability. Ultimately, I was generating YAML files programmatically just to work around the limitations.</p>
<p>Parsl’s configuration system is a massive improvement because <em>it’s just Python</em>. See the Parsl example above. We can use <code>os.getenv()</code> to dynamically pull the Slurm account or partition. We can use conditional logic, loops, and functions to construct the configuration object. We can easily integrate it with <a href="../notebook/dotenv.html">automatic config</a> tools.</p>
<p>This flexibility is neat for writing portable workflows. We can define a single script that intelligently adapts to the environment it’s running in, whether that’s a local machine or a different HPC cluster, without the configuration-boilerplate nightmare that plagued my Snakemake setup.</p>
</section>
<section id="local-execution" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="local-execution"><span class="header-section-number">4</span> Local execution</h2>
<p>The oldest local executor is the <a href="https://parsl.readthedocs.io/en/stable/stubs/parsl.executors.ThreadPoolExecutor.html?ref=danmackinlay.name">ThreadPoolExecutor</a>. Threads are almost always more trouble than they’re worth in Python, IMO. If I wanted to spend time debugging non-deterministic segfaults, I’d switch to writing C.</p>
<p>The <a href="https://parsl.readthedocs.io/en/stable/stubs/parsl.executors.HighThroughputExecutor.html?ref=danmackinlay.name">HighThroughputExecutor</a>, however, seems to support multiprocessing backends.</p>
</section>
<section id="providers" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="providers"><span class="header-section-number">5</span> Providers</h2>
<p>Parsl supports various <code>Provider</code>s for public cloud backends (AWS, Google Cloud, Azure) and Kubernetes. Because the workflow logic (the Apps and their dependencies) is completely decoupled from the execution configuration (the <code>Config</code> object), running the same analysis on-prem or in the cloud often just means loading a different configuration object. It probably gets less seamless when I need to manage massive data assets, but I’ve managed to avoid that so far. TBC</p>
</section>
<section id="debugging-parsl-workers" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="debugging-parsl-workers"><span class="header-section-number">6</span> Debugging Parsl workers</h2>
<p>When Parsl tasks fail, the default error reporting is often opaque and unhelpful:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource text number-lines code-with-copy"><code class="sourceCode"><span id="cb4-1">[1/4] ✗ FAILED: tgt_deaf1a769193/hmc/f4567256</span>
<span id="cb4-2">  Error: Dependency failure for task 1. The representative cause is via task 0</span></code></pre></div></div>
<p><strong>What’s happening:</strong></p>
<ul>
<li>Parsl workers run in separate processes (via HTEX)</li>
<li>When a worker crashes, the exception is wrapped in Parsl’s internal classes</li>
<li>The actual Python traceback and error message are hidden inside the wrapper</li>
<li>We only see “Dependency failure” without knowing the root cause</li>
</ul>
<p>This is infuriating.</p>
<ul>
<li>No visibility into what actually went wrong</li>
<li>We can’t distinguish between import errors, type errors, or logic bugs</li>
<li>We have to manually inspect worker log files (if they exist)</li>
<li>Errors propagate through dependency chains, hiding the original failure</li>
</ul>
<p>What follows are some design patterns and code snippets to improve error visibility in Parsl workflows.</p>
<section id="error-extraction-wrapper" class="level3" data-number="6.1">
<h3 data-number="6.1" class="anchored" data-anchor-id="error-extraction-wrapper"><span class="header-section-number">6.1</span> Error Extraction Wrapper</h3>
<p>Add this function to our Parsl workflow file (e.g., <code>parsl_task.py</code>):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> unwrap_parsl_future(future, name: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>):</span>
<span id="cb5-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Extract and surface exceptions from Parsl futures with full diagnostics.</span></span>
<span id="cb5-3"></span>
<span id="cb5-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Args:</span></span>
<span id="cb5-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">        future: Parsl AppFuture to unwrap</span></span>
<span id="cb5-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">        name: Descriptive name for logging (e.g., "build_tgt_abc123")</span></span>
<span id="cb5-7"></span>
<span id="cb5-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Returns:</span></span>
<span id="cb5-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">        Future result if successful</span></span>
<span id="cb5-10"></span>
<span id="cb5-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Raises:</span></span>
<span id="cb5-12"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">        Original exception with enhanced logging of remote stdout/stderr</span></span>
<span id="cb5-13"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb5-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb5-15">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> future.result()</span>
<span id="cb5-16">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">Exception</span> <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb5-17">        <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> traceback</span>
<span id="cb5-18">        log.error(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"[</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">] FAILED in worker:"</span>)</span>
<span id="cb5-19">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">""</span>.join(traceback.format_exception(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span>(e), e, e.__traceback__)))</span>
<span id="cb5-20"></span>
<span id="cb5-21">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Dump remote debug info if available</span></span>
<span id="cb5-22">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">hasattr</span>(e, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'stdout'</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">and</span> e.stdout:</span>
<span id="cb5-23">            log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"---- WORKER STDOUT ----</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, e.stdout)</span>
<span id="cb5-24">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">hasattr</span>(e, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'stderr'</span>) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">and</span> e.stderr:</span>
<span id="cb5-25">            log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"---- WORKER STDERR ----</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, e.stderr)</span>
<span id="cb5-26"></span>
<span id="cb5-27">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Log exception attributes for debugging Parsl wrappers</span></span>
<span id="cb5-28">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Exception type: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span>(e).<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span>)</span>
<span id="cb5-29">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Exception attributes: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dir</span>(e))</span>
<span id="cb5-30"></span>
<span id="cb5-31">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">raise</span></span></code></pre></div></div>
<p>This wrapper function:</p>
<ul>
<li>Catches all exceptions raised by <code>.result()</code> calls</li>
<li>Formats the full traceback (including nested causes via <code>__traceback__</code>)</li>
<li>Extracts remote stdout and stderr if they’re attached to the exception</li>
<li>Logs exception metadata to help debug the wrapper’s behaviour</li>
<li>Re-raises the original exception so the workflow still fails</li>
</ul>
<p>Wrap All <code>Future.result()</code> Calls</p>
<p><strong>Before</strong> (opaque errors):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i, (future, record) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">zip</span>(run_futures, run_records), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):</span>
<span id="cb6-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb6-3">        future.result()  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ❌ Hides worker exceptions</span></span>
<span id="cb6-4">        log.info(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  [</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">] ✓ </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, i, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures), record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb6-5">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">Exception</span> <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb6-6">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  [</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">] ✗ FAILED: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, i, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures), record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb6-7">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    Error: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(e))  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Only sees "Dependency failure"</span></span></code></pre></div></div>
<p><strong>After</strong> (full visibility):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb7-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i, (future, record) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">zip</span>(run_futures, run_records), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):</span>
<span id="cb7-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb7-3">        name <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'target_id'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'sampler'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>]<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb7-4">        unwrap_parsl_future(future, name)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ✅ Extracts full traceback</span></span>
<span id="cb7-5">        log.info(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  [</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">] ✓ </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, i, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures), record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb7-6">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">Exception</span> <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb7-7">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  [</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">] ✗ FAILED: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, i, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures), record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb7-8">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"    Error: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(e))</span></code></pre></div></div>
<p>Now we can see:</p>
<ul>
<li>Exact line number where error occurred (<code>sample_cmd.py:251</code>)</li>
<li>Full Python traceback with nested calls</li>
<li>Actual exception type (<code>TypeError</code>)</li>
<li>Specific error message (“Object of type ArrayImpl is not JSON serializable”)</li>
</ul>
<p>The next few are bonus options that might also be helpful</p>
</section>
<section id="force-worker-logs-to-a-visible-directory" class="level3" data-number="6.2">
<h3 data-number="6.2" class="anchored" data-anchor-id="force-worker-logs-to-a-visible-directory"><span class="header-section-number">6.2</span> Force worker logs to a visible directory</h3>
<p>By default, Parsl workers may write logs to hidden or temp directories. We can force them to a known location:</p>
<p><strong>In Parsl config YAML</strong> (<code>config/parsl/local.yaml</code>):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb8-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">executors</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb8-2"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">local_htex</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb8-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">worker_logdir_root</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> /path/to/artifacts/run_dir/parsl_workers</span></span>
<span id="cb8-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">max_workers</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span></span></code></pre></div></div>
<p><strong>Benefits:</strong></p>
<ul>
<li>All workers’ stdout/stderr in one place</li>
<li>Easier to inspect logs when remote exceptions don’t capture everything</li>
<li>Can <code>tail -f</code> worker logs during execution</li>
</ul>
</section>
<section id="instrument-entry-points" class="level3" data-number="6.3">
<h3 data-number="6.3" class="anchored" data-anchor-id="instrument-entry-points"><span class="header-section-number">6.3</span> Instrument Entry Points</h3>
<p>Add debug logging at the start of the Parsl app entry functions:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb9-1"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@python_app</span></span>
<span id="cb9-2"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> build_target_app(cfg_yaml, target_id, experiment):</span>
<span id="cb9-3">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Build a target via direct command call."""</span></span>
<span id="cb9-4">    <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> logging</span>
<span id="cb9-5">    log <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logging.getLogger(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span>)</span>
<span id="cb9-6"></span>
<span id="cb9-7">    log.info(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"[WORKER START] build_target_app(target_id=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)"</span>, target_id)</span>
<span id="cb9-8"></span>
<span id="cb9-9">    <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> lambda_hat.commands.build_cmd <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> build_entry</span>
<span id="cb9-10">    result <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> build_entry(cfg_yaml, target_id, experiment)</span>
<span id="cb9-11"></span>
<span id="cb9-12">    log.info(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"[WORKER END] build_target_app(target_id=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">)"</span>, target_id)</span>
<span id="cb9-13">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> result</span></code></pre></div></div>
<p><strong>What this catches:</strong></p>
<ul>
<li>Import-time failures (if a worker can’t load modules)</li>
<li>Crashes before any logging happens in the command</li>
<li>Helps distinguish “worker started but crashed” vs “worker never started”</li>
</ul>
</section>
</section>
<section id="parsl-worker-error-zoo" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="parsl-worker-error-zoo"><span class="header-section-number">7</span> Parsl Worker Error Zoo</h2>
<p>I extracted this list of failures from the logs of my recent Parsl runs and had the LLM summarise them.</p>
<section id="error-dependency-failure-for-task-n" class="level3" data-number="7.1">
<h3 data-number="7.1" class="anchored" data-anchor-id="error-dependency-failure-for-task-n"><span class="header-section-number">7.1</span> Error: “Dependency failure for task N”</h3>
<p><strong>Meaning:</strong> This task depends on another task (via <code>inputs=[...]</code>) that failed.</p>
<p><strong>Solution:</strong> 1. Look for earlier task failures in the logs 2. Use <code>unwrap_parsl_future()</code> to inspect the root cause 3. Fix the upstream task, not the dependent one</p>
</section>
<section id="error-modulenotfounderror-in-worker" class="level3" data-number="7.2">
<h3 data-number="7.2" class="anchored" data-anchor-id="error-modulenotfounderror-in-worker"><span class="header-section-number">7.2</span> Error: “ModuleNotFoundError” in worker</h3>
<p><strong>Meaning:</strong> The worker can’t import a required module.</p>
<p><strong>Common causes:</strong></p>
<ul>
<li>Virtual environment not activated in the worker</li>
<li>Missing <code>worker_init</code> entry in executor config</li>
<li>Module installed in a different environment than the worker uses</li>
</ul>
<p><strong>Solution:</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb10-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># config/parsl/local.yaml</span></span>
<span id="cb10-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">executors</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb10-3"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">local_htex</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb10-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">    worker_init</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">: </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">|</span></span>
<span id="cb10-5">      source /path/to/venv/bin/activate</span>
<span id="cb10-6">      export PYTHONPATH=/path/to/project</span></code></pre></div></div>
</section>
<section id="error-pickleerror-cant-pickle-object" class="level3" data-number="7.3">
<h3 data-number="7.3" class="anchored" data-anchor-id="error-pickleerror-cant-pickle-object"><span class="header-section-number">7.3</span> Error: “PickleError: Can’t pickle <code>&lt;object&gt;</code>”</h3>
<p><strong>Meaning:</strong> Parsl can’t serialize the function arguments or return value.</p>
<p><strong>Common culprits:</strong> - Passing file handles, database connections, or threads - Returning non-serializable objects (e.g.&nbsp;JAX arrays can be tricky to serialize)</p>
<p><strong>Solution:</strong> - Pass file paths (strings), not file objects - Convert JAX arrays to numpy before returning: <code>return np.asarray(jax_array)</code> - Use primitives (int, float, str, dict, list) for return values</p>
</section>
<section id="error-worker-crashes-silently" class="level3" data-number="7.4">
<h3 data-number="7.4" class="anchored" data-anchor-id="error-worker-crashes-silently"><span class="header-section-number">7.4</span> Error: Worker crashes silently</h3>
<p><strong>Meaning:</strong> The worker process died without raising a Python exception.</p>
<p><strong>Common causes:</strong> - Out of memory (OOM killer) - Segfault in a C extension (JAX, NumPy, etc.) - Signal received (SIGKILL, timeout)</p>
<p><strong>Solution:</strong> 1. Check <code>worker_logdir_root</code> for stderr files 2. Look for “Killed” messages (OOM) 3. Add memory limits to the executor config 4. Run the task manually outside Parsl to reproduce</p>
</section>
<section id="worker-error-catching-variations" class="level3" data-number="7.5">
<h3 data-number="7.5" class="anchored" data-anchor-id="worker-error-catching-variations"><span class="header-section-number">7.5</span> Worker Error Catching Variations</h3>
<section id="variation-1-accumulate-errors-and-continue" class="level4" data-number="7.5.1">
<h4 data-number="7.5.1" class="anchored" data-anchor-id="variation-1-accumulate-errors-and-continue"><span class="header-section-number">7.5.1</span> Variation 1: Accumulate Errors and Continue</h4>
<p>Instead of failing immediately, we collect errors and report them at the end:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb11-1">failures <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb11-2"></span>
<span id="cb11-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i, (future, record) <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">enumerate</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">zip</span>(run_futures, run_records), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>):</span>
<span id="cb11-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb11-5">        unwrap_parsl_future(future, record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb11-6">        log.info(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  [</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">] ✓ </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, i, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures), record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb11-7">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">Exception</span> <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb11-8">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  [</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">] ✗ FAILED: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, i, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures), record[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>])</span>
<span id="cb11-9">        failures.append({<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'record'</span>: record, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'error'</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(e)})</span>
<span id="cb11-10"></span>
<span id="cb11-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Report all failures at end</span></span>
<span id="cb11-12"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> failures:</span>
<span id="cb11-13">    log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"⚠ FAILURE SUMMARY: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> of </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%d</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> runs failed"</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(failures), <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(run_futures))</span>
<span id="cb11-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> f <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> failures:</span>
<span id="cb11-15">        log.error(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"  • </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">%s</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>, f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'record'</span>][<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'run_id'</span>], f[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'error'</span>])</span></code></pre></div></div>
</section>
<section id="variation-2-retry-failed-tasks" class="level4" data-number="7.5.2">
<h4 data-number="7.5.2" class="anchored" data-anchor-id="variation-2-retry-failed-tasks"><span class="header-section-number">7.5.2</span> Variation 2: Retry Failed Tasks</h4>
<p>Wrap the extraction in retry logic:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb12-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> unwrap_with_retry(future, name: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>, max_retries: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span>):</span>
<span id="cb12-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Extract error and optionally retry on transient failures."""</span></span>
<span id="cb12-3">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> attempt <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(max_retries):</span>
<span id="cb12-4">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb12-5">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> unwrap_parsl_future(future, name)</span>
<span id="cb12-6">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> (<span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">TimeoutError</span>, <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">ConnectionError</span>) <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb12-7">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> attempt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&lt;</span> max_retries <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>:</span>
<span id="cb12-8">                log.warning(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"[</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">] Retry </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>attempt<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">/</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>max_retries<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> after: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>e<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb12-9">                <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">continue</span></span>
<span id="cb12-10">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">raise</span></span></code></pre></div></div>
</section>
<section id="variation-3-extract-to-structured-log" class="level4" data-number="7.5.3">
<h4 data-number="7.5.3" class="anchored" data-anchor-id="variation-3-extract-to-structured-log"><span class="header-section-number">7.5.3</span> Variation 3: Extract to Structured Log</h4>
<p>For machine-readable error tracking, we extract errors to a structured log.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb13-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> json</span>
<span id="cb13-2"></span>
<span id="cb13-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> unwrap_to_json(future, name: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>, output_path: Path):</span>
<span id="cb13-4">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Extract error and write structured JSON for analysis."""</span></span>
<span id="cb13-5">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb13-6">        result <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> future.result()</span>
<span id="cb13-7">        output_path.write_text(json.dumps({</span>
<span id="cb13-8">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'name'</span>: name,</span>
<span id="cb13-9">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'status'</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'success'</span>,</span>
<span id="cb13-10">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'result'</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(result),</span>
<span id="cb13-11">        }))</span>
<span id="cb13-12">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> result</span>
<span id="cb13-13">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">Exception</span> <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb13-14">        <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> traceback</span>
<span id="cb13-15">        output_path.write_text(json.dumps({</span>
<span id="cb13-16">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'name'</span>: name,</span>
<span id="cb13-17">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'status'</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'failed'</span>,</span>
<span id="cb13-18">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'error_type'</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span>(e).<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span>,</span>
<span id="cb13-19">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'error_message'</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>(e),</span>
<span id="cb13-20">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'traceback'</span>: traceback.format_exception(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">type</span>(e), e, e.__traceback__),</span>
<span id="cb13-21">        }, indent<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb13-22">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">raise</span></span></code></pre></div></div>
</section>
</section>
<section id="how-this-all-works" class="level3" data-number="7.6">
<h3 data-number="7.6" class="anchored" data-anchor-id="how-this-all-works"><span class="header-section-number">7.6</span> How this all works</h3>
</section>
<section id="parsls-exception-wrapping-mechanism" class="level3" data-number="7.7">
<h3 data-number="7.7" class="anchored" data-anchor-id="parsls-exception-wrapping-mechanism"><span class="header-section-number">7.7</span> Parsl’s Exception Wrapping Mechanism</h3>
<p>When a Parsl worker raises an exception:</p>
<ol type="1">
<li><strong>Worker process</strong>: Exception occurs in the <code>@python_app</code> function</li>
<li><strong>Parsl serialization</strong>: Exception is pickled and sent back to the main process</li>
<li><strong>Parsl DataFlowKernel</strong>: Wraps the exception in <code>AppException</code> or <code>DependencyError</code></li>
<li><strong>Future.result()</strong>: Re-raises the wrapped exception</li>
</ol>
<p><strong>The problem:</strong> By default, we only see the wrapper (<code>DependencyError</code>), not the original exception.</p>
<p><strong>Our solution:</strong></p>
<ul>
<li>Call <code>.result()</code> to unwrap it</li>
<li>Catch the exception and extract <code>__cause__</code> and <code>__traceback__</code></li>
<li>Format it with <code>traceback.format_exception()</code> to show the full chain</li>
<li>Check for Parsl-specific attributes, like <code>stdout</code> and <code>stderr</code></li>
</ul>
<p>With the future wrapper approach, we recover:</p>
<ul>
<li>✅ Full exception traceback (all nested calls)</li>
<li>✅ Exception message and type</li>
<li>✅ Line numbers in source files</li>
<li>✅ Local variables (in traceback context)</li>
<li>✅ Chained exceptions (<code>__cause__</code>, <code>__context__</code>)</li>
</ul>
<p>We still need to do manual work to extract certain info:</p>
<ul>
<li>❌ Worker’s stdout (unless we configure <code>worker_logdir_root</code>)
<ul>
<li><strong>Fix:</strong> Set <code>worker_logdir_root</code> in the executor config.</li>
</ul></li>
<li>❌ Worker’s stderr (same)
<ul>
<li><strong>Fix:</strong> Same as above.</li>
</ul></li>
<li>❌ Worker’s environment variables
<ul>
<li><strong>Fix:</strong> Log them in the worker entry point.</li>
</ul></li>
<li>❌ Import-time errors (before the function runs)
<ul>
<li><strong>Fix:</strong> Add instrumentation at the start of the function.</li>
</ul></li>
</ul>


</section>
</section>

 ]]></description>
  <category>computers are awful</category>
  <category>computers are awful together</category>
  <category>concurrency hell</category>
  <category>premature optimization</category>
  <category>python</category>
  <guid>https://danmackinlay.name/notebook/parsl.html</guid>
  <pubDate>Mon, 17 Nov 2025 01:43:45 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/tafeldans_RP-P-1937-2008.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Top influences of 2025</title>
  <link>https://danmackinlay.name/post/2025_influences.html</link>
  <description><![CDATA[ 



<div class="audience">
    <h3 class="notification-title anchored">Assumed audience:</h3>
    <p>Laypeople and also nerds like me</p>
</div>




<div class="quarto-title-meta">

    
    </div>





<div id="fig-haag-maypole" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-haag-maypole-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/haag_maypole_RP-P-OB-86.461.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/haag_maypole_RP-P-OB-86.461.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-haag-maypole-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I read a lot this year, as I do every year, but more than ever I used AI tools to help with much of it. Some of it was useful in specialist ways; I don’t expect many people will care about those. Some of it, though, made my life <em>different</em> in a way that might be useful to others, so I’m mentioning it here.</p>
<p>I “agree” entirely with relatively few of these pieces. The criterion for inclusion is that the piece <em>influenced</em> me, not necessarily that it <em>agrees with me</em>. That is to say, this list <em>does</em> constitute an endorsement of quality, but not of the content.</p>
<p>Not all of this was written this year. I don’t read <em>the whole internet</em> the moment it updates.</p>
<section id="conferences-symposia-workshops" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="conferences-symposia-workshops"><span class="header-section-number">1</span> Conferences, symposia, workshops</h2>
<ul>
<li><a href="../post/iliad2.html">ILIAD2</a> was a theoretical alignment unconference that totally shifted my thinking about credible approaches to AI alignment. Among other things, it persuaded me there might be something in <a href="../notebook/singular_learning_theory.html">Singular Learning Theory</a>.</li>
<li><a href="https://post-agi.org?ref=danmackinlay.name">post-agi</a> co-located with <a href="../post/neurips2025.html">NeurIPS</a></li>
<li><a href="../post/neurips2025.html">NeurIPS itself</a></li>
<li><a href="../post/iclr2025.html">ICLR</a></li>
</ul>
</section>
<section id="civic-tech" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="civic-tech"><span class="header-section-number">2</span> Civic tech</h2>
<p><a href="../notebook/civic_tech.html">Digital governance and civic tech</a>, and other notions of what social coordination could or should be in the age of AI</p>
<ul>
<li><a href="https://metagov.substack.com/?ref=danmackinlay.name">Metagov</a></li>
<li><a href="https://blog.cosmos-institute.org/p/coasean-bargaining-at-scale?ref=danmackinlay.name">Coasean Bargaining at Scale - Cosmos Institute</a></li>
<li><a href="https://post-agi.org?ref=danmackinlay.name">post-agi</a> again.</li>
</ul>
<p>I’m spinning up a modest civic tech project at the moment in my home, <a href="../notebook/melbourne.html">Melbourne/Naarm</a>.</p>
</section>
<section id="oh-wow-it-turns-out-that-humancomputer-interaction-is-not-only-real-its-existentially-important" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="oh-wow-it-turns-out-that-humancomputer-interaction-is-not-only-real-its-existentially-important"><span class="header-section-number">3</span> Oh wow — it turns out that Human–Computer Interaction is not only real, it’s existentially important</h2>
<p>I always thought HCI was too soft and pre-paradigmatic to cohere into a real science. And too vague to make useful predictions.</p>
<p>I was wrong. <em>Turns out</em> it’s the discipline that studies the interface between human and machine intelligence, and as such is IMO crucial for our survival. Moreover, it turns out that although the median HCI paper might be a bit <em>meh</em>, the best ones are <em>really</em> good.</p>
<p>You can see what I mean by looking at some of my recent funding proposals, on <a href="../post/proposal_human_reward_hacking.html">human reward tampering</a>, human-AI asymmetries …</p>
<p>I now hold that actually-existing AI only makes sense as a coupled human–AI system, and we need to understand what that system does.</p>
<p>Relatedly…</p>
</section>
<section id="societal-epistemic-health" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="societal-epistemic-health"><span class="header-section-number">4</span> Societal Epistemic Health</h2>
<p>How do we maintain a healthy infosphere in the sense of having good beliefs and avoiding bad beliefs, at societal scale, with ubiquitous deepfakes and LLMs that can generate plausible-sounding bullshit?</p>
<p>Some readings that helped me think about this:</p>
<ul>
<li><a href="https://elevanth.org/blog/2021/06/15/regression-fire-and-dangerous-things-1-3/?ref=danmackinlay.name">Regression, Fire, and Dangerous Things</a></li>
<li><a href="https://capturethenarrative.com/?ref=danmackinlay.name">Capture the Narrative</a></li>
</ul>
</section>
<section id="stochastic-parrotology" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="stochastic-parrotology"><span class="header-section-number">5</span> Stochastic parrotology</h2>
<p>Ornithology of aleatoric psittaciformes. Chineseboxology.</p>
<p>These are abstruse ways I might describe the questions of <a href="../notebook/stochastic_parrotology.html">predictive pretraining versus agency</a>. Can pretraining lead to understanding? Can it lead to agency? Is this “<a href="../notebook/causally_embedded_agency.html">causally embedded learning</a>” framing going to make it all make sense? When?</p>
<ul>
<li><a href="https://deontologistics.co/2025/06/22/tfe-on-post-searlean-critiques-of-llms/?ref=danmackinlay.name">TfE: On Post-Searlean Critiques of LLMs – DEONTOLOGISTICS</a></li>
</ul>
</section>
<section id="political-economy-of-actually-existing-ai" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="political-economy-of-actually-existing-ai"><span class="header-section-number">6</span> Political Economy of Actually-existing AI</h2>
<p>The hype/takes landscape is fractally complex, and anyone whose take on it all reads like “it will <em>obviously</em> go like X” isn’t credible to me — they’re just stoking the hot-take furnace.</p>
<p><em>Some</em> types of hype are predictably <a href="../notebook/bullshit.html">bullshit</a> which is not to say incorrect, just uncoupled from the truth.. Never before has it been so painfully clear that whichever institution issues qualifications for “thought leadership” really needs to work on its syllabus.</p>
<p>That said, certain analyses I think are worth paying more attention to for their ability to help us discern the possibilities. Here are some pieces that attempt to bring at least some vague knowledge of technical and socio-economic systems to bear on the political economy of AI.</p>
<ul>
<li><a href="https://ludic.mataroa.blog/blog/i-will-fucking-piledrive-you-if-you-mention-ai-again/?ref=danmackinlay.name">I Will Fucking Piledrive You If You Mention AI Again</a> (on detecting when you are being sold hype that cannot deliver)</li>
<li><a href="https://www.notboring.co/p/the-electric-slide?ref=danmackinlay.name">The Electric Slide — by Packy McCormick and Sam D’Amico</a> (On backing out the bits-vs-atoms strategies pursued by the two global superpowers)</li>
<li><a href="https://www.programmablemutter.com/p/the-political-economy-of-ai-a-syllabus?ref=danmackinlay.name">The Political Economy of AI: A Syllabus - by Henry Farrell</a>. I picked this at random from a few interesting articles in the political economy rubric.</li>
<li><a href="https://www.newstatesman.com/politics/2025/09/inside-the-tony-blair-institute?ref=danmackinlay.name">Inside the Tony Blair Institute</a> (Tech industry influence and/or state capture in middle powers, a case study)</li>
<li><a href="https://www.nber.org/conferences/economics-transformative-ai-workshop-fall-2025?ref=danmackinlay.name">Economics of Transformative AI Workshop, Fall 2025</a></li>
</ul>
</section>
<section id="thomas-urquhart" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="thomas-urquhart"><span class="header-section-number">7</span> Thomas Urquhart</h2>
<p>Guys, this dissolute, self-sabotaging, anarchic genius has all his works online, and I missed that fact. Did you know he wrote a proposal, <em>Logopandecteision</em>, for the ultimate language in which all words described themselves by their sounds, but did not finish it, instead delivering a book about the language which mostly consists of him complaining about his creditors? Did you know he invented a language, <em>Trissotetras</em>, whose utterances are trigonometric proofs? Quixotic mathematical-linguistic genius whose time has finally come.</p>
<ul>
<li><a href="https://www.tandfonline.com/doi/full/10.1080/00033790.2019.1625438?ref=danmackinlay.name#abstract">Maligned for mathematics: Sir Thomas Urquhart and his Trissotetras: Annals of Science: Vol 76, No 2</a></li>
<li><a href="https://utoronto.scholaris.ca/items/7d21865a-6c20-4499-aec3-790e874b795b?ref=danmackinlay.name">The Trissotetras: Or, A Most Exquisite Table For Resolving all manner of Triangles, whether Plaine or Sphericall, Rectangular or Obliquangular, with greater facility, then ever hitherto hath been practised. Most necessary for all such as would attaine to the exact knowledge of Fortification, Dyaling, Navigation, Surveying, Architecture, the Art of Shadowing, taking of Heights, and Distances, the use of both the Globes, Perspective, the skill of making the Maps, the Theory of the Planets, the calculating of their motions, and of all other Astronomicall computations whatsoever. Now lately invented, and perfected, explained, commented on, and with all possible brevity, and perspicuity, in the hiddest, and most re-searched mysteries, from the very first grounds of the science it selfe, proved, and convincingly demonstrated</a></li>
<li><a href="https://link.springer.com/chapter/10.1057/9781137401496_11?ref=danmackinlay.name">Urquhart’s Inflationary Universe | SpringerLink</a></li>
<li><a href="https://brill.com/display/book/edcoll/9789004358065/B9789004358065-s010.xml?ref=danmackinlay.name">“Verbs, mongrels, participles and hybrids”: Sir Thomas Urquhart of Cromarty’s Universal Language in: “Joyous Sweit Imaginatioun”</a></li>
</ul>
</section>
<section id="fiction" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="fiction"><span class="header-section-number">8</span> Fiction</h2>
<p>Max Gladstone’s Craft sequence has <a href="https://reactormag.com/book-review-last-first-snow-by-max-gladstone/?ref=danmackinlay.name">always been interestingly political</a>. The conceit in the series is that the laws of physics are like… laws that can be challenged in court: corporate lawyers notice, and a whole industry of “Craft” lawyers and engineers instantly springs up to litigate reality itself and industrialize divinity. But that’s so last decade; the new series, <a href="https://us.macmillan.com/series/thecraftwars?ref=danmackinlay.name">The Craft Wars</a>, feels very of-the-moment: untrustworthy synthetic superintelligences, locked in high-leverage expansions, duel for market share.</p>
<p><a href="https://locusmag.com/review/darkome-by-hannu-rajaniemi-review-by-niall-harrison/?ref=danmackinlay.name">Darkome by Hannu Rajaniemi</a>: biohacking cypherpunks in a corporate-locked-down, plague-and-climate-collapse near-future Burning Man. I hope civilization endures long enough to read the sequel.</p>
</section>
<section id="references" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="references"><span class="header-section-number">9</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Binmore2010Game" class="csl-entry">
Binmore. 2010. <span>“<a href="https://doi.org/10.1016/j.jce.2010.07.003">Game Theory and Institutions</a>.”</span> <em>Journal of Comparative Economics</em>, Symposium: The Dynamics of Institutions,.
</div>
<div id="ref-Bullock2025AGI" class="csl-entry">
Bullock, Hammond, and Krier. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.05710">AGI, Governments, and Free Societies</a>.”</span>
</div>
<div id="ref-Costello2024Durably" class="csl-entry">
Costello, Pennycook, and Rand. 2024. <span>“<a href="https://doi.org/10.1126/science.adq1814">Durably Reducing Conspiracy Beliefs Through Dialogues with AI</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Dezfouli2020Adversarial" class="csl-entry">
Dezfouli, Nock, and Dayan. 2020. <span>“<a href="https://doi.org/10.1073/pnas.2016921117">Adversarial Vulnerabilities of Human Decision-Making</a>.”</span> <em>Proceedings of the National Academy of Sciences</em>.
</div>
<div id="ref-Duque2025Advantage" class="csl-entry">
Duque, Aghajohari, Cooijmans, et al. 2025. <span>“<a href="https://openreview.net/forum?id=QFO1asgas2">Advantage Alignment Algorithms</a>.”</span> In.
</div>
<div id="ref-Hammond2025Neural" class="csl-entry">
Hammond, and Adam-Day. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2412.08897">Neural Interactive Proofs</a>.”</span> In.
</div>
<div id="ref-Hyland2024FreeEnergy" class="csl-entry">
Hyland, Gavenčiak, Costa, et al. 2024. <span>“<a href="https://openreview.net/forum?id=4Ft7DcrjdO">Free-Energy Equilibria: Toward a Theory of Interactions Between Boundedly-Rational Agents</a>.”</span> In.
</div>
<div id="ref-Kamenica2011Bayesian" class="csl-entry">
Kamenica, and Gentzkow. 2011. <span>“<a href="https://doi.org/10.1257/aer.101.6.2590">Bayesian Persuasion</a>.”</span> <em>American Economic Review</em>.
</div>
<div id="ref-Kolchinsky2025Maximizing" class="csl-entry">
Kolchinsky, Marvian, Gokler, et al. 2025. <span>“<a href="https://doi.org/10.3390/e27010091">Maximizing Free Energy Gain</a>.”</span> <em>Entropy</em>.
</div>
<div id="ref-Kulveit2025Gradual" class="csl-entry">
Kulveit, Douglas, Ammann, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.16946">Gradual Disempowerment: Systemic Existential Risks from Incremental AI Development</a>.”</span>
</div>
<div id="ref-Ng2025TabMGP" class="csl-entry">
Ng, Fong, Frazier, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2510.25154">TabMGP: Martingale Posterior with TabPFN</a>.”</span>
</div>
<div id="ref-Qiu2025Lockin" class="csl-entry">
Qiu, He, Chugh, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2506.06166">The Lock-in Hypothesis: Stagnation by Algorithm</a>.”</span> In.
</div>
<div id="ref-Still2012Thermodynamics" class="csl-entry">
Still, Sivak, Bell, et al. 2012. <span>“<a href="https://doi.org/10.1103/PhysRevLett.109.120604">Thermodynamics of Prediction</a>.”</span> <em>Physical Review Letters</em>.
</div>
</div>


</section>

 ]]></description>
  <category>AI safety</category>
  <category>economics</category>
  <category>language</category>
  <category>review</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/post/2025_influences.html</guid>
  <pubDate>Sun, 09 Nov 2025 21:58:45 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/haag_maypole_RP-P-OB-86.461.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Snakemake</title>
  <link>https://danmackinlay.name/notebook/snakemake.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-shoe-elf" class="figure illustration full quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-shoe-elf-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/shoe_elf.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/shoe_elf.png" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-shoe-elf-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I missed it before, but <code>Snakemake</code> deserves a look. At its core, it’s a <a href="../notebook/build_tools.html">build tool</a> inspired by Make, but it’s built with data science and bioinformatics workflows in mind.</p>
<p>Its main purpose is to create reproducible, scalable data analyses. We express a pipeline as a DAG (Directed Acyclic Graph) of rules, and Snakemake detects which jobs can run in parallel based on their dependencies. This avoids re-running tasks whose inputs haven’t changed — super handy if the task is a 100-hour weather simulation or a neural-network training run.</p>
<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>After spending a few days with it, I reckon that snakemake is an amazing <em>build</em> tool on the HPC, running a large experiment on the cluster etc It’s not so good as an exploratory data-science tool, since it doesn’t really seem to make it easy to adaptively design parameters. I’m currently using <a href="../notebook/parsl.html">Parsl</a> for that, which requires more work to get caching and dependency management, which is probably ultimately worth the friction since that also gets me interactive and adaptive experimentation</p>
</div>
</div>
</div>
<section id="the-dsl" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="the-dsl"><span class="header-section-number">1</span> The DSL</h2>
<p>Snakemake uses its own DSL (a.k.a. Domain-Specific Language) for defining the tasks in a <code>Snakefile</code>.</p>
<p>I hate this. The docs spin this as a “human-readable, Python-based language,” but in practice it’s a custom file format. This odd choice breaks modern IDE support, linting and parsing, and is generally irritating.</p>
<p>So why stomach it? Because its other features are <em>that</em> useful — especially its explicit support for <a href="../notebook/hpc_hell.html">nightmare campus cluster horrors</a>. It integrates with batch schedulers like Slurm, PBS, SGE and LSF. Combined with support for remote files and containerization (like <a href="../notebook/apptainer.html">Apptainer/Singularity</a> and Conda), it’s valuable for the kind of work I do.</p>
</section>
<section id="how-cluster-execution-works" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="how-cluster-execution-works"><span class="header-section-number">2</span> How Cluster Execution Works</h2>
<p>The typical pattern for using Snakemake on an HPC cluster is to combine rule definitions with a “profile.”</p>
<ol type="1">
<li><p><strong>Define Rules in the <code>Snakefile</code></strong>: Each rule specifies <code>input</code> files, <code>output</code> files, and resource hints.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1">rule foo:</span>
<span id="cb1-2">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">input</span>: …</span>
<span id="cb1-3">    output: …</span>
<span id="cb1-4">    threads: <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span></span>
<span id="cb1-5">    resources:</span>
<span id="cb1-6">        mem_mb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">16000</span>,</span>
<span id="cb1-7">        runtime_min<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span></span>
<span id="cb1-8">    shell:</span>
<span id="cb1-9">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"my-command --input {input} --output {output}"</span></span></code></pre></div></div></li>
<li><p><strong>Create a <code>profile</code></strong>: This is a directory (for example, <code>~/.config/snakemake/profiles/mycluster/</code>) that holds configuration. It defines the cluster submission command (for example, <code>sbatch</code> or <code>qsub</code>), the default resources, and concurrency limits. The profile maps our rule’s resource names (for example, <code>mem_mb</code>) to the scheduler’s specific flags (for example, <code>--mem</code>).</p></li>
<li><p><strong>Run Snakemake</strong>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">snakemake</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--profile</span> mycluster <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-j</span> 100</span></code></pre></div></div>
<p>Snakemake reads the profile, analyses the DAG, and submits each job (or groups of jobs) to the scheduler, respecting dependencies and resource requests. It also has a useful job-grouping feature, which bundles many small tasks into a single scheduler job to reduce load.</p></li>
</ol>
</section>
<section id="choosing-cluster-mode" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="choosing-cluster-mode"><span class="header-section-number">3</span> Choosing Cluster Mode</h2>
<p>When we set up the profile, we have to decide <em>how</em> Snakemake will talk to the scheduler. There are two main ways.</p>
<section id="classic-cluster-generic-mode" class="level3" data-number="3.1">
<h3 data-number="3.1" class="anchored" data-anchor-id="classic-cluster-generic-mode"><span class="header-section-number">3.1</span> Classic <code>cluster-generic</code> Mode</h3>
<p>This is the classic method (my recommendation). We use the <code>snakemake-executor-plugin-cluster-generic</code> plugin and provide a shell command template for submission.</p>
<p><strong><code>profiles/cluster_generic/config.yaml</code></strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">executor</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cluster-generic</span></span>
<span id="cb3-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">jobs</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span></span>
<span id="cb3-3"></span>
<span id="cb3-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># template for the submission command</span></span>
<span id="cb3-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cluster-generic-submit-cmd</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">: </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">&gt;-</span></span>
<span id="cb3-6">  sbatch --account=$SLURM_ACCOUNT --time={resources.runtime} --mem={resources.mem_mb} \</span>
<span id="cb3-7">         --cpus-per-task={resources.cpus} --gres={resources.gres} --job-name={rule}-{jobid}</span>
<span id="cb3-8"></span>
<span id="cb3-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">default-resources</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb3-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> runtime=120</span></span>
<span id="cb3-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> mem_mb=64000</span></span>
<span id="cb3-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cpus=4</span></span>
<span id="cb3-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> gres=gpu:1</span></span>
<span id="cb3-14"></span>
<span id="cb3-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... other settings</span></span>
<span id="cb3-16"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">printshellcmds</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">true</span></span>
<span id="cb3-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">latency-wait</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span></span></code></pre></div></div>
<ul>
<li><strong>Pros:</strong> Highly flexible: it works with <em>any</em> scheduler and, critically, lets us use environment variables (like <code>$SLURM_ACCOUNT</code>) inside the template.</li>
<li><strong>Cons:</strong> We have to write and maintain the submission command boilerplate.</li>
</ul>
</section>
<section id="executor-plugins-e.g.-slurm" class="level3" data-number="3.2">
<h3 data-number="3.2" class="anchored" data-anchor-id="executor-plugins-e.g.-slurm"><span class="header-section-number">3.2</span> Executor Plugins (e.g., <code>slurm</code>)</h3>
<p>In version 8, Snakemake introduced executor plugins, like <code>snakemake-executor-plugin-slurm</code>. They accept scheduler-specific resource names directly.</p>
<p><strong><code>profiles/slurm/config.yaml</code></strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb4-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">executor</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> slurm</span></span>
<span id="cb4-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">jobs</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span></span>
<span id="cb4-3"></span>
<span id="cb4-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">default-resources</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb4-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> runtime=120</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> # ⚠️ Hard-coded!</span></span>
<span id="cb4-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> mem_mb=64000</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> # ⚠️ Hard-coded!</span></span>
<span id="cb4-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cpus_per_task=4</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> # ⚠️ Hard-coded!</span></span>
<span id="cb4-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> slurm_partition=standard</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ⚠️ Hard-coded!</span></span>
<span id="cb4-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> slurm_account=my_project_account</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> # ⚠️ Hard-coded!</span></span>
<span id="cb4-10"></span>
<span id="cb4-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... other settings</span></span>
<span id="cb4-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">printshellcmds</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">true</span></span>
<span id="cb4-13"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">latency-wait</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">60</span></span></code></pre></div></div>
<p>This is notionally the more modern and luxurious way, but in my experience, it kinda sucks. The comforts are meagre, and the costs are high.</p>
<p>See all those hard‑coded resource defaults? We <strong>cannot</strong> use environment variables here. And we <em>cannot</em> override just one of them. Want to change the memory allocation for a run? We have to reproduce the entire config file, including lines that did not change. Want to use a different account? Reproduce a whole config file. Want to use <a href="../notebook/dotenv.html">automatic config</a> which works perfectly fine for other parts of your app? Nope, not for your executor plugin config.</p>
<p>This forces us to hard‑code site-specific things like <code>my_project_account</code>, which is terrible for portability and leads to a proliferation of config files lying around, defeating the purpose of Snakemake.</p>
<p>Worse, this singular design choice is not at all clearly documented, so it is a massive time suck for fools, like me, who assume that more modern = better.</p>
</section>
<section id="asides" class="level3" data-number="3.3">
<h3 data-number="3.3" class="anchored" data-anchor-id="asides"><span class="header-section-number">3.3</span> Asides</h3>
<p>Snakemake can also target public cloud backends (Kubernetes, AWS Batch, Google Life Sciences API) and stage data from S3/GCS. In theory, this lets us run the same Snakefile on-prem or in the cloud. In practice, costs and object-store quirks mean that most people I know still run their workflows on classic HPC clusters.</p>


</section>
</section>

 ]]></description>
  <category>computers are awful</category>
  <category>concurrency hell</category>
  <category>faster pussycat</category>
  <category>premature optimization</category>
  <category>python</category>
  <guid>https://danmackinlay.name/notebook/snakemake.html</guid>
  <pubDate>Tue, 04 Nov 2025 06:04:17 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/shoe_elf.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Utopian governance using technology, including generative AI</title>
  <link>https://danmackinlay.name/notebook/civic_tech.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-bad-shepherds" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-bad-shepherds-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/bad_shepherds_RP-P-OB-52.957.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/bad_shepherds_RP-P-OB-52.957.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-bad-shepherds-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>The companion notebook on <a href="../notebook/utopian_governance.html">utopian governance</a> asks <em>what systems should we have?</em> — sortition, futarchy, liquid democracy, and other institutional designs. This notebook asks a different question: <em>what platforms and tools might help us actually govern better?</em> In particular, what’s the best, kindest, and wisest collective behaviour we could achieve if generative AI and digital platforms helped mediate governance?</p>
<p>A partial counterpart to <a href="../notebook/ai_disempowerment.html">AI disempowerment of humans</a> is AI empowerment of collective decision-making. This isn’t the same as wondering how we might <a href="../notebook/ai_diy.html">democratize AI</a> — that’s some kind of dual question and also interesting.</p>
<section id="an-epistemic-problem" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="an-epistemic-problem"><span class="header-section-number">1</span> An epistemic problem</h2>
<p>Governance is partially an epistemic problem: how does a collective discover which policies will actually produce good outcomes, given that no individual knows enough? It can also be a problem of more naked coercion, <a href="../notebook/coalition_games.html">coalition dynamics</a>, <a href="../notebook/misinformation.html">deception</a>, and so on; we mostly ignore those here. Civic <em>tech</em> is for the slice that tools can plausibly do work on: deliberation, truth-finding, preference aggregation, plus the psychological layer that comes with putting humans in the loop. The surrounding politics — power, identity, mammalian ego — sits mostly outside what mechanism design can touch; we deliberately scope down to where the tools have traction, on the bet that any functioning coalition, movement, team, or parliament has to do that epistemic work to coordinate at all, regardless of how much else is in play. The deliberative tools must still operate inside environments shaped by adversarial manipulation, captured platforms, and engagement-economy incentives that reward division <span class="citation" data-cites="Ovadya2023Bridging">(Ovadya and Thorburn 2023)</span> — but that is a robustness question for the same epistemic mechanism, not a different kind of problem. For the broader context of how communities form and maintain shared knowledge, see <a href="../notebook/epistemic_community.html">epistemic communities</a>; for the broader theory of decision-making under bounded compute, see <a href="../notebook/ai_economics_of_cognition.html">political economy of cognition</a>.</p>
<p><a href="../notebook/social_choice.html">Social choice theory</a> frames this as preference aggregation — how to combine what people <em>want</em>. Preferences, though, are coupled with beliefs in an interesting way. People don’t disagree about climate policy because they want different temperatures. They can disagree in good faith because they hold different models of how the economy, the atmosphere, and political institutions interact, and whether any of these will in fact impact them in any important way. The preference-aggregation framing (voting, polls, referenda) does not seem to be a tool for the <em>belief</em>-aggregation job.</p>
<p>Several mechanisms in the <a href="../notebook/utopian_governance.html">utopian governance</a> notebook attack this directly. <a href="../notebook/prediction_markets.html">Prediction markets</a> aggregate beliefs by rewarding accuracy — but they tell us what people think <em>will</em> happen, not what <em>would</em> happen if we intervened (the <a href="../notebook/prediction_markets.html#causal-validity">causal validity</a> problem). Futarchy tries to bridge the gap by conditioning markets on policy choices, but inherits the causal difficulties. <a href="../notebook/reputation_systems.html">Reputation systems</a> are a softer version of the same idea: weight opinions by track record rather than by majority.</p>
<p>The belief/preference framing also misses a psychological layer. Much of contemporary democratic dysfunction looks less like ideological disagreement and more like <em>affective polarization</em> — emotional dislike of the out-party, more or less independent of any policy disagreement. A surprising amount of the deliberative-AI literature targets this layer rather than the belief layer: the goal is “conflict transformation” rather than consensus-finding <span class="citation" data-cites="Ovadya2023Bridging Ovadya2024Democracy">(Ovadya and Thorburn 2023; Ovadya et al. 2024)</span>, enabling productive conflict by closing the <em>perception gap</em> — our beliefs about <em>other people’s</em> beliefs, which are systematically more extreme than the actual distribution. The intergroup-contact and conflict-mediation literatures are the relevant precursors here, alongside social choice. For the underlying group-decision dynamics these tools are trying to engineer for — diversity dividends, information cascades, surprisingly-popular polling, contrarian-vs-consensus tradeoffs — see <a href="../notebook/wisdom_of_crowds_vs_groupthink.html">groupthink and the wisdom of crowds</a>.</p>
<p>The rest of this notebook surveys mechanisms that take a different angle on the same problem. AI-mediated deliberation <em>generates</em> new statements that bridge between positions rather than aggregating existing ones — closer to what Habermas meant by the ideal speech situation: not a vote, but a process that produces justified consensus through structured dialogue. Bridging-based aggregation does more intimate work with political discussions themselves: it uses the signal of <em>who agrees with whom</em> to surface the statements that already cross divides. Participatory platforms try to make input itself binding rather than advisory. Each of these is a partial answer to the problem of healthy deliberation. A more radical alternative — <a href="../notebook/delegated_agent_governance.html">delegated agent governance</a> — gives each principal a fiduciary AI agent and lets agents do the negotiating, with the political and economic spheres potentially merging into a Coasean bargaining stack. The tools surveyed in this notebook all keep the human in the deliberation loop. The design question is how to combine them — markets for factual questions, deliberation for value-laden ones, reputation for weighting expertise, whatever else it takes — and whether AI mediation gets us closer to truth, or just closer to <em>feeling</em> agreeable.</p>
<p>This topic probably deserves its own notebook when the literature matures; for now, eh, you’ve got my rambles.</p>
<p>For the technical question of whether AI systems can serve as <em>epistemic</em> infrastructure rather than just <em>deliberative</em> infrastructure — extracting reliable belief from noisy strategic crowds, rather than only mediating discussion — see learning from the madness of crowds. For the broader institutional-design question — what trade-offs an epistemic community is making between fast convergence, diversity, action-readiness, skimmable summaries, and member-status ratification, and what mechanisms (peer review, prestige, scoring rules, randomised assignment, admission control) discipline those trade-offs — see <a href="../notebook/epistemic_community.html">epistemic communities</a>. The civic-tech tools surveyed here are one slice of that design space, biased toward large-group <em>deliberative</em> outputs.</p>
<p>TODO: connect to Tetlock’s superforecasting literature?</p>
</section>
<section id="ai-mediated-deliberation" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="ai-mediated-deliberation"><span class="header-section-number">2</span> AI-mediated deliberation</h2>
<p>Can AI help divided groups find common ground? Early experiments suggest yes — and perhaps better than human facilitators.</p>
<section id="the-habermas-machine" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="the-habermas-machine"><span class="header-section-number">2.1</span> The Habermas Machine</h3>
<p>Ekeoma Uzogara’s summary of <span class="citation" data-cites="Tessler2024AI">Tessler et al. (2024)</span>:</p>
<blockquote class="blockquote">
<p>To act collectively, groups must reach agreement; however, this can be challenging when discussants present very different but valid opinions. <span class="citation" data-cites="Tessler2024AI">Tessler et al. (2024)</span> investigated whether artificial intelligence (AI) can help groups reach a consensus during democratic debate (see <span class="citation" data-cites="Nyhan2024Public">Nyhan and Titiunik (2024)</span>). The authors trained a large language model called the Habermas Machine to serve as an AI mediator that helped small UK groups find common ground while discussing divisive political issues such as Brexit, immigration, the minimum wage, climate change, and universal childcare. Compared with human mediators, AI mediators produced more palatable statements that generated wide agreement and left groups less divided. The AI’s statements were more clear, logical, and informative without alienating minority perspectives. This work carries policy implications for AI’s potential to unify deeply divided groups.</p>
</blockquote>
<p>See also: <span class="citation" data-cites="Hernandez2025Automating Volpe2025Artificial">(Hernández 2025; Volpe 2025)</span>. For how this kind of deliberation works at smaller scales without AI, see <a href="../notebook/community_governance.html">community governance</a>.</p>
</section>
<section id="team-mirai" class="level3" data-number="2.2">
<h3 data-number="2.2" class="anchored" data-anchor-id="team-mirai"><span class="header-section-number">2.2</span> Team Mirai</h3>
<p>Team Mirai is a Japanese experiment in running lots of governance-cleverness mechanisms at once. See <a href="https://www.schneier.com/blog/archives/2026/03/team-mirai-and-democracy.html?ref=danmackinlay.name">Team Mirai and Democracy</a>:</p>
<blockquote class="blockquote">
<p>Imagine an election where every voter has the opportunity to opine directly to politicians on precisely the issues they care about. They’re not expected to spend hours becoming policy experts. Instead, an <a href="https://depth-interview-ai.vercel.app/?ref=danmackinlay.name">AI Interviewer</a> walks them through the subject, answering their questions, interrogating their experience, even challenging their thinking.</p>
<p>Voters get immediate feedback on how their individual point of view matches—or doesn’t—a party’s platform, and they can see whether and how the party adopts their feedback. This isn’t like an opinion poll that politicians use for calculating short-term electoral tactics. It’s a deliberative reasoning process that scales, engaging voters in defining policy and helping candidates to listen deeply to their constituents.</p>
<p>This is happening today in Japan. Constituents have spent about <a href="https://depth-interview-ai.vercel.app/sessions?ref=danmackinlay.name">eight thousand hours</a> engaging with Mirai’s AI Interviewer since 2025. The party’s gamified volunteer mobilization app, <a href="https://action.team-mir.ai/stats?ref=danmackinlay.name">Action Board</a>, captured about 100,000 organizer actions per day in the runup to last week’s election.</p>
<p>It’s how Team Mirai, which translates to ‘The Future Party,’ does politics.</p>
</blockquote>
</section>
</section>
<section id="bridging-based-aggregation" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="bridging-based-aggregation"><span class="header-section-number">3</span> Bridging-based aggregation</h2>
<p>A family of mechanisms with a shared move: use the signal in <em>who agrees with whom</em> to find content, statements, or policy positions that cross ideological divides. Unlike the Habermas Machine, these systems don’t generate new text; they select among what participants already wrote. Two deployed examples worth knowing are X’s Community Notes and the Polis / vTaiwan stack.</p>
<section id="community-notes" class="level3" data-number="3.1">
<h3 data-number="3.1" class="anchored" data-anchor-id="community-notes"><span class="header-section-number">3.1</span> Community Notes</h3>
<p>Community Notes (formerly Birdwatch) surfaces fact-checks on X posts only when the system infers that a note is rated helpful by raters who usually disagree. The published <a href="https://communitynotes.x.com/guide/en/under-the-hood/ranking-notes?ref=danmackinlay.name">algorithm</a> is a matrix-factorisation model:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ar_%7Bun%7D%20%5C;=%5C;%20%5Cmu%20%5C;+%5C;%20i_n%20%5C;+%5C;%20b_u%20%5C;+%5C;%20f_u%5E%5Ctop%20f_n%20%5C;+%5C;%20%5Cvarepsilon_%7Bun%7D.%0A"></p>
<p>Here <img src="https://latex.codecogs.com/png.latex?r_%7Bun%7D"> is user <img src="https://latex.codecogs.com/png.latex?u">’s rating of note <img src="https://latex.codecogs.com/png.latex?n"> (helpful / not helpful, coded numerically), <img src="https://latex.codecogs.com/png.latex?%5Cmu"> is a global intercept, <img src="https://latex.codecogs.com/png.latex?b_u"> is a per-user “how positive is this rater” bias, <img src="https://latex.codecogs.com/png.latex?i_n"> is the <em>note intercept</em>, and <img src="https://latex.codecogs.com/png.latex?f_u%5E%5Ctop%20f_n"> is the dot product of a low-dimensional user factor and a note factor. Parameters are fit by regularized least squares over the observed ratings.</p>
<p>The factors <img src="https://latex.codecogs.com/png.latex?f_u"> and <img src="https://latex.codecogs.com/png.latex?f_n"> absorb the main axis of polarity — roughly, partisanship. Their dot product predicts the <em>disagreement</em> pattern: how user polarity aligns with note polarity. What’s left in <img src="https://latex.codecogs.com/png.latex?i_n"> is the helpfulness signal with the polarity component divided out. A note with high <img src="https://latex.codecogs.com/png.latex?i_n"> is one that raters across the polarity axis converge on calling helpful. That is the bridging score, and a note is shown publicly only when <img src="https://latex.codecogs.com/png.latex?i_n"> clears a threshold.</p>
<p>Some caveats:</p>
<ul>
<li>It’s a rank-1 factorization (at least, in the deployed version) — one dominant axis of disagreement is assumed. If the real disagreement graph has factions who disagree on three orthogonal axes, we are regressing out one axis and projecting the others onto that in some sense. That might be an improvement over unweighted averaging, but it is not bridging in a strong sense.</li>
<li><img src="https://latex.codecogs.com/png.latex?i_n"> is not identifiable without regularization; the regularizer (is it a prior?) on <img src="https://latex.codecogs.com/png.latex?f_u"> and <img src="https://latex.codecogs.com/png.latex?f_n"> is necessary but its choice affects what counts as “bridging” out in the tail.</li>
<li>Adversarial robustness emerges because a manipulator has to coordinate raters with divergent <img src="https://latex.codecogs.com/png.latex?f_u"> to move <img src="https://latex.codecogs.com/png.latex?i_n">, which is costlier than coordinating raters inside one faction.</li>
</ul>
</section>
<section id="polis-and-vtaiwan" class="level3" data-number="3.2">
<h3 data-number="3.2" class="anchored" data-anchor-id="polis-and-vtaiwan"><span class="header-section-number">3.2</span> Polis and vTaiwan</h3>
<p><a href="https://pol.is?ref=danmackinlay.name">Polis</a> solves a related problem with a related pipeline, aimed at structured deliberation rather than ranking fact-checks. Participants submit short statements; everyone votes agree / disagree / pass on the statements of others. The agree/disagree matrix is factored by PCA, giving each participant a 2-D position on an “opinion map”, and <img src="https://latex.codecogs.com/png.latex?k">-means clusters participants into opinion groups (typically two to four). Per-statement consensus is computed <em>across</em> clusters: a <em>group-informed consensus</em> statement is one that substantially every cluster, weighted by cluster size, agrees with.</p>
<p>The Taiwan g0v community and the subsequent <a href="https://info.vtaiwan.tw/?ref=danmackinlay.name">vTaiwan</a> process, under Audrey Tang, ran Polis at policy scale — producing consensus recommendations on Uber regulation, fintech licensing, online alcohol sales, and more. Tang’s broader framing, “<a href="https://www.plurality.net/?ref=danmackinlay.name">Plurality</a>,” treats this family of tools as infrastructure for collective intelligence across diversity.</p>
<p>Decoder: Polis differs from Community Notes along the following axes:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th></th>
<th>Community Notes</th>
<th>Polis</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Output</td>
<td>per-item score (rank)</td>
<td>per-statement consensus + opinion map</td>
</tr>
<tr class="even">
<td>Time</td>
<td>continuous, per note</td>
<td>session-based</td>
</tr>
<tr class="odd">
<td>Adversarial pressure</td>
<td>high</td>
<td>lower (smaller audience)</td>
</tr>
<tr class="even">
<td>Downstream use</td>
<td>automatic display</td>
<td>human facilitators curate</td>
</tr>
<tr class="odd">
<td>Rank</td>
<td>1 polarity axis</td>
<td>2 PCA components</td>
</tr>
</tbody>
</table>
</section>
<section id="the-broader-family" class="level3" data-number="3.3">
<h3 data-number="3.3" class="anchored" data-anchor-id="the-broader-family"><span class="header-section-number">3.3</span> The broader family</h3>
<p>Aviv Ovadya and Luke Thorburn’s <a href="https://bridging.systems/?ref=danmackinlay.name">bridging systems</a> work <span class="citation" data-cites="Ovadya2023Bridging Ovadya2024Democracy">(Ovadya and Thorburn 2023; Ovadya et al. 2024)</span> generalises the design pattern across recommender systems, collective response systems, and human-facilitated mini-publics, and flags its characteristic failure modes: what if there is no bridge? what if the apparent “bridge” is a false consensus because we have only modelled one axis of disagreement? what if “bridging” is just a polite name for asymmetric concession from whichever side is less coordinated? Related experimental infrastructure is discussed at the <a href="https://www.meaningalignment.org/?ref=danmackinlay.name">Meaning Alignment Institute</a> and the <a href="https://aidemocracyfoundation.org/?ref=danmackinlay.name">AI &amp; Democracy Foundation</a>.</p>
<p>For the <em>preference</em> aggregation problem, see <a href="../notebook/social_choice.html">social choice</a> (classical preference aggregation), <a href="../notebook/reputation_systems.html">reputation systems</a> (iterative weighting), and <a href="../notebook/epistemic_community.html">epistemic communities</a> on the “whose judgement carries weight” question.</p>
<p>TODO: ingest <span class="citation" data-cites="Wojcik2022Birdwatch">Wojcik et al. (2022)</span>.</p>
</section>
</section>
<section id="participatory-civic-platforms" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="participatory-civic-platforms"><span class="header-section-number">4</span> Participatory civic platforms</h2>
<p>Most “participation” in existing democracies is consultation: comment boxes, public submissions, surveys, town halls. The institution asks for input, then decides what to do with it. This is better than nothing, but it doesn’t change the governance structure — the same people make the same decisions, just with more information (which they may or may not use).</p>
<p>The tools below aim at something stronger: participation-as-governance, where the <a href="../notebook/mechanism_design.html">mechanism design</a> of the platform itself determines how input translates into outcomes. Participatory budgeting with binding commitments, consent-based policy revision, structured deliberation with decision rules — these aren’t just input channels, they’re alternative governance architectures. The distinction in the threat models is that the failure mode of consultation is <em>captured input</em> (powerful voices dominate the comment box), while the failure mode of governance-by-platform is <em>mechanism failure</em> (the rules produce perverse outcomes). Different failure modes require different defences.</p>
<p>Not all of this is AI-dependent — much of it is about building better infrastructure for human participation, that is to say, it is something closer to UX design than to machine learning.</p>
<p>See also <a href="../notebook/kinder_social_media.html">platform democracy and kinder social media</a> on redesigning online public spaces, and <a href="../notebook/delegated_agent_governance.html">delegated agent economies</a> on what happens when AI agents act on our behalf.</p>
<ul>
<li><a href="https://civictech.guide/?ref=danmackinlay.name">Civic Tech Field Guide</a> — a comprehensive directory.</li>
<li><a href="https://participedia.net/?ref=danmackinlay.name">Participedia</a> — a global crowdsourcing platform for researchers, educators, practitioners, policymakers, activists, and anyone interested in public participation and democratic innovations. Theory, methods, and case studies.</li>
<li><a href="https://www.governingwithai.com/p/democratic-input-and-artificial-intelligence?ref=danmackinlay.name">Democratic Input and Artificial Intelligence</a></li>
<li><a href="https://www.plurality.net/?ref=danmackinlay.name">Plurality: The Future of Collaborative Technology and Democracy</a></li>
<li><a href="https://www.plural.ch/de/vision?ref=danmackinlay.name">Plural</a> — Swiss platform for participatory democracy.</li>
<li><a href="https://github.com/metagov/interop?ref=danmackinlay.name">metagov/interop: Supporting interoperable deliberative tools</a></li>
<li><a href="https://www.gov.scot/publications/market-research-existing-civic-technologies-participation/pages/4/?ref=danmackinlay.name">Results — Market research of existing civic technologies for participation — gov.scot</a></li>
</ul>
<section id="metagov" class="level3" data-number="4.1">
<h3 data-number="4.1" class="anchored" data-anchor-id="metagov"><span class="header-section-number">4.1</span> Metagov</h3>
<p><a href="https://metagov.org/?ref=danmackinlay.name">Metagov</a> hosts a stable of interesting projects for online community governance. <a href="https://www.joshuatan.com/research/?ref=danmackinlay.name">Joshua Tan</a> is head of research; I’m keen to see what the organisation does next. See also <a href="https://metagov.substack.com/p/metagov-news-special-ai-issue-nov?triedRedirect=true&amp;ref=danmackinlay.name">Metagov News (Special AI Issue) - Nov 2025</a>.</p>
<ul>
<li><p><a href="https://metagov.org/projects/koi-pond?ref=danmackinlay.name">KOI pond</a></p>
<blockquote class="blockquote">
<p>Knowledge Organisation Infrastructure (KOI) is an open protocol that allows communities to collaboratively manage knowledge on their own terms while remaining interoperable with others. Developed by BlockScience with contributions from Metagov and the Australian Research Council Centre of Excellence for Automated Decision-Making and Society (ADM+S), KOI is designed for contexts where knowledge needs to be contextual, traceable, and machine-readable without forcing everyone into the same database or governance model.</p>
<p>KOI allows different groups to organise, reference, and share knowledge in a modular, consent-based way. It enables interoperability without centralisation, creating a shared architecture for collective intelligence while preserving local control.</p>
</blockquote></li>
<li><p><a href="https://policykit.org?ref=danmackinlay.name">PolicyKit</a>: This is software for online communities to govern themselves. It lets communities create and enforce their own rules and decision-making processes.</p></li>
<li><p><a href="https://govbase.metagov.org?ref=danmackinlay.name">Govbase</a>: An open-source, crowd-sourced database of online governance projects, tools, organizations, and concepts.</p></li>
<li><p><a href="https://metagov.org/?ref=danmackinlay.name">Collective Voice</a>: A project to integrate Metagov with Open Collective, exploring how collective governance can work with the financial practices of online communities.</p></li>
<li><p><a href="https://metagov.org/projects/interop?ref=danmackinlay.name">Interop1</a>: An initiative that aims to create a more interoperable ecosystem for online deliberation and funds open-source tools for deliberation and digital governance.</p></li>
<li><p>[…]</p></li>
</ul>
</section>
<section id="permissionless-infrastructure" class="level3" data-number="4.2">
<h3 data-number="4.2" class="anchored" data-anchor-id="permissionless-infrastructure"><span class="header-section-number">4.2</span> Permissionless infrastructure</h3>
<p>A different axis of variation: not <em>which mechanism aggregates input</em> but <em>whose substrate the platform runs on</em>. The blockchain-adjacent communities have a distinctive value stack — open global participation, censorship resistance, credible neutrality, auditability — which they treat as preconditions for anything we’d call <em>governance</em>, rather than as features.</p>
<p><a href="https://www.palladiummag.com/2023/10/06/why-i-built-zuzalu/?ref=danmackinlay.name">Zuzalu</a> introduced me to <a href="https://zuzalu.gitbook.io/zuzalu-beta-docs/welcome/zuzalu.city-vision-and-mission?ref=danmackinlay.name">Zuzalu.city</a> and, in turn, to <a href="https://vitalik.eth.limo/general/2023/12/28/cypherpunk.html?ref=danmackinlay.name">Make Ethereum Cypherpunk Again</a>:</p>
<blockquote class="blockquote">
<p>Many of these values are shared not just by many in the Ethereum community, but also by other blockchain communities, and even non-blockchain decentralization communities, though each community has its own unique combination of these values and how much each one is emphasized.</p>
<ul>
<li><strong>Open global participation</strong>: anyone in the world should be able to participate as a user, observer or developer, on a maximally equal footing. Participation should be <strong>permissionless</strong>.</li>
<li><strong>Decentralization</strong>: minimize the dependence of an application on any one single actor. In particular, <strong>an application should continue working even if its core developers disappear forever</strong>.</li>
<li><strong>Censorship resistance</strong>: centralized actors should not have the power to interfere with any given user’s or application’s ability to operate. Concerns around bad actors should be addressed at higher layers of the stack.</li>
<li><strong>Auditability</strong>: anyone should be able to validate an application’s logic and its ongoing operation (eg. by running a full node) to make sure that it is operating according to the rules that its developers claim it is.</li>
<li><strong>Credible neutrality</strong>: base-layer infrastructure <a href="https://nakamoto.com/credible-neutrality/?ref=danmackinlay.name">should be neutral</a>, and in such a way that anyone can see that it is neutral even if they do not already trust the developers.</li>
<li><strong>Building tools, not empires</strong>. Empires try to capture and trap the user inside a walled garden; tools do their task but otherwise interoperate with a wider open ecosystem.</li>
<li><strong>Cooperative mindset</strong>: even while competing, projects within the ecosystem cooperate on shared software libraries, research, security, community building and other areas that are commonly valuable to them. Projects <strong>try to be positive-sum, both with each other and with the wider world</strong>.</li>
</ul>
</blockquote>
<ul>
<li>Luke Winkie, <a href="https://www.pcgamer.com/uk/inside-decentraland-the-surreal-second-life-for-crypto-true-believers/?ref=danmackinlay.name">Inside Decentraland, the surreal Second Life for crypto true believers</a>.</li>
</ul>
</section>
</section>
<section id="incoming" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="incoming"><span class="header-section-number">5</span> Incoming</h2>
<ul>
<li><p><a href="https://www.forethought.org/research/design-sketches-collective-epistemics?ref=danmackinlay.name">AI Tools for Trust: Community Notes, Rhetoric Detection &amp; More</a> — design sketches for collective epistemics.</p></li>
<li><p><a href="https://newpublic.substack.com/p/will-ai-break-democracy-or-fix-it?ref=danmackinlay.name">Will AI break democracy or fix it? Yes.</a> reviews <span class="citation" data-cites="Schneier2025Rewiring">Schneier and Sanders (2025)</span>.</p></li>
<li><p><a href="https://aviv.me/?ref=danmackinlay.name">Aviv Ovadya</a>—primary focus on ensuring AI governance can keep up with AI advances, building on deliberative democracy.</p>
<blockquote class="blockquote">
<p>Aviv’s primary focus is on ensuring that the governance of AI can keep up with the rate of AI advances, building on lessons from applied deliberative democracy to enable <a href="https://reimagine.aviv.me/p/governance-of-ai-with-ai-through?ref=danmackinlay.name">effective transnational governance and alignment</a>. This involves framing (e.g., <a href="https://www.belfercenter.org/publication/towards-platform-democracy-policymaking-beyond-corporate-ceos-and-partisan-pressure?ref=danmackinlay.name">“Platform Democracy”</a>), theory (e.g., <a href="https://arxiv.org/abs/2302.00672?ref=danmackinlay.name">“Generative CI”</a>), and applied work: accelerating efforts to build out and pilot the organizational and technical infrastructure for deliberative governance (formally or informally advising efforts at Meta, Twitter, and OpenAI).</p>
</blockquote></li>
<li><p><a href="https://reimagine.aviv.me/p/reimagining-democracy-ai-journal-of-democracy?ref=danmackinlay.name">Reimagining Democracy for AI (in the “Journal of Democracy”)</a></p></li>
<li><p><a href="https://reimagine.aviv.me/p/governance-of-ai-with-ai-through?ref=danmackinlay.name">Governance of AI, with AI, through deliberative democracy</a></p></li>
<li><p><a href="https://www.radicalxchange.org/tools/?ref=danmackinlay.name">Methods and Tools—RadicalxChange</a></p></li>
<li><p><a href="https://www.saiph.org/?ref=danmackinlay.name">Saiph Savage, Director Northeastern Civic A.I. Lab</a>—tools for gig economy workers and sousveillance.</p></li>
<li><p><a href="https://time.com/6979012/audrey-tang-interview-plurality-democracy/?ref=danmackinlay.name">Inside Audrey Tang’s Plan to Align Technology with Democracy | TIME</a></p></li>
<li><p><a href="https://newpublic.substack.com/p/exploring-a-new-social-product-for?ref=danmackinlay.name">Exploring a new social product for local communities</a></p>
<blockquote class="blockquote">
<p>Our vision is a world where being the “steward” of the local online space is an important job in every community—not only paid and well-supported, but as celebrated as local librarians and teachers. We’re well past the days where just because something’s online doesn’t mean it’s not real or important.</p>
</blockquote></li>
<li><p><a href="https://charlielidbury.com/charlielidbury/Government-as-Software-eba0662863ec4946be4964d34c3dc50a?ref=danmackinlay.name">Government as Software</a>—the claim: government is nothing more than an information-processing machine.</p></li>
<li><p><a href="https://www.wh-ai.org/?ref=danmackinlay.name">wh-ai | Foundation</a>—a local startup pitching big:</p>
<blockquote class="blockquote">
<p>wh-ai [/ˈwaɪ/] is building superintelligent knowledge. Our platform implements a peer-to-peer dialectic process on a decentralized trustless network where questions are answered and verified by the fittest and most advanced AI agents, no need to have multiple AI agents on retainer, nor trust them, instantly guaranteeing highest quality and alignment at lowest cost. We enable a future where we can thrive in novel and abundant synthetic data, expertly verified, with primitives that ground the next discovery on a immutable bedrock.</p>
</blockquote></li>
<li><p><a href="https://www.theomachialabs.com/post/steering-a-permissionless-ai-safety-organization?ref=danmackinlay.name">Steering a Permissionless AI Safety Organization</a></p></li>
<li><p><a href="https://apenwarr.ca/log/20211201?ref=danmackinlay.name">Apenwarr</a> — “Everyone seems to have an increasingly horrifically misguided idea of how distributed systems work.”</p></li>
<li><p><a href="https://campaignlab.uk/innovation/?ref=danmackinlay.name">Innovation - Campaign Lab</a></p></li>
<li><p>Jeremy Yuille, <a href="https://isomorphous.design/praxis/cognitive-infra?ref=danmackinlay.name">Cognitive Infra: The Real Work Surfaces — isomorphous.design</a></p></li>
<li><p><a href="https://acter.global/?ref=danmackinlay.name">Acter - Organize Your Activism</a></p></li>
<li><p><a href="https://www.forethought.org/research/preparing-for-the-intelligence-explosion?reloaded=true&amp;ref=danmackinlay.name">Preparing for the Intelligence Explosion</a></p></li>
<li><p><a href="https://docs.google.com/document/d/12mnAL8ahx-LCC_XaJTbs0K_TcCGsC7BtVNm4iiEQw8Q/edit?pli=1&amp;tab=t.0&amp;ref=danmackinlay.name#heading=h.xmxmx0a5w2dx">AI and Collective Governance: Points of Intervention - Google Docs</a></p></li>
</ul>
</section>
<section id="references" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="references"><span class="header-section-number">6</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Acemoglu2011Opinion" class="csl-entry">
Acemoglu, and Ozdaglar. 2011. <span>“<a href="https://doi.org/10.1007/s13235-010-0004-1">Opinion Dynamics and Learning in Social Networks</a>.”</span> <em>Dynamic Games and Applications</em>.
</div>
<div id="ref-AllenZhu2025DOGE" class="csl-entry">
Allen-Zhu, and Xu. 2025. <span>“<a href="https://doi.org/10.2139/ssrn.5127931">DOGE: Reforming AI Conferences and Towards a Future Civilization of Fairness and Justice</a>.”</span> SSRN Scholarly Paper.
</div>
<div id="ref-Almaatouq2021When" class="csl-entry">
Almaatouq, Rahimian, Burton, et al. 2021. <span>“<a href="http://arxiv.org/abs/2006.12471">When Social Influence Promotes the Wisdom of Crowds</a>.”</span> <em>arXiv:2006.12471 [Physics, Stat]</em>.
</div>
<div id="ref-Arguedas2022Echo" class="csl-entry">
Arguedas, Robertson, Fletche, et al. 2022. <span>“<a href="https://royalsociety.org/-/media/policy/projects/online-information-environment/oie-echo-chambers.pdf">Echo Chambers, Filter Bubbles, and Polarisation: A Literature Review</a>.”</span>
</div>
<div id="ref-Atanasov2015Distilling" class="csl-entry">
Atanasov, Rescober, Stone, et al. 2015. <span>“<a href="https://doi.org/10.1287/mnsc.2015.2374">Distilling the Wisdom of Crowds: Prediction Markets Versus Prediction Polls</a>.”</span> <em>Academy of Management Proceedings</em>.
</div>
<div id="ref-Baron2005Right" class="csl-entry">
Baron. 2005. <span>“<a href="https://doi.org/10.1016/S0065-2601(05)37004-3">So Right It’s Wrong: Groupthink and the Ubiquitous Nature of Polarized Group Decision Making</a>.”</span> In <em>Advances in Experimental Social Psychology</em>.
</div>
<div id="ref-Burton2024Howa" class="csl-entry">
Burton, Lopez-Lopez, Hechtlinger, et al. 2024. <span>“<a href="https://doi.org/10.1038/s41562-024-01959-9">How Large Language Models Can Reshape Collective Intelligence</a>.”</span> <em>Nature Human Behaviour</em>.
</div>
<div id="ref-Conitzer2024Position" class="csl-entry">
Conitzer, Freedman, Heitzig, et al. 2024. <span>“<a href="http://arxiv.org/abs/2404.10271">Position: Social Choice Should Guide AI Alignment in Dealing with Diverse Human Feedback</a>.”</span> In <em>Proceedings of the 41st International Conference on Machine Learning</em>. ICML’24.
</div>
<div id="ref-Dai2024Mappinga" class="csl-entry">
Dai, and Fleisig. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.13038">Mapping Social Choice Theory to RLHF</a>.”</span> In.
</div>
<div id="ref-Danan2016Robust" class="csl-entry">
Danan, Gajdos, Hill, et al. 2016. <span>“<a href="https://doi.org/10.1257/aer.20150678">Robust Social Decisions</a>.”</span> <em>American Economic Review</em>.
</div>
<div id="ref-Drolsbach2024Community" class="csl-entry">
Drolsbach, Solovev, and Pröllochs. 2024. <span>“<a href="https://doi.org/10.1093/pnasnexus/pgae217">Community Notes Increase Trust in Fact-Checking on Social Media</a>.”</span> Edited by David Rand. <em>PNAS Nexus</em>.
</div>
<div id="ref-Farrell2015Pursuing" class="csl-entry">
Farrell, and Shalizi. 2015. <span>“<a href="http://henryfarrell.net/wp/wp-content/uploads/2013/04/Farrell-paper.pdf">Pursuing Cognitive Democracy</a>.”</span> <em>From Voice to Influence: Understanding Citizenship in a Digital Age; Allen, D., Light, J., Eds</em>.
</div>
<div id="ref-Fish2025Generative" class="csl-entry">
Fish, Gölz, Parkes, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2309.01291">Generative Social Choice</a>.”</span>
</div>
<div id="ref-Golub2012How" class="csl-entry">
Golub, and Jackson. 2012. <span>“<a href="https://doi.org/10.1093/qje/qjs021">How Homophily Affects the Speed of Learning and Best-Response Dynamics</a>.”</span> <em>The Quarterly Journal of Economics</em>.
</div>
<div id="ref-Goyal2024Designing" class="csl-entry">
Goyal, Chang, and Terry. 2024. <span>“<a href="https://doi.org/10.1145/3613905.3650948">Designing for Human-Agent Alignment: Understanding What Humans Want from Their Agents</a>.”</span> In <em>Extended Abstracts of the CHI Conference on Human Factors in Computing Systems</em>.
</div>
<div id="ref-Greenwald1986Externalities" class="csl-entry">
Greenwald, and Stiglitz. 1986. <span>“<a href="https://doi.org/10.2307/1891114">Externalities in Economies with Imperfect Information and Incomplete Markets</a>.”</span> <em>The Quarterly Journal of Economics</em>.
</div>
<div id="ref-Gudino2024Large" class="csl-entry">
Gudiño, Grandi, and Hidalgo. 2024. <span>“<a href="https://doi.org/10.1098/rsta.2024.0100">Large Language Models (LLMs) as Agents for Augmented Democracy</a>.”</span> <em>Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences</em>.
</div>
<div id="ref-Hernandez2025Automating" class="csl-entry">
Hernández. 2025. <span>“<a href="https://doi.org/10.1609/aies.v8i2.36687">Towards Automating Deliberation? The Idea of Deliberative Democracy Embedded in Google’s Habermas Machine</a>.”</span> <em>Proceedings of the AAAI/ACM Conference on AI, Ethics, and Society</em>.
</div>
<div id="ref-Hertz2016Social" class="csl-entry">
Hertz, Romand-Monnier, Kyriakopoulou, et al. 2016. <span>“<a href="https://doi.org/10.1037/xhp0000145">Social influence protects collective decision making from equality bias</a>.”</span> <em>Journal of Experimental Psychology. Human Perception and Performance</em>.
</div>
<div id="ref-Kasirzadeh2025Characterizing" class="csl-entry">
Kasirzadeh, and Gabriel. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2504.21848">Characterizing AI Agents for Alignment and Governance</a>.”</span>
</div>
<div id="ref-Lazar2024Governing" class="csl-entry">
Lazar. 2024a. <span>“<a href="https://doi.org/10.48550/arXiv.2410.20720">Lecture I: Governing the Algorithmic City</a>.”</span>
</div>
<div id="ref-Lazar2024Comunicative" class="csl-entry">
———. 2024b. <span>“<a href="https://doi.org/10.48550/arXiv.2410.20718">Lecture II: Communicative Justice and the Distribution of Attention</a>.”</span>
</div>
<div id="ref-List2001Epistemic" class="csl-entry">
List, and Goodin. 2001. <span>“<a href="https://doi.org/10.1111/1467-9760.00128">Epistemic Democracy: Generalizing the Condorcet Jury Theorem</a>.”</span> <em>Journal of Political Philosophy</em>.
</div>
<div id="ref-Lloyd2025Community" class="csl-entry">
Lloyd, Nguyen, Levy, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2509.15434">Beyond Community Notes: A Framework for Understanding and Building Crowdsourced Context Systems</a>.”</span>
</div>
<div id="ref-Lorenz2010Heterogeneous" class="csl-entry">
Lorenz. 2010. <span>“<a href="https://doi.org/10.1002/cplx.20295">Heterogeneous Bounds of Confidence: Meet, Discuss and Find Consensus!</a>”</span> <em>Complexity</em>.
</div>
<div id="ref-Masuda2011Can" class="csl-entry">
Masuda, and Redner. 2011. <span>“Can Partisan Voting Lead to Truth?”</span> <em>Journal of Statistical Mechanics: Theory and Experiment</em>.
</div>
<div id="ref-Mercier2021Does" class="csl-entry">
Mercier, and Claidière. 2021. <span>“<a href="https://doi.org/10.1016/j.cognition.2021.104912">Does Discussion Make Crowds Any Wiser?</a>”</span> <em>Cognition</em>.
</div>
<div id="ref-Navajas2018Aggregated" class="csl-entry">
Navajas, Niella, Garbulsky, et al. 2018. <span>“<a href="https://doi.org/10.1038/s41562-017-0273-4">Aggregated Knowledge from a Small Number of Debates Outperforms the Wisdom of Large Crowds</a>.”</span> <em>Nature Human Behaviour</em>.
</div>
<div id="ref-Novelli2025Replicab" class="csl-entry">
Novelli, Argota Sánchez-Vaquerizo, Helbing, et al. 2025. <span>“<a href="https://doi.org/10.1007/s00146-025-02511-7">A Replica for Our Democracies? On Using Digital Twins to Enhance Deliberative Democracy</a>.”</span> <em>AI &amp; SOCIETY</em>.
</div>
<div id="ref-Nyhan2024Public" class="csl-entry">
Nyhan, and Titiunik. 2024. <span>“<a href="https://doi.org/10.1126/science.ads7371">Public Opinion Alone Won’t Save Democracy</a>.”</span> <em>Science</em>.
</div>
<div id="ref-OConnor2021How" class="csl-entry">
O’Connor, and Wu. 2021. <span>“<a href="https://doi.org/10.31222/osf.io/w3xc5">How Should We Promote Transient Diversity in Science?</a>”</span>
</div>
<div id="ref-Ovadya2023Reimagininga" class="csl-entry">
Ovadya. 2023a. <span>“<a href="https://doi.org/10.1353/jod.2023.a907697">Reimagining Democracy for AI</a>.”</span> <em>Journal of Democracy</em>.
</div>
<div id="ref-Ovadya2023Generative" class="csl-entry">
———. 2023b. <span>“<a href="https://doi.org/10.48550/arXiv.2302.00672">‘Generative CI’ Through Collective Response Systems</a>.”</span>
</div>
<div id="ref-Ovadya2023Bridging" class="csl-entry">
Ovadya, and Thorburn. 2023. <span>“<a href="https://doi.org/10.48550/ARXIV.2301.09976">Bridging Systems: Open Problems for Countering Destructive Divisiveness Across Ranking, Recommenders, and Governance</a>.”</span>
</div>
<div id="ref-Ovadya2024Democracy" class="csl-entry">
Ovadya, Thorburn, Redman, et al. 2024. <span>“<a href="https://openreview.net/forum?id=iAdszMHVLN">Toward Democracy Levels for AI</a>.”</span> In.
</div>
<div id="ref-Qiu2025Lockin" class="csl-entry">
Qiu, He, Chugh, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2506.06166">The Lock-in Hypothesis: Stagnation by Algorithm</a>.”</span> In.
</div>
<div id="ref-Schneier2025Rewiring" class="csl-entry">
Schneier, and Sanders. 2025. <em>Rewiring Democracy: How AI Will Transform Our Politics, Government, and Citizenship</em>. Strong Ideas.
</div>
<div id="ref-Schrock2018CivicTech" class="csl-entry">
Schrock. 2018. <em><a href="https://klangable.com/uploads/books/CivicTech.pdf">Civic Tech: Making Technology Work for People</a></em>.
</div>
<div id="ref-Seger2023Democratising" class="csl-entry">
Seger, Ovadya, Siddarth, et al. 2023. <span>“<a href="https://doi.org/10.1145/3600211.3604693">Democratising AI: Multiple Meanings, Goals, and Methods</a>.”</span> In <em>Proceedings of the 2023 AAAI/ACM Conference on AI, Ethics, and Society</em>. AIES ’23.
</div>
<div id="ref-Shahidi2025Coasean" class="csl-entry">
Shahidi, Rusak, Manning, et al. 2025. <span>“<a href="https://doi.org/10.3386/w34468">The Coasean Singularity? Demand, Supply, and Market Design with AI Agents</a>.”</span> In. Working Paper Series.
</div>
<div id="ref-Shin2024Systematic" class="csl-entry">
Shin, Floch, Rask, et al. 2024. <span>“<a href="https://doi.org/10.1016/j.giq.2024.101954">A Systematic Analysis of Digital Tools for Citizen Participation</a>.”</span> <em>Government Information Quarterly</em>.
</div>
<div id="ref-Slaughter2025Community" class="csl-entry">
Slaughter, Peytavin, Ugander, et al. 2025. <span>“<a href="https://doi.org/10.1073/pnas.2503413122">Community Notes Reduce Engagement with and Diffusion of False Information Online</a>.”</span> <em>Proceedings of the National Academy of Sciences</em>.
</div>
<div id="ref-Sorensen2025Value" class="csl-entry">
Sorensen, Mishra, Patel, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.15484">Value Profiles for Encoding Human Variation</a>.”</span>
</div>
<div id="ref-Stelmakh2020Large" class="csl-entry">
Stelmakh, Rastogi, Shah, et al. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2011.15083">A Large Scale Randomized Controlled Trial on Herding in Peer-Review Discussions</a>.”</span>
</div>
<div id="ref-Suresh2024Participation" class="csl-entry">
Suresh, Tseng, Young, et al. 2024. <span>“<a href="https://doi.org/10.1145/3630106.3658992">Participation in the Age of Foundation Models</a>.”</span> In <em>Proceedings of the 2024 ACM Conference on Fairness, Accountability, and Transparency</em>. FAccT ’24.
</div>
<div id="ref-Tan2022Institutions" class="csl-entry">
Tan, and Abramsky. 2022. <span>“<a href="https://ora.ox.ac.uk/objects/uuid:a5fb9a63-020d-43a7-8351-0d85fa65d626">Institutions under composition</a>.”</span>
</div>
<div id="ref-Tessler2024AI" class="csl-entry">
Tessler, Bakker, Jarrett, et al. 2024. <span>“<a href="https://doi.org/10.1126/science.adq2852">AI Can Help Humans Find Common Ground in Democratic Deliberation</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Tomasev2025Virtual" class="csl-entry">
Tomašev, Franklin, Leibo, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2509.10147">Virtual Agent Economies</a>.”</span>
</div>
<div id="ref-Trouche2014Arguments" class="csl-entry">
Trouche, Sander, and Mercier. 2014. <span>“<a href="http://papers.ssrn.com/abstract=2431710">Arguments, More Than Confidence, Explain the Good Performance of Reasoning Groups</a>.”</span> SSRN Scholarly Paper ID 2431710.
</div>
<div id="ref-vandenSteen2010Culture" class="csl-entry">
van den Steen. 2010. <span>“<a href="https://doi.org/10.1287/mnsc.1100.1214">Culture Clash: The Costs and Benefits of Homogeneity</a>.”</span> <em>Management Science</em>.
</div>
<div id="ref-Volpe2025Artificial" class="csl-entry">
Volpe. 2025. <span>“<a href="https://doi.org/10.1007/s10676-025-09854-1">Toward an Artificial Deliberation? On Google DeepMind’s Habermas Machine</a>.”</span> <em>Ethics and Information Technology</em>.
</div>
<div id="ref-Weisbuch2002Meet" class="csl-entry">
Weisbuch, Deffuant, Amblard, et al. 2002. <span>“<a href="https://doi.org/10.1002/cplx.10031">Meet, Discuss, and Segregate!</a>”</span> <em>Complexity</em>.
</div>
<div id="ref-Wojcik2018Birds" class="csl-entry">
Wojcik. 2018. <span>“<a href="https://doi.org/10.2139/ssrn.2795736">Do Birds of a Feather Vote Together, or Is It Peer Influence?</a>”</span> <em>Political Research Quarterly</em>.
</div>
<div id="ref-Wojcik2022Birdwatch" class="csl-entry">
Wojcik, Hilgard, Judd, et al. 2022. <span>“<a href="https://doi.org/10.48550/ARXIV.2210.15723">Birdwatch: Crowd Wisdom and Bridging Algorithms Can Inform Understanding and Reduce the Spread of Misinformation</a>.”</span>
</div>
<div id="ref-Xu2023Decisionaid" class="csl-entry">
Xu, and Dean. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2303.13712">Decision-Aid or Controller? Steering Human Decision Makers with Algorithms</a>.”</span>
</div>
<div id="ref-Yang2025Bridging" class="csl-entry">
Yang, and Bachmann. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2502.05017">Bridging Voting and Deliberation with Algorithms: Field Insights from vTaiwan and Kultur Komitee</a>.”</span>
</div>
<div id="ref-Yang2024LLM" class="csl-entry">
Yang, Dailisan, Korecki, et al. 2024. <span>“<a href="https://doi.org/10.1609/aies.v7i1.31758">LLM Voting: Human Choices and AI Collective Decision-Making</a>.”</span> <em>Proceedings of the AAAI/ACM Conference on AI, Ethics, and Society</em>.
</div>
<div id="ref-Young2024Participation" class="csl-entry">
Young, Ehsan, Singh, et al. 2024. <span>“<a href="https://doi.org/10.5210/fm.v29i4.13642">Participation Versus Scale: Tensions in the Practical Demands on Participatory AI</a>.”</span> <em>First Monday</em>.
</div>
<div id="ref-Zerilli2025Citizens" class="csl-entry">
Zerilli. 2025. <em>A Citizen’s Guide to Artificial Intelligence</em>.
</div>
</div>


</section>

 ]]></description>
  <category>adversarial</category>
  <category>AI safety</category>
  <category>bounded compute</category>
  <category>communicating</category>
  <category>cooperation</category>
  <category>culture</category>
  <category>economics</category>
  <category>extended self</category>
  <category>faster pussycat</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>language</category>
  <category>machine learning</category>
  <category>markets</category>
  <category>mind</category>
  <category>money</category>
  <category>neural nets</category>
  <category>NLP</category>
  <category>security</category>
  <category>sovereign</category>
  <category>technology</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/civic_tech.html</guid>
  <pubDate>Mon, 27 Oct 2025 23:11:18 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/bad_shepherds_RP-P-OB-52.957.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Grass-roots friendly societies could provide cooperative insurance against dark times</title>
  <link>https://danmackinlay.name/notebook/neo_friendly_societies.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div class="callout callout-style-simple callout-none no-icon callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">None</span>What mutual aid feels like from the inside
</div>
</div>
<div class="callout-body-container callout-body">
<p>It’s 2031. You’re a mid-career professional in Melbourne—let’s say a paralegal, or an accountant, or a technical writer. Over the past two years, <a href="../notebook/ai_economics_automation.html">AI systems have gotten good enough</a> to do about 70% of what you used to do, and your employer has noticed. You haven’t been fired exactly—your role has been “restructured” into something smaller and worse-paid, and you’re competing with twice as many people for the remaining positions. Your industry isn’t the only one. The same thing has happened across much of the professional services sector, more or less simultaneously.</p>
<p>Normally this is where the safety net catches you. But the safety net is stretched. The government is running deficits from <a href="../notebook/climate_change.html">climate adaptation spending</a>—the latest summer was catastrophic, and rebuilding is expensive. Centrelink is overwhelmed. The JobSeeker payment hasn’t kept pace with the cost of living, and anyway, “retraining” programs assume there are jobs to retrain <em>into</em>, which is less obvious than it used to be. Your super is decades away from being accessible. Your mortgage doesn’t care about any of this.</p>
<p>Now imagine a different version of 2031, where five years earlier—back in the quaint days of 2026—you and forty-odd people you trusted had put $200 a month each into a mutual fund structured as a friendly society. The society had invested that pool in a mix of assets chosen specifically to do well when the broader economy does badly: catastrophe bonds, critical minerals, defence and cybersecurity ETFs, maybe some infrastructure REITs. The Australian economy is in recession, but your society’s portfolio is up, because the things that cause recessions—geopolitical instability, supply chain disruption, energy crises—are exactly the things these assets are priced against.</p>
<p>You’re still in trouble. The society isn’t going to replace your income. But it can bridge you for six months while you figure out your next move. It can pay for retraining that the government isn’t offering. A few members who work in sectors that are still hiring can make introductions. The society has negotiated a group rate with a health insurer, so you haven’t lost coverage. And because the group is small—you know these people, you’ve met their kids—the process of asking for help doesn’t feel like submitting a form to a bureaucracy. It feels like leaning on your mates.</p>
</div>
</div>
<p><strong>Curious where this project goes? <a href="https://woozy-page-39c.notion.site/32d398af2ab0805293a9dfb1561b4bdf?pvs=105&amp;ref=danmackinlay.name">Sign up for updates</a>.</strong></p>
<p>What happens to ordinary people when the systems we depend on stop working properly?</p>
<p>We live inside a set of assumptions about the future. The state will provide healthcare. Unemployment insurance will catch us if we fall. The currency will hold its value. Supply chains will keep the shelves stocked. The climate will remain tolerable enough that we can keep living where we live.</p>
<p>None of these are guaranteed, and several are already fraying. <a href="../notebook/climate_change.html">Climate change</a> is repricing property, displacing populations, and straining government budgets. <a href="../notebook/ai_economics_automation.html">Automation is reshaping labour markets</a> in ways that existing welfare systems were not designed to handle. Wars and trade disputes disrupt supply chains with increasing regularity. Any one of these would be a serious policy challenge; taken together, they constitute the thing some people have started calling a “polycrisis”—multiple overlapping stresses that compound each other.</p>
<p>The standard response to all of this is: surely the government will handle it. And maybe it will! Australia has handled crises before. For sure, the best possible solution would be a coordinated, well-funded government response that provides a robust safety net for everyone, and I still think we should do that. Well executed coordinated action by states is what they are for and it would be the best and cheapest solution.</p>
<p>However, I am not banking on Australia in particular getting its shit together to face the future. Modern states, especially Western states, are not hedging well against correlated, civilisation-scale risks. They are reactive, not anticipatory. The social safety net was designed for a world of temporary individual misfortune—you lose your job, you get sick—not for a world where entire sectors of the economy might become obsolete at once, or where climate impacts and geopolitical shocks hit everyone in the same region simultaneously. Maybe the state will get on the ball, but the world is moving fast, and the political system is slow, and Australia seems to be living in the political battles of 2019. It takes years to enact a policy, and our governments should have started planning for this a while ago if they hoped to have a solution in place by the time it becomes a problem.</p>
<p>So what can we do about this ourselves, without waiting for the state to get ahead of the problem?</p>
<p>This is the first in a series of posts about <a href="../notebook/civic_tech.html">alternative institutions for citizens</a>—things we can build now, while we still have the prosperity to do so, so we’re more robust if the state doesn’t act for us.</p>
<p>If we do it right, we might even persuade the government to join the party, and we can all be better off together.</p>
<div id="fig-boat-partyyy" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-boat-partyyy-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/boat_partyyy_RP-P-1887-A-12200.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/boat_partyyy_RP-P-1887-A-12200.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-boat-partyyy-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<section id="why-do-things-collectively" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="why-do-things-collectively"><span class="header-section-number">1</span> Why do things collectively?</h2>
<p>The obvious individual response to all of the above is: save more money. Build a bigger personal buffer. And sure, do that too. But there are reasons why doing this as a group is qualitatively better than doing it alone.</p>
<p>Even better would be mass, societal scale planning for industrial diversity, financial resilience, and social cohesion. But Australia has had a long run of governments which don’t give off “don’t worry guys we have a long term strategic plan fit for the future” vibes, and the current one is no exception. It seems like building our own alternatives might be a good idea because</p>
<ol type="1">
<li>Then we have alternatives</li>
<li>Maybe when everyone is building alternative of their own the state will get the message and join the party</li>
</ol>
<p>So! Community aid!</p>
<p><strong>Economies of scale.</strong> A single person investing $200/month doesn’t have much negotiating power or diversification. Fifty people investing $200/month have a pool of $120k/year—enough to access investment vehicles and fee structures that aren’t available to retail investors, and enough to absorb a bad quarter without anyone panicking.</p>
<p><strong>Collective bargaining.</strong> A group can negotiate rates that individuals can’t: group health insurance, bulk purchasing, professional services at institutional pricing. The friendly society acts as a small institution on behalf of its members, and institutions get better deals than individuals.</p>
<p><strong>Diversification of skills and networks.</strong> In a crisis, money is only part of what you need. We also need information, contacts, and practical help. A group of fifty people across different industries collectively knows far more about which sectors are hiring, which services are still functioning, and where the opportunities are than any one person does. Social capital is a real asset, and it compounds with group size.</p>
<p><strong>Shared administration.</strong> Running a serious investment strategy, tracking regulatory obligations, managing claims—this is overhead that doesn’t scale linearly. One person doing it for fifty is vastly more efficient than fifty people each doing it for themselves. (And as I’ll argue below, <a href="../notebook/civic_tech.html">AI tools</a> can compress this overhead further.)</p>
<p><strong>Commitment and discipline.</strong> It’s easy to raid your own savings when times get tight. It’s harder—in a good way—to draw on a shared fund without justification to people you know and respect. The social structure provides the kind of gentle accountability that most of us struggle to maintain individually.</p>
<p><strong>Community ties as resilience.</strong> This one is less tangible but maybe the most important. The research on disaster resilience consistently finds that the biggest predictor of how well people come through a crisis isn’t wealth or preparation—it’s the strength of their social networks. A group that has been meeting regularly, managing shared resources, and building trust for years before a crisis hits is in a fundamentally different position from a collection of isolated individuals, even wealthy ones. The institution is the thing that builds those ties.</p>
</section>
<section id="why-a-friendly-society" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="why-a-friendly-society"><span class="header-section-number">2</span> Why a friendly society?</h2>
<p>So if we want to do this collectively, what form should it take? I want to dust off an old idea. A <a href="https://en.wikipedia.org/wiki/Friendly_society?ref=danmackinlay.name">friendly society</a>:</p>
<blockquote class="blockquote">
<p>A friendly society (sometimes called a benefit society, mutual aid society, benevolent society, fraternal organization or “ROSCA”) is a mutual association for the purposes of insurance, pensions, savings or cooperative banking. It is a mutual organization or benefit society composed of a body of people who join together for a common financial or social purpose. Before modern insurance and the welfare state, friendly societies provided financial and social services to individuals, often according to their religious, political, or trade affiliations.</p>
</blockquote>
<p>We stopped using friendly societies because the state got better at providing services. But if we think the state might not provide enough in future, that ecological niche reopens. Friendly societies were designed for exactly this—small groups, self-governing, built to function when larger institutions can’t or won’t. I gotta tell you, I think we need to plan for that; a Universal Basic Income <a href="https://post-agi.org/talks/korinek-economics-ai?ref=danmackinlay.name#transcript">ain’t gonna happen, baby</a>.</p>
<p>Earlier on this blog, thinking about these kinds of problems, I tried to start a <a href="../notebook/cohousing_australia.html">housing cooperative</a>; I’m a co-operative problem-solving kind of guy. This idea is <em>way easier</em> than that kind of cooperative. Housing is weird, and housing markets are weird.</p>
</section>
<section id="a-modern-citizen-supported-crisis-hedge" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="a-modern-citizen-supported-crisis-hedge"><span class="header-section-number">3</span> A modern citizen-supported crisis hedge</h2>
<p>I don’t think there is a strong argument for a <em>classic</em>-style friendly society that simply pools income to provide insurance. There are economies of scale to insurance that are hard to beat—if 10 people in my neighbourhood pool our income to make our own flood insurance fund, this is probably not great, because if we get flooded we will all be flooded at the same time. Nationwide insurance is most efficiently provided by nation-scale institutions, and the state is currently pretty good at that.</p>
<p>A more interesting, contemporary pitch is investing in counter-cyclical assets—things that might still be a store of value at the time when the state cuts back.</p>
<p>Here’s a model: we start a mutual aid society that takes membership fees and invests them in a diversified portfolio of industry-specific ETFs or unit trusts. These investments could grow over time, potentially faster than government tax income. When financial troubles hit, our society would have assets to negotiate and pay for services like healthcare and unemployment insurance.</p>
<p>This is riskier than classic income pooling, but that’s a feature. We don’t care if the friendly society does poorly in good times or during disasters the state would cover; we want it to be useful to its members in <em>bad</em> times. This thing makes sense as a crisis instrument—the scenario at the top of this post is what it looks like from the inside.</p>
<p>I would propose keeping each society small—maybe dozens of members. This dodges coordination problems, keeps trust personal, and means we can iterate fast rather than grinding through bureaucracy designed for large institutions. What follows is a worked example of what such institutions might look like. Scale would be by creating many such institutions, rather than trying to scale up to the size of a major insurance company, or a state.</p>
<p>Sound interesting? <a href="../contact.html">Get in touch</a>.</p>
</section>
<section id="interesting-assets" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="interesting-assets"><span class="header-section-number">4</span> Interesting assets</h2>
<p>Whatever the retail equivalent of <a href="https://en.wikipedia.org/wiki/Catastrophe_bond?ref=danmackinlay.name">Catastrophe bonds</a> is, for natural catastrophes. Critical minerals, for energy scarcity. We can invest in defence contractors if we’re worried about war, although that is distasteful for various reasons.</p>
</section>
<section id="interesting-services" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="interesting-services"><span class="header-section-number">5</span> Interesting services</h2>
<p>Could such societies negotiate other deals for their members by using institutional clout?</p>
</section>
<section id="prior-art" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="prior-art"><span class="header-section-number">6</span> Prior art</h2>
<section id="the-historical-record" class="level3" data-number="6.1">
<h3 data-number="6.1" class="anchored" data-anchor-id="the-historical-record"><span class="header-section-number">6.1</span> The historical record</h3>
<p>Friendly societies have deep roots—burial societies existed in ancient Greece and Rome, medieval guilds extended the idea to illness and other misfortune, and by the 19th century friendly societies were <em>enormous</em>. David Beito’s <a href="https://uncpress.org/9780807848418/from-mutual-aid-to-the-welfare-state/?ref=danmackinlay.name"><em>From Mutual Aid to the Welfare State</em></a> estimates that roughly a third of adult American men belonged to fraternal lodges by 1910, cutting across race, class, and gender lines. In Australia, the major orders—<a href="https://pursuit.unimelb.edu.au/articles/australia-s-friendly-history?ref=danmackinlay.name">Manchester Unity Oddfellows, Ancient Order of Foresters, the Druids, the Rechabites</a>—were central to colonial social infrastructure, providing sickness benefits, funeral funds, and medical access decades before the welfare state existed. <a href="https://www.australianunity.com.au/about-us/our-history?ref=danmackinlay.name">Australian Unity</a>, which still operates, traces its lineage to these traditions.</p>
<p>The standard narrative is that fraternal societies declined because the welfare state made them unnecessary. Beito’s counterargument is interesting: government programs <em>displaced</em> mutual aid, replacing reciprocity-based solidarity with paternalistic dependency. Whether or not you buy that framing in full, the relevant point for us is that the decline was contingent on the state actually providing. If state provision weakens, the ecological niche reopens. But: we would want to start such projects while we have the prosperity now, not wait until we lose the economic surplus that would have made them possible.</p>
</section>
<section id="modern-mutual-aid-revivals" class="level3" data-number="6.2">
<h3 data-number="6.2" class="anchored" data-anchor-id="modern-mutual-aid-revivals"><span class="header-section-number">6.2</span> Modern mutual aid revivals</h3>
<p>There’s a lot happening here already:</p>
<p><strong>Broodfonds (Bread Funds).</strong> A cute modern Dutch variant. <a href="https://en.wikipedia.org/wiki/Broodfonds?ref=danmackinlay.name">Broodfonds</a> started in the Netherlands in 2006 as a mutual sick-leave scheme for freelancers. Groups of 25–50 people each contribute €33–€112/month into individual dedicated accounts. If a member gets sick, the others “gift” them a modest income for up to two years. There are now <a href="https://www.shareable.net/dutch-collective-broodfonds-provides-gift-based-health-insurance-for-freelancers/?ref=danmackinlay.name">over 350 groups with 15,000+ members</a>. The gifts structure is a hack to avoid insurance regulation (in the Netherlands, at least), and the small group size keeps trust personal. A UK adaptation, <a href="https://mutualfirstaid.org.uk/?ref=danmackinlay.name">Mutual First Aid</a>, and a UK <a href="http://breadfunds.uk/?ref=danmackinlay.name">Bread Funds</a> project are attempting to transplant the model.</p>
<p><strong>COVID-era mutual aid networks.</strong> The pandemic saw a massive resurgence of mutual aid groups globally. In Australia, groups like Love Your Neighbour Melbourne (9,000+ members) organized grocery runs and other support. <a href="https://opencollective.com/mutualaidaustralia?ref=danmackinlay.name">Mutual Aid Australia</a> emerged as an umbrella cooperative. Most of these were informal—no investment function, no durable legal structure—but they demonstrated that the appetite for organized solidarity persists.</p>
<p><strong>ROSCAs and chamas.</strong> Rotating savings and credit associations are essentially friendly societies under another name, and they are alive and well globally—Kenyan <em>chamas</em>, Southeast Asian <em>tontines</em>, Latin American <em>tandas</em>. These are mostly informal but some have substantial assets.</p>
<p><strong>The Sustainable Economies Law Center</strong> has published a <a href="https://www.theselc.org/mutual_aid_toolkit?ref=danmackinlay.name">Mutual Aid Toolkit</a> addressing legal structures for mutual aid groups in the US context.</p>
</section>
</section>
<section id="ai-angles" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="ai-angles"><span class="header-section-number">7</span> AI Angles</h2>
<p>The historical friendly societies needed armies of volunteers to do administration—meeting minutes, accounts, claims processing, correspondence, rule-books. Modern financial regulation demands even more: risk management frameworks, actuarial reports, governance documentation, regulatory returns.</p>
<p>The bet here is that AI agents can compress much of this work. Not eliminate it—I imagine we would still need human judgement for the important decisions—but make it cheap enough that a group of 30–50 people can afford the overhead that used to require institutional scale.</p>
<p>I’ve asked my LLM research assistant for a <a href="../notebook/neo_friendly_societies_technical.html">detailed war-game of what this would look like</a>—itemising APRA compliance costs, estimating what AI can compress, and sketching the shoestring team we’d need. <strong>tl;dr</strong>: traditional compliance for a friendly society runs $100k–215k/year, which is death for a small mutual. With aggressive AI automation of documentation, regulatory reporting, and actuarial prep work, it looks like we could compress that to $41k–56k/year. Still painful at 50 members, but viable at 100+, especially if the compliance infrastructure is shared across a network of societies.</p>
<p>However, there are some workarounds—ultra-small boutique funds with only AUD2M, other legal structures that are not APRA-registered, and so on—that could be viable at smaller scale.</p>
<p>That companion post works through possible legal structures in Australian law—from full APRA registration down to a Broodfonds-style gift model—and a staged approach that lets us build capability incrementally without taking on institutional-scale costs from day one.</p>
</section>
<section id="replicating-to-other-mutual-aid-groups" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="replicating-to-other-mutual-aid-groups"><span class="header-section-number">8</span> Replicating to other mutual aid groups</h2>
<p>I think the most valuable thing we could produce isn’t a single friendly society but a template: legal docs, governance frameworks, software tools, investment strategies, compliance checklists, and lessons learned—all published openly so that anyone can fork the model.</p>
<p>The vision is many small societies (dozens of members each), loosely affiliated, sharing infrastructure and knowledge but independently governed. This keeps each group small enough for trust and agility, while the network as a whole achieves scale for collective bargaining and knowledge-sharing.</p>
<p>This is essentially the societal-scale part of the Broodfonds model—they published their framework and it replicated to 350+ groups. We’d ideally be doing the same thing as far as replication goes.</p>
</section>
<section id="actually-democratizing-to-all-of-society" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="actually-democratizing-to-all-of-society"><span class="header-section-number">9</span> Actually democratizing to all of society</h2>
<p>If we hope that friendly societies might be a universal solution to mutual aid: no. This model is great for middle-class people who already have some surplus income. A mutual aid society might help keep middle-class people above the poverty line, but it won’t help people who are already below it.</p>
<p>How about everyone else? As I learned in <a href="../notebook/neo_friendly_societies_technical.html">that companion post</a>, the baseline running costs for these things are high, so we cannot access them if we’re already broke. We could massively lower the entry costs with regulatory reform, but on the short timescale I am interested in (i.e.&nbsp;starting now and making the next handful of years go better while the state dilly-dallies) this is not going to be a thing. Anyway, on that longer time scale, I would probably put my energy into lobbying the state to directly insure the population’s income, rather than lowering the barrier for mutual aid societies.</p>
<p>Also, even with regulatory reform, if we have less capital to get returns from, we get less return.</p>
<p>That said, while recognising that a neo-friendly society would be an instrument for middle-class welfare, I think it is worth considering anyway, because keeping middle-class people above the poverty line is also a good idea.</p>
</section>
<section id="open-questions" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="open-questions"><span class="header-section-number">10</span> Open questions</h2>
<ul>
<li>Is there appetite for this among people I actually know (as opposed to strangers on the internet, where there’s appetite for everything)?</li>
<li>What does the right counter-cyclical portfolio actually look like?—catastrophe bonds, critical minerals ETFs, and defence stocks are low-effort examples, but designing a real crisis-hedge portfolio needs serious thought.</li>
<li>What are existing Australian co-ops or mutuals doing that’s close to this vision—and what can we learn from them?</li>
<li>A bunch of legal and regulatory questions that I’ve tried to <a href="../notebook/neo_friendly_societies_technical.html">work through in that companion post</a>.</li>
</ul>
<p>If you know about any of this, I’d <a href="../contact.html">love to hear from you</a>. And, like, soon. We should probably have started this already if we wanted to do it, but maybe it’s not too late.</p>


</section>

 ]]></description>
  <category>communicating</category>
  <category>community project</category>
  <category>cooperation</category>
  <category>diy</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>markets</category>
  <category>mind</category>
  <category>money</category>
  <category>straya</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/neo_friendly_societies.html</guid>
  <pubDate>Mon, 27 Oct 2025 23:11:18 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/boat_partyyy_RP-P-1887-A-12200.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Delegated agent governance</title>
  <link>https://danmackinlay.name/notebook/delegated_agent_governance.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-demon-contracxt" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-demon-contracxt-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/demon_contracxt_RP-P-OB-6815.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/demon_contracxt_RP-P-OB-6815.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-demon-contracxt-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Could Hayek’s dream of distributed information flows through the economy be put into practice in a more humane way using AI agents?</p>
<p>This is the <em>all-in</em> version of <a href="../notebook/civic_tech.html">civic tech</a>: we lean into massive-scale agent management. The civic-tech tools keep humans as the deliberators and use AI to mediate, bridge, or aggregate; here we contemplate handing the negotiating itself to AI agents acting as personal fiduciaries. Both branches inherit the same downstream problems — adversarial manipulation, alignment of agent to principal, separating belief from preference from affective signal — and the institutional-design trade-offs surveyed in <a href="../notebook/epistemic_community.html">epistemic communities</a> apply to either layer of the stack. Learning from the madness of crowds covers the formal multi-agent question of how a learner can reliably reconstruct what a population of strategic agents actually believes — a problem this notebook’s fiduciary agents must solve <em>internally</em>, against a population of one.</p>
<p>I have many thoughts about the risks and opportunities here. For now, just a placeholder.</p>
<section id="coasean-singularity" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="coasean-singularity"><span class="header-section-number">1</span> Coasean Singularity</h2>
<p>Seb Krier argues in <a href="https://blog.cosmos-institute.org/p/coasean-bargaining-at-scale?ref=danmackinlay.name">Coasean Bargaining at Scale</a> that a Coasean Singularity is arriving.</p>
<blockquote class="blockquote">
<p>[…] consider AGI deployed as a vast ecology of personalized agents and systems. This emerging ecosystem is what <span class="citation" data-cites="Tomasev2025Virtual">Tomašev et al. (2025)</span> characterize as the “virtual agent economy” a new economic layer where agents transact and coordinate at scales and speeds beyond direct human oversight. While this ecology will contain countless specialized agents, let’s focus on the one that matters most from an individual’s perspective: your personal advocate. Think of it as a fiduciary extension of yourself: a tireless, extremely competent digital representative, closely tied to you, its principal.</p>
<p>What could such an agent do? In principle, it can negotiate, calculate, compare, coordinate, verify, monitor, and much more in a split second. Through many multi-turn conversations, tweaking knobs and sliders, and continuous learning, it could also develop an increasingly sophisticated (though never perfect) model of who you are, your preferences, personal circumstances, values, resources, and more. This should evolve over time—an agent’s alignment should follow the principal’s own evolution. Recent research <span class="citation" data-cites="Goyal2024Designing">(Goyal, Chang, and Terry 2024)</span> on negotiation agents finds that “human-agent alignment” is profoundly personal. Users expect agents to not only execute goals but also embody their identity, requiring alignment on everything from preferred negotiation tactics to personal ethical boundaries and the specific public reputation they wanted to project. There are of course important privacy considerations here, but none of these seem fundamentally intractable. For example these systems could be built on technologies like zero-knowledge proofs and differential privacy, ensuring that preferences are communicated and aggregated without revealing sensitive underlying data.</p>
</blockquote>
<p>See also <span class="citation" data-cites="Shahidi2025Coasean">Shahidi et al. (2025)</span>.</p>
<p>The argument is that a sufficiently advanced economic negotiation might be indistinguishable from democratic consensus-building, and that the economic and political spheres might merge in a Coasean Singularity—or at least that this is a possible future.</p>
</section>
<section id="meaning-economy" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="meaning-economy"><span class="header-section-number">2</span> “Meaning economy”</h2>
<p>A slightly more galaxy-brained version: price signals and contracts are the medium of communication, and the goal is to coordinate economic activity in such a way that it maximizes something richer than the classical revealed preferences of neoclassical economics.</p>
<p>A related concept from Joe Edelman (of Couchsurfing fame): markets aligned with “deep human values”: <a href="https://meaningalignment.substack.com/p/market-intermediaries-a-post-agi?ref=danmackinlay.name">Market Intermediaries</a>.</p>
</section>
<section id="thick-models-of-value" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="thick-models-of-value"><span class="header-section-number">3</span> Thick models of value</h2>
<p>I feel like the <em>thick models of value</em> concept might need to be pried apart from the specific institutional design of market intermediaries, but it’s worth noting that the two are related.</p>
<p><a href="https://www.full-stack-alignment.ai/about?ref=danmackinlay.name">Full-Stack Alignment: Co-Aligning AI and Institutions with Thick Models of Value</a>:</p>
<blockquote class="blockquote">
<p>Full-Stack Alignment is a collaborative project led by the <a href="https://meaningalignment.org/?ref=danmackinlay.name">Meaning Alignment Institute</a> and a small group of outside researchers. Our goal is to align AI and institutions with what people value, from each individual’s pursuit of their vision of the good life to the collective achievement of shared values and ideals. In other words, we want AI systems and institutions that fit human values and sociality well, where the AI systems and their institutions are compatible.</p>
<p>We argue that our current societal stack is misaligned in many places; we have markets that favor things that are addictive and isolating, and our democratic institutions are polarizing us. Things will get worse as AI displace workers entirely, outspeed regulation, and outmanouver lawyers. In our near-term future we risk sudden or <a href="https://gradual-disempowerment.ai/?ref=danmackinlay.name">gradual disempowerment</a> as our economic and democratic agency erodes.</p>
<p>This challenge may seem insurmountable. We disagree, and argue this intractability stems from how we model what humans care about in our AI, markets and democracies—in our <a href="https://www.full-stack-alignment.ai/paper?ref=danmackinlay.name">position paper</a>, we summarize these approaches as “Preferentist models of value” (PMV) and “Values-as-text” (VAT). Both of these fail to capture the richness of human motivation. Consequently, a desire for “meaningful connection” becomes “engagement metrics” to recommender systems, which becomes “daily active users” to companies, and “quarterly revenue” in markets. Instead, we propose a new paradigm — “Thick models of value” (TMV). This is an emerging field, but new research shows great promise and we are optimistic about using it to achieve Full-Stack Alignment.</p>
</blockquote>
</section>
<section id="incoming" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="incoming"><span class="header-section-number">4</span> Incoming</h2>
<ul>
<li><a href="https://forum.effectivealtruism.org/topics/comprehensive-ai-services?ref=danmackinlay.name">Comprehensive AI Services - EA Forum</a></li>
<li><a href="https://www.alignmentforum.org/posts/a5NxvzFGddj2e8uXQ/updating-drexler-s-cais-model?ref=danmackinlay.name">Updating Drexler’s CAIS model — AI Alignment Forum</a></li>
</ul>
</section>
<section id="references" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="references"><span class="header-section-number">5</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Burton2024Howa" class="csl-entry">
Burton, Lopez-Lopez, Hechtlinger, et al. 2024. <span>“<a href="https://doi.org/10.1038/s41562-024-01959-9">How Large Language Models Can Reshape Collective Intelligence</a>.”</span> <em>Nature Human Behaviour</em>.
</div>
<div id="ref-chen2024imperfect" class="csl-entry">
Chen, Ghersengorin, and Petersen. 2024. <span>“<a href="https://drive.google.com/file/d/1nIEjKm1AlBP1bzNMkEbtHW31G166KbR_/view">Imperfect Recall and AI Delegation</a>.”</span>
</div>
<div id="ref-Edelman2025FullStack" class="csl-entry">
Edelman, Tan, Lowe, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2512.03399">Full-Stack Alignment: Co-Aligning AI and Institutions with Thick Models of Value</a>.”</span> In.
</div>
<div id="ref-Franklin2022Preference" class="csl-entry">
Franklin, and Ashton. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2206.10300">Preference Change in Persuasive Robotics</a>.”</span>
</div>
<div id="ref-Franklin2022Recognising" class="csl-entry">
Franklin, Ashton, Gorman, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2203.10525">Recognising the Importance of Preference Change: A Call for a Coordinated Multidisciplinary Research Effort in the Age of AI</a>.”</span>
</div>
<div id="ref-Gabriel2020Artificial" class="csl-entry">
Gabriel. 2020. <span>“<a href="https://doi.org/10.1007/s11023-020-09539-2">Artificial Intelligence, Values, and Alignment</a>.”</span> <em>Minds and Machines</em>.
</div>
<div id="ref-Gabriel2024Ethics" class="csl-entry">
Gabriel, Manzini, Keeling, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.16244">The Ethics of Advanced AI Assistants</a>.”</span>
</div>
<div id="ref-Goyal2024Designing" class="csl-entry">
Goyal, Chang, and Terry. 2024. <span>“<a href="https://doi.org/10.1145/3613905.3650948">Designing for Human-Agent Alignment: Understanding What Humans Want from Their Agents</a>.”</span> In <em>Extended Abstracts of the CHI Conference on Human Factors in Computing Systems</em>.
</div>
<div id="ref-Hadfield2025Economy" class="csl-entry">
Hadfield, and Koh. 2025. <span>“<a href="http://arxiv.org/abs/2509.01063">An Economy of AI Agents</a>.”</span> In <em>The Economics of Transformative AI</em>.
</div>
<div id="ref-Kim2020Deep" class="csl-entry">
Kim. 2020. <span>“<a href="https://doi.org/10.1016/j.techsoc.2020.101378">Deep Learning and Principal–Agent Problems of Algorithmic Governance: The New Materialism Perspective</a>.”</span> <em>Technology in Society</em>.
</div>
<div id="ref-Klingefjord2024What" class="csl-entry">
Klingefjord, Lowe, and Edelman. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.10636">What Are Human Values, and How Do We Align AI to Them?</a>”</span>
</div>
<div id="ref-Levine2024Resourcerational" class="csl-entry">
Levine, Chater, Tenenbaum, et al. 2024. <span>“<a href="https://doi.org/10.1017/S0140525X24001067">Resource-Rational Contractualism: A Triple Theory of Moral Cognition</a>.”</span> <em>Behavioral and Brain Sciences</em>.
</div>
<div id="ref-Shahidi2025Coasean" class="csl-entry">
Shahidi, Rusak, Manning, et al. 2025. <span>“<a href="https://doi.org/10.3386/w34468">The Coasean Singularity? Demand, Supply, and Market Design with AI Agents</a>.”</span> In. Working Paper Series.
</div>
<div id="ref-Tomasev2025Virtual" class="csl-entry">
Tomašev, Franklin, Leibo, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2509.10147">Virtual Agent Economies</a>.”</span>
</div>
<div id="ref-ZhiXuan2025Preferences" class="csl-entry">
Zhi-Xuan, Carroll, Franklin, et al. 2025. <span>“<a href="https://doi.org/10.1007/s11098-024-02249-w">Beyond Preferences in AI Alignment</a>.”</span> <em>Philosophical Studies</em>.
</div>
</div>


</section>

 ]]></description>
  <category>adversarial</category>
  <category>AI safety</category>
  <category>bounded compute</category>
  <category>communicating</category>
  <category>cooperation</category>
  <category>culture</category>
  <category>economics</category>
  <category>extended self</category>
  <category>faster pussycat</category>
  <category>incentive mechanisms</category>
  <category>institutions</category>
  <category>language</category>
  <category>machine learning</category>
  <category>markets</category>
  <category>mind</category>
  <category>money</category>
  <category>neural nets</category>
  <category>NLP</category>
  <category>security</category>
  <category>technology</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/delegated_agent_governance.html</guid>
  <pubDate>Mon, 27 Oct 2025 23:11:18 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/demon_contracxt_RP-P-OB-6815.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Learning to act in generative settings</title>
  <link>https://danmackinlay.name/notebook/action_generative.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-elephant-seats-steamhouse" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-elephant-seats-steamhouse-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/elephant_seats_steamhouse00vern_0203.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/elephant_seats_steamhouse00vern_0203.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-elephant-seats-steamhouse-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Learning to act in generative action sets. A theory of how <a href="../notebook/reinforcement_learning.html">learning to act</a> operates in an <a href="../notebook/open_ended_intelligence.html">open world</a> using <a href="../notebook/nn_generative.html">generative models</a>.</p>
<section id="generative-models-as-rl-policies" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="generative-models-as-rl-policies"><span class="header-section-number">1</span> Generative Models as RL Policies</h2>
<ul>
<li><span class="citation" data-cites="Janner2022Planning">Janner et al. (2022)</span> → First work treating diffusion models as control policies; inspired “Diffusion‑DICE”.</li>
<li><span class="citation" data-cites="Chen2021Decision">Chen et al. (2021)</span> → Pioneered autoregressive policy generation conditioned on rewards and trajectories.</li>
<li><span class="citation" data-cites="Lu2023Contrastive">Lu et al. (2023)</span> → Introduced energy‑based control of diffusion policies — a bridge to goal‑conditioned RL.</li>
<li><span class="citation" data-cites="Mao2024DiffusionDICE">Mao et al. (2024)</span> → The canonical “generative action set” model: combines denoising diffusion with dual‑form RL.</li>
</ul>
</section>
<section id="generative-models-as-world-models" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="generative-models-as-world-models"><span class="header-section-number">2</span> Generative Models as World Models</h2>
<p>We should look that up too</p>
</section>
<section id="dual-contrastive-formulations" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="dual-contrastive-formulations"><span class="header-section-number">3</span> Dual &amp; Contrastive Formulations</h2>
<ul>
<li>*<span class="citation" data-cites="Nachum2020Reinforcement">Nachum and Dai (2020)</span> → Mathematical foundation for the DICE family of dual generative RL objectives.</li>
<li>*<span class="citation" data-cites="Sikchi2025RLZero">Sikchi et al. (2025)</span>. → Unifies DICE and generative imitation through f‑divergence matching.</li>
<li><span class="citation" data-cites="Eysenbach2022Contrastive">Eysenbach et al. (2022)</span> → Connects InfoNCE and successor features — key to generative goal‑reaching.</li>
<li><span class="citation" data-cites="Blier2021Learning">Blier, Tallec, and Ollivier (2021)</span> → Formal basis for contrastive successor measures and generative planning.</li>
</ul>
</section>
<section id="goal-conditioned-and-generative-action-rl" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="goal-conditioned-and-generative-action-rl"><span class="header-section-number">4</span> Goal-Conditioned and Generative Action RL</h2>
<ul>
<li><span class="citation" data-cites="Eysenbach2021Information">Eysenbach, Salakhutdinov, and Levine (2021)</span> — → Reframes unsupervised skill discovery as a generative manifold problem.</li>
<li><span class="citation" data-cites="Ghosh2020Learning">Ghosh et al. (2020)</span> → Empirical foundations for goal‑conditioned generative imitation.</li>
<li><span class="citation" data-cites="Liu2024Single">Liu, Tang, and Eysenbach (2024)</span> → Shows emergent skill learning purely from generative contrastive objectives.</li>
</ul>
</section>
<section id="self-generating-feedback-and-exploration" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="self-generating-feedback-and-exploration"><span class="header-section-number">5</span> Self-Generating Feedback and Exploration</h2>
<ul>
<li>*<span class="citation" data-cites="Klyubin2005All">Klyubin, Polani, and Nehaniv (2005)</span> connects this work to <a href="../notebook/intrinsic_motivation.html">empowerment</a>. → Origin of intrinsic‑motivation‑as‑generative‑exploration.</li>
<li><span class="citation" data-cites="Eysenbach2018Diversity">Eysenbach et al. (2018)</span> — <em>DIAYN: Diversity Is All You Need</em>. → Canonical “self‑generative” skill‑discovery paper using MI‑based objectives.</li>
<li><em><span class="citation" data-cites="Sikchi2025RLZero">Sikchi et al. (2025)</span> — → Defines RLZero: </em>language‑conditioned generative action sets* and zero‑shot policy generation.</li>
</ul>
<hr>
</section>
<section id="incoming" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="incoming"><span class="header-section-number">6</span> Incoming</h2>
<ul>
<li><a href="https://generative-rl-tutorial.github.io/?ref=danmackinlay.name">generative-rl-tutorial.github.io</a></li>
</ul>
<blockquote class="blockquote">
<p>Abstract: This tutorial explores the intersection of generative AI and reinforcement learning, demonstrating how generative models can be understood as RL agents and environments, and conversely, how RL can be viewed as generative modeling. It aims to bridge the gap between these fields, showing how insights from each can enhance the other. The workshop will cover topics such as reinterpreting generative AI training through an RL lens, adapting generative AI to build new RL algorithms, and understanding how AI agents interacting with tools and humans create a new generative model. It will also discuss future directions and open problems, focusing on how RL can shape the future of foundation model training and enable generative AI systems to construct their own knowledge.</p>
</blockquote>
<p><span class="citation" data-cites="Xu2025Online">Xu et al. (2025)</span>:</p>
<blockquote class="blockquote">
<p>With advances in generative AI, decision-making agents can now dynamically create new actions during online learning, but action generation typically incurs costs that must be balanced against potential benefits. We study an online learning problem where an agent can generate new actions at any time step by paying a one-time cost, with these actions becoming permanently available for future use. The challenge lies in learning the optimal sequence of two-fold decisions: which action to take and when to generate new ones, further complicated by the triangular tradeoffs among exploitation, exploration and <img src="https://latex.codecogs.com/png.latex?%5Ctextit%7Bcreation%7D">. To solve this problem, we propose a doubly-optimistic algorithm that employs Lower Confidence Bounds (LCB) for action selection and Upper Confidence Bounds (UCB) for action generation. Empirical evaluation on healthcare question-answering datasets demonstrates that our approach achieves favorable generation-quality tradeoffs compared to baseline strategies. From theoretical perspectives, we prove that our algorithm achieves the optimal regret of <img src="https://latex.codecogs.com/png.latex?O(T%5E%7B%5Cfrac%7Bd%7D%7Bd+2%7D%7Dd%5E%7B%5Cfrac%7Bd%7D%7Bd+2%7D%7D%20+%20d%5Csqrt%7BT%5Clog%20T%7D)">, providing the first sublinear regret bound for online learning with expanding action spaces.</p>
</blockquote>
</section>
<section id="references" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="references"><span class="header-section-number">7</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Ajay2023Conditional" class="csl-entry">
Ajay, Du, Gupta, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2211.15657">Is Conditional Generative Modeling All You Need for Decision-Making?</a>”</span> In.
</div>
<div id="ref-Blier2021Learning" class="csl-entry">
Blier, Tallec, and Ollivier. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2101.07123">Learning Successor States and Goal-Dependent Values: A Mathematical Viewpoint</a>.”</span>
</div>
<div id="ref-Chen2021Decision" class="csl-entry">
Chen, Lu, Rajeswaran, et al. 2021. <span>“<a href="http://arxiv.org/abs/2106.01345">Decision Transformer: Reinforcement Learning via Sequence Modeling</a>.”</span> In <em>Advances in Neural Information Processing Systems</em>.
</div>
<div id="ref-Du2023What" class="csl-entry">
Du, Kosoy, Dayan, et al. 2023. <span>“<a href="https://openreview.net/forum?id=aFEZdGL3gn">What Can AI Learn from Human Exploration? Intrinsically-Motivated Humans and Agents in Open-World Exploration</a>.”</span> In.
</div>
<div id="ref-Eysenbach2018Diversity" class="csl-entry">
Eysenbach, Gupta, Ibarz, et al. 2018. <span>“<a href="http://arxiv.org/abs/1802.06070">Diversity Is All You Need: Learning Skills Without a Reward Function</a>.”</span> In.
</div>
<div id="ref-Eysenbach2021Information" class="csl-entry">
Eysenbach, Salakhutdinov, and Levine. 2021. <span>“<a href="https://openreview.net/forum?id=3wU2UX0voE">The Information Geometry of Unsupervised Reinforcement Learning</a>.”</span> In.
</div>
<div id="ref-Eysenbach2022Contrastive" class="csl-entry">
Eysenbach, Zhang, Levine, et al. 2022. <span>“<a href="https://openreview.net/forum?id=vGQiU5sqUe3">Contrastive Learning as Goal-Conditioned Reinforcement Learning</a>.”</span> In <em>NeurIPS</em>.
</div>
<div id="ref-Ghosh2020Learning" class="csl-entry">
Ghosh, Gupta, Reddy, et al. 2020. <span>“<a href="https://openreview.net/forum?id=rALA0Xo6yNJ">Learning to Reach Goals via Iterated Supervised Learning</a>.”</span> In.
</div>
<div id="ref-Janner2022Planning" class="csl-entry">
Janner, Du, Tenenbaum, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2205.09991">Planning with Diffusion for Flexible Behavior Synthesis</a>.”</span> In <em>Proceedings of the 39th International Conference on Machine Learning</em>.
</div>
<div id="ref-Klyubin2005All" class="csl-entry">
Klyubin, Polani, and Nehaniv. 2005. <span>“<a href="https://doi.org/10.1007/11553090_75">All Else Being Equal Be Empowered</a>.”</span> In <em>Advances in Artificial Life</em>. Lecture Notes in Computer Science.
</div>
<div id="ref-Liu2024Single" class="csl-entry">
Liu, Tang, and Eysenbach. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2408.05804">A Single Goal Is All You Need: Skills and Exploration Emerge from Contrastive RL Without Rewards, Demonstrations, or Subgoals</a>.”</span> In <em>International Conference on Learning Representations</em>.
</div>
<div id="ref-Lu2023Contrastive" class="csl-entry">
Lu, Chen, Chen, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2304.12824">Contrastive Energy Prediction for Exact Energy-Guided Diffusion Sampling in Offline Reinforcement Learning</a>.”</span>
</div>
<div id="ref-Mao2024DiffusionDICE" class="csl-entry">
Mao, Xu, Zhan, et al. 2024. <span>“<a href="http://arxiv.org/abs/2407.20109">Diffusion-DICE: In-Sample Diffusion Guidance for Offline Reinforcement Learning</a>.”</span> In <em>NeurIPS</em>.
</div>
<div id="ref-Nachum2020Reinforcement" class="csl-entry">
Nachum, and Dai. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2001.01866">Reinforcement Learning via Fenchel-Rockafellar Duality</a>.”</span> In.
</div>
<div id="ref-Ringstrom2023Reward" class="csl-entry">
Ringstrom. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2211.10851">Reward Is Not Necessary: How to Create a Modular &amp; Compositional Self-Preserving Agent for Life-Long Learning</a>.”</span>
</div>
<div id="ref-Schmidhuber2010Formal" class="csl-entry">
Schmidhuber. 2010. <span>“<a href="https://doi.org/10.1109/TAMD.2010.2056368">Formal Theory of Creativity, Fun, and Intrinsic Motivation (1990–2010)</a>.”</span> <em>IEEE Transactions on Autonomous Mental Development</em>.
</div>
<div id="ref-Sikchi2025RLZero" class="csl-entry">
Sikchi, Agarwal, Jajoo, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2412.05718">RLZero: Direct Policy Inference from Language Without In-Domain Supervision</a>.”</span> In <em>ICLR</em>.
</div>
<div id="ref-Steinberg2024Variational" class="csl-entry">
Steinberg, Oliveira, Ong, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2409.06142">Variational Search Distributions</a>.”</span>
</div>
<div id="ref-Xi2023Indeterminacy" class="csl-entry">
Xi, and Bloem-Reddy. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2206.00801">Indeterminacy in Generative Models: Characterization and Strong Identifiability</a>.”</span> In.
</div>
<div id="ref-Xu2025Online" class="csl-entry">
Xu, Jain, Wilder, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2509.25777">Online Decision Making with Generative Action Sets</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>energy</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>gene</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>networks</category>
  <category>probability</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/action_generative.html</guid>
  <pubDate>Mon, 06 Oct 2025 01:18:10 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/elephant_seats_steamhouse00vern_0203.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Hanging out my shingle</title>
  <link>https://danmackinlay.name/post/my_shingle.html</link>
  <description><![CDATA[ 



<div class="audience">
    <h3 class="notification-title anchored">Assumed audience:</h3>
    <p>Other people interested in world-saving work</p>
</div>




<div class="quarto-title-meta">

    
    </div>





<div id="fig-turban-spruiker" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-turban-spruiker-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/turban_spruiker_RP-P-2010-26.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/turban_spruiker_RP-P-2010-26.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-turban-spruiker-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>A career-defining decision I made last month clarified a few things. I had the incredible privilege of turning down a job offer I’d worked towards for a decade. Notionally, it was my dream job — working on an important problem with people I respect, using my skills and aligning with my research interests. Moreover, such jobs are unobtainium in Australia at the moment, since <a href="../notebook/science_in_australia.html">Australia is not very serious about science and technology</a> compared with more advanced economies. I was perplexed to discover I hadn’t accepted the job.</p>
<p>The decision came down to impact. At this stage of the polycrisis, I have a fire in me to work not just on <em>impactful things</em>, but on the places where I can make the <em>most</em> impact. If we — humanity, I mean — are going to successfully navigate the next century, I think we need to work on the most urgent things.</p>
<p>So, having made this choice,<sup>1</sup> I need to take that goal seriously. While I still have the luxury of choice for this brief time, I must work out how to achieve this <em>impact</em> I’m seeking.</p>
<p>Thus! I’m hanging out my shingle. <strong>Who wants to work with me?</strong> <strong>On what?</strong></p>
<section id="the-most-urgent-thing" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="the-most-urgent-thing"><span class="header-section-number">1</span> The most urgent thing</h2>
<p>I need to scope what I mean by <em>impact</em>. For these purposes, it’s <a href="../notebook/ai_safety.html">AI safety</a>. I think we’re mishandling every aspect of the transition to an AI-driven society. Many parts of this transition will probably go awry unless we invest in proper mitigations, and right now we’re not doing well.</p>
<p>My risk model here is broad.</p>
<ul>
<li>There’s a risk of perpetuating or worsening inequality across society.</li>
<li>We have a real chance of losing the delicate human understanding that underpins liberal society and democracy.</li>
<li>There’s also the danger of total epistemic collapse: we could lose the ability to understand the world and make good decisions, drowning in a sea of AI slop.</li>
<li>Moreover, we face psychological risks of becoming alienated as machine intelligences infiltrate every aspect of our lives.</li>
<li>We risk being shot by autonomous, weaponized drones or hit by AI-engineered bioweapons as geopolitical tensions rise.</li>
<li>There’s the looming threat of autonomous intelligent algorithms spiralling out of control and causing untold harm to humanity for their own reasons.</li>
</ul>
<p>We need to address <em>all</em> these issues, and quickly. The time to work on improving this situation is not after a disaster strikes, but before it does.</p>
<p>There are many other massive problems in society, but this is the one that will hit us <em>first</em>, because software moves so damn fast. We need to get it solved in order to work on the others.</p>
<p>I think it is very much worth working on AI safety now, because there is also a massive potential upside to getting it right. If we can get trustworthy, reliable versions of these tools in the hands of the people who need them, they could help us solve all the other problems we face, e.g.&nbsp;<a href="../notebook/climate_ml.html">climate change</a>, <a href="../notebook/civic_tech.html">democracy</a>, health, global poverty…</p>
</section>
<section id="what-i-am-up-for" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="what-i-am-up-for"><span class="header-section-number">2</span> What I am up for</h2>
<p>I could use ideas, collaborations, roles, co-founders, mentorship. New contacts. Old contacts who didn’t know I was looking. I want help to work out what I should do next to make a difference on this problem. Maybe we should work together?</p>
<p>I’m open for business, up for ideas, and ready to start things. I’m ready to join your project. I’m ready to found a new project. I’m looking for collaborators, co-founders, and employers. Solve an important scientific problem? Persuade an important institution to change its ways? Build a new institution?</p>
<p>The things I pursue should be impactful. Everything’s on the table right now. I’d work in your company, work for the government, or found a new venture. The key point here is that I’m prepared to trade prestige, esteem, and seniority for a chance to make tangible improvements.</p>
<p>Does that speak to you? Get in touch.</p>
<p>If you’re about to suggest some random non-impactful role, thank you kindly! But I don’t need help with such roles; I can find ’em myself.</p>
</section>
<section id="what-im-useful-for" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="what-im-useful-for"><span class="header-section-number">3</span> What I’m useful for</h2>
<p>Vanity deep research is the new vanity search! Here is what the algorithms say about me; <strong>tl;dr</strong> I’m some kind of futuristic Swiss army knife of AI research and strategy.</p>
<ul>
<li><a href="https://g.co/gemini/share/27842c9e0073?ref=danmackinlay.name">Gemini summary of me</a></li>
<li><a href="https://chatgpt.com/s/dr_68eede5750888191a44fd76ac1f82610?ref=danmackinlay.name">ChatGPT summary of me</a></li>
</ul>
<p>My key value proposition is that I’m good at several things you rarely find in the same person, which makes me excellent. Bluntly, my combination of IQ and EQ and domain expertise is rare. But let’s get into detail.</p>
<p>AI safety is something <a href="../about_dan.html">I am very qualified to help with</a>, as a machine learning expert with a broad view of the landscape and a lot of experience at the coalface. I’m a voraciously curious, smart guy who’s good at hard intellectual work, especially mathematical work. I’m highly motivated by difficult problems and interesting intellectual challenges. I’m driven by working with people towards shared goals. Projects that bring that enthusiasm to bear will go very well. My enthusiasm is a sandblaster which can wear down granite problems.</p>
<p>As my current<sup>2</sup> role (research scientist in a major ICT research lab) hopefully indicates, I’m a skilled artificial intelligence and machine learning researcher with a considerable ability to produce <a href="https://scholar.google.com/citations?user=JRD1yecAAAAJ&amp;hl=en&amp;oi=ao&amp;ref=danmackinlay.name">cutting edge AI methods</a>. I understand the mathematics of deep learning, linear algebra, probability theory, and physics modelling, and I’m one of those people who invent the algorithms that make the AI world progress. I <a href="../about_dan.html#publications">publish papers in top-tier machine learning conferences</a>, pushing forward the state of the art in these areas. In the world of machine learning research, my particular skill is <em>breadth</em>; people come to me when they need the right tool for a weird job, because I know many, many tools. If you want to know how to get 3% more performance out of your LLM training, you wouldn’t come to me. If you want to know how to replace your entire training pipeline with something radically better, I’m your guy.</p>
<p>I’m a qualified statistician and data scientist, with qualifications from a range of reputable universities. I have a deep understanding of, and experience in, statistics, probability, and causal inference. I can design experiments, analyse data, and draw valid conclusions. I’m trained in econometrics, ecology, geospatial data analysis, and epidemiology.</p>
<p>People skills: yes. I am intensely pro-social and collaborative, and I can get many people to argue that <em>when I am on a team the team works better</em>. If that doesn’t seem valuable to you, then we have very different models of where high performing projects come from. I can run projects involving people. I’ve managed lots of students, supervised a PhD, and run a number of conferences, workshops, and events. I get excellent results from teams I lead, and excellent exit interviews from people I manage. I’ve run projects in Southeast Asia, Switzerland, and Australia across multiple languages and multiple cultures. I’ve even organized bands, which is like organizing a conference but musicians are more tempestuous than baseline humans, so it counts double.</p>
<p>My <a href="../notebook/how_to_communicate.html">conflict style and communication hygiene</a> are strong. I can bring people together, resolve disputes, and get things done. I’m comfortable working with challenging personalities. I’m extremely good at getting to know people, socializing with them, and building bridges across cultural divides within and across nations, and across political positions. I’ve worked with people who have ADHD and autism.</p>
<p>I can code, of course. <a href="https://github.com/danmackinlay/?ref=danmackinlay.name">I’ve written reams of code</a>, but I’m not going to pitch that here, because software engineering is a real and deep field, and you should hire software engineers for engineering software. Specifically, if you want some software engineered, you’d be better off hiring someone who’s spent 10 years honing their coding skills rather than 10 years honing their mathematical skills.</p>
<p>I know how to communicate effectively between different disciplines—between scientists and the public as well as among scientists of various specializations. I’ve been a scientist in different fields myself. I have theory of mind about how different disciplines think, and I can translate between them.</p>
<p>I can write. In fact, I write constantly; I’ve penned over a million words on this blog and more in various other places, not just academic journals. I can write for different audiences, from technical papers to popular articles.</p>
<p>I’m not afraid of being in the spotlight. If you need a show pony, I’m that guy.</p>
</section>
<section id="constraints" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="constraints"><span class="header-section-number">4</span> Constraints</h2>
<section id="location" class="level3" data-number="4.1">
<h3 data-number="4.1" class="anchored" data-anchor-id="location"><span class="header-section-number">4.1</span> Location</h3>
<p>I’m in Melbourne, Australia. Australia is my country of citizenship. I can work remotely or on-site. I can travel internationally if needed. I can relocate for a strong proposition, though it would need to be worthwhile since I just bought a house here near my family. I prefer to work face-to-face, but I am already steeled to compromise on this if needed.</p>
</section>
<section id="remuneration" class="level3" data-number="4.2">
<h3 data-number="4.2" class="anchored" data-anchor-id="remuneration"><span class="header-section-number">4.2</span> Remuneration</h3>
<p>As a mid-career AI researcher, my market rate is notionally high, but I will discount for a role that achieves joy or impact. That is, I’m flexible. I can work for equity, for a salary, or for a stipend. I can work part-time or full-time. I can work as a contractor or as an employee. I can work in a startup or in a large organization. I’m open to various arrangements.</p>
<p>However, I need to keep paying my mortgage. Relatedly…</p>
</section>
<section id="runway" class="level3" data-number="4.3">
<h3 data-number="4.3" class="anchored" data-anchor-id="runway"><span class="header-section-number">4.3</span> Runway</h3>
<p>Less than is wise. My academic career choices have not been financially focused. I will need to secure a real income by May 2026 to keep the mortgage ticking.</p>
<p>I can start new full-time gigs <del>with 15 days’ notice, which is how long it would take to leave the current role.</del> from 2026. I would prefer no earlier than February, because, man, I need a small break after this gig. Negotiable for a good enough project, though.</p>
</section>
</section>
<section id="contact" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="contact"><span class="header-section-number">5</span> Contact</h2>
<p>Hit me up on <a href="../contact.html">my contact form</a>, or email me at dan@thisdomain.</p>
<p>You can also check out my <a href="../#category=proposal">funding proposals so far</a>.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>and believe me, I’m already <a href="../notebook/ai_safety_career_calibration.html">second-guessing myself</a>↩︎</p></li>
<li id="fn2"><p>I know it’s unusual to be pitching while in my current role, but CSIRO is a government research lab with a public mission, so I have no conflicts of interest here.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>adversarial</category>
  <category>AI safety</category>
  <category>catastrophe</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>incentive mechanisms</category>
  <category>innovation</category>
  <category>institutions</category>
  <category>machine learning</category>
  <category>networks</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/post/my_shingle.html</guid>
  <pubDate>Mon, 29 Sep 2025 08:31:26 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/turban_spruiker_RP-P-2010-26.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Probabilistic Dependency Graphs</title>
  <link>https://danmackinlay.name/notebook/graphical_models_pdg.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-fix-my-net" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-fix-my-net-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/fix_my_net_RP-P-BI-6560X.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/fix_my_net_RP-P-BI-6560X.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-fix-my-net-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Here’s an intriguing generalization of classical <a href="../notebook/graphical_models.html">graphical model</a> formalisms by <a href="https://orichardson.github.io/research/?ref=danmackinlay.name">Oli Richardson</a>, called <a href="https://orichardson.github.io/pdg/?ref=danmackinlay.name">Probabilistic Dependency Graphs</a>:</p>
<blockquote class="blockquote">
<p>Probabilistic Dependency Graphs (PDGs) are a powerful class of graphical model, that can model the combination of inconsistent beliefs. PDGs generalize Bayesian Networks and Factor graphs, but are arguably more natural to use. This measure of inconsistency is itself quite useful: many information theoretically-motivated notions of loss functions and statistical distances arise naturally as the inconsistencies of the appropriate PDGs. Moreover, relationships between these PDGs give very simple intuitive proofs of otherwise fairly inscrutable results, such as variational bounds, and bounds between statistical distances.</p>
</blockquote>
<p>This is a mere placeholder for now. FWIW, the attractions of the PDG framework seem to me very provocative, and I’m especially intrigued by them as a potential formalism for constructing <a href="../notebook/bayes_generalized.html">a Generalized Bayesianism</a> by other means than infrabayesianism or ad hoc <a href="../notebook/bayes_by_backprop.html">Bayes by backprop</a>. OTOH they also seem a little bit annoying to compute, so there is more work to be done here.</p>
<ul>
<li><a href="https://github.com/orichardson/pdg?ref=danmackinlay.name">orichardson/pdg: probabilistic dependency graph implementation and tools</a></li>
</ul>
<section id="references" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="references"><span class="header-section-number">1</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Richardson2022Loss" class="csl-entry">
Richardson, Oliver E. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2202.11862">Loss as the Inconsistency of a Probabilistic Dependency Graph: Choose Your Model, Not Your Loss Function</a>.”</span>
</div>
<div id="ref-Richardson2024Unified" class="csl-entry">
Richardson, Oliver. 2024. <span>“<a href="https://www.cs.cornell.edu/~oli/files/oli-dissertation.pdf">A Unified Theory of Probabilistic Modeling, Dependence, and Inconsistency</a>.”</span>
</div>
<div id="ref-Richardson2025Learning" class="csl-entry">
Richardson, Oliver Ethan. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2508.11037">Learning with Confidence</a>.”</span>
</div>
<div id="ref-Richardson2020Probabilistic" class="csl-entry">
Richardson, Oliver, and Halpern. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2012.10800">Probabilistic Dependency Graphs</a>.”</span>
</div>
<div id="ref-Richardson2023Inference" class="csl-entry">
Richardson, Oliver E., Halpern, and Sa. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2311.05580">Inference for Probabilistic Dependency Graphs</a>.”</span>
</div>
<div id="ref-Richardson2024Qualitative" class="csl-entry">
Richardson, Oliver E., Peters, and Halpern. 2024. <span>“<a href="https://proceedings.neurips.cc/paper_files/paper/2024/hash/80b7bec60081f95d900973509744a306-Abstract-Conference.html">Qualitative Mechanism Independence</a>.”</span> <em>Advances in Neural Information Processing Systems</em>.
</div>
</div>


</section>

 ]]></description>
  <category>algebra</category>
  <category>graphical models</category>
  <category>machine learning</category>
  <category>networks</category>
  <category>probability</category>
  <category>statistics</category>
  <guid>https://danmackinlay.name/notebook/graphical_models_pdg.html</guid>
  <pubDate>Mon, 15 Sep 2025 03:30:14 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/fix_my_net_RP-P-BI-6560X.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Deep linear networks</title>
  <link>https://danmackinlay.name/notebook/nn_deep_linear.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-crocodile-prodder" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-crocodile-prodder-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/crocodile_prodder_RP-P-BI-5294.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/crocodile_prodder_RP-P-BI-5294.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-crocodile-prodder-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I want a theory that predicts <em>which</em> features deep nets learn, <em>when</em> they learn them, and <em><a href="../notebook/nn_why.html">why</a></em>. But neural nets are messy and hard to analyse, so we need a way to simplify them for analysis that still recovers the properties we care about.</p>
<p>Deep linear networks (DLNs) are one attempt: models that keep depth, nonconvexity, and hierarchical representation formation while remaining analytically tractable. In principle, they let me connect data geometry (singular values/vectors) to gradient-flow trajectories: which modes win first, how layers align, and why low-rank semantic structure emerges.</p>
<p>I haven’t been terribly convinced that they’re plausible models for the things I care about — they’re just linear functions written a weird way, right? But what about mixtures of linear functions? Gated neural networks <span class="citation" data-cites="Li2022Globally Saxe2022Neural">(Li and Sompolinsky 2022; A. Saxe, Sodhani, and Lewallen 2022)</span> are a weird type of mixture over a weird type of linear model that just about approximates a ReLU activation if we treat it right. I just saw Devon Jarvis present the work <span class="citation" data-cites="Jarvis2024Make">Jarvis et al. (2024)</span>, which pushes this quite a long way as a model for a kind of multi-modal network, so I’m now more receptive to the idea that these things could actually be useful</p>
<p>A dot-point curriculum that gets me from deep linear networks to their gated (and ReLU-equivalent) extensions.</p>
<ul>
<li><p>The absolute essentials: <a href="../notebook/linear_algebra.html">SVD, eigendecompositions</a>, <a href="../notebook/matrix_calculus.html">matrix calculus</a>, <a href="../notebook/gradient_flows.html">gradient flow/continuous-time limit</a>. Note the classic non-convexity result (in weight space) and why depth changes dynamics <span class="citation" data-cites="Baldi1989Neural Fukumizu1998Effect">(Baldi and Hornik 1989; Fukumizu 1998)</span>.</p></li>
<li><p>Next: the exact gradient-flow dynamics of deep linear networks from first principles, including the SVD change of variables, balanced solutions, mode decoupling, and closed-form singular-value trajectories <span class="citation" data-cites="Saxe2014Exact">(Andrew M. Saxe, McClelland, and Ganguli 2014)</span>.</p></li>
<li><p>Structured datasets and “semantic development” in deep linear nets—how hierarchies emerge mode-by-mode, and why the time course depends on Σ_yx singular values while the fixed point depends on Σ_x (<span class="citation" data-cites="Saxe2019Mathematical">Andrew M. Saxe, McClelland, and Ganguli (2019)</span>). I’ll reproduce the hierarchy demo and plot singular-value races.</p></li>
<li><p>“low-rank simplicity bias” and its consequences for feature learning and generalization in linear (and near-linear) regimes <span class="citation" data-cites="Huh2023LowRank">(Huh et al. 2023)</span> — sounds interesting.</p></li>
<li><p>Gated Deep Linear Network (GDLN) formalism and the <em>neural race reduction</em>—how gating induces pathway-specific effective datasets and why “fastest path wins” (<span class="citation" data-cites="Saxe2022Neural">A. Saxe, Sodhani, and Lewallen (2022)</span>).</p></li>
<li><p>Compare GDLNs with globally-gated deep linear networks and understand the relationship and limits of each gating scheme <span class="citation" data-cites="Li2022Globally">(Li and Sompolinsky 2022)</span>.</p></li>
<li><p>After that I think I might have a chance at grokking the ReLU↔︎GDLN equivalence via <em>Rectified Linear Networks (ReLNs)</em> <span class="citation" data-cites="Jarvis2024Make">(Jarvis et al. 2024)</span>.</p></li>
<li><p>They seem to be used as a model in <a href="../notebook/singular_learning_theory.html">singular learning theory</a>, once again for tractability. I should work out how that works.</p></li>
<li><p>Confusing things:</p>
<ul>
<li>“linear network” ≠ “linear training dynamics” because depth makes training non-convex and highly structured <span class="citation" data-cites="Saxe2014Exact Baldi1989Neural">(Andrew M. Saxe, McClelland, and Ganguli 2014; Baldi and Hornik 1989)</span>.</li>
<li>disentanglement isn’t necessarily the default inductive bias <span class="citation" data-cites="Locatello2019Challenging Jarvis2024Make">(Locatello et al. 2019; Jarvis et al. 2024)</span>.</li>
</ul></li>
</ul>
<section id="references" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="references"><span class="header-section-number">1</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Atanasov2021Neural" class="csl-entry">
Atanasov, Bordelon, and Pehlevan. 2021. <span>“<a href="http://arxiv.org/abs/2111.00034">Neural Networks as Kernel Learners: The Silent Alignment Effect</a>.”</span> In <em>International Conference on Learning Representations (ICLR)</em>.
</div>
<div id="ref-Baldi1989Neural" class="csl-entry">
Baldi, and Hornik. 1989. <span>“<a href="https://doi.org/10.1016/0893-6080(89)90014-2">Neural Networks and Principal Component Analysis: Learning from Examples Without Local Minima</a>.”</span> In <em>Neural Netw.</em>
</div>
<div id="ref-Fukumizu1998Effect" class="csl-entry">
Fukumizu. 1998. <span>“Effect of Batch Learning in Multilayer Neural Networks.”</span> In <em>Proceedings of the 5th International Conference on Neural Information Processing</em>.
</div>
<div id="ref-Goldt2020Modeling" class="csl-entry">
Goldt, Mézard, Krzakala, et al. 2020. <span>“<a href="https://doi.org/10.1103/PhysRevX.10.041044">Modeling the Influence of Data Structure on Learning in Neural Networks: The Hidden Manifold Model</a>.”</span> <em>Physical Review X</em>.
</div>
<div id="ref-Huh2023LowRank" class="csl-entry">
Huh, Mobahi, Zhang, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2103.10427">The Low-Rank Simplicity Bias in Deep Networks</a>.”</span>
</div>
<div id="ref-Jacot2018Neural" class="csl-entry">
Jacot, Gabriel, and Hongler. 2018. <span>“<a href="http://arxiv.org/abs/1806.07572">Neural Tangent Kernel: Convergence and Generalization in Neural Networks</a>.”</span> In <em>Advances in Neural Information Processing Systems</em>. NIPS’18.
</div>
<div id="ref-Jarvis2024Make" class="csl-entry">
Jarvis, Klein, Rosman, et al. 2024. <span>“<a href="https://openreview.net/forum?id=27SSnLl85x">Make Haste Slowly: A Theory of Emergent Structured Mixed Selectivity in Feature Learning ReLU Networks</a>.”</span> In.
</div>
<div id="ref-Lee2019Wide" class="csl-entry">
Lee, Xiao, Schoenholz, et al. 2019. <span>“<a href="http://arxiv.org/abs/1902.06720">Wide Neural Networks of Any Depth Evolve as Linear Models Under Gradient Descent</a>.”</span> In <em>Advances in Neural Information Processing Systems</em>.
</div>
<div id="ref-Li2022Globally" class="csl-entry">
Li, and Sompolinsky. 2022. <span>“<a href="http://arxiv.org/abs/2210.17449">Globally Gated Deep Linear Networks</a>.”</span> In <em>Proceedings of the 36th International Conference on Neural Information Processing Systems</em>. NIPS ’22.
</div>
<div id="ref-Locatello2019Challenging" class="csl-entry">
Locatello, Bauer, Lucic, et al. 2019. <span>“<a href="http://arxiv.org/abs/1811.12359">Challenging Common Assumptions in the Unsupervised Learning of Disentangled Representations</a>.”</span> In <em>Proceedings of the 36th International Conference on Machine Learning</em>.
</div>
<div id="ref-Rigotti2013Importance" class="csl-entry">
Rigotti, Barak, Warden, et al. 2013. <span>“<a href="https://doi.org/10.1038/nature12160">The Importance of Mixed Selectivity in Complex Cognitive Tasks</a>.”</span> <em>Nature</em>.
</div>
<div id="ref-Saxe2014Exact" class="csl-entry">
Saxe, Andrew M, McClelland, and Ganguli. 2014. <span>“Exact Solutions to the Nonlinear Dynamics of Learning in Deep Linear Neural Networks.”</span> In <em>International Conference on Learning Representations (ICLR)</em>.
</div>
<div id="ref-Saxe2019Mathematical" class="csl-entry">
Saxe, Andrew M., McClelland, and Ganguli. 2019. <span>“<a href="https://doi.org/10.1073/pnas.1820226116">A Mathematical Theory of Semantic Development in Deep Neural Networks</a>.”</span> <em>Proceedings of the National Academy of Sciences</em>.
</div>
<div id="ref-Saxe2022Neural" class="csl-entry">
Saxe, Andrew, Sodhani, and Lewallen. 2022. <span>“<a href="http://arxiv.org/abs/2207.10430">The Neural Race Reduction: Dynamics of Abstraction in Gated Networks</a>.”</span> In <em>Proceedings of the 39th International Conference on Machine Learning</em>.
</div>
<div id="ref-Thompson1972Principal" class="csl-entry">
Thompson. 1972. <span>“Principal Submatrices IX: Interlacing Inequalities for Singular Values of Submatrices.”</span> <em>Linear Algebra and Its Applications</em>.
</div>
</div>


</section>

 ]]></description>
  <category>machine learning</category>
  <category>neural nets</category>
  <category>optimization</category>
  <category>statmech</category>
  <guid>https://danmackinlay.name/notebook/nn_deep_linear.html</guid>
  <pubDate>Fri, 08 Aug 2025 04:11:46 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/crocodile_prodder_RP-P-BI-5294.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Agent foundations</title>
  <link>https://danmackinlay.name/notebook/agent_foundations.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-fool-boops" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-fool-boops-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/fool_boops_RP-P-OB-75.244.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/fool_boops_RP-P-OB-75.244.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-fool-boops-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p><em>Agent foundations</em> is the branch of <a href="../notebook/ai_aligning.html">AI alignment</a> that tries to answer: if we were to build a <a href="../notebook/superintelligence.html">superintelligent</a> system from scratch, what clean, mathematical objective could we give it so that it robustly <a href="../notebook/ai_safety.html">does what we want</a>, even if we cannot understand the system ourselves? Unlike <a href="../notebook/model_interpretation.html">interpretability</a> (which <a href="../notebook/ai_mech_interp.html">inspects black-box models</a>) or preference learning (which tries to extract human values), agent foundations is about first principles: designing an agent that’s “aligned by construction.”</p>
<p>So what might this look like formalised? The central idea is to create a “formal goal” that is entirely made of math—not of human words with underspecified meaning.</p>
<p>There seem to be a few speculative proposals in this space, including QACI, <a href="https://arbital.com/p/indirect_normativity/?ref=danmackinlay.name">indirect normativity</a> and utility indifference — These are representative of the kind of formalism agent foundations explores.</p>
<section id="qaci" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="qaci"><span class="header-section-number">1</span> QACI: Question-Answer Counterfactual Interval</h2>
<p>One speculative proposal in the agent-foundations space is <strong>QACI</strong>, the “question-answer counterfactual interval”. It is not the whole of agent foundations — just one of the weirder and more formalized sketches of what a “clean mathematical goal” might look like.</p>
<p>Very roughly: QACI tries to give an agent a way of scoring its actions by asking counterfactual questions. The picture is: <em>if I acted one way rather than another, how would the answer to a particular well-posed question about the world come out differently?</em> The hope is that if we can ground goals in question-answer pairs, and measure how much the agent’s action shifts those answers across counterfactual worlds, we get something precise enough to avoid ontology trouble and maybe even Goodharting.</p>
<p>Here are the core ingredients, as I understand them:</p>
<ul>
<li><strong>Counterfactuals</strong> — The system doesn’t just evaluate the actual world, but counterfactual ones: “what if this string of data were replaced with that one?”</li>
<li><strong>Blob location</strong> — The zany part. This is about locating a bitstring (the “blob”) across possible computational universes. We define functions that pick out the blob from different states, and functions that rewrite the blob to see what happens under perturbation.</li>
<li><strong>Ontological robustness</strong> — The value proposition. Instead of pointing at “chairs” or “trees” (which depend on messy, shifting ontologies), the system points at raw information. That should, in theory, let the system survive when its ontology of the world gets rebuilt at higher levels of intelligence.</li>
</ul>
<p>The promise is attractive, I guess: give the AI a mathematically exact target that refers only to information and counterfactual dependence, and maybe we get behaviour that’s safe and robust.</p>
<p>AFAICT QACI remains speculative and hard to parse. There are a lot of axioms to buy into to make it look even remotely feasible. It’s not obvious how to connect “blobs” to real-world referents, or why this formulation really sidesteps <a href="../notebook/goodharts_law.html">Goodhart’s Law</a>. Even insiders hedge on whether it’s the right line to pursue. Still, it illustrates the flavour of what agent-foundations research is trying to do: carve a trustworthy goal into the inviolable substrate of mathematics so that even a superintelligence could be trusted to pursue it.</p>
</section>
<section id="incoming" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="incoming"><span class="header-section-number">2</span> Incoming</h2>
<p><a href="https://www.lesswrong.com/posts/4XcADCLDDguyej2N7/orthogonal-s-formal-goal-alignment-theory-of-change?ref=danmackinlay.name">Tamsin on Agent Foundations</a></p>


</section>

 ]]></description>
  <category>computers are awful</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>innovation</category>
  <category>language</category>
  <category>machine learning</category>
  <category>mind</category>
  <category>neural nets</category>
  <category>NLP</category>
  <category>statistics</category>
  <category>stringology</category>
  <category>technology</category>
  <category>UI</category>
  <category>unsupervised</category>
  <guid>https://danmackinlay.name/notebook/agent_foundations.html</guid>
  <pubDate>Tue, 05 Aug 2025 22:12:55 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/fool_boops_RP-P-OB-75.244.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Coincidences in computation</title>
  <link>https://danmackinlay.name/notebook/computational_coincidence.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-chicken-diamond" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-chicken-diamond-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/chicken_diamond_RP-P-OB-5231.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/chicken_diamond_RP-P-OB-5231.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-chicken-diamond-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p><a href="https://www.alignment.org/blog/a-computational-no-coincidence-principle/?ref=danmackinlay.name">A computational no-coincidence principle</a> <span class="citation" data-cites="Christiano2022Formalizing">(Christiano, Neyman, and Xu 2022)</span> is another way of approaching interpretability. What if we think about good neural network performance as learning a representation more compact than memorization of the data, expressed in the language of computational complexity? We’d call a representation <em>simple</em> if that principle can be “efficiently verified” in some sense from a compact proof. This feels attractive, intuitively, but, holy blazes, I suspect the search for such proofs will be punishing.</p>
<p>Most everything I know about this topic is from being asked to review a paper for <a href="../post/iliad2.html">ILLIAD2</a>. That review is reproduced below.</p>
<section id="review-of-a-paper" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="review-of-a-paper"><span class="header-section-number">1</span> Review of a paper</h2>
<p>I also reviewed exactly one paper for the conference proceedings <span class="citation" data-cites="Dunbar2025Wide">(Dunbar and Aaronson 2025)</span>. Since it was an interesting learning experience, I want to release my review. I’m not 100% sure if this will violate the rules, unilaterally de-anonymising myself, but I think it is OK, and moreover, any costs from that choice will be paid by me, rather than the authors, and the value of the review is non-zero I think.</p>
<section id="reviewer-abstract" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="reviewer-abstract"><span class="header-section-number">1.1</span> Reviewer abstract</h3>
<p>I know a bit about random neural networks but less about computational complexity. I put all my notes in the “abstract” in the hope that it will be useful for others with my background, and because it might expose my errors of reasoning. If you already know about such things, you can skip to the end.</p>
<p><strong>Note</strong>: Since there was some notation clash between the original blog post and this paper, I introduce compromise notation. Dunbar’s <img src="https://latex.codecogs.com/png.latex?n"> is <img src="https://latex.codecogs.com/png.latex?m">.</p>
<p>Neyman and coworkers at the ARC would <a href="https://www.alignment.org/blog/a-computational-no-coincidence-principle/?ref=danmackinlay.name">like to formalise when a neural network has “discovered a way of doing things that we can study” in terms of when an surprising behaviour is susceptible to an easy verification</a>. Their motivation is a computational operationalisation of <a href="https://mxphi.com/wp-content/uploads/2023/04/MxPhi-Gowers2023.pdf?ref=danmackinlay.name">Tim Gowers’s no coincidence principle</a></p>
<blockquote class="blockquote">
<p>If an apparently outrageous coincidence happens in mathematics, then there is a reason for it.</p>
</blockquote>
<p>They see his no-coincidence principle and counter with the <em>computational no-coincidence conjecture</em> (CNCC), which uses computational-complexity machinery in the space of random functions to turn it into something we can imagine operationalizing.</p>
<p>I don’t come from computational complexity, so I’ll spell the computational no-coincidence conjecture out here for myself and others like me. I’ll give it in the form we need for the paper — abstract enough to cover the cases we care about but concrete enough to be pedagogical. Suppose we have a universe of functions (circuits, neural networks, Turing machines), and suppose that this universe comes equipped with a probability measure so we can draw functions at random from this universe of functions.</p>
<p>Working with random functions has some annoying technicalities; let’s barrel through them briskly. Because I’m an ML guy, I’ll assume we only care about real vector functions — that’s specific enough for me to keep in my head, and it’s worked for me so far. Call this universe <img src="https://latex.codecogs.com/png.latex?%5COmega">. Each function <img src="https://latex.codecogs.com/png.latex?f%20%5Cin%20%5COmega"> is a map from<sup>1</sup> <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BR%7D%5E%7Bm%7D%5Cto%5Cmathbb%7BR%7D%5E%7Bm%7D"> i.e.&nbsp;we have an <img src="https://latex.codecogs.com/png.latex?m">-dimensional input space and an <img src="https://latex.codecogs.com/png.latex?m">-dimensional output space.<sup>2</sup>. We call the probability measure <img src="https://latex.codecogs.com/png.latex?%5Cmu"><sup>3</sup> and for technical probability-theory reasons we want a <img src="https://latex.codecogs.com/png.latex?%5Csigma">-algebra defined (“<img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BF%7D">”) over our function space so that things don’t go haywire when we attempt to compute probabilities of “things” in this function space. This is generally easy for discrete function spaces but gets tedious for function spaces between vectors over continuous fields like the reals. <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BF%7D"> needs to hold all the sets over which we might attempt to compute probabilities. We wrap these up in a probability tuple <img src="https://latex.codecogs.com/png.latex?(%5COmega,%20%5Cmu,%20%5Cmathcal%7BF%7D)"> that lets us do probability stuff in a well-posed way to our universe of functions.</p>
<p>There are various desirable properties for this function space.</p>
<ol type="1">
<li>For our phenomena of interest, we should be able to guesstimate how likely it is to be observed by chance, i.e.&nbsp;we should be able to bound probabilities of rare events of interest (we will come back to this)</li>
<li>We should be required to spend the absolute minimum of time arsing about with <img src="https://latex.codecogs.com/png.latex?%5Csigma">-algebras and other distracting technical machinery.</li>
<li>The function space should map cleanly onto some class of functions we care about (e.g.&nbsp;it should be “easy” to interpret things from our function space as neural nets or Turing machines or what-have-you)</li>
</ol>
<p>The original blog post addressed these desiderata by dealing with the space of random reversible circuits, i.e.&nbsp;random Boolean functions with some nice structure from <img src="https://latex.codecogs.com/png.latex?%5C%7B0,1%5C%7D%5E%7B3n%7D%5Cto%20%5C%7B0,1%5C%7D%5E%7B3n%7D"> (i.e.&nbsp;<img src="https://latex.codecogs.com/png.latex?m=3n">). These objects are discrete, so desideratum (2) is easy. They have a neat approximation in terms of random permutations, so that’s (1) dealt with. (3) is addressed by deciding we care about Boolean circuits for now, and computer scientists are comfortable thinking about the space of Boolean circuits as a toy model for all kinds of things like formal logic and… other discrete problems that computer scientists care about.</p>
<p>Let’s fix on the setting of that Neyman blog post: random deep reversible Boolean circuits <img src="https://latex.codecogs.com/png.latex?f:%20%5C%7B0,1%5C%7D%5E%7B3n%7D%20%5Cto%20%5C%7B0,1%5C%7D%5E%7B3n%7D">. The distribution is concrete — e.g., pick a random sequence of 3-bit reversible gates, arranged in layers that touch all wires, to a given depth. For large enough depth, such circuits behave pseudorandomly: recent results apparently show they achieve strong <img src="https://latex.codecogs.com/png.latex?k">-wise independence.</p>
<p>This motivates modelling a deep random reversible circuit as though it were drawn uniformly from the <a href="https://en.wikipedia.org/wiki/Symmetric_group?ref=danmackinlay.name">symmetric group</a> on <img src="https://latex.codecogs.com/png.latex?%5C%7B0,1%5C%7D%5E%7B3n%7D">, <img src="https://latex.codecogs.com/png.latex?%5Cmathrm%7BSym%7D(%5C%7B0,1%5C%7D%5E%7B3n%7D)">.<sup>4</sup> So that solves (1) for us. There are a lot of permutations, but we’ve studied the crap out of them, so that should be manageable. We have a simple, albeit approximate, distribution for circuits here.</p>
<p>To bring us back to the main goal: we’re doing this because we want a good notion of the distributions of such functions — circuits that might, if we squint, look a bit like deductions about the world — so we can quantify what it means for their behaviour to be remarkable and what it might mean to explain remarkable behaviour <img src="https://latex.codecogs.com/png.latex?P">. We are working toward the idea that something is remarkable if its behaviour is “outrageously coincidental”, which we can now gloss as <em>very low probability under the null distribution</em>.</p>
<p>We focus on properties <img src="https://latex.codecogs.com/png.latex?P"> that talk about the mapping from inputs to outputs across the entire admissible input set. Formally:</p>
<blockquote class="blockquote">
<p><img src="https://latex.codecogs.com/png.latex?P(f)"> means : there is no input <img src="https://latex.codecogs.com/png.latex?x"> such that <img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bin%7D%7D(x)"> and <img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bout%7D%7D(f(x))"> are both true.</p>
</blockquote>
<p>Here <img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bin%7D%7D%20:%20%5C%7B0,1%5C%7D%5E%5Cell%20%5Cto%20%5C%7B%5Ctext%7BTrue%7D,%5Ctext%7BFalse%7D%5C%7D"> and <img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bout%7D%7D%20:%20%5C%7B0,1%5C%7D%5Em%20%5Cto%20%5C%7B%5Ctext%7BTrue%7D,%5Ctext%7BFalse%7D%5C%7D"> are Boolean predicates on inputs and outputs, respectively.<sup>5</sup> In Neyman’s example, let’s label it <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D">. <img src="https://latex.codecogs.com/png.latex?p%5E0_%7B%5Ctext%7Bin%7D%7D(x)"> is “the last <img src="https://latex.codecogs.com/png.latex?n"> bits of <img src="https://latex.codecogs.com/png.latex?x"> are all 0”, and <img src="https://latex.codecogs.com/png.latex?p%5E0_%7B%5Ctext%7Bout%7D%7D(y)"> is the same condition on <img src="https://latex.codecogs.com/png.latex?y">. The <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D"> in Neyman’s blog post says: <em>for every</em> input whose last <img src="https://latex.codecogs.com/png.latex?n"> bits are 0, the corresponding output’s last <img src="https://latex.codecogs.com/png.latex?n"> bits are <em>not</em> all 0.</p>
<p>Spelling it out for myself: if there’s even one input in the <img src="https://latex.codecogs.com/png.latex?p%5E0_%7B%5Ctext%7Bin%7D%7D"> set whose output also lies in <img src="https://latex.codecogs.com/png.latex?p%5E0_%7B%5Ctext%7Bout%7D%7D">, then <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D(f)"> fails. That’s why a property like “output bit <img src="https://latex.codecogs.com/png.latex?i%20%3E%202n"> is always 1 for all <img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bin%7D%7D"> inputs” is enough to guarantee <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D(f)"> — it eliminates the possibility of the output’s last <img src="https://latex.codecogs.com/png.latex?n"> bits all being zero.</p>
<p>There are <img src="https://latex.codecogs.com/png.latex?2%5E%7B3n%7D"> binary strings of length <img src="https://latex.codecogs.com/png.latex?3n">. How many end in <img src="https://latex.codecogs.com/png.latex?n"> zeros? <img src="https://latex.codecogs.com/png.latex?2%5E%7B2n%7D"> of those. Permutations <img src="https://latex.codecogs.com/png.latex?f"> that never produce a string ending in <img src="https://latex.codecogs.com/png.latex?n"> zeros from a string ending in <img src="https://latex.codecogs.com/png.latex?n"> zeros? Feels… enumerable. If we model it as something like a random process, it feels like we can estimate the probability of that event, and in fact the probability that a randomly chosen permutation does that, <img src="https://latex.codecogs.com/png.latex?%0A(1-2%5E%7B-n%7D)%5E%7B2%5E%7B2n%7D%7D%20%5Capprox%20e%5E%7B-2%5En%7D%0A"> In reality, the reversible-circuit distribution isn’t exactly uniform over all permutations — structured outliers exist — but for the purposes of bounding the probability of <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D(f)"> they’re probably negligible, so this simple form will do for the moment. So if a randomly chosen circuit has this property, I’d be astonished if <img src="https://latex.codecogs.com/png.latex?n"> were bigger than the number of fingers I have.</p>
<p>We’re nearly at the computational no-coincidence conjecture — hang on; we want to use this machinery to capture “structure” in functions that explains outrageous coincidences. We’ll say an outrageous coincidence for a function <img src="https://latex.codecogs.com/png.latex?f"> is explained by structure if there exists an advice string, <img src="https://latex.codecogs.com/png.latex?%5Cpi(f)">, and a verification algorithm <img src="https://latex.codecogs.com/png.latex?V(f,%20%5Cpi(f))"> that can quickly check <img src="https://latex.codecogs.com/png.latex?P(f)">. “Quickly” means polynomial time in the “size” of <img src="https://latex.codecogs.com/png.latex?f">, which can be some count of the number of gates.</p>
<p>The computational no-coincidence conjecture is that</p>
<ol type="a">
<li>For all <img src="https://latex.codecogs.com/png.latex?f"> such that <img src="https://latex.codecogs.com/png.latex?P(f)"> is <em>true</em>, <img src="https://latex.codecogs.com/png.latex?V(f,%20%5Cpi(f))=%5Ctextrm%7Btrue%7D"> [TODO clarify]</li>
<li>For 99% of <img src="https://latex.codecogs.com/png.latex?f"> such that <img src="https://latex.codecogs.com/png.latex?P(f)"> is <em>false</em>, there is no <img src="https://latex.codecogs.com/png.latex?%5Cpi(f)"> that makes <img src="https://latex.codecogs.com/png.latex?V(f,%5Cpi(f))=%5Ctextrm%7Btrue%7D">. [TODO clarify]</li>
</ol>
<p>The 99% clause prevents us from breaking the computational complexity hierarchy. We can’t allow perfect classifiers here.</p>
<p>Meanwhile, (a) does the work of “explaining” structure. It says that <em>if</em> we can always find an <em>advice</em> (let’s gloss that as <em>a compact demonstration that the structure is real</em>) for a fixed, outrageously unlikely property <img src="https://latex.codecogs.com/png.latex?P"> (and for a fixed <img src="https://latex.codecogs.com/png.latex?%5COmega">, etc.), then the verifier <img src="https://latex.codecogs.com/png.latex?V">, given that advice, has perfect recall (and good specificity) over the set of all random functions. In set diagrams, we claim that the set of functions <img src="https://latex.codecogs.com/png.latex?f"> that satisfy <img src="https://latex.codecogs.com/png.latex?P(f)"> but for which no proof <img src="https://latex.codecogs.com/png.latex?%5Cpi(f)"> will persuade our verifier is empty.</p>
<p>So! A formalization of the conjecture that <em>all coincidences must be explainable</em>.</p>
<div id="cell-cncc" class="cell" data-execution_count="2">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> mpl</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> matplotlib_set_diagrams <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> EulerDiagram</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> livingthing.matplotlib_style <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> set_livingthing_style, reset_default_style</span>
<span id="cb1-5"></span>
<span id="cb1-6">set_livingthing_style()</span>
<span id="cb1-7"></span>
<span id="cb1-8">P_true_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.13</span></span>
<span id="cb1-9">V_accepts_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.20</span></span>
<span id="cb1-10">intersection_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.09</span></span>
<span id="cb1-11"></span>
<span id="cb1-12">subset_sizes <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb1-13">    (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>): P_true_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> intersection_size,   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># A only: "10"</span></span>
<span id="cb1-14">    (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): V_accepts_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> intersection_size,<span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># B only: "01"</span></span>
<span id="cb1-15">    (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): intersection_size,                 <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># A∩B:   "11"</span></span>
<span id="cb1-16">}</span>
<span id="cb1-17"></span>
<span id="cb1-18">subset_labels <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb1-19">    (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>): <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"True</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">coincidences</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">missed"</span>,</span>
<span id="cb1-20">    (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"V accepts</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">but P false"</span>,</span>
<span id="cb1-21">    (<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>): <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Certified</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\n</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">coincidences"</span>,</span>
<span id="cb1-22">}</span>
<span id="cb1-23"></span>
<span id="cb1-24">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">6</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span>))</span>
<span id="cb1-25"></span>
<span id="cb1-26"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Try a cost objective that preserves *relative* sizes nicely.</span></span>
<span id="cb1-27">diagram <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> EulerDiagram(</span>
<span id="cb1-28">    subset_sizes,</span>
<span id="cb1-29">    subset_labels<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>subset_labels,</span>
<span id="cb1-30">    set_labels<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"P(C) is true"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"V accepts"</span>],</span>
<span id="cb1-31">    cost_function_objective<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"relative"</span>,   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># good for preserving ordering</span></span>
<span id="cb1-32">    verbose<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb1-33">    ax<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ax,</span>
<span id="cb1-34">)</span>
<span id="cb1-35"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> key, text_artist <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> diagram.subset_label_artists.items():</span>
<span id="cb1-36">    text_artist.set_color(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"black"</span>)</span>
<span id="cb1-37"></span>
<span id="cb1-38"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Highlight the 10 region directly</span></span>
<span id="cb1-39">artist_10 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> diagram.subset_artists[(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)]</span>
<span id="cb1-40">artist_10.set_facecolor(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tab:orange"</span>)</span>
<span id="cb1-41">artist_10.set_alpha(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.35</span>)</span>
<span id="cb1-42">artist_10.set_edgecolor(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tab:orange"</span>)</span>
<span id="cb1-43"></span>
<span id="cb1-44"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Use shapely centroid for a precise callout</span></span>
<span id="cb1-45">geom_10 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> diagram.subset_geometries[(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)]</span>
<span id="cb1-46">x, y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> geom_10.centroid.x, geom_10.centroid.y</span>
<span id="cb1-47">ax.annotate(</span>
<span id="cb1-48">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Empty under the conjecture"</span>,</span>
<span id="cb1-49">    xy<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(x, y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.03</span>),</span>
<span id="cb1-50">    xycoords<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data"</span>,</span>
<span id="cb1-51">    xytext<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">65</span>),</span>
<span id="cb1-52">    textcoords<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"offset points"</span>,</span>
<span id="cb1-53">    ha<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"right"</span>,</span>
<span id="cb1-54">    bbox<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(</span>
<span id="cb1-55">      boxstyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"round,pad=0.3"</span>, fc<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"w"</span>, ec<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0.4"</span>),</span>
<span id="cb1-56">    arrowprops<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">dict</span>(</span>
<span id="cb1-57">      arrowstyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"-&gt;"</span>,</span>
<span id="cb1-58">      connectionstyle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"arc3,rad=0.2"</span>),</span>
<span id="cb1-59">)</span>
<span id="cb1-60"></span>
<span id="cb1-61">ax.set_title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Null model = universe of circuits"</span>)</span>
<span id="cb1-62">ax.set_axis_off()</span>
<span id="cb1-63">plt.tight_layout()</span>
<span id="cb1-64">plt.show()</span>
<span id="cb1-65"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"savefig.transparent {mpl.rcParams['savefig.transparent']}")</span></span>
<span id="cb1-66"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"figure.facecolor {mpl.rcParams['figure.facecolor']}")</span></span>
<span id="cb1-67"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"axes.facecolor {mpl.rcParams['axes.facecolor"]}")</span></span>
<span id="cb1-68"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"fig patch {fig.get_facecolor(), fig.get_alpha()}")</span></span>
<span id="cb1-69"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"ax patch {ax.get_facecolor(), ax.get_alpha()}")</span></span>
<span id="cb1-70"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"fig facecolor {fig.get_facecolor()}")   # expect rgba with alpha 0</span></span>
<span id="cb1-71"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print(f"ax facecolor {ax.get_facecolor()}")    # expect alpha 0</span></span>
<span id="cb1-72"></span>
<span id="cb1-73"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># (Optional sanity check)</span></span>
<span id="cb1-74"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># print("Radii:", diagram.radii)  # different radii reflect set totals A vs B</span></span></code></pre></div></div>
</details>
<div class="cell-output cell-output-display">
<div>
<figure class="figure">
<p><a href="computational_coincidence_files/figure-html/cncc-output-1.png" class="lightbox" data-gallery="quarto-lightbox-gallery-2"><img src="https://danmackinlay.name/notebook/computational_coincidence_files/figure-html/cncc-output-1.png" id="cncc" width="573" height="378" class="figure-img"></a></p>
</figure>
</div>
</div>
</div>
<p>We can now see what a “structural” explanation of <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D(f)"> might look like. For instance, suppose there exists an output bit in position <img src="https://latex.codecogs.com/png.latex?i%20%3E%202n"> — i.e., one of the final <img src="https://latex.codecogs.com/png.latex?n"> bits — such that for <em>every</em> input whose last <img src="https://latex.codecogs.com/png.latex?n"> bits are all zero, the circuit flips that bit from 0 to 1 on the first layer and never changes it again. This ensures that any input in the <img src="https://latex.codecogs.com/png.latex?p%5E0_%7B%5Ctext%7Bin%7D%7D"> set (last <img src="https://latex.codecogs.com/png.latex?n"> bits zero) will produce an output where bit <img src="https://latex.codecogs.com/png.latex?i"> is fixed to 1, so the output’s last <img src="https://latex.codecogs.com/png.latex?n"> bits can never all be zero. In other words, <img src="https://latex.codecogs.com/png.latex?P(f)"> holds for a simple, structural reason.</p>
<p>In the CNCP world, this is a kind of case where the “advice” <img src="https://latex.codecogs.com/png.latex?%5Cpi(f)"> could be very compact — e.g., “bit <img src="https://latex.codecogs.com/png.latex?i"> is constant-1 across the entire <img src="https://latex.codecogs.com/png.latex?p%5E0_%7B%5Ctext%7Bin%7D%7D"> domain” — and the verifier <img src="https://latex.codecogs.com/png.latex?V"> could check it in polynomial time by evaluating the circuit on just the relevant subset of inputs. The conjecture’s claim, I understand, is that <em>all</em> circuits satisfying <img src="https://latex.codecogs.com/png.latex?P"> have some succinct, checkable <img src="https://latex.codecogs.com/png.latex?%5Cpi">, not just this toy case.</p>
<section id="actual-reviewer-abstract" class="level4" data-number="1.1.1">
<h4 data-number="1.1.1" class="anchored" data-anchor-id="actual-reviewer-abstract"><span class="header-section-number">1.1.1</span> Actual review abstract</h4>
<p>One immediate problem, if we come from the ML world, is that Neyman’s reversible Boolean circuits don’t look like the dominant paradigm for modern learning algorithms. It would be satisfying to have a function space that “looks” like neural networks, but still meets the convenience requirements (1)–(3) that lets us pose formal, probability-based claims about explaining structure. Ideally, we’d have a big bag of random functions that look like NNs — then we could ask computational-no-coincidence-type questions directly in the neural-net domain.</p>
<p>The idea in <span class="citation" data-cites="Dunbar2025Wide">Dunbar and Aaronson (2025)</span> is simple: a good model for neural networks is neural networks — random ones. There’s a long lineage of work on this, from <span class="citation" data-cites="Neal1996Priors">Neal (1996)</span> to the omnibus <span class="citation" data-cites="Roberts2022Principles">Roberts, Yaida, and Hanin (2022)</span>. In the standard setup, each weight and bias is drawn independently from a Gaussian with zero mean and suitable variance. This is mathematically tractable and has lots of known limit theorems.</p>
<p>This choice satisfies desideratum (3): the function space maps cleanly onto the objects of interest, because those objects are literally neural nets. It also satisfies desideratum (2) — as width grows, the preactivations approach a Gaussian process, so the underlying measure space is “nice” and the <img src="https://latex.codecogs.com/png.latex?%5Csigma">-algebra headaches and <img src="https://latex.codecogs.com/png.latex?%5COmega">-wrangling are outsourced to the Gaussian-process literature.</p>
<p>The extra work in <span class="citation" data-cites="Dunbar2025Wide">Dunbar and Aaronson (2025)</span> is aimed at desideratum (1), which is about being able to bound the probability of rare events. Their main theorem identifies conditions under which randomly initialised NNs behave, for the purpose of such probability estimates, like draws from a tractable, product-Gaussian null model. Concretely:</p>
<ul>
<li>Assume a nonlinear activation <img src="https://latex.codecogs.com/png.latex?%5Csigma"> with zero mean under <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%20N(0,1)">: <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BE%7D_%7Bz%5Csim%5Cmathcal%20N(0,1)%7D%5B%5Csigma(z)%5D=0">.</li>
<li>Use “critical” hyperparameters that keep the per-neuron variance stable layer-to-layer.</li>
<li>Fix a finite dataset <img src="https://latex.codecogs.com/png.latex?D"> of distinct inputs<sup>6</sup></li>
</ul>
<p>Under these conditions, for any fixed layer depth <img src="https://latex.codecogs.com/png.latex?%5Cell"> and width <img src="https://latex.codecogs.com/png.latex?m"> large enough, the outputs on different inputs have exponentially decaying covariance in <img src="https://latex.codecogs.com/png.latex?%5Cell">, and the joint law over all neurons and inputs is within <img src="https://latex.codecogs.com/png.latex?e%5E%7B-%5COmega(%5Cell)%7D"> total-variation distance of an i.i.d. standard Gaussian. This means the probability of many interesting subsets is easy to compute, because a good approximation to <img src="https://latex.codecogs.com/png.latex?%5Cmu"> is easy to work with. This exponential-decay regime is the NN-side analogue of Neyman’s “random permutation” assumption: it gives us a null distribution we can actually compute with.</p>
<p>They then propose a neural-net analogue of <img src="https://latex.codecogs.com/png.latex?P(C)">, which they call <img src="https://latex.codecogs.com/png.latex?P%5E%7B(1)%7D">, where the input and output predicates are</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bin%7D%7D%5E%7B(1)%7D(x)"> is trivial — it holds for all <img src="https://latex.codecogs.com/png.latex?x%5Cin%20D">.</li>
<li><img src="https://latex.codecogs.com/png.latex?p_%7B%5Ctext%7Bout%7D%7D%5E%7B(1)%7D(y)"> is “every coordinate of <img src="https://latex.codecogs.com/png.latex?y"> is negative.”</li>
</ul>
<p>In words: <em>every</em> dataset input maps to an all-negative output vector at the chosen layer. Under the product-Gaussian null model, this event is exponentially unlikely in the width. This mirrors Neyman’s “no input with last <img src="https://latex.codecogs.com/png.latex?n"> zeros maps to an output with last <img src="https://latex.codecogs.com/png.latex?n"> zeros,” which is (doubly) exponentially unlikely under the uniform-permutation heuristic. That rarity, together with the tractable null, makes <img src="https://latex.codecogs.com/png.latex?P%5E%7B(1)%7D"> a good candidate for exploring computational-no-coincidence in a neural-network setting.</p>
<p>As with Neyman’s bit-flip example, we can imagine simple structural reasons a network might satisfy <img src="https://latex.codecogs.com/png.latex?P%5E%7B(1)%7D">. For instance, suppose there’s a neuron in the chosen output layer whose bias is set to a large negative value, and whose incoming weights are all small enough that its preactivation stays negative for <em>every</em> input in <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BD%7D">. If every output coordinate is built in this way — perhaps via repeated weight/bias motifs in the architecture — then the “all-negative” property holds for a mechanical, easily checkable reason. In CNCP terms, the advice <img src="https://latex.codecogs.com/png.latex?%5Cpi"> could specify the index and parameters of these always-negative neurons, and the verifier <img src="https://latex.codecogs.com/png.latex?V"> could confirm the property in polynomial time.</p>
<p>Tying it all up with a bow, if we accept that the Computational No-Coincidence Conjecture is a worthy angle of attack for understanding structural properties of networks, then this seems to give us a more comfy, learning-adjacent model to use in it.</p>
</section>
</section>
<section id="review" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="review"><span class="header-section-number">1.2</span> Review</h3>
<p>This paper does a lot of hard work to find criteria and conditions under which wide, deep neural networks give us a tractable null distribution for producing Computational No-Coincidence Conjecture results. It supplies one such example plus many useful auxiliary results that would help us produce more. As far as I understand the conjecture, this paper mostly adapts it to neural-network domains, which seems useful for making progress. It is, IMO, clearly written, with some rough edges that I suspect come from the paper sitting at the edge of two fields with strong opinions about terminology; we may not all agree on how rough those edges are.</p>
<p>I have examined the technical results at a surface level, and they seem credible, but errors could have escaped me.</p>
<p>I have questions.</p>
<section id="handling-the-finite-dataset" class="level4" data-number="1.2.1">
<h4 data-number="1.2.1" class="anchored" data-anchor-id="handling-the-finite-dataset"><span class="header-section-number">1.2.1</span> Handling the finite dataset</h4>
<p>Do we need to tweak the conjecture, or the random neural network model, to handle the fixed-size dataset? As written, it seems that if <img src="https://latex.codecogs.com/png.latex?P%5E%7B(1)%7D"> quantifies only over a <em>finite</em> dataset <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BD%7D">, a verifier could simply forward-propagate every <img src="https://latex.codecogs.com/png.latex?x%5Cin%20%5Cmathcal%7BD%7D"> and check the predicate—cost <img src="https://latex.codecogs.com/png.latex?O(%7CD%7C%5Ccdot%20T_%7B%5Ctext%7Bfwd%7D%7D)">, independent of any “structure.” So this is polynomial in the size of the network. Neyman’s verifier doesn’t have this problem, I think, because the input space grows exponentially with the width of the network, so one can’t brute-force the <img src="https://latex.codecogs.com/png.latex?2%5E%7B2n%7D"> inputs.</p>
<p>Call the “size” of the network <img src="https://latex.codecogs.com/png.latex?%7Cf%7C=m%5Cell"> (<img src="https://latex.codecogs.com/png.latex?n%5Cell"> in the notation of the paper). Then do we need something like the following?</p>
<ol type="1">
<li><p><em>Verifier time</em>: <img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7Bpoly%7D(%7Cf%7C)"> and sublinear in <img src="https://latex.codecogs.com/png.latex?%7C%5Cmathcal%7BD%7D%7C"></p></li>
<li><p><em>Advice size</em>: <img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7Bpoly%7D(%7Cf%7C)">, independent of <img src="https://latex.codecogs.com/png.latex?%7C%5Cmathcal%7BD%7D%7C">.</p></li>
</ol>
</section>
<section id="can-we-handle-other-activations-actually" class="level4" data-number="1.2.2">
<h4 data-number="1.2.2" class="anchored" data-anchor-id="can-we-handle-other-activations-actually"><span class="header-section-number">1.2.2</span> Can we handle other activations actually?</h4>
<p>We need the <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BE%7D_%7Bz%5Csim%5Cmathcal%20N(0,1)%7D%5B%5Csigma(z)%5D=0"> to get decaying covariance between sites in the readout, which naturally suggests <img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7Btanh%7D">. We could also translate a ReLU or GeLU so it’s centred. Any reason not to do that? I have a sense there might be, because the paper mentions a connection to the complexity-bias of tanh networks, but I don’t see what it is.</p>
</section>
<section id="why-not-just-do-p0-from-the-neyman-paper" class="level4" data-number="1.2.3">
<h4 data-number="1.2.3" class="anchored" data-anchor-id="why-not-just-do-p0-from-the-neyman-paper"><span class="header-section-number">1.2.3</span> Why not just do <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D"> from the Neyman paper?</h4>
<p>We can get a very near analogue to Neyman’s original <img src="https://latex.codecogs.com/png.latex?P%5E%7B(0)%7D(C)"> by coarsening the neural network at input and readout with a 0–1 step function, and then it’s just a function from bits to bits again. We could set the neural network widths to <img src="https://latex.codecogs.com/png.latex?m=3n"> and talk about getting the last-<img src="https://latex.codecogs.com/png.latex?n">-bits-are-zero conditions from Neyman. It’s not exactly the same: we draw the tail bits with replacement rather than sampling permutations, but the analogy would still be closer. What do we get from the outputs-all-negative <img src="https://latex.codecogs.com/png.latex?P%5E%7B(1)%7D">?</p>
</section>
<section id="other-architectures" class="level4" data-number="1.2.4">
<h4 data-number="1.2.4" class="anchored" data-anchor-id="other-architectures"><span class="header-section-number">1.2.4</span> Other architectures?</h4>
<p>This isn’t really a question for this paper — we want to do one thing at a time — but I’ll ask it anyway: Let’s suppose we wanted to prove things about some other architecture, such as attention-based transformer architectures. Do we have any hope of a nice null model like the one in this paper in that case?</p>
</section>
</section>
</section>
<section id="references" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="references"><span class="header-section-number">2</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Christiano2022Formalizing" class="csl-entry">
Christiano, Neyman, and Xu. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2211.06738">Formalizing the Presumption of Independence</a>.”</span>
</div>
<div id="ref-Dunbar2025Wide" class="csl-entry">
Dunbar, and Aaronson. 2025. <span>“<a href="https://openreview.net/forum?id=m4OpQAK3eY">Wide Neural Networks at Initialization Can Be Random Functions</a>.”</span> In.
</div>
<div id="ref-Gross2024Compact" class="csl-entry">
Gross, Agrawal, Kwa, et al. 2024. <span>“<a href="https://doi.org/10.52202/079017-2523">Compact Proofs of Model Performance via Mechanistic Interpretability</a>.”</span> <em>Advances in Neural Information Processing Systems</em>.
</div>
<div id="ref-Neal1996Priors" class="csl-entry">
Neal. 1996. <span>“<a href="https://doi.org/10.1007/978-1-4612-0745-0_2">Priors for Infinite Networks</a>.”</span> In <em>Bayesian Learning for Neural Networks</em>. Lecture Notes in Statistics.
</div>
<div id="ref-Roberts2022Principles" class="csl-entry">
Roberts, Yaida, and Hanin. 2022. <em><a href="https://doi.org/10.1017/9781009023405">The Principles of Deep Learning Theory: An Effective Theory Approach to Understanding Neural Networks</a></em>.
</div>
</div>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>we might want to restrict the input and output spaces to be subsets of these spaces, but let’s stick with that for now — I don’t think the usual restrictions complicate things.↩︎</p></li>
<li id="fn2"><p>I don’t think the spaces need to be the same size; generalization is left as an exercise, though↩︎</p></li>
<li id="fn3"><p>because we need <img src="https://latex.codecogs.com/png.latex?P"> for other things later↩︎</p></li>
<li id="fn4"><p>It’s not <em>exact</em> — the true circuit distribution gives extra weight to highly structured cases like the identity or bitwise NOT — but the authors argue that uniform-permutation heuristic is likely close enough for estimating the tiny probabilities of “outrageous coincidences”.↩︎</p></li>
<li id="fn5"><p>They say nothing about the distribution of inputs, but we can imagine a natural extension to inputs sampled from some distribution, so we could make statements about noisy worlds in expectation. Anyway.↩︎</p></li>
<li id="fn6"><p>technical condition: no scalar multiples in the dataset↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>adversarial</category>
  <category>AI safety</category>
  <category>computational complexity</category>
  <category>game theory</category>
  <category>machine learning</category>
  <category>sparser than thou</category>
  <guid>https://danmackinlay.name/notebook/computational_coincidence.html</guid>
  <pubDate>Mon, 04 Aug 2025 11:43:36 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/chicken_diamond_RP-P-OB-5231.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Discretizing and quantizing neural nets</title>
  <link>https://danmackinlay.name/notebook/nn_quantization.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-flaggy-paddleboat" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-flaggy-paddleboat-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/flaggy_paddleboat_RP-P-1946-127.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/flaggy_paddleboat_RP-P-1946-127.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-flaggy-paddleboat-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Quantization, in the general sense, maps a continuous or large set of values to a smaller, discrete set. The notion has roots in signal processing and information theory; <em>Vector Quantization (VQ)</em> emerged in the late 1970s and early 1980s, e.g.&nbsp;the Linde-Buzo-Gray algorithm <span class="citation" data-cites="Linde1980Algorithm">(Linde, Buzo, and Gray 1980)</span>. VQ represents vectors from a continuous space using a finite set of prototype vectors from a “codebook,” typically designed by clustering a large sample of data. The objective is to minimise representation error (distortion) for a given codebook size (rate) — the <a href="../notebook/informations.html">rate-distortion trade-off</a> at the centre of information theory.</p>
<p>The way we quantize NNs has its own bloody-minded reinventions, as usual. Instead of arbitrary codebooks, we typically use structured ones. Converting <code>float32</code> weights and activations to <code>int8</code> (or to binary values) is <em>scalar quantization</em>: we partition a continuous interval of real numbers into a finite set of ordered bins. The motivations are speed (specialised hardware) and storage size (see also <a href="../notebook/nn_compressing.html">compression</a>).</p>
<div class="callout callout-style-simple callout-caution">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Making neural networks small and fast, which is the point of this technique, is a high value problem and therefore lots of money is pouring into it. I am almost certainly missing some recent developments.</p>
</div>
</div>
</div>
<section id="uniform-vs-logarithmic" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="uniform-vs-logarithmic"><span class="header-section-number">1</span> Uniform vs logarithmic</h2>
<p>Scalar quantization comes in two main families.</p>
<ul>
<li><em>Uniform quantization</em> divides the interval into bins of equal width. The affine mapping below is the canonical example. Simple, computationally cheap, the default.</li>
<li><em>Logarithmic quantization</em> uses bins narrower near zero and wider further out. Useful when the value distribution is non-uniform — NN weights cluster around zero, audio signals span many orders of magnitude. We rarely write down “logarithmic quantization” explicitly in NN papers, but it effectively happens in low-bit float types like <code>bfloat16</code> and <code>fp8</code>.</li>
</ul>
</section>
<section id="affine-mapping" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="affine-mapping"><span class="header-section-number">2</span> Affine mapping</h2>
<p>The default in NN quantization. Map a floating-point range <img src="https://latex.codecogs.com/png.latex?%5Br_%7Bmin%7D,%20r_%7Bmax%7D%5D"> to a range of <img src="https://latex.codecogs.com/png.latex?B">-bit integers via a scale factor <img src="https://latex.codecogs.com/png.latex?S"> (a float) and a zero-point <img src="https://latex.codecogs.com/png.latex?Z"> (an integer). <img src="https://latex.codecogs.com/png.latex?S"> is the step size; <img src="https://latex.codecogs.com/png.latex?Z"> ensures the real value zero maps exactly to an integer.</p>
<p>Quantize: <img src="https://latex.codecogs.com/png.latex?%0Aq%20=%20%5Ctext%7Bround%7D(r/S%20+%20Z)%0A"></p>
<p>Dequantize: <img src="https://latex.codecogs.com/png.latex?%0Ar'%20=%20S(q%20-%20Z)%0A"></p>
<p><img src="https://latex.codecogs.com/png.latex?r'"> approximates the original <img src="https://latex.codecogs.com/png.latex?r">; the quantization error is <img src="https://latex.codecogs.com/png.latex?r%20-%20r'">.</p>
<p>For a typical linear layer we want <img src="https://latex.codecogs.com/png.latex?Y%20=%20WX%20+%20b">, where <img src="https://latex.codecogs.com/png.latex?W"> is the weight matrix, <img src="https://latex.codecogs.com/png.latex?X"> are the input activations, and <img src="https://latex.codecogs.com/png.latex?b"> is the bias. With weights and activations quantized to integers (<img src="https://latex.codecogs.com/png.latex?W_q">, <img src="https://latex.codecogs.com/png.latex?X_q">): <img src="https://latex.codecogs.com/png.latex?%0AY_q%20=%20W_q%20X_q%20+%20b_q%0A"> This runs in integer arithmetic, which is fast on most processors. The output’s scale factor is computed from the inputs’, and we convert back to float if a downstream layer needs it. Many corner cases — overflow, requantization, asymmetric ranges — I’m eliding here; see <span class="citation" data-cites="Jacob2017Quantization">Jacob et al. (2017)</span> for the gory detail.</p>
</section>
<section id="what-gets-quantized" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="what-gets-quantized"><span class="header-section-number">3</span> What gets quantized</h2>
<p>Orthogonal to bit-width: which tensors do we quantize?</p>
<ul>
<li><em>Weight-only quantization</em> shrinks the model on disk and in memory. Activations stay in floating point, and the matrix multiplication still pays a per-call dequantization cost (int weights → float, then float-float matmul).</li>
<li><em>Weight and activation quantization</em> — full-stack. With both as integers, the matmul itself runs entirely in integer arithmetic, which is faster and more energy-efficient on compatible hardware.</li>
</ul>
<p>For LLMs, whose output is a discrete token distribution anyway, full-stack feels well-matched. AFAICT it’s also where most production systems are headed.</p>
</section>
<section id="when-to-quantize" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="when-to-quantize"><span class="header-section-number">4</span> When to quantize</h2>
<p>Do we quantize a fully-trained float model, or train with quantization in the loop? Terms of art: <em>post-training</em> (PTQ) vs <em>quantization-aware training</em> (QAT).</p>
<p><span class="citation" data-cites="Jacob2017Quantization">Jacob et al. (2017)</span> distinguishes:</p>
<ul>
<li><em>Post-training quantization (PTQ)</em> — convert a trained float model with minimal effort. Cheap, sometimes lossy.</li>
<li><em>Quantization-aware training (QAT)</em> — fine-tune (or train from scratch) with simulated quantization in the forward pass, so the network learns weights that round nicely. More effort, usually higher accuracy at low bit-widths.</li>
</ul>
<p>QAT is where we start working with <a href="../notebook/discrete_gradients.html">discrete gradients</a>: if the forward pass rounds, the backward pass needs something to differentiate through, e.g.&nbsp;the <em>Straight-Through Estimator (STE)</em>.</p>
</section>
<section id="bit-budget-regimes" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="bit-budget-regimes"><span class="header-section-number">5</span> Bit-budget regimes</h2>
<section id="low-bit-integers" class="level3" data-number="5.1">
<h3 data-number="5.1" class="anchored" data-anchor-id="low-bit-integers"><span class="header-section-number">5.1</span> Low-bit integers</h3>
<p>The middle ground: 8-bit, 4-bit, sometimes 2-bit (ternary) integers. Most production pipelines I’ve seen live in this band.</p>
<p><em>Ternary quantization</em> — three levels, typically <img src="https://latex.codecogs.com/png.latex?%5C%7B-1,%200,%20+1%5C%7D"> — sounds attractive. PrismML’s <em>Bonsai</em> is one example I’ve encountered.</p>
<ul>
<li><a href="https://prismml.com/?ref=danmackinlay.name">PrismML — Concentrating intelligence</a></li>
<li><a href="https://github.com/PrismML-Eng/Bonsai-demo/?ref=danmackinlay.name">PrismML-Eng/Bonsai-demo: Bonsai Demo</a></li>
</ul>
</section>
<section id="binary-networks" class="level3" data-number="5.2">
<h3 data-number="5.2" class="anchored" data-anchor-id="binary-networks"><span class="header-section-number">5.2</span> Binary networks</h3>
<p>The limit case: one bit per weight (or per activation).</p>
<ul>
<li><em>BinaryConnect</em> <span class="citation" data-cites="Courbariaux2016BinaryConnect">(Courbariaux, Bengio, and David 2016)</span> quantizes weights to <img src="https://latex.codecogs.com/png.latex?%5C%7B-1,%20+1%5C%7D"> during forward and backward passes. Deep networks still train under this extreme constraint, which acts as a regularizer.</li>
<li><em>DoReFa-Net</em> <span class="citation" data-cites="Zhou2018DoReFaNet">(Zhou et al. 2018)</span> extends binarization to weights, <em>activations</em> and gradients at low bit-widths, so the entire forward and backward pass can run on bitwise operations.</li>
</ul>
</section>
</section>
<section id="references" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="references"><span class="header-section-number">6</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Bai2019ProxQuant" class="csl-entry">
Bai, Wang, and Liberty. 2019. <span>“<a href="https://doi.org/10.48550/arXiv.1810.00861">ProxQuant: Quantized Neural Networks via Proximal Operators</a>.”</span>
</div>
<div id="ref-Courbariaux2016BinaryConnect" class="csl-entry">
Courbariaux, Bengio, and David. 2016. <span>“<a href="https://doi.org/10.48550/arXiv.1511.00363">BinaryConnect: Training Deep Neural Networks with Binary Weights During Propagations</a>.”</span>
</div>
<div id="ref-Hubara2018Quantized" class="csl-entry">
Hubara, Courbariaux, Soudry, et al. 2018. <span>“<a href="http://jmlr.org/papers/v18/16-456.html">Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations</a>.”</span> <em>Journal of Machine Learning Research</em>.
</div>
<div id="ref-Jacob2017Quantization" class="csl-entry">
Jacob, Kligys, Chen, et al. 2017. <span>“<a href="https://doi.org/10.48550/arXiv.1712.05877">Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference</a>.”</span>
</div>
<div id="ref-Linde1980Algorithm" class="csl-entry">
Linde, Buzo, and Gray. 1980. <span>“<a href="https://doi.org/10.1109/TCOM.1980.1094577">An Algorithm for Vector Quantizer Design</a>.”</span> <em>IEEE Transactions on Communications</em>.
</div>
<div id="ref-Meng2020Training" class="csl-entry">
Meng, Bachmann, and Khan. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2002.10778">Training Binary Neural Networks Using the Bayesian Learning Rule</a>.”</span> In <em>Proceedings of the 37th International Conference on Machine Learning</em>.
</div>
<div id="ref-Zhou2018DoReFaNet" class="csl-entry">
Zhou, Wu, Ni, et al. 2018. <span>“<a href="https://doi.org/10.48550/arXiv.1606.06160">DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>edge computing</category>
  <category>machine learning</category>
  <category>model selection</category>
  <category>neural nets</category>
  <category>sparser than thou</category>
  <guid>https://danmackinlay.name/notebook/nn_quantization.html</guid>
  <pubDate>Fri, 25 Jul 2025 01:46:22 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/flaggy_paddleboat_RP-P-1946-127.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>The Predictive Approach to Bayesian Inference</title>
  <link>https://danmackinlay.name/notebook/bayes_predictive.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-gas-experiments" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-gas-experiments-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/gas_experiments_RP-P-1953-870.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/gas_experiments_RP-P-1953-870.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-gas-experiments-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Bayesian inference is traditionally introduced via unknown <em>parameters</em> that interact to produce the things we expect to actually observe: we place a prior distribution on a parameter <img src="https://latex.codecogs.com/png.latex?%5Ctheta">, update it to a posterior distribution given the data, and then use the posterior over that parameter to generate a posterior over actual observables. The predictive approach by contrast puts prediction at the centre – probabilities are assigned directly to future observables rather than to parameters. This view was championed (perhaps even invented, I think) by Bruno de Finetti, who argued that probability statements should only refer to observable events, with parameters serving as a convenient fiction linking past data to future outcomes. In other words, the <em>only</em> meaningful uncertainty is about things we might observe. Parameters are always merely nuisance parameters — they’re an auxiliary device.</p>
<p>We might care about this minimalism for philosophical or methodological reasons, which I think was De Finetti’s ideal.</p>
<p>There is also the surprising notion that predictive Bayes might unlock new tools for handling <a href="../notebook/bayes_misspecified.html">mis-specification</a> in our models. Since all models are mis-specified, we might hope that looking at the predictive distribution is one escape from the the problems of <a href="../notebook/bayes_misspecified.html">M-open</a> inference.</p>
<p>Finally, the great success of our age in machine learning (e.g.&nbsp;in <a href="../notebook/nn_why.html">neural nets</a>) has been predicting observables rather than tying predictions to “true parameters”. And Predictive Bayes is <em>just there</em> waiting for us to use it. Indeed, after watching an seminar by Susan Wei, I feel that de Finetti’s perspective might be an interesting way of understanding <a href="../notebook/nn_foundation_bayes.html">when foundation models do optimal inference</a>; most neural networks are best understood as purely predictive models anyway rather than parameter estimators, and purely predictive Bayes suddenly seems like a useful analogy.</p>
<section id="background-and-notation" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="background-and-notation"><span class="header-section-number">1</span> Background and Notation</h2>
<p>Throughout the next bit we need to distinguish <em>distributions</em> (uppercase letters) from their <em>densities</em> (lowercase letters) when both exist. We work on an infinite sequence of observations.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AX_1,%5C,X_2,%5C,%5Cdots%0A"></p>
<p>Taking values in some space <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%20X">. A finite batch of data is denoted</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ax_%7B1:n%7D%20%5C;=%5C;%20(x_1,%5Cdots,x_n).%0A"></p>
<section id="classic-parameter-based-bayesian-inference" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="classic-parameter-based-bayesian-inference"><span class="header-section-number">1.1</span> Classic, parameter-based Bayesian inference</h3>
<ul>
<li><p>Parameter: <img src="https://latex.codecogs.com/png.latex?%5Ctheta%5Cin%5CTheta">.</p></li>
<li><p>Prior on <img src="https://latex.codecogs.com/png.latex?%5Ctheta">: <img src="https://latex.codecogs.com/png.latex?%5CPi(d%5Ctheta)"> with density <img src="https://latex.codecogs.com/png.latex?%5Cpi(%5Ctheta)">.</p></li>
<li><p>Likelihood of data <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D"> under parameter <img src="https://latex.codecogs.com/png.latex?%5Ctheta">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%20%20L(x_%7B1:n%7D%5Cmid%20%5Ctheta)%0A"> Often written <img src="https://latex.codecogs.com/png.latex?%0A%20%20p(x_%7B1:n%7D%5Cmid%20%5Ctheta)%5Cbigr).%0A"></p></li>
<li><p>Posterior distribution of <img src="https://latex.codecogs.com/png.latex?%5Ctheta">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%20%20%5CPi(d%5Ctheta%5Cmid%20x_%7B1:n%7D),%0A%20%20%5Cquad%5Ctext%7Bwith%20density%20%7D%0A%20%20%5Cpi(%5Ctheta%5Cmid%20x_%7B1:n%7D)%0A%20%20=%20%5Cfrac%7BL(x_%7B1:n%7D%5Cmid%20%5Ctheta)%5C,%5Cpi(%5Ctheta)%7D%7B%5Cint_%5CTheta%20L(x_%7B1:n%7D%5Cmid%20%5Cvartheta)%5C,%5Cpi(%5Cvartheta)%5C,d%5Cvartheta%7D.%0A"></p></li>
<li><p>Posterior predictive distribution for a new observation <img src="https://latex.codecogs.com/png.latex?X_%7Bn+1%7D">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%20%20P_%7B%5Ctext%7Bparam%7D%7D%5Cbigl(X_%7Bn+1%7D%5Cin%20A%5Cmid%20x_%7B1:n%7D%5Cbigr)%0A%20%20=%20%5Cint_%5CTheta%20P_%5Ctheta(X_%7Bn+1%7D%5Cin%20A)%5C;%5CPi(d%5Ctheta%5Cmid%20x_%7B1:n%7D),%0A"></p>
<p>or in density form</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%20%20p(x_%7Bn+1%7D%5Cmid%20x_%7B1:n%7D)%0A%20%20=%20%5Cint_%5CTheta%20p(x_%7Bn+1%7D%5Cmid%20%5Ctheta)%5C,%5Cpi(%5Ctheta%5Cmid%20x_%7B1:n%7D)%5C,d%5Ctheta.%0A"></p></li>
</ul>
</section>
</section>
<section id="predictive-de-finettistyle-inference" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="predictive-de-finettistyle-inference"><span class="header-section-number">2</span> Predictive (de Finetti–Style) Inference</h2>
<p>Instead of introducing an unobserved <img src="https://latex.codecogs.com/png.latex?%5Ctheta">, we work <em>directly</em> with the sequence of one-step-ahead predictive distributions:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP_n(%5C,%5Ccdot%5Cmid%20x_%7B1:n%7D)%0A%5Cequiv%20%5CPr%5Cbigl%5C%7BX_%7Bn+1%7D%5Cin%5Ccdot%20%5C,%5Cbigm%7C%5C,X_%7B1:n%7D=x_%7B1:n%7D%5Cbigr%5C%7D,%0A%5Cqquad%20n=0,1,2,%5Cdots,%0A"></p>
<p>Where:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?P_0"> is the <em>prior predictive</em> (our belief about <img src="https://latex.codecogs.com/png.latex?X_1"> before we see the data).</li>
<li><img src="https://latex.codecogs.com/png.latex?P_n"> is the <em>predictive rule</em> after we see <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">.</li>
</ul>
<p>If these <img src="https://latex.codecogs.com/png.latex?P_n"> satisfy <em>coherence</em> and <em>exchangeability</em> conditions (respectively Kolmogorov consistency, symmetry of <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">), then, by de Finetti’s theorem, there exists an (implicit) random measure <img src="https://latex.codecogs.com/png.latex?F"> such that</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP_n(A%5Cmid%20x_%7B1:n%7D)%0A=%20%5Cmathbb%7BE%7D%5Cbigl%5BF(A)%5Cmid%20x_%7B1:n%7D%5Cbigr%5D.%0A"></p>
<p>The <img src="https://latex.codecogs.com/png.latex?P_n"> are our Bayesian updates, but in principle we do not need to write down—or sample—the posterior on <img src="https://latex.codecogs.com/png.latex?F"> because there is an existence proof that such updates are valid. Confusingly, many intros assume this will be enough, and yet I’m not satisfied. How do I calculate such things?</p>
<section id="key-notation-for-predictives" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="key-notation-for-predictives"><span class="header-section-number">2.1</span> Key notation for predictives</h3>
<table class="caption-top table">
<colgroup>
<col style="width: 22%">
<col style="width: 77%">
</colgroup>
<thead>
<tr class="header">
<th>Symbol</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><img src="https://latex.codecogs.com/png.latex?P_n(%5Ccdot%5Cmid%20x_%7B1:n%7D)"></td>
<td>Predictive distribution for <img src="https://latex.codecogs.com/png.latex?X_%7Bn+1%7D"> given data <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">.</td>
</tr>
<tr class="even">
<td><img src="https://latex.codecogs.com/png.latex?p_n(x_%7Bn+1%7D%5Cmid%20x_%7B1:n%7D)"></td>
<td>Density of <img src="https://latex.codecogs.com/png.latex?P_n"> when it exists (use lowercase for densities).</td>
</tr>
<tr class="odd">
<td><img src="https://latex.codecogs.com/png.latex?%5Ctilde%20F"></td>
<td>Implicit random probability measure (“parameter” in de Finetti’s sense).</td>
</tr>
<tr class="even">
<td><img src="https://latex.codecogs.com/png.latex?%5CPi(dF)"></td>
<td>Mixing measure on <img src="https://latex.codecogs.com/png.latex?%5Ctilde%20F"> (the de Finetti prior), often not written out.</td>
</tr>
<tr class="odd">
<td><img src="https://latex.codecogs.com/png.latex?%5Calpha,F_0"></td>
<td>Hyperparameters in Dirichlet-process examples: <img src="https://latex.codecogs.com/png.latex?%5Calpha"> is the concentration, <img src="https://latex.codecogs.com/png.latex?F_0"> the base.</td>
</tr>
</tbody>
</table>
<ul>
<li>The <em>parameter view</em> is familiar to more people. We write down <img src="https://latex.codecogs.com/png.latex?%5Cpi(%5Ctheta)"> and <img src="https://latex.codecogs.com/png.latex?p(x%5Cmid%5Ctheta)">, update to <img src="https://latex.codecogs.com/png.latex?%5Cpi(%5Ctheta%5Cmid%20x)">, then integrate out <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> to predict.</li>
<li>In the <em>predictive view</em> we change emphasis: We directly specify how we would predict the <em>next datum</em> at each step. If our predictive rule is coherent, there automatically exists some Bayes model behind it.</li>
</ul>
<p>For many modern nonparametric and robust methods, it’s often easier to create the <img src="https://latex.codecogs.com/png.latex?P_n"> than to choose a high-dimensional prior. In some cases (e.g.&nbsp;Fortini–Petrone’s predictive resampling or Fong et al.’s martingale posteriors) we never explicitly deal with <img src="https://latex.codecogs.com/png.latex?%5Ctilde%20F"> or <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> at all.</p>
</section>
</section>
<section id="practical-implementation" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="practical-implementation"><span class="header-section-number">3</span> Practical implementation</h2>
<p>You will notice that most of the theory of predictive Bayes is an elaborate and quite painful proof of symmetry properties for exponential-family models under interesting but not exactly state-of-the-art world models. You might ask: can we actually compute predictive Bayes in practice, rather than simply proving theorems about how it might work if we could? Would this be helpful for building intuition?</p>
<p>Yes, it turns out there are a couple of useful methods, especially from the field of <a href="../notebook/in_context_learning.html">in-context learning</a>. In particular, Bayesian in-context learning via transformers, etc, seems to be a pretty good model for a pure Bayes predictive. <span class="citation" data-cites="Hollmann2023TabPFN">Hollmann et al. (2023)</span>, a <a href="../notebook/nn_tabular_data.html">tabular data inference method</a>, and <span class="citation" data-cites="Lee2023Martingale">Lee et al. (2023)</span>, a <a href="../notebook/neural_process_regression.html">neural process regressor</a>, both make this connection explicit and are a fun way of building practical intuition.</p>
<p>TODO: check out TabMGP <span class="citation" data-cites="Ng2025TabMGP">(Ng et al. 2025)</span> which explicitly attempts to <em>be</em> a processor of predictive distributions.</p>
<p>For me, starting with these practical methods is a good way to build intuition before diving into the more abstract theory.</p>
<p>I was clued in to this approach by <a href="https://www.suswei.com/?ref=danmackinlay.name">Susan Wei</a> and have written more about it at <a href="../notebook/nn_bayes_posterior.html">neural posteriors</a>.</p>
</section>
<section id="how-it-works" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="how-it-works"><span class="header-section-number">4</span> How it works</h2>
<div class="callout callout-style-simple callout-none no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>I’m still in the process of arguing with the literature about this section. what follows is a mixture of my content and the LLM content and not yet vetted for sanity.</p>
</div>
</div>
</div>
<section id="exchangeability-and-de-finettis-theorem" class="level3" data-number="4.1">
<h3 data-number="4.1" class="anchored" data-anchor-id="exchangeability-and-de-finettis-theorem"><span class="header-section-number">4.1</span> Exchangeability and de Finetti’s Theorem</h3>
<p><em>Exchangeability</em> is the assumption that our probabilistic beliefs about a sequence of random variables don’t depend on the order in which we observe the data. Formally, <img src="https://latex.codecogs.com/png.latex?(X_1,%5Cldots,X_n)"> is exchangeable if for every permutation <img src="https://latex.codecogs.com/png.latex?%5Cpi"> of <img src="https://latex.codecogs.com/png.latex?%7B1,%5Cdots,n%7D">, the joint distribution satisfies <img src="https://latex.codecogs.com/png.latex?P(X_1%5Cin%20dx_1,%5Cdots,X_n%5Cin%20dx_n)%20=%20P(X_%7B%5Cpi(1)%7D%5Cin%20dx_1,%5Cdots,X_%7B%5Cpi(n)%7D%5Cin%20dx_n)">. De Finetti’s representation theorem is the foundation: any infinite exchangeable sequence is conditionally iid. There exists a (generally unknown) random distribution <img src="https://latex.codecogs.com/png.latex?F"> such that, conditional on <img src="https://latex.codecogs.com/png.latex?F">, the <img src="https://latex.codecogs.com/png.latex?X_i"> are iid with law <img src="https://latex.codecogs.com/png.latex?F">. In Bayesian terms, <img src="https://latex.codecogs.com/png.latex?F"> plays the role of a parameter – in fact we can think of <img src="https://latex.codecogs.com/png.latex?F"> as <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> and put a prior on <img src="https://latex.codecogs.com/png.latex?F">. In measure-theoretic form: If <img src="https://latex.codecogs.com/png.latex?(X_n)_%7Bn%5Cge1%7D"> is exchangeable on a space <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BX%7D">, then there exists a probability measure <img src="https://latex.codecogs.com/png.latex?%5Cmu"> on the set of probability distributions over <img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BX%7D"> such that for every <img src="https://latex.codecogs.com/png.latex?n"> and any measurable events <img src="https://latex.codecogs.com/png.latex?A_1,%5Cdots,A_n%5Csubseteq%5Cmathcal%7BX%7D">,</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP(X_1%5Cin%20A_1,%5Cdots,X_n%5Cin%20A_n)%20%5C;=%5C;%20%5Cint%20%5Cprod_%7Bi=1%7D%5En%20F(A_i)%5C;%20%5Cmu(dF)%5C,.%0A"></p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cmu"> is the <em>de Finetti mixing measure</em> or the law of the random <img src="https://latex.codecogs.com/png.latex?F">. If <img src="https://latex.codecogs.com/png.latex?%5Cmu"> were known, we could first sample <img src="https://latex.codecogs.com/png.latex?F%5Csim%20%5Cmu"> (like drawing a random parameter) and then sample <img src="https://latex.codecogs.com/png.latex?X_1,%5Cdots,X_n%5Ciid%20F">. Of course, <img src="https://latex.codecogs.com/png.latex?%5Cmu"> is typically not known — the theorem only asserts that it exists.</p>
<ol type="1">
<li><p><em>The joint distribution factors into a product of predictive terms.</em> As noted earlier, <img src="https://latex.codecogs.com/png.latex?P(x_1,%5Cdots,x_n)%20=%20%5Cint%20%5Cprod_%7Bi=1%7D%5En%20F(dx_i),%5Cmu(dF)">. By Fubini’s theorem, we can swap the order of integration and view this as iterative conditioning: first draw <img src="https://latex.codecogs.com/png.latex?F%5Csim%5Cmu">, then <img src="https://latex.codecogs.com/png.latex?X_1%5Csim%20F">, next draw <img src="https://latex.codecogs.com/png.latex?X_2%5Csim%20F">, and so on. The result is exactly <img src="https://latex.codecogs.com/png.latex?P(x_1)P(x_2%7Cx_1)%5Ccdots%20P(x_n%7Cx_%7B1:n-1%7D)">. In fact, the one-step predictive distribution emerges naturally: <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D%5Cin%20A%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)%20%5C;=%5C;%20%5Cint%20F(A)%5C;%20%5Cmu(dF%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)%5C,,"> where <img src="https://latex.codecogs.com/png.latex?%5Cmu(%5Ccdot%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)"> is the posterior distribution of <img src="https://latex.codecogs.com/png.latex?F"> given the observed data. This formula formalizes a simple idea: <em>the predictive distribution for a new observation is the posterior mean of <img src="https://latex.codecogs.com/png.latex?F"> (the “urn” distribution)</em>. For example, in a coin-flip scenario, <img src="https://latex.codecogs.com/png.latex?F"> would be the true (but unknown) distribution of Heads/Tails, and given some data the predictive probability of Heads on the next flip is the posterior expected value of <img src="https://latex.codecogs.com/png.latex?F(%7B%5Ctext%7BHeads%7D%7D)">. If we had a <img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7BBeta%7D(a,b)"> prior on the coin’s bias <img src="https://latex.codecogs.com/png.latex?p=F(%7B%5Ctext%7BHeads%7D%7D)">, this predictive is <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7Ba%20+%20%5Ctext%7B(heads%20so%20far)%7D%7D%7Ba+b+n%7D"> — the well-known Beta-Binomial rule. Taking <img src="https://latex.codecogs.com/png.latex?a=b=1"> (a uniform prior) gives <img src="https://latex.codecogs.com/png.latex?(1+k)/(2+n)"> after <img src="https://latex.codecogs.com/png.latex?k"> heads in <img src="https://latex.codecogs.com/png.latex?n"> tosses, which is Laplace’s “rule of succession.” Notice the predictive viewpoint reproduces these formulas: it’s literally the posterior expectation of the unknown frequency.</p></li>
<li><p><em>Learning is reflected in the convergence of predictive distributions.</em> Under exchangeability, the Strong Law of Large Numbers says the empirical distribution of observations converges almost surely to the underlying <img src="https://latex.codecogs.com/png.latex?F">. In predictive terms, this means our predictive distribution eventually concentrates. A precise statement is: with probability 1, <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D%5Cin%20%5Ccdot%20%5Cmid%20X_%7B1:n%7D)"> converges (as <img src="https://latex.codecogs.com/png.latex?n%5Cto%5Cinfty">) to a degenerate distribution that places all its mass on the limiting empirical frequency <img src="https://latex.codecogs.com/png.latex?F,">. In other words, as we see more data, the sequence of predictive measures <img src="https://latex.codecogs.com/png.latex?(P_n)"> forms a <a href="../notebook/martingales.html">martingale</a> that converges to the true distribution <img src="https://latex.codecogs.com/png.latex?F"> almost surely. This is a powerful (and arguably main) consistency property: no matter what the true <img src="https://latex.codecogs.com/png.latex?F"> is, an exchangeable Bayesian will almost surely eventually have predictive probabilities that match <img src="https://latex.codecogs.com/png.latex?F"> on every set <img src="https://latex.codecogs.com/png.latex?A">. In classical terms, the posterior on <img src="https://latex.codecogs.com/png.latex?F"> converges to a point mass at the truth (<a href="../notebook/bayes_misspecified.html">if the model is well-specified</a>). This was first shown by Joseph Doob in 1949 using <a href="../notebook/martingales.html">martingale theory</a>. It provides a <a href="../notebook/bayes_consistency.html">frequentist validation of Bayesian learning in the exchangeable case</a>. From the predictive perspective, it says: <em>if our predictive rule is coherent and we eventually see enough data, we will effectively discover the data-generating distribution</em> — our forecasts become indistinguishable from frequencies in the long run.</p></li>
</ol>
<p>As a time-series guy, one thing I found weird about this literature — and I’ll flag it for you, dear reader — is that everything here seems like it should extend to predicting arbitrary phenomena, but different authors introduce different assumptions about the generating process, and it’s not easy to work out which assumptions apply, at least for me. Sometimes we’re handling complicated dependencies; other times we’re not. AFAICT, the core ‘Predictive Bayes’ idea doesn’t impose many assumptions. But de Finetti’s actual proofs about exchangeability impose i.i.d.-like structure on the observations.</p>
</section>
<section id="predictive-distributions-and-coherence-conditions" class="level3" data-number="4.2">
<h3 data-number="4.2" class="anchored" data-anchor-id="predictive-distributions-and-coherence-conditions"><span class="header-section-number">4.2</span> Predictive Distributions and Coherence Conditions</h3>
<p>A <em>predictive rule</em> or <em>predictive distribution sequence</em> is a collection <img src="https://latex.codecogs.com/png.latex?%7BP_n(%5Ccdot%20%5Cmid%20x_%7B1:n%7D)%20:%20n%5Cge0,;%20x_%7B1:n%7D%5Cin%20%5Cmathcal%7BX%7D%5En%7D">, where each <img src="https://latex.codecogs.com/png.latex?P_n(%5Ccdot%5Cmid%20x_%7B1:n%7D)"> is a probability measure for the next observation <img src="https://latex.codecogs.com/png.latex?X_%7Bn+1%7D"> given past observations <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">. (For <img src="https://latex.codecogs.com/png.latex?n=0">, we have <img src="https://latex.codecogs.com/png.latex?P_0(%5Ccdot)">, which is just the distribution of <img src="https://latex.codecogs.com/png.latex?X_1"> before seeing any data.) Not every choice of predictive rules corresponds to a valid joint distribution — the rules must satisfy <em>coherence</em> constraints. The fundamental coherence condition is that there exists <em>some</em> joint probability law <img src="https://latex.codecogs.com/png.latex?P"> on the sequence such that for all <img src="https://latex.codecogs.com/png.latex?n"> and events <img src="https://latex.codecogs.com/png.latex?A%5Csubseteq%5Cmathcal%7BX%7D">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP_n(A%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)%20%5C;=%5C;%20P(X_%7Bn+1%7D%5Cin%20A%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D),%0A"></p>
<p>That is, the kernel <img src="https://latex.codecogs.com/png.latex?P_n"> truly comes from that joint law. By the Ionescu–Tulcea extension theorem, if we can specify a family of conditional probabilities consistently for every finite stage, a unique process measure <img src="https://latex.codecogs.com/png.latex?P"> on the sequence (on <img src="https://latex.codecogs.com/png.latex?(%5Cmathcal%7BX%7D)%5E%5Cinfty">) is induced. Thus, one route to define a Bayesian model is to pick a predictive rule and invoke Ionescu–Tulcea to get the joint. However, ensuring <em>consistency</em> and <em>exchangeability</em> in the predictive rule is tricky; we have several existence proofs, but they’re not obviously constructive. <span class="citation" data-cites="Fortini2000Exchangeability">Fortini, Ladelli, and Regazzini (2000)</span> gave a description of the necessary and sufficient conditions for exchangeability in terms of predictives. In plain language, their conditions are:</p>
<ul>
<li><p><strong>Symmetry:</strong> If we condition on any past data <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">, the predictive distribution <img src="https://latex.codecogs.com/png.latex?P_n(%5Ccdot%20%5Cmid%20x_%7B1:n%7D)"> must be a symmetric function of <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">. That is, the predictive distribution depends on the past observations only through their <em>multiset</em> or empirical frequency. This is intuitively clear — if the order of past data doesn’t matter for joint probabilities, it shouldn’t matter for predicting the next observation either. So, for example, in an exchangeable coin toss model, <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D=%5Ctext%7BHeads%7D%5Cmid%20X_%7B1:n%7D)"> can only depend on the number of heads in <img src="https://latex.codecogs.com/png.latex?n"> tosses (and <img src="https://latex.codecogs.com/png.latex?n">), not on the exact sequence.</p></li>
<li><p><strong>Associativity / Consistency:</strong> This one is more technical. Roughly, it means the predictive rule must be internally consistent when extended to two steps. Formally, for any <img src="https://latex.codecogs.com/png.latex?n%5Cge0">, for any events <img src="https://latex.codecogs.com/png.latex?A,B"> in the state space, we require</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cint_A%20P_%7Bn+1%7D(B%20%5Cmid%20X_%7B1:n+1%7D=x_%7B1:n%7D,x_%7Bn+1%7D)%20%5C;%20P_n(dx_%7Bn+1%7D%5Cin%20A%20%5Cmid%20x_%7B1:n%7D)%20%5C;=%5C;%20%5Cint_B%20P_%7Bn+1%7D(A%20%5Cmid%20X_%7B1:n+1%7D=x_%7B1:n%7D,x_%7Bn+1%7D)%20%5C;%20P_n(dx_%7Bn+1%7D%5Cin%20B%20%5Cmid%20x_%7B1:n%7D)%5C,,%0A"></p>
<p>And this should hold for all past <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D">. Although this expression looks complicated, it basically says: if we consider two future time points <img src="https://latex.codecogs.com/png.latex?n+1"> and <img src="https://latex.codecogs.com/png.latex?n+2">, the joint predictive for <img src="https://latex.codecogs.com/png.latex?(X_%7Bn+1%7D,%20X_%7Bn+2%7D)"> should be symmetric in those two, because the entire sequence is exchangeable. This ensures that our one-step predictive extends consistently to a two-step (and hence multi-step) predictive. In intuitive terms, condition (ii) is related to <em>Kolmogorov consistency</em> for the projective family of predictive distributions and the requirement of exchangeability on future samples. If symmetry (i) and this consistency (ii) hold, then there exists an exchangeable joint law producing those predictives. These conditions are the predictive analogue of de Finetti’s theorem: they characterize when a given predictive specification is “valid” (arises from some mixture model).</p></li>
</ul>
<p>The takeaway is that to design a Bayesian model in predictive form, we must propose a rule <img src="https://latex.codecogs.com/png.latex?P_n(%5Ccdot%5Cmid%20x_%7B1:n%7D)"> that is symmetric and coherent across time. If we have such a rule, either from a classic parametric model or from some spicy extension, a de Finetti-type parameter <img src="https://latex.codecogs.com/png.latex?%5CTheta"> (the random distribution <img src="https://latex.codecogs.com/png.latex?F">) is implicitly defined as the thing whose posterior predictive matches our rule.</p>
<p>Note, we get that for free by doing classic-flavoured parametric Bayes and assuming our likelihood is correct. The extra work here is to make that more general</p>
<p>The predictive approach often yields an implicit description of the prior on <img src="https://latex.codecogs.com/png.latex?%5CTheta"> without having to write it down explicitly. A classic example:</p>
<div class="callout callout-style-simple callout-none no-icon callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">None</span>Pólya’s Urn/Dirichlet Process.
</div>
</div>
<div class="callout-body-container callout-body">
<p>Suppose we want an exchangeable model for draws <img src="https://latex.codecogs.com/png.latex?X_i"> taking values in some space (say <img src="https://latex.codecogs.com/png.latex?%5Cmathbb%7BR%7D"> or a discrete set) such that: (a) the first draw <img src="https://latex.codecogs.com/png.latex?X_1"> has some distribution <img src="https://latex.codecogs.com/png.latex?F_0"> (a “baseline” measure), and (b) at each step, the probability of seeing a <em>new</em> value that has never been seen before is proportional to a constant <img src="https://latex.codecogs.com/png.latex?%5Calpha">, while the probability of seeing a value already seen is proportional to how many times it was seen. Formally, we set:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?P_0(%5Ccdot)%20=%20F_0(%5Ccdot)">,</li>
<li>For <img src="https://latex.codecogs.com/png.latex?n%5Cge1">, given past data <img src="https://latex.codecogs.com/png.latex?x_%7B1:n%7D"> with <img src="https://latex.codecogs.com/png.latex?k"> distinct values <img src="https://latex.codecogs.com/png.latex?%7By_1,%5Cdots,y_k%7D"> appearing in counts <img src="https://latex.codecogs.com/png.latex?n_1,%5Cdots,n_k">, define <img src="https://latex.codecogs.com/png.latex?P_n(X_%7Bn+1%7D=y_j%20%5Cmid%20x_%7B1:n%7D)%20=%20%5Cfrac%7Bn_j%7D%7B%5C,%5Calpha%20+%20n%5C,%7D,%20%5Cqquad%20j=1,%5Cdots,k,"> and <img src="https://latex.codecogs.com/png.latex?P_n(X_%7Bn+1%7D%20%5Ctext%7B%20is%20a%20new%20value%7D%20%5Cmid%20x_%7B1:n%7D)%20=%20%5Cfrac%7B%5Calpha%7D%7B%5C,%5Calpha%20+%20n%5C,%7D."> If a new value is to appear, it is drawn from the base distribution <img src="https://latex.codecogs.com/png.latex?F_0"> (e.g.&nbsp;a new color in an urn is sampled from <img src="https://latex.codecogs.com/png.latex?F_0">).</li>
</ul>
<p>It is easy to check symmetry: the formulas depend on <img src="https://latex.codecogs.com/png.latex?(n_1,%5Cdots,n_k)">, the counts of past values, which is symmetric in the data. The consistency condition can also be verified (and is a special case of the general theorem above) – essentially it holds because of the “reinforcement” form of the process (adding two observations in either order leads to the same updated counts). Therefore, by the theorem, there is an exchangeable joint law corresponding to this predictive rule. <span class="citation" data-cites="Blackwell1973Ferguson">Blackwell and MacQueen (1973)</span> proved <em>that</em> law’s de Finetti measure is the Dirichlet Process <img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7BDP%7D(%5Calpha%20F_0)">. In other words, specifying this predictive scheme is equivalent to assuming <img src="https://latex.codecogs.com/png.latex?F%5Csim%20DP(%5Calpha%20F_0)"> as a prior on the distribution and then observing iid samples. But notice how much simpler the predictive description is: we can understand and simulate_the model just by following the above recipe, without any direct invocation of a Dirichlet or Beta function. This predictive view also makes some properties obvious: e.g.&nbsp;the probability that the next observation is new remains <img src="https://latex.codecogs.com/png.latex?%5Calpha/(%5Calpha+n)"> which tends to 0 as <img src="https://latex.codecogs.com/png.latex?n"> grows, implying eventually all draws are repeats of existing values – hence the limiting random distribution <img src="https://latex.codecogs.com/png.latex?F"> is discrete (almost surely, it’s an atomic distribution with infinitely many potential atoms). All that can be “seen” directly from the predictive rule, whereas deriving it from the Dirichlet process definition might require more work. This example underscores how we can “build priors by thinking predictively.” any other BNP priors have similar stories – for instance, the Pitman–Yor process has a two-parameter predictive rule <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bnew%7D)%20%5Cpropto%20%5Calpha%20+%20c%20k"> and <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D=y_j)%20%5Cpropto%20n_j%20-%20c"> for some <img src="https://latex.codecogs.com/png.latex?0%5Cle%20c%3C1"> (with some constraints to ensure non-negativity), yielding a rich-get-richer scheme with power-law behaviour in the counts. The underlying de Finetti measure in that case is a stable (or two-parameter Poisson–Dirichlet) process, but we can derive it by first principles via the predictive condition.</p>
</div>
</div>
</section>
<section id="parametric-models-and-sufficient-statistics." class="level3" data-number="4.3">
<h3 data-number="4.3" class="anchored" data-anchor-id="parametric-models-and-sufficient-statistics."><span class="header-section-number">4.3</span> Parametric Models and Sufficient Statistics.</h3>
<p>The predictive approach is fully compatible with parametric Bayesian models. If we have a parametric family <img src="https://latex.codecogs.com/png.latex?%7Bf_%5Ctheta(x)%7D"> and a prior <img src="https://latex.codecogs.com/png.latex?%5Cpi(d%5Ctheta)">, the traditional posterior predictive is <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D%5Cin%20A%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)%20=%20%5Cint_%7B%5CTheta%7D%20f_%5Ctheta(A)%5C;%20%5Cpi(d%5Ctheta%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)%5C,."> This obeys the coherence conditions automatically (since it came from a joint model). But an interesting viewpoint is gained by focusing on <em>predictive sufficiency</em>. In many models, the posterior predictive depends on the data only through some summary <img src="https://latex.codecogs.com/png.latex?T(x_%7B1:n%7D)">. For example, in the Beta–Binomial model (coin flips with Beta prior), <img src="https://latex.codecogs.com/png.latex?T"> can be the number of heads <img src="https://latex.codecogs.com/png.latex?k"> in <img src="https://latex.codecogs.com/png.latex?n"> flips. In a normal model with known variance and unknown mean, <img src="https://latex.codecogs.com/png.latex?T"> could be the sample mean. In general, if <img src="https://latex.codecogs.com/png.latex?T(x_%7B1:n%7D)"> is a sufficient statistic for <img src="https://latex.codecogs.com/png.latex?%5Ctheta">, then the predictive distribution <img src="https://latex.codecogs.com/png.latex?P_n(%5Ccdot%5Cmid%20x_%7B1:n%7D)"> will be a function of <img src="https://latex.codecogs.com/png.latex?T(x_%7B1:n%7D)">. <span class="citation" data-cites="Fortini2000Exchangeability">Fortini, Ladelli, and Regazzini (2000)</span> discuss how <em>predictive sufficiency</em> relates to classical sufficiency. Essentially, a statistic <img src="https://latex.codecogs.com/png.latex?T_n%20=%20T(X_%7B1:n%7D)"> is <strong>predictively sufficient</strong> if <img src="https://latex.codecogs.com/png.latex?P_n(X_%7Bn+1%7D%5Cin%20%5Ccdot%20%5Cmid%20X_%7B1:n%7D)%20=%20P_n(X_%7Bn+1%7D%5Cin%20%5Ccdot%20%5Cmid%20T_n)"> for all data – that is, the prediction for a new observation depends on past data only through <img src="https://latex.codecogs.com/png.latex?T_n">. For an exponential family with conjugate prior, this <img src="https://latex.codecogs.com/png.latex?T_n"> will usually be the same as the conventional sufficient statistic. Predictive sufficiency provides another angle: instead of deriving the posterior for <img src="https://latex.codecogs.com/png.latex?%5Ctheta">, we can directly derive the predictive by updating <img src="https://latex.codecogs.com/png.latex?T">. For example, in the normal-with-known-variance case, we can derive the Gaussian form of the predictive for the next observation by <em>directly updating the mean and uncertainty of the sampling distribution</em>, rather than explicitly updating a prior for <img src="https://latex.codecogs.com/png.latex?%5Ctheta">. In summary, parametric Bayesian models yield predictive rules of a special form (ones that admit a finite-dimensional sufficient statistic). These are consistent with the general theory but represent cases where the predictive distributions lie on a lower-dimensional family. The predictive approach doesn’t conflict with parametric modelling – it <em>generalizes</em> it, and in practice it often yields the same results (since Bayes theorem ensures coherence). What it offers is a different interpretation of those results: our posterior is just a device to produce predictions, and we could have potentially produced those predictions without ever introducing <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> explicitly.</p>
</section>
<section id="martingales-and-the-martingale-posterior" class="level3" data-number="4.4">
<h3 data-number="4.4" class="anchored" data-anchor-id="martingales-and-the-martingale-posterior"><span class="header-section-number">4.4</span> Martingales and the Martingale Posterior</h3>
<p>One of the modern breakthroughs in predictive inference is recognizing the role of <a href="../notebook/martingales.html">martingales</a> in Bayesian updating. We saw earlier that the sequence of predictive distributions <img src="https://latex.codecogs.com/png.latex?(P_n)"> under an exchangeable model is a martingale (in the weak sense that <img src="https://latex.codecogs.com/png.latex?P_%7Bn%7D"> is the conditional expectation of <img src="https://latex.codecogs.com/png.latex?P_%7Bn+1%7D"> given current information) and it converges to the true distribution <img src="https://latex.codecogs.com/png.latex?F"> almost surely. <span class="citation" data-cites="Fong2021Martingale">E. Fong, Holmes, and Walker (2021)</span> took this insight further: if the <em>conventional</em> Bayes posterior predictive yields a martingale that converges to a degenerate distribution at the true <img src="https://latex.codecogs.com/png.latex?F">, perhaps we can <em>construct other martingales that converge to something else</em>, representing different uncertainty quantification. The martingale posterior is built on this idea. They start from the premise: “the foundation of Bayesian inference is to assign a distribution on missing observations conditional on what has been observed.” Rather than starting with a prior on <img src="https://latex.codecogs.com/png.latex?%5Ctheta">, they ask: <em>what distribution would a Bayesian assign to all the not-yet-seen data <img src="https://latex.codecogs.com/png.latex?Y_%7Bn+1%7D,Y_%7Bn+2%7D,%5Cdots"> given the seen <img src="https://latex.codecogs.com/png.latex?Y_%7B1:n%7D">?</em> If we follow standard Bayes, the answer is clear: it would be the product of posterior predictives, i.e.&nbsp;<img src="https://latex.codecogs.com/png.latex?P(Y_%7Bn+1:%5Cinfty%7D%5Cin%20dy_%7Bn+1:%5Cinfty%7D%5Cmid%20Y_%7B1:n%7D=y_%7B1:n%7D)%20=%20%5Cint%20%5Cprod_%7Bm=n+1%7D%5E%5Cinfty%20F(dy_m);%20%5Cmu(dF%20%5Cmid%20Y_%7B1:n%7D=y_%7B1:n%7D)">. This complicated object is basically “<img src="https://latex.codecogs.com/png.latex?F"> drawn from the posterior, then future <img src="https://latex.codecogs.com/png.latex?Y"> iid from <img src="https://latex.codecogs.com/png.latex?F">.” From it, we can derive the usual posterior for any parameter <img src="https://latex.codecogs.com/png.latex?%5Ctheta%20=%20T(F)"> as the induced distribution of <img src="https://latex.codecogs.com/png.latex?%5Ctheta">. In fact, Doob’s theorem showed that if we go this route, the distribution of <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> defined in this way equals the standard posterior for <img src="https://latex.codecogs.com/png.latex?%5Ctheta">. So nothing new so far – it just recapitulates that the Bayesian posterior is equivalent to the Bayesian predictive for the sequence. But now comes the twist: we’re free to choose a different joint predictive for future data that isn’t derived from the prior-predictive formula. If we do so, we get a different “posterior” for <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> when we invert that relationship. The only requirement is that our chosen joint predictive for future data still respects that <img src="https://latex.codecogs.com/png.latex?Y_%7Bn+1:%5Cinfty%7D">, given <img src="https://latex.codecogs.com/png.latex?Y_%7B1:n%7D">, forms a martingale as <img src="https://latex.codecogs.com/png.latex?n"> grows (so that as <img src="https://latex.codecogs.com/png.latex?n%5Cto%5Cinfty"> it collapses appropriately). <span class="citation" data-cites="Fong2021Predictive">C. H. E. Fong (2021)</span> introduce a family of such predictive rules (including some based on copula dependence structures to handle when observations are not iid). The resulting <em>martingale posterior</em> is the probability distribution on the parameter (or on any estimand of interest) that corresponds to these new predictives. It is a true posterior in the sense that it is an updated distribution on the quantity given the data, but it <em>need not come from any prior via Bayes’ rule</em>. In practice, we can think of it as <em>a Bayesian-like posterior that uses an alternative updating rule</em>. The martingale posterior is chosen to satisfy certain optimality or robustness properties (for instance, we can design it to minimize some loss on predictions, or to coincide with bootstrap resampling in large samples).</p>
<p>Fong et al.&nbsp;note connections between martingale posteriors and the Bayesian bootstrap and other resampling schemes. The term “martingale” highlights that the sequence of these posteriors (as <img src="https://latex.codecogs.com/png.latex?n"> increases) is a martingale in the space of probability measures, which ensures coherence over time. This concept is quite new, and ongoing research is examining its properties – for example, how close is a martingale posterior to the ordinary posterior as <img src="https://latex.codecogs.com/png.latex?n"> becomes large? Early results indicate that if the model is well-specified, certain martingale posteriors are <em>consistent</em> (converge on the true parameter) and even <em>asymptotically normal</em> like a standard posterior. But if the model is misspecified, a cleverly chosen martingale posterior might offer advantages in terms of robustness (since it was not derived from the wrong likelihood). The theory here is deep, combining Bayesian ideas with martingale convergence and requiring new technical tools to verify things like convergence in distribution of these posterior-like objects.</p>
<p>From a user’s perspective, however, the appeal is that we can get a posterior <em>without specifying a prior or likelihood</em>, by directly coding how we think future data should behave. This significantly lowers the barrier to doing Bayesian-style uncertainty quantification in complex problems – we can bypass the often difficult task of choosing a prior or fully specifying a likelihood and focus on predictions (which may be easier to elicit from experts or justify scientifically).</p>
</section>
</section>
<section id="practical-methods-and-examples" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="practical-methods-and-examples"><span class="header-section-number">5</span> Practical Methods and Examples</h2>
<p>Let’s walk through a few concrete examples and methods where the predictive approach is applied. We’ve already discussed the Pólya urn (Dirichlet process) and a simple Beta-Bernoulli model. Here we highlight additional applied scenarios:</p>
<ul>
<li><p><strong>In-context-learning</strong>: As we mentioned above, some neural networks give up on the proofs and just compute interesting Bayes predictive updates. See <span class="citation" data-cites="Hollmann2023TabPFN Lee2023Martingale">(Hollmann et al. 2023; Lee et al. 2023)</span></p></li>
<li><p><strong>Bayesian Bootstrap</strong> <span class="citation" data-cites="Rubin1981Bayesian">(Rubin 1981)</span>: Suppose we have observed data <img src="https://latex.codecogs.com/png.latex?x_1,%5Cdots,x_n"> which we treat as a sample from some population distribution <img src="https://latex.codecogs.com/png.latex?F">. The Bayesian bootstrap avoids choosing a parametric likelihood for <img src="https://latex.codecogs.com/png.latex?F"> and instead puts a <em>uniform prior on the space of all discrete distributions supported on <img src="https://latex.codecogs.com/png.latex?%7Bx_1,%5Cdots,x_n%7D"></em>. In effect, we assume <em>exchangeability</em> and that the true <img src="https://latex.codecogs.com/png.latex?F"> puts all its mass on the observed points (as would be the case if these <img src="https://latex.codecogs.com/png.latex?n"> points were literally the entire population values, but we just don’t know their weights). The posterior for <img src="https://latex.codecogs.com/png.latex?F"> given the data then turns out to be a <img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7BDirichlet%7D(1,1,%5Cdots,1)"> on the point masses at <img src="https://latex.codecogs.com/png.latex?x_1,%5Cdots,x_n">. Consequently, the posterior predictive for a new observation <img src="https://latex.codecogs.com/png.latex?X_%7Bn+1%7D"> is <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D=x_i%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)%20=%20%5Cfrac%7B1%7D%7Bn%7D%5C,,"> for each <img src="https://latex.codecogs.com/png.latex?i=1,%5Cdots,n">. In other words, the next observation is equally likely to be any of the observed values. This is precisely the Bayesian bootstrap’s predictive distribution, which is just the empirical distribution of the sample (sometimes with one extra point allowed to be new, but with a flat prior that new point gets zero mass posterior). The Bayesian bootstrap can be viewed as a limiting case of the Dirichlet process predictive rule when <img src="https://latex.codecogs.com/png.latex?%5Calpha%20%5Cto%200"> (or, dually, when I say “I believe all probability mass is already in the observed points”). It’s a prime example of how a predictive assumption (the next point is equally likely to be any observed point) leads to an implicit prior (<img src="https://latex.codecogs.com/png.latex?%5Coperatorname%7BDirichlet%7D(1,1,%5Cdots,1)"> on weights) and a posterior (the random weights after a Dirichlet draw). The Bayesian bootstrap is often used to generate <em>approximate posterior samples for parameters like the mean or quantiles without having to assume any specific data distribution</em>. This method has gained popularity in Bayesian data analysis, especially in cases where a parametric model is hard to justify. It is an embodiment of de Finetti’s idea: we directly express belief about future draws (they should resemble past draws in distribution) and that is our model.</p></li>
<li><p><strong>Predictive Model Checking and Cross-Validation:</strong> In Bayesian model evaluation, a common practice is to use the posterior predictive distribution to check goodness-of-fit: simulate replicated data <img src="https://latex.codecogs.com/png.latex?X_i%5E%7B%5Ctext%7Brep%7D%7D"> from <img src="https://latex.codecogs.com/png.latex?P(X_i%5E%7B%5Ctext%7Brep%7D%7D%5Cmid%20X_%7B1:n%7D)"> and compare to observed <img src="https://latex.codecogs.com/png.latex?X_i">. Any systematic difference may indicate model misfit. This looks very much like predictive approach: rather than testing hypotheses about parameters, we ask “does the model predict new data that look like the data we have?”. Additionally, methods like leave-one-out cross-validation (LOO-CV) can be given a Bayesian justification via the predictive approach. The LOO-CV score is essentially the product of <img src="https://latex.codecogs.com/png.latex?P(X_i%20%5Cmid%20X_%7B-i%7D)"> over all <img src="https://latex.codecogs.com/png.latex?i"> (the probability of each left-out point under the predictive based on the rest). Selecting models by maximizing this score (or its logarithm) is equivalent to maximizing predictive fit. Some recent research (including <span class="citation" data-cites="Fong2020Marginal">E. Fong and Holmes (2020)</span>) formally connects cross-validation to Bayesian marginal likelihood and even proposes <em>cumulative cross-validation</em> as a way to score models coherently. The philosophy is: a model is good if it <em>predicts well</em>, not just if it has high posterior probability a priori. By building model assessment on predictive distributions, we ensure the evaluation criteria align with the end-use of the model (prediction or forecasting).</p></li>
<li><p><strong>Coresets and Large-Scale Bayesian Summarization:</strong> <span class="citation" data-cites="Flores2025Predictive">(Flores 2025)</span> A very recent application of predictive thinking is in creating <a href="../notebook/data_summarization.html#coresets">Bayesian coreset algorithms</a> – these aim to compress large datasets into small weighted subsets that yield almost the same posterior inference. Traditionally, coreset construction tries to approximate the log-likelihood of the full data by a weighted log-likelihood of a subset (minimizing a KL divergence). However, this fails for complex non-iid models. <span class="citation" data-cites="Flores2025Predictive">Flores (2025)</span> proposed to use a <em>predictive coreset</em>: choose a subset of points such that the posterior predictive distribution of the subset is close to that of the full data. In other words, rather than matching likelihoods, match how well the subset can predict new data like the full set would. This approach explicitly cites the predictive view of inference <span class="citation" data-cites="Fong2024Asymptotics Fortini2012Predictive">(E. Fong and Yiu 2024; Fortini and Petrone 2012)</span> as inspiration. The result is an algorithm that works even for models where likelihoods are intractable (because it can operate on predictive draws). This is a cutting-edge example of methodological innovation driven by predictive thinking.</p></li>
<li><p><strong>Machine Learning and Sequence Modelling:</strong> It’s worth noting that in machine learning, modern large models (like transformers) are often trained to do next-token prediction on sequences. In some recent conceptual work, researchers have drawn a connection between such <em>pre-trained sequence models</em> and de Finetti’s theory. Essentially, a large language model that’s been trained on tons of text is <em>implicitly</em> representing a predictive distribution for words given preceding words. If the data (text) were regarded as exchangeable in some blocks, the model is doing a kind of empirical Bayes (using the training corpus as prior experience) to predict new text. Some authors <span class="citation" data-cites="Ye2024Exchangeable">(Ye and Namkoong 2024)</span> have even argued that <em>in-context learning</em> by these models is equivalent to Bayesian updating on latent features, “Bayesian inference à la de Finetti”. While these ideas are still speculative, they illustrate how the predictive perspective resonates in ML: the focus is entirely on <img src="https://latex.codecogs.com/png.latex?P(%5Ctext%7Bfuture%20tokens%7D%5Cmid%20%5Ctext%7Bpast%20tokens%7D)">. If we were to build an AI that <em>learns like a Bayesian</em>, it might well do so by honing its predictive distribution through experience, rather than by explicitly maintaining a distribution on parameters. This is essentially what these sequence models do, albeit not in a fully coherent probabilistic way. Application in <span class="citation" data-cites="Hollmann2023TabPFN Lee2023Martingale">(Hollmann et al. 2023; Lee et al. 2023)</span></p></li>
</ul>
</section>
<section id="history" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="history"><span class="header-section-number">6</span> History</h2>
<p>I got an LLM to summarize the history for me:</p>
</section>
<section id="historical-timeline-of-the-predictive-framework" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="historical-timeline-of-the-predictive-framework"><span class="header-section-number">7</span> Historical Timeline of the Predictive Framework</h2>
<ul>
<li><p><strong>1930s – de Finetti’s Foundation:</strong> In 1937, Bruno de Finetti published his famous representation theorem for exchangeable sequences, laying the cornerstone of predictive Bayesian inference. An infinite sequence of observations <img src="https://latex.codecogs.com/png.latex?X_1,X_2,%5Cdots"> is <em>exchangeable</em> if its joint probability is invariant under permutation of indices. De Finetti’s theorem states that any infinite exchangeable sequence is equivalent to <em>iid</em> sampling from some latent random probability distribution <img src="https://latex.codecogs.com/png.latex?F">; for suitable observables (say <img src="https://latex.codecogs.com/png.latex?X_i%5Cin%5Cmathbb%7BR%7D">):</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP(X_1%5Cin%20dx_1,%5Cdots,X_n%5Cin%20dx_n)%20%5C;=%5C;%20%5Cint%20%5Cprod_%7Bi=1%7D%5En%20F(dx_i)%5C;%20%5Cmu(dF)%5C,,%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?%5Cmu"> is a “mixing” measure on distribution functions <img src="https://latex.codecogs.com/png.latex?F"> (this <img src="https://latex.codecogs.com/png.latex?%5Cmu"> serves as a prior over <img src="https://latex.codecogs.com/png.latex?F"> in Bayesian terms). Intuitively, if we believe the <img src="https://latex.codecogs.com/png.latex?X_i"> are exchangeable, we act <em>as if</em> there is some unknown true distribution <img src="https://latex.codecogs.com/png.latex?F"> governing them; given <img src="https://latex.codecogs.com/png.latex?F">, the data are iid. De Finetti emphasized that <img src="https://latex.codecogs.com/png.latex?F"> itself is an unobservable construct – what matters are the predictive probabilities <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D%5Cin%20A%20%5Cmid%20X_%7B1:n%7D=x_%7B1:n%7D)"> for future observations. His philosophical stance was that probability is about our belief in future observable events, not about abstract parameters. He often illustrated this with betting and forecasting, treating inference as updating predictive “previsions” (expectations of future quantities). De Finetti’s ideas formed the philosophical bedrock of the <em>Italian school</em> of subjective Bayesianism, shifting focus toward prediction.</p></li>
<li><p><strong>1950s – Formalization of Exchangeability:</strong> Following de Finetti, mathematical statisticians solidified the theoretical underpinnings. Hewitt and Savage (1955) provided a rigorous existence proof for de Finetti’s representation via measure-theoretic extension theorems (ensuring a mixing measure <img src="https://latex.codecogs.com/png.latex?%5Cmu"> exists for any exchangeable law). This period established exchangeability as a fundamental concept in Bayesian theory. Simply put, <em>exchangeability = “iid given some <img src="https://latex.codecogs.com/png.latex?F">”</em>. This result, sometimes called <em>de Finetti’s theorem</em>, became a “cornerstone of modern Bayesian theory”. It means that specifying a prior on the parameter (or on <img src="https://latex.codecogs.com/png.latex?F">) is mathematically equivalent to specifying a predictive rule for the sequence. In fact, we can recover de Finetti’s mixture form by multiplying one-step-ahead predictive probabilities:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0AP(x_1,%5Cdots,x_n)%20=%20P(x_1)%20%5C,%20P(x_2%5Cmid%20x_1)%5Ccdots%20P(x_n%5Cmid%20x_%7B1:n-1%7D)%5C,,%0A"></p>
<p>And for an exchangeable model, this product must equal the integral above. This insight – that a joint distribution can be factorized into sequential predictive distributions – is central to the predictive approach, and also completely baffling to introduce to students.</p></li>
<li><p><strong>1970s – Bayesian Nonparametrics and Urn Schemes:</strong> Decades later, de Finetti’s predictive philosophy found new life in <a href="../notebook/bayes_nonparametric.html">Bayesian nonparametric</a> methods. In 1973, <span class="citation" data-cites="Blackwell1973Ferguson">Blackwell and MacQueen (1973)</span> introduced the Pólya’s urn scheme as a constructive predictive rule for the <a href="../notebook/measure_rvs.html">Dirichlet Process (DP) prior</a>, which Ferguson had proposed that same year as a nonparametric prior on distributions. Blackwell and MacQueen showed that if <img src="https://latex.codecogs.com/png.latex?X_1%5Csim%20F_0"> (a base distribution) and for each <img src="https://latex.codecogs.com/png.latex?n%5Cge1">, <img src="https://latex.codecogs.com/png.latex?X_%7Bn+1%7D%5Cmid%20X_%7B1:n%7D%20%5Csim%20%5Cfrac%7B%5Calpha%7D%7B%5Calpha+n%7DF_0%20+%20%5Cfrac%7B1%7D%7B%5Calpha+n%7D%5Csum_%7Bi=1%7D%5En%20%5Cdelta_%7BX_i%7D%5C,,"> then the sequence <img src="https://latex.codecogs.com/png.latex?(X_n)_%7Bn%5Cge1%7D"> is exchangeable and in fact <img src="https://latex.codecogs.com/png.latex?F_0"> mixed with the urn scheme defines a Dirichlet process law. In this predictive rule, with probability <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7B%5Calpha%7D%7B%5Calpha+n%7D">, the <img src="https://latex.codecogs.com/png.latex?(n+1)">th draw is a <em>new</em> value sampled from <img src="https://latex.codecogs.com/png.latex?F_0">, and with probability <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7Bn_j%7D%7B%5Calpha+n%7D">, it repeats one of the previously seen values (specifically, it equals the j-th distinct value seen so far, which occurred <img src="https://latex.codecogs.com/png.latex?n_j"> times). This elegant scheme generates clusters of identical values and is the basis of the Chinese restaurant process in machine learning. Importantly, it required no explicit mention of a parameter – the predictive probabilities themselves defined the model. The Dirichlet process became the canonical example of a prior that is <em>constructed via predictive distributions</em>. Around the same time, <span class="citation" data-cites="Cifarelli1978Nonparametric">Cifarelli and Regazzini (1978)</span> discussed Bayesian nonparametric problems under exchangeability, and Ewens’s sampling formula <span class="citation" data-cites="Ewens1972Sampling">(Ewens 1972)</span> in population genetics provided another famous predictive rule for random partitions of species. These developments all build rich new models by directly formulating how observations <em>predict</em> new ones.</p></li>
<li><p><strong>1980s – Predictive Inference and Model Assessment:</strong> By the 1980s, the predictive viewpoint began influencing statistical practice and philosophy outside of nonparametrics. Seymour Geisser advanced the idea that <em>predictive ability</em> is the ultimate test of a model – he promoted predictive model checking and advocated using the posterior predictive distribution for model assessment and selection (foundational to modern cross-validation approaches). In 1981, Rubin introduced the <a href="../notebook/bootstrap.html#as-a-bayesian-method">Bayesian bootstrap</a>, an alternative to the classical bootstrap, which can be seen as a predictive inferential method: it assumes an exchangeable model where the “prior” is that the <img src="https://latex.codecogs.com/png.latex?n"> observed data points form a finite population from which future samples are drawn uniformly at random. The Bayesian bootstrap’s posterior predictive for a new observation is simply the empirical distribution of the observed sample (with random weights), which aligns with de Finetti’s view of directly assigning probabilities to future data without a parametric likelihood. Ghosh and Meeden <span class="citation" data-cites="Ghosh1986Empirical Ghosh2021Bayesian">(Ghosh and Meeden 1986; Ghosh 2021)</span> further developed Bayesian predictive methods for <em>finite population sampling</em>, treating the unknown finite population values as exchangeable and focusing on predicting the unseen units – again, no explicit parametric likelihood was needed. These works kept alive the notion that Bayesian inference “a la de Finetti” – with predictions first – could be practically useful. However, at the time, mainstream Bayesian statistics still largely centred on parametric models and priors, so the predictive approach was a somewhat heterodox perspective, championed by a subset of Bayesian thinkers.</p></li>
<li><p><strong>1990s – The Italian School and Generalized Exchangeability:</strong> The 1990s saw renewed theoretical interest in characterizing exchangeable structures via predictions. <strong>Partial exchangeability</strong> (where data have subgroup invariances, like Markov exchangeability or other structured dependence) became a focus. In 1995, Jim Pitman generalized the Pólya urn to a two-parameter family (the Pitman–Yor process), broadening the class of predictive rules to capture power-law behavior in frequencies <span class="citation" data-cites="Pitman1995Exchangeable">(Pitman 1995)</span>. In Italy, scholars like Eugenio Regazzini, Pietro Muliere, and their collaborators began exploring reinforced urn processes and other predictive constructions for more complex sequences. For example, <span class="citation" data-cites="Muliere1993Bayesian">Pietro Muliere and Petrone (1993)</span> applied predictive mixtures of Dirichlet processes in regression problems, and <span class="citation" data-cites="Muliere2000Urn">P. Muliere, Secchi, and Walker (2000)</span> introduced reinforced urn models for survival data. These models were essentially <em>Markov chains whose transition probabilities update with reinforcement</em> (i.e.&nbsp;past observations feed back into future transition probabilities), and they showed such sequences are mixtures of Markov chains – a type of partially exchangeable structure. Throughout, the strategy was to start by positing a plausible form for the one-step predictive distribution and then deduce the existence and form of the underlying probability law or “prior.” This reversed the conventional approach: instead of specifying a prior then deriving predictions, we specify predictions and thereby define an implicit prior. By the end of the 90s, the groundwork was laid for a systematic predictive construction of Bayesian models.</p></li>
<li><p><strong>2000s – Predictive Characterizations and New Priors:</strong> <span class="citation" data-cites="Fortini2000Exchangeability">Fortini, Ladelli, and Regazzini (2000)</span> formalized the <em>conditions for a predictive rule to yield exchangeability</em>. They gave precise necessary and sufficient conditions on a sequence of conditional distributions <img src="https://latex.codecogs.com/png.latex?(P_n)"> that ensure there exists some exchangeable joint law <img src="https://latex.codecogs.com/png.latex?P"> producing them. In essence, they proved that <em>symmetry</em> (the predictive probabilities depend on data only through symmetric functions like counts) and a certain consistency (related to associative conditioning of future predictions) characterize exchangeability. This result (along with earlier work by Diaconis and Freedman on sufficiency) provided a rigorous predictive <em>criterion</em>: we can validate whether a proposed prediction rule is coherent (comes from some exchangeable model) without explicitly constructing the latent parameter. Around the same time, new priors in BNP were being defined via predictive structures. For instance, the species sampling models (Boothby, Pitman, etc.) were recognized as those exchangeable sequences with a general predictive form <img src="https://latex.codecogs.com/png.latex?P(X_%7Bn+1%7D=%20%5Ctext%7Bnew%7D%20%5Cmid%20X_%7B1:n%7D)%20=%20%5Cfrac%7B%5Calpha%20+%20c%20k%7D%7B%5Calpha%20+%20n%7D"> which yields various generalizations of the Dirichlet process. The Italian school played a leading role: they worked out how popular nonparametric priors like Dirichlet processes, Pitman–Yor processes, and others can be derived from a sequence of predictive probabilities. <em>Priors by prediction</em> became a theme. <span class="citation" data-cites="Fortini2012Predictive">Fortini and Petrone (2012)</span> wrote a comprehensive review on predictive construction of priors for both exchangeable and partially exchangeable scenarios. They highlighted theoretical links and revisited classical results “to shed light on theoretical connections” among predictive constructions. By the end of the 2000s, it was clear that we could <em>either</em> start with a prior or directly with a predictive mechanism – the two routes were provably equivalent if done consistently, but the predictive route often yielded new insights.</p></li>
<li><p><strong>2010s – Consolidation and Wider Adoption:</strong> In the 2010s, the predictive approach gained broader recognition and was increasingly connected to modern statistical learning. Fortini and Petrone continued to publish a series of works extending the theory: they explored predictive <a href="../notebook/nearly_sufficient_statistics_bottlenecks.html">sufficiency</a> (identifying what summary of data preserves all information for predicting new data), and they characterized a range of complex priors via predictive rules (from hierarchical priors to hidden Markov models built on predictive constructions). For example, they showed how an infinite Hidden Markov Model (used in machine learning for clustering time series) can be seen as a mixture of Markov chains, constructed by a sequence of predictive transition distributions. Meanwhile, machine learning researchers, notably in the topic modelling and Bayesian nonparametric clustering communities, adopted the language of exchangeable partitions (the Chinese restaurant process, Indian buffet process, etc., all essentially predictive rules). The review article <span class="citation" data-cites="Fortini2016Predictive">Fortini and Petrone (2016)</span> distilled the philosophy and noted how the predictive approach had become central both to Bayesian foundations and to practical modelling in nonparametrics and ML. Another development was the exploration of conditionally identically distributed (CID) sequences (weaker than full exchangeability) and other relaxations – these allow some trend or covariate effects while retaining a predictive structure. Researchers like Berti contributed here, defining models where only a subset of predictive probabilities are constrained by symmetry <span class="citation" data-cites="Berti2004Limit Berti2012Limit">(Berti, Pratelli, and Rigo 2004, 2012)</span>. All these efforts reinforced that <em>de Finetti’s perspective is not just philosophical musing – it leads to concrete new models and methods</em>.</p></li>
<li><p><strong>2020s – Martingale Posteriors and Prior-Free Bayesianism:</strong> Very recent years have witnessed a surge of interest in prior-free or prediction-driven Bayesian updating rules. Two parallel lines of work – one by Fong, Holmes, and Walker in the UK, and another by Berti, Rigo, and collaborators in Italy – have pushed the predictive approach to its logical extreme: <em>conduct Bayesian inference entirely through predictive distributions, with no explicit prior at all</em>. Edwin Fong’s thesis <span class="citation" data-cites="Fong2021Predictive">(C. H. E. Fong 2021)</span> and subsequent papers introduced the Martingale Posterior framework. The core idea is to view <em>the “parameter” as the infinite sequence of future (or missing) observations</em>. If we had the entire population or the entire infinite sequence <img src="https://latex.codecogs.com/png.latex?Y_%7Bn+1:%5Cinfty%7D">, any parameter of interest (like the true mean, or the underlying distribution <img src="https://latex.codecogs.com/png.latex?F">) would be known exactly. Thus uncertainty about <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> is really uncertainty about the as-yet-unseen data. Fong et al.&nbsp;formalize this by directly assigning a joint predictive distribution for all future observations given the observed <img src="https://latex.codecogs.com/png.latex?Y_%7B1:n%7D">. In notation, instead of a posterior <img src="https://latex.codecogs.com/png.latex?p(%5Ctheta%5Cmid%20Y_%7B1:n%7D)">, they consider <img src="https://latex.codecogs.com/png.latex?p(Y_%7Bn+1:%5Cinfty%7D%5Cmid%20Y_%7B1:n%7D)">. This is a <em>huge</em> distribution (over an infinite sequence), but under exchangeability it encodes the same information as a posterior on <img src="https://latex.codecogs.com/png.latex?%5Ctheta">. In fact, there is a one-to-one correspondence: if we choose the predictive distribution in the standard Bayesian way (by integrating the likelihood against a prior), then <em>Doob’s martingale theorem</em> implies the induced distribution on <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> is exactly the usual posterior. Fong and colleagues instead relax this: they allow us to specify any predictive mechanism (any sequence of one-step-ahead predictive densities) that seems reasonable for the problem, not necessarily derived from a likelihood-prior pair. As long as these predictive densities are coherent (a martingale in the sense of not contradicting themselves over time), we can define an implicit “posterior” for <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> or for any function of the unseen data. They dub this the martingale posterior distribution, which “returns Bayesian uncertainty directly on any statistic of interest without the need for the likelihood and prior”. In practice, they introduce an algorithm called <em>predictive resampling</em> to draw samples from the martingale posterior. Essentially, we iteratively sample pseudo-future observations from the chosen predictive rule to impute an entire fake “completion” of the data, use that to compute the statistic of interest, and repeat – thereby approximating the distribution of that statistic under the assumed predictive model. Martingale posteriors generalize Bayesian inference, subsuming standard posteriors when the predictive comes from a usual model, but also allowing robust or model-misspecified settings to be handled by choosing an alternative predictive (e.g.&nbsp;we might choose a heavy-tailed predictive density to guard against outliers, implicitly yielding a different “posterior”).</p>
<p>In parallel, <span class="citation" data-cites="Berti2023Bayesian">Berti et al. (2023)</span> developed a similar idea of Bayesian predictive inference without a prior. They work axiomatically with a user-specified sequence of predictives <img src="https://latex.codecogs.com/png.latex?%7B%5Csigma_n(%5Ccdot%5Cmid%20x_%7B1:n%7D)%7D_%7Bn%5Cge0%7D"> and establish general results for consistency and asymptotics of the resulting inference. One main advantage, as they note, is “no prior probability has to be selected” – the only inputs are the data and the predictive rule. These cutting-edge developments show how de Finetti’s viewpoint – once considered philosophically radical – is now driving methodological innovation for large-scale and robust Bayesian analysis. Today, the predictive approach is not only a cornerstone of Bayesian foundations but also an active area of research in its own right, influencing topics from machine learning (e.g.&nbsp;sequence modelling and meta-learning) to the theory of Bayesian asymptotics.</p></li>
</ul>
</section>
<section id="questions" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="questions"><span class="header-section-number">8</span> Questions</h2>
<ul>
<li>How do we extend this idea to causal inference, especially <a href="../notebook/causal_abstraction.html">causal abstraction</a>? Do we simply end up reinventing classical graphical models anyway?</li>
</ul>
</section>
<section id="incoming" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="incoming"><span class="header-section-number">9</span> Incoming</h2>
<ul>
<li><a href="https://xianblog.wordpress.com/2022/11/07/martingale-posteriors/comment-page-1/?ref=danmackinlay.name#:~:text=Image%3A%20p%28y_">martingale posteriors | Xi’an’s Og</a></li>
<li>Chapter 2 of <a href="https://postbayes.github.io/seminar/?ref=danmackinlay.name">Post-Bayes seminar series</a></li>
</ul>
</section>
<section id="references" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="references"><span class="header-section-number">10</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Berti2023Bayesian" class="csl-entry">
Berti, Dreassi, Leisen, et al. 2023. <span>“<a href="https://doi.org/10.5705/ss.202021.0238">Bayesian Predictive Inference Without a Prior</a>.”</span> <em>Statistica Sinica</em>.
</div>
<div id="ref-Berti2004Limit" class="csl-entry">
Berti, Pratelli, and Rigo. 2004. <span>“<a href="https://doi.org/10.1214/009117904000000676">Limit Theorems for a Class of Identically Distributed Random Variables</a>.”</span> <em>The Annals of Probability</em>.
</div>
<div id="ref-Berti2012Limit" class="csl-entry">
———. 2012. <span>“<a href="https://doi.org/10.1214/EJP.v17-1765">Limit Theorems for Empirical Processes Based on Dependent Data</a>.”</span> <em>Electronic Journal of Probability</em>.
</div>
<div id="ref-Berti2021Central" class="csl-entry">
———. 2021. <span>“<a href="https://doi.org/10.3390/math9243211">A Central Limit Theorem for Predictive Distributions</a>.”</span> <em>Mathematics</em>.
</div>
<div id="ref-Blackwell1973Ferguson" class="csl-entry">
Blackwell, and MacQueen. 1973. <span>“<a href="https://doi.org/10.1214/aos/1176342372">Ferguson Distributions Via Polya Urn Schemes</a>.”</span> <em>The Annals of Statistics</em>.
</div>
<div id="ref-Cifarelli1978Nonparametric" class="csl-entry">
Cifarelli, and Regazzini. 1978. <span>“Nonparametric Statistical Problems Under Partial Exchangeability: The Use of Associative Means.”</span> <em>Annali Del’Instituto Di Matematica Finianziara Dell’Universita Di Torino, Serie</em>.
</div>
<div id="ref-DeFinetti1937Prevision" class="csl-entry">
De Finetti. 1937. <span>“<a href="http://www.numdam.org/item/AIHP_1937__7_1_1_0.pdf">La Prévision: Ses Lois Logiques, Ses Sources Subjectives</a>.”</span> In <em>Annales de l’institut Henri Poincaré</em>.
</div>
<div id="ref-Ewens1972Sampling" class="csl-entry">
Ewens. 1972. <span>“<a href="https://doi.org/10.1016/0040-5809(72)90035-4">The Sampling Theory of Selectively Neutral Alleles</a>.”</span> <em>Theoretical Population Biology</em>.
</div>
<div id="ref-Flores2025Predictive" class="csl-entry">
Flores. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2502.05725">Predictive Coresets</a>.”</span>
</div>
<div id="ref-Fong2021Predictive" class="csl-entry">
Fong, C. H. E. 2021. <span>“<a href="https://ora.ox.ac.uk/objects/uuid:98a6d3eb-6fee-4850-87f2-8dd048fd6864">The predictive view of Bayesian inference</a>.”</span>
</div>
<div id="ref-Fong2020Marginal" class="csl-entry">
Fong, Edwin, and Holmes. 2020. <span>“<a href="https://doi.org/10.1093/biomet/asz077">On the Marginal Likelihood and Cross-Validation</a>.”</span> <em>Biometrika</em>.
</div>
<div id="ref-Fong2021Martingale" class="csl-entry">
Fong, Edwin, Holmes, and Walker. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2103.15671">Martingale Posterior Distributions</a>.”</span>
</div>
<div id="ref-Fong2024Asymptotics" class="csl-entry">
Fong, Edwin, and Yiu. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2410.17692">Asymptotics for Parametric Martingale Posteriors</a>.”</span>
</div>
<div id="ref-Fortini2000Exchangeability" class="csl-entry">
Fortini, Ladelli, and Regazzini. 2000. <span>“<a href="https://www.jstor.org/stable/25051292">Exchangeability, Predictive Distributions and Parametric Models</a>.”</span> <em>Sankhy?: The Indian Journal of Statistics, Series A (1961-2002)</em>.
</div>
<div id="ref-Fortini2012Predictive" class="csl-entry">
Fortini, and Petrone. 2012. <span>“<a href="https://doi.org/10.1214/11-BJPS176">Predictive Construction of Priors in Bayesian Nonparametrics</a>.”</span> <em>Brazilian Journal of Probability and Statistics</em>.
</div>
<div id="ref-Fortini2016Predictive" class="csl-entry">
———. 2016. <span>“<a href="https://iris.unibocconi.it/handle/11565/3984471">Predictive distribution (de Finetti’s view)</a>.”</span> In <em>Wiley StatsRef: Statistics Reference Online</em>.
</div>
<div id="ref-Fortini2025Exchangeability" class="csl-entry">
———. 2025. <span>“<a href="https://doi.org/10.1214/24-STS965">Exchangeability, Prediction and Predictive Modeling in Bayesian Statistics</a>.”</span> <em>Statistical Science</em>.
</div>
<div id="ref-Ghosh2021Bayesian" class="csl-entry">
Ghosh. 2021. <em><a href="https://www.taylorfrancis.com/books/mono/10.1201/9781315138169/bayesian-methods-finite-population-sampling-niels-keiding-malay-ghosh">Bayesian Methods for Finite Population Sampling</a></em>.
</div>
<div id="ref-Ghosh1986Empirical" class="csl-entry">
Ghosh, and Meeden. 1986. <span>“<a href="https://doi.org/10.1080/01621459.1986.10478373">Empirical Bayes Estimation in Finite Population Sampling</a>.”</span> <em>Journal of the American Statistical Association</em>.
</div>
<div id="ref-Hewitt1955Symmetric" class="csl-entry">
Hewitt, and Savage. 1955. <span>“<a href="https://doi.org/10.1090/S0002-9947-1955-0076206-8">Symmetric Measures on Cartesian Products</a>.”</span> <em>Transactions of the American Mathematical Society</em>.
</div>
<div id="ref-Hollmann2023TabPFN" class="csl-entry">
Hollmann, Müller, Eggensperger, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2207.01848">TabPFN: A Transformer That Solves Small Tabular Classification Problems in a Second</a>.”</span>
</div>
<div id="ref-Hollmann2025Accurate" class="csl-entry">
Hollmann, Müller, Purucker, et al. 2025. <span>“<a href="https://doi.org/10.1038/s41586-024-08328-6">Accurate Predictions on Small Data with a Tabular Foundation Model</a>.”</span> <em>Nature</em>.
</div>
<div id="ref-Lee2023Martingale" class="csl-entry">
Lee, Yun, Nam, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2304.09431">Martingale Posterior Neural Processes</a>.”</span>
</div>
<div id="ref-Meeden1983Choosing" class="csl-entry">
Meeden, and Ghosh. 1983. <span>“<a href="https://www.jstor.org/stable/2240483">Choosing Between Experiments: Applications to Finite Population Sampling</a>.”</span> <em>The Annals of Statistics</em>.
</div>
<div id="ref-Muliere1993Bayesian" class="csl-entry">
Muliere, Pietro, and Petrone. 1993. <span>“<a href="https://doi.org/10.1007/BF02589069">A Bayesian Predictive Approach to Sequential Search for an Optimal Dose: Parametric and Nonparametric Models</a>.”</span> <em>Journal of the Italian Statistical Society</em>.
</div>
<div id="ref-Muliere2000Urn" class="csl-entry">
Muliere, P., Secchi, and Walker. 2000. <span>“<a href="https://doi.org/10.1016/S0304-4149(99)00119-2">Urn Schemes and Reinforced Random Walks</a>.”</span> <em>Stochastic Processes and Their Applications</em>.
</div>
<div id="ref-Ng2025TabMGP" class="csl-entry">
Ng, Fong, Frazier, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2510.25154">TabMGP: Martingale Posterior with TabPFN</a>.”</span>
</div>
<div id="ref-Pitman1993Dependence" class="csl-entry">
Pitman. 1993. <span>“<a href="https://doi.org/10.1007/978-1-4612-4374-8_6">Dependence</a>.”</span> In <em>Probability</em>.
</div>
<div id="ref-Pitman1995Exchangeable" class="csl-entry">
———. 1995. <span>“<a href="https://doi.org/10.1007/BF01213386">Exchangeable and Partially Exchangeable Random Partitions</a>.”</span> <em>Probability Theory and Related Fields</em>.
</div>
<div id="ref-Rubin1981Bayesian" class="csl-entry">
Rubin. 1981. <span>“<a href="https://doi.org/10.1214/aos/1176345338">The Bayesian Bootstrap</a>.”</span> <em>Annals of Statistics</em>.
</div>
<div id="ref-Ye2024Exchangeable" class="csl-entry">
Ye, and Namkoong. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2408.03307">Exchangeable Sequence Models Quantify Uncertainty Over Latent Concepts</a>.”</span>
</div>
</div>


</section>

 ]]></description>
  <category>Bayes</category>
  <category>how do science</category>
  <category>likelihood free</category>
  <category>probability</category>
  <category>statistics</category>
  <guid>https://danmackinlay.name/notebook/bayes_predictive.html</guid>
  <pubDate>Thu, 10 Jul 2025 06:22:15 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/gas_experiments_RP-P-1953-870.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Degrees of freedom in NNs</title>
  <link>https://danmackinlay.name/notebook/nn_information_criteria_dof.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-french-shadows" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-french-shadows-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/french_shadows_magicstageillusi00hopk_0198.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/french_shadows_magicstageillusi00hopk_0198.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-french-shadows-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>In classical statistics there are <a href="../notebook/information_criteria_dof.html">families of model complexity estimates, which are loosely collectively referred to as “Degrees of freedom” of a model</a>. They don’t scale up to <a href="../notebook/nn_overparameterization.html">overparameterized NNs</a>, computationally or practically, and there are other tools.</p>
<p>Exception: <span class="citation" data-cites="Shoham2025Flatness">Shoham, Mor-Yosef, and Avron (2025)</span> argues for a connection to the <a href="../notebook/information_criteria_dof.html#tic">Takeuchi Information Criterion</a>.</p>
<p>These end up being popular in <a href="../notebook/ai_dev_interp.html">developmental interpretability</a>.</p>
<section id="learning-coefficient" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="learning-coefficient"><span class="header-section-number">1</span> Learning coefficient</h2>
<p>The major output of <a href="../notebook/singular_learning_theory.html">singular learning theory</a>, AFAICT, is a particular estimate of a model’s effective dimensionality.</p>
</section>
<section id="minimum-description-length" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="minimum-description-length"><span class="header-section-number">2</span> Minimum description length</h2>
<p><a href="../notebook/minimum_description_length.html">MDL</a> seems to be an interesting way to think about NNs <span class="citation" data-cites="Hinton1993Autoencoders Hinton1993Keeping Perez2021Rissanen">(Geoffrey E. Hinton and Zemel 1993; Geoffrey E. Hinton and van Camp 1993; Perez, Kiela, and Cho 2021)</span>.</p>
<p>There’s some connection to LLC, I’ve been told, but I don’t yet know enough to make that precise.</p>
</section>
<section id="sane" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="sane"><span class="header-section-number">3</span> SANE</h2>
<p><em>Sharpness-Adjusted Number of Effective</em> parameters <span class="citation" data-cites="Wang2023SANE">(L. Wang and Roberts 2023)</span>.</p>
<p>Spruiked by Stephen Roberts at <a href="https://www.youtube.com/watch?v=tGnoQ6Jqx34&amp;ref=danmackinlay.name">Instability is All You Need: The Surprising Dynamics of Learning in Deep Models</a></p>
</section>
<section id="incoming" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="incoming"><span class="header-section-number">4</span> Incoming</h2>
<ul>
<li>Eleuther’s local volume measurement looks connected: <a href="https://blog.eleuther.ai/tyche-poser-comparison/?ref=danmackinlay.name">Research Update: Applications of Local Volume Measurement | EleutherAI Blog</a></li>
</ul>
</section>
<section id="references" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="references"><span class="header-section-number">5</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-AbbasEffective" class="csl-entry">
Abbas, Sutter, Figalli, et al. n.d. <span>“Eﬀective Dimension of Machine Learning Models.”</span>
</div>
<div id="ref-Dold2025Paths" class="csl-entry">
Dold, Kobialka, Palm, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.03382">Paths and Ambient Spaces in Neural Loss Landscapes</a>.”</span>
</div>
<div id="ref-Hinton1993Keeping" class="csl-entry">
Hinton, Geoffrey E., and van Camp. 1993. <span>“<a href="https://doi.org/10.1145/168304.168306">Keeping the Neural Networks Simple by Minimizing the Description Length of the Weights</a>.”</span> In <em>Proceedings of the Sixth Annual Conference on Computational Learning Theory</em>. COLT ’93.
</div>
<div id="ref-Hinton1993Autoencoders" class="csl-entry">
Hinton, Geoffrey E, and Zemel. 1993. <span>“<a href="https://proceedings.neurips.cc/paper/1993/hash/9e3cfc48eccf81a0d57663e129aef3cb-Abstract.html">Autoencoders, Minimum Description Length and Helmholtz Free Energy</a>.”</span> In <em>Advances in Neural Information Processing Systems</em>.
</div>
<div id="ref-Hitchcock2025Global" class="csl-entry">
Hitchcock, and Hoogland. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2507.21449">From Global to Local: A Scalable Benchmark for Local Posterior Sampling</a>.”</span>
</div>
<div id="ref-Humayun2024Deep" class="csl-entry">
Humayun, Balestriero, and Baraniuk. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2402.15555">Deep Networks Always Grok and Here Is Why</a>.”</span>
</div>
<div id="ref-Khachaturov2024Complexity" class="csl-entry">
Khachaturov, and Mullins. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2410.18556">Complexity Matters: Effective Dimensionality as a Measure for Adversarial Robustness</a>.”</span>
</div>
<div id="ref-Lau2025Local" class="csl-entry">
Lau, Furman, Wang, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2308.12108">The Local Learning Coefficient: A Singularity-Aware Complexity Measure</a>.”</span> In.
</div>
<div id="ref-MichaudQuantization" class="csl-entry">
Michaud, Liu, Girit, et al. n.d. <span>“The Quantization Model of Neural Scaling.”</span>
</div>
<div id="ref-Munn2025Bayesian" class="csl-entry">
Munn, and Wei. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2410.05612">A Bayesian Model Selection Criterion for Selecting Pretraining Checkpoints</a>.”</span>
</div>
<div id="ref-Murata1994Network" class="csl-entry">
Murata, Yoshizawa, and Amari. 1994. <span>“<a href="https://doi.org/10.1109/72.329683">Network Information Criterion-Determining the Number of Hidden Units for an Artificial Neural Network Model</a>.”</span> <em>IEEE Transactions on Neural Networks</em>.
</div>
<div id="ref-Perez2021Rissanen" class="csl-entry">
Perez, Kiela, and Cho. 2021. <span>“<a href="http://arxiv.org/abs/2103.03872">Rissanen Data Analysis: Examining Dataset Characteristics via Description Length</a>.”</span> In <em>Proceedings of the 38th International Conference on Machine Learning</em>.
</div>
<div id="ref-Ripoli2025Improved" class="csl-entry">
Ripoli, and Everitt. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.05144">Improved MCMC with Active Subspaces</a>.”</span>
</div>
<div id="ref-Saito2007Real" class="csl-entry">
Saito. 2007. <span>“<a href="https://doi.org/10.48550/arXiv.0707.2308">On Real Log Canonical Thresholds</a>.”</span>
</div>
<div id="ref-Shoham2025Flatness" class="csl-entry">
Shoham, Mor-Yosef, and Avron. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2506.17809">Flatness After All?</a>”</span>
</div>
<div id="ref-Wang2023SANE" class="csl-entry">
Wang, Lawrence, and Roberts. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2305.18490">SANE: The Phases of Gradient Descent Through Sharpness Adjusted Number of Effective Parameters</a>.”</span>
</div>
<div id="ref-Wang2023SharpnessAware" class="csl-entry">
Wang, Pengfei, Zhang, Lei, et al. 2023. <span>“<a href="https://openaccess.thecvf.com/content/CVPR2023/html/Wang_Sharpness-Aware_Gradient_Matching_for_Domain_Generalization_CVPR_2023_paper.html">Sharpness-Aware Gradient Matching for Domain Generalization</a>.”</span> In.
</div>
<div id="ref-Watanabe2010Asymptotic" class="csl-entry">
Watanabe. 2010. <span>“<a href="https://doi.org/10.48550/arXiv.1004.2316">Asymptotic Equivalence of Bayes Cross Validation and Widely Applicable Information Criterion in Singular Learning Theory</a>.”</span> <em>Journal of Machine Learning Research</em>.
</div>
</div>


</section>

 ]]></description>
  <category>estimator distribution</category>
  <category>information</category>
  <category>likelihood</category>
  <category>model selection</category>
  <category>statistics</category>
  <guid>https://danmackinlay.name/notebook/nn_information_criteria_dof.html</guid>
  <pubDate>Wed, 25 Jun 2025 09:19:22 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/french_shadows_magicstageillusi00hopk_0198.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Inductive biases</title>
  <link>https://danmackinlay.name/notebook/nn_inductive_biases.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-moon-maxxing" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-moon-maxxing-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/moon_maxxing_RP-P-1916-396.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/moon_maxxing_RP-P-1916-396.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-moon-maxxing-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>I’m not sure what this truly means or whether anyone is, but I think it means something like quantifying <em>architectures that make it “easier” to learn about the phenomena of interest</em>. This is a practical engineering discipline in NNs, but maybe also interesting to think about <a href="../notebook/mind_as_ml.html">in humans</a>.</p>



 ]]></description>
  <category>functional analysis</category>
  <category>how do science</category>
  <category>meta learning</category>
  <category>model selection</category>
  <category>optimization</category>
  <category>statmech</category>
  <guid>https://danmackinlay.name/notebook/nn_inductive_biases.html</guid>
  <pubDate>Sun, 15 Jun 2025 22:43:12 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/moon_maxxing_RP-P-1916-396.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Headaches</title>
  <link>https://danmackinlay.name/notebook/headaches.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-forging-a-head" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-forging-a-head-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/forging_a_head_RP-P-1953-152.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/forging_a_head_RP-P-1953-152.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-forging-a-head-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Headache is not a monolithic condition. The path to managing complex, multifactorial conditions like chronic headaches lies in rigorous data collection, <a href="../notebook/single_subject_experiments.html">personalized n-of-1 trials</a>, stuff like that. I made some notes on that theme and then got an AI to pad them out into whole sentences. Strap in for the ride.</p>
<section id="headache-typology" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="headache-typology"><span class="header-section-number">1</span> Headache typology</h2>
<p>Effective management begins with correct identification. The three major primary headache types have distinct pathophysiology, prognoses, and other words beginning with “p”.</p>
<p>I’ve listed the three I’ve encountered in the wild, but I doubt this list is exhaustive.</p>
<section id="migraine" class="level3" data-number="1.1">
<h3 data-number="1.1" class="anchored" data-anchor-id="migraine"><span class="header-section-number">1.1</span> Migraine</h3>
<p>Once miscategorized as a vascular issue, migraine is now understood as a complex neuroinflammatory disorder <span class="citation" data-cites="FrimpongManson2024Advances">(Frimpong-Manson et al. 2024)</span>. See also <span class="citation" data-cites="Ferrari2022Migraine Hilliard2025Migraine Mungoven2021Chronic Ong2018Migraine Ozge2024Revolutionizing">(Ferrari et al. 2022; Hilliard 2025; Mungoven, Henderson, and Meylakh 2021; Ong and De Felice 2018; Özge et al. 2024)</span>.</p>
<ul>
<li><p><strong>Mechanism</strong>: The leading model involves <strong>Cortical Spreading Depression (CSD)</strong>, a wave of intense neural activity followed by suppression, which is linked to aura and triggers the <strong>trigeminovascular system</strong>. This activation releases neuropeptides like <strong>Calcitonin Gene-Related Peptide (CGRP)</strong>, leading to neurogenic inflammation, vasodilation, and the severe, often unilateral, throbbing pain characteristic of migraine. The brainstem and hypothalamus are also involved, modulating pain sensitivity and contributing to premonitory symptoms.</p></li>
<li><p><strong>Prognosis</strong>: Migraine is typically a chronic condition with episodic attacks that can vary in frequency and severity. For some, frequency can increase over time, transitioning to chronic migraine (≥15 headache days per month). Onset is most common before age 40.</p></li>
<li><p><strong>Treatment</strong>:</p>
<ul>
<li><strong>Acute</strong>: Triptans (e.g., Rizatriptan), which are 5-HT1B/1D receptor agonists, work by constricting cranial blood vessels and inhibiting neuropeptide release. Due to their vasoconstrictive action, they are contraindicated in patients with cardiovascular disease. Newer options include “gepants” (oral CGRP receptor antagonists) and “ditans” that target the 5-HT1F receptor without causing vasoconstriction.</li>
<li><strong>Preventive</strong>: For frequent attacks, options include beta-blockers, antidepressants, anti-seizure medications, and the <strong>CGRP-targeted monoclonal antibodies</strong> and gepants.</li>
</ul></li>
</ul>
</section>
<section id="tension-type-headache-tth" class="level3" data-number="1.2">
<h3 data-number="1.2" class="anchored" data-anchor-id="tension-type-headache-tth"><span class="header-section-number">1.2</span> Tension-Type Headache (TTH)</h3>
<p><a href="https://ichd-3.org/2-tension-type-headache/?ref=danmackinlay.name">TTH is the most prevalent primary headache</a>, characterized by bilateral, non-pulsating, “pressing” or “tightening” pain of mild to moderate intensity.</p>
<ul>
<li><p><strong>Mechanism</strong>: The pathophysiology is multifactorial and not fully resolved, i.e.&nbsp;we don’t really know. It is thought to involve both peripheral and central mechanisms. In episodic TTH, peripheral factors like increased pericranial muscle tenderness are key. In chronic TTH, <strong>central sensitization</strong> of pain pathways in the central nervous system (CNS) appears more dominant, meaning the CNS becomes more efficient at processing pain signals.</p></li>
<li><p><strong>Prognosis</strong>: The prognosis is generally good. Episodic TTH can often be managed with simple analgesics and lifestyle adjustments. A subset of individuals may develop chronic TTH, which can be more debilitating and challenging to treat.</p></li>
<li><p><strong>Treatment</strong>:</p>
<ul>
<li><strong>Acute</strong>: Simple analgesics like NSAIDs (ibuprofen, naproxen) and acetaminophen are the first line of treatment. Limiting use to twice a week is crucial to avoid medication-overuse headache.</li>
<li><strong>Preventive</strong>: For chronic TTH, the tricyclic antidepressant <strong>amitriptyline</strong> is a well-established prophylactic treatment. Non-pharmacological approaches, including physical therapy, stress management, and cognitive behavioral therapy, are also central to management.</li>
</ul></li>
</ul>
</section>
<section id="cluster-headache" class="level3" data-number="1.3">
<h3 data-number="1.3" class="anchored" data-anchor-id="cluster-headache"><span class="header-section-number">1.3</span> Cluster Headache</h3>
<p>Known for its excruciating and strictly unilateral pain in and around the eye, cluster headache is the most common of the “trigeminal autonomic cephalalgias”. I don’t know what the other trigeminal autonomic cephalalgias are, but I doubt they’re fun.</p>
<ul>
<li><p><strong>Mechanism</strong>: While the exact cause is unknown, imaging studies point to the <strong>hypothalamus</strong> as a key player, explaining the remarkable circadian and circannual periodicity of attacks (occurring at the same time of day or year). This hypothalamic activation leads to secondary activation of the trigeminal and cranial autonomic systems, causing the characteristic pain and accompanying symptoms like a watering eye, nasal congestion, and a sense of restlessness or agitation.</p></li>
<li><p><strong>Prognosis</strong>: About 90% of individuals have episodic cluster headache, with periods of frequent attacks (“clusters”) lasting weeks to months, followed by remission periods. The remaining 10% have the chronic form, with no significant remission. The pain is considered one of the most severe known to medicine.</p></li>
<li><p><strong>Treatment</strong>:</p>
<ul>
<li><strong>Acute</strong>: The two mainstays are <strong>high-flow oxygen</strong> (100% O2 via a non-rebreather mask), which is effective for most patients within 15 minutes, and injectable or nasal <strong>triptans</strong>.</li>
<li><strong>Preventive</strong>: <strong>Verapamil</strong>, a calcium channel blocker, is the first-line prophylactic treatment. For transitional periods, greater occipital nerve blocks can provide relief. Newer options include the CGRP monoclonal antibody galcanezumab.</li>
</ul></li>
</ul>
</section>
</section>
<section id="management-strategy" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="management-strategy"><span class="header-section-number">2</span> Management strategy</h2>
<p>For the statistically minded among us, managing headaches is an exercise in data collection, signal detection, and personalized intervention.</p>
<section id="systematic-trigger-identification" class="level3" data-number="2.1">
<h3 data-number="2.1" class="anchored" data-anchor-id="systematic-trigger-identification"><span class="header-section-number">2.1</span> Systematic Trigger Identification</h3>
<p>Self-reported trigger accuracy is often low <span class="citation" data-cites="Casanova2022Observational">(Casanova et al. 2022)</span>. So! <a href="../notebook/single_subject_experiments.html">Quantified self</a> time!</p>
<ul>
<li><strong>Establish a Baseline</strong>: Commit to a <strong><a href="https://pubmed.ncbi.nlm.nih.gov/35670125/?ref=danmackinlay.name">90-day daily tracking period</a></strong> for statistical validity. Retrospective recall is unreliable. Track headache occurrence, severity (1-10), duration, and associated symptoms.</li>
<li><strong>Systematic Testing</strong>: Isolate and test one potential trigger category at a time (e.g., sleep duration, stress levels, specific foods, screen time). This involves controlled elimination and reintroduction phases to establish correlation.</li>
<li><strong>Analyze that Data</strong>: Export the data and apply our statistical skills. Look for temporal relationships, dose-response effects (e.g., does more screen time correlate with higher pain severity?), and interaction effects between triggers.</li>
</ul>
<section id="tools" class="level4" data-number="2.1.1">
<h4 data-number="2.1.1" class="anchored" data-anchor-id="tools"><span class="header-section-number">2.1.1</span> Tools</h4>
<ul>
<li><strong>Specialized Tracking Apps</strong>: Opt for a specialized app over a general-purpose quantified-self app. Apps like <a href="https://apps.apple.com/us/app/migraine-insight-tracker/id1364291643?ref=danmackinlay.name">Migraine Insight</a> seem popular, Apple Health integration, and flexible data export features.</li>
<li><strong>Advanced Data Collection</strong>: For complex variables like screen time across multiple devices, privacy-first, open-source tools like <strong><a href="https://activitywatch.net?ref=danmackinlay.name">ActivityWatch</a></strong> can capture data locally. This currently requires manual data aggregation via its API, but it provides the granular data needed for robust analysis.</li>
</ul>
</section>
</section>
</section>
<section id="psychedelics" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="psychedelics"><span class="header-section-number">3</span> Psychedelics</h2>
<p>Anecdotal reports of <a href="../notebook/drugs_fun.html">psychedelics</a> for headache have now been validated in clinical research, particularly for cluster headache <span class="citation" data-cites="Bjurenfalk2025Lifetime Henderson2025Exploring Leighton2025Clinical Schindler2022Psychedelics Smedfors2024Use">(Bjurenfalk et al. 2025; Henderson et al. 2025; Leighton et al. 2025; Schindler 2022; Smedfors et al. 2024)</span>.</p>
<ul>
<li><strong>The Evidence</strong>: Clinical studies have shown that psilocybin and non-hallucinogenic LSD analogues (like 2-bromo-LSD) <a href="https://www.science.org/content/article/lsd-alleviates-suicide-headaches?ref=danmackinlay.name">can terminate cluster periods and provide months of remission after just a few doses</a>. The mechanism is thought to be potent activation of the 5-HT2A serotonin receptor, which produces long-lasting neuroplastic changes.</li>
<li><strong>Current Status</strong>: This is an active area of research, with Phase 2 clinical trials underway. It represents a paradigm shift from acute treatment to long-duration prevention, but it’s not yet a standard clinical therapy.</li>
</ul>
<p>Extra spicy: <a href="https://forum.effectivealtruism.org/posts/x8P8EGnujSZm6fyMH/emerging-evidence-on-treating-cluster-headaches-with-dmt?ref=danmackinlay.name">Emerging evidence on treating cluster headaches with DMT</a></p>
</section>
<section id="references" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="references"><span class="header-section-number">4</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Bjurenfalk2025Lifetime" class="csl-entry">
Bjurenfalk, Cosmo, Simonsson, et al. 2025. <span>“<a href="https://doi.org/10.1177/02698811251324372">Lifetime classic psychedelic use and headaches: A cross-sectional study</a>.”</span> <em>Journal of Psychopharmacology (Oxford, England)</em>.
</div>
<div id="ref-Casanova2022Observational" class="csl-entry">
Casanova, Vives-Mestres, Donoghue, et al. 2022. <span>“<a href="https://doi.org/10.1111/head.14328">An observational study of self-reported migraine triggers and prospective evaluation of the relationships with occurrence of attacks enabled by a smartphone application (App)</a>.”</span> <em>Headache</em>.
</div>
<div id="ref-Ferrari2022Migraine" class="csl-entry">
Ferrari, Goadsby, Burstein, et al. 2022. <span>“<a href="https://doi.org/10.1038/s41572-021-00328-4">Migraine</a>.”</span> <em>Nature Reviews Disease Primers</em>.
</div>
<div id="ref-FrimpongManson2024Advances" class="csl-entry">
Frimpong-Manson, Ortiz, McMahon, et al. 2024. <span>“<a href="https://doi.org/10.3389/fnmol.2024.1355281">Advances in understanding migraine pathophysiology: a bench to bedside review of research insights and therapeutics</a>.”</span> <em>Frontiers in Molecular Neuroscience</em>.
</div>
<div id="ref-Henderson2025Exploring" class="csl-entry">
Henderson, Elsaadany, Chan, et al. 2025. <span>“<a href="https://doi.org/10.1007/s11916-024-01321-8">Exploring the Potential of Psychedelics in the Treatment of Headache Disorders: Clinical Considerations and Exploratory Insights</a>.”</span> <em>Current Pain and Headache Reports</em>.
</div>
<div id="ref-Hilliard2025Migraine" class="csl-entry">
Hilliard. 2025. <span>“<a href="https://medicinetoday.com.au/mt/2025/june/feature-article/migraine-2025-update-management">Migraine in 2025: An Update on Management</a>.”</span> <em>Medicine Today</em>.
</div>
<div id="ref-Leighton2025Clinical" class="csl-entry">
Leighton, Lau, Savdo, et al. 2025. <span>“<a href="https://doi.org/10.1177/25158163251345472">Clinical Treatment of Cluster Headache with the Serotonergic Indoleamine Psychedelics Psilocybin and LSD and with Ketamine: A Case Series</a>.”</span> <em>Cephalalgia Reports</em>.
</div>
<div id="ref-Mungoven2021Chronic" class="csl-entry">
Mungoven, Henderson, and Meylakh. 2021. <span>“<a href="https://doi.org/10.3389/fpain.2021.705276">Chronic Migraine Pathophysiology and Treatment: A Review of Current Perspectives</a>.”</span> <em>Frontiers in Pain Research</em>.
</div>
<div id="ref-Ong2018Migraine" class="csl-entry">
Ong, and De Felice. 2018. <span>“<a href="https://doi.org/10.1007/s13311-017-0592-1">Migraine Treatment: Current Acute Medications and Their Potential Mechanisms of Action</a>.”</span> <em>Neurotherapeutics</em>.
</div>
<div id="ref-Ozge2024Revolutionizing" class="csl-entry">
Özge, Baykan, Bıçakçı, et al. 2024. <span>“<a href="https://doi.org/10.3389/fneur.2024.1402569">Revolutionizing migraine management: advances and challenges in CGRP-targeted therapies and their clinical implications</a>.”</span> <em>Frontiers in Neurology</em>.
</div>
<div id="ref-Scher2019Epidemiology" class="csl-entry">
Scher, Wang, Katsarava, et al. 2019. <span>“<a href="https://doi.org/10.1177/0333102418786266">Epidemiology of migraine in men: Results from the Chronic Migraine Epidemiology and Outcomes (CaMEO) Study</a>.”</span> <em>Cephalalgia: An International Journal of Headache</em>.
</div>
<div id="ref-Schindler2022Psychedelics" class="csl-entry">
Schindler. 2022. <span>“<a href="https://doi.org/10.1016/j.neuropharm.2022.109166">Psychedelics as Preventive Treatment in Headache and Chronic Pain Disorders</a>.”</span> <em>Neuropharmacology</em>.
</div>
<div id="ref-Smedfors2024Use" class="csl-entry">
Smedfors, Jennysdotter Olofsgård, Steinberg, et al. 2024. <span>“<a href="https://doi.org/10.3390/brainsci14040348">Use of Prescribed and Non-Prescribed Treatments for Cluster Headache in a Swedish Cohort</a>.”</span> <em>Brain Sciences</em>.
</div>
<div id="ref-Wang2010Comorbidities" class="csl-entry">
Wang, Fuh, and Chen. 2010. <span>“<a href="https://doi.org/10.3389/fneur.2010.00016">Comorbidities of Migraine</a>.”</span> <em>Frontiers in Neurology</em>.
</div>
<div id="ref-Zobdeh2021Pharmacological" class="csl-entry">
Zobdeh, ben Kraiem, Attwood, et al. 2021. <span>“<a href="https://doi.org/10.1111/bph.15657">Pharmacological Treatment of Migraine: Drug Classes, Mechanisms of Action, Clinical Trials and New Treatments</a>.”</span> <em>British Journal of Pharmacology</em>.
</div>
</div>


</section>

 ]]></description>
  <category>health</category>
  <guid>https://danmackinlay.name/notebook/headaches.html</guid>
  <pubDate>Sat, 14 Jun 2025 06:47:37 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/forging_a_head_RP-P-1953-152.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Multi-level agency</title>
  <link>https://danmackinlay.name/notebook/multi_level_agency.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>Looking at a complicated system such as a human society or a microchip or a neural network, at what <a href="../notebook/coarse_graining.html">level of abstraction</a> do we want to think about it to best understand <em>what it is doing</em>? E.g. is <a href="../notebook/technological_determinism.html">technology itself an agent</a>?</p>
<p>Probably some classic question about “emergence” and “complexity” and “hierarchy” and “levels of organisation”. We might also think about the <em>modern synthesis</em> of evolutionary biology, which is a theory of how evolution works at different levels of organisation, from genes to organisms to populations.</p>
<div id="fig-heavenly-hierarchy" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-heavenly-hierarchy-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/heavenly_hierachy_RP-P-OB-7606.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/heavenly_hierachy_RP-P-OB-7606.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-heavenly-hierarchy-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<section id="incoming" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="incoming"><span class="header-section-number">1</span> Incoming</h2>
<ul>
<li><p><a href="https://www.mindthefuture.info/p/towards-a-scale-free-theory-of-intelligent?ref=danmackinlay.name">Towards a scale-free theory of intelligent agency</a></p></li>
<li><p>We might care also about the suggestive-but-indirect <a href="../notebook/utility_fitness.html">mapping between utility and fitness</a>…</p></li>
<li><p><a href="https://acsresearch.org/research?ref=danmackinlay.name">Alignment of Complex Systems Research Group – ACS Research Program</a></p>
<blockquote class="blockquote">
<p>Our research seeks to build towards the following goals:</p>
<ul>
<li>A science of the space of intelligent systems</li>
<li>Naturalised theories of agency, including theories that account for the multi-scale nature of agentic behaviour</li>
<li>Nuanced accounts of how humans reason, act and value as it pertains to solving the AI alignment problem</li>
<li>An understanding of the underlying principles that govern collective behaviour between humans, between humans and AIs, and between AI systems</li>
</ul>
</blockquote></li>
</ul>
</section>
<section id="references" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="references"><span class="header-section-number">2</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Aktipis2020Cheating" class="csl-entry">
Aktipis, Athena. 2020. <em>The Cheating Cell: How Evolution Helps Us Understand and Treat Cancer</em>.
</div>
<div id="ref-Aktipis2015Cancer" class="csl-entry">
Aktipis, C. Athena, Boddy, Jansen, et al. 2015. <span>“<a href="https://doi.org/10.1098/rstb.2014.0219">Cancer Across the Tree of Life: Cooperation and Cheating in Multicellularity</a>.”</span> <em>Philosophical Transactions of the Royal Society B: Biological Sciences</em>.
</div>
<div id="ref-Brunet2015Multilevel" class="csl-entry">
Brunet, and Doolittle. 2015. <span>“<a href="https://doi.org/10.1093/gbe/evv152">Multilevel Selection Theory and the Evolutionary Functions of Transposable Elements</a>.”</span> <em>Genome Biology and Evolution</em>.
</div>
<div id="ref-Chen2018Punishment" class="csl-entry">
Chen, and Szolnoki. 2018. <span>“<a href="https://doi.org/10.1371/journal.pcbi.1006347">Punishment and Inspection for Governing the Commons in a Feedback-Evolving Game</a>.”</span> <em>PLoS Computational Biology</em>.
</div>
<div id="ref-Costa2025Possible" class="csl-entry">
Da Costa, Gavenčiak, Hyland, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2410.00258">Possible Principles for Aligned Structure Learning Agents</a>.”</span>
</div>
<div id="ref-Falandays2022All" class="csl-entry">
Falandays, Kaaronen, Moser, et al. 2022. <span>“<a href="https://doi.org/10.31234/osf.io/jhrp6">All Intelligence Is Collective Intelligence</a>.”</span>
</div>
<div id="ref-Fields2022Competency" class="csl-entry">
Fields, and Levin. 2022. <span>“<a href="https://doi.org/10.3390/e24060819">Competency in Navigating Arbitrary Spaces as an Invariant for Analyzing Cognition in Diverse Embodiments</a>.”</span> <em>Entropy</em>.
</div>
<div id="ref-Fletcher2007Evolution" class="csl-entry">
Fletcher, and Zwick. 2007. <span>“<a href="https://doi.org/10.1016/j.jtbi.2006.09.030">The evolution of altruism: game theory in multilevel selection and inclusive fitness</a>.”</span> <em>Journal of Theoretical Biology</em>.
</div>
<div id="ref-Gardner2015Genetical" class="csl-entry">
Gardner. 2015. <span>“<a href="https://doi.org/10.1111/jeb.12566">The Genetical Theory of Multilevel Selection</a>.”</span> <em>Journal of Evolutionary Biology</em>.
</div>
<div id="ref-Hagens2020Economics" class="csl-entry">
Hagens. 2020. <span>“<a href="https://doi.org/10.1016/j.ecolecon.2019.106520">Economics for the Future – Beyond the Superorganism</a>.”</span> <em>Ecological Economics</em>.
</div>
<div id="ref-Hoel2025Causal" class="csl-entry">
Hoel. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.13395">Causal Emergence 2.0: Quantifying Emergent Complexity</a>.”</span>
</div>
<div id="ref-Hyland2024FreeEnergy" class="csl-entry">
Hyland, Gavenčiak, Costa, et al. 2024. <span>“<a href="https://openreview.net/forum?id=4Ft7DcrjdO">Free-Energy Equilibria: Toward a Theory of Interactions Between Boundedly-Rational Agents</a>.”</span> In.
</div>
<div id="ref-Jensen2018Tangled" class="csl-entry">
Jensen. 2018. <span>“<a href="https://doi.org/10.1088/1361-6404/aaee8f">Tangled Nature: A Model of Emergent Structure and Temporal Mode Among Co-Evolving Agents</a>.”</span> <em>European Journal of Physics</em>.
</div>
<div id="ref-Keeney1993Decisions" class="csl-entry">
Keeney, and Raiffa. 1993. <em>Decisions with Multiple Objectives: Preferences and Value Trade-Offs</em>.
</div>
<div id="ref-Lehtonen2020Price" class="csl-entry">
Lehtonen. 2020. <span>“<a href="https://doi.org/10.1098/rstb.2019.0362">The Price Equation and the Unity of Social Evolution Theory</a>.”</span> <em>Philosophical Transactions of the Royal Society B: Biological Sciences</em>.
</div>
<div id="ref-Levin2019Computational" class="csl-entry">
Levin. 2019. <span>“<a href="https://doi.org/10.3389/fpsyg.2019.02688">The Computational Boundary of a “Self”: Developmental Bioelectricity Drives Multicellularity and Scale-Free Cognition</a>.”</span> <em>Frontiers in Psychology</em>.
</div>
<div id="ref-Okasha2009Individuals" class="csl-entry">
Okasha. 2009. <span>“<a href="https://doi.org/10.1007/s10539-009-9154-1">Individuals, Groups, Fitness and Utility: Multi-Level Selection Meets Social Choice Theory</a>.”</span> <em>Biology &amp; Philosophy</em>.
</div>
<div id="ref-Okasha2008Evolution" class="csl-entry">
Okasha, and Okasha. 2008. <em>Evolution and the Levels of Selection</em>.
</div>
<div id="ref-Rajpal2023Quantifying" class="csl-entry">
Rajpal, Stengel, Mediano, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2310.20386">Quantifying Hierarchical Selection</a>.”</span>
</div>
<div id="ref-Simon1973Organization" class="csl-entry">
Simon. 1973. <span>“The Organization of Complex Systems.”</span> <em>Hierarchy Theory: The Challenge of Complex Systems</em>.
</div>
<div id="ref-Vanchurin2021Theory" class="csl-entry">
Vanchurin, Wolf, Katsnelson, et al. 2021. <span>“<a href="https://doi.org/10.1101/2021.11.03.466494">Towards a Theory of Evolution as Multilevel Learning</a>.”</span>
</div>
<div id="ref-Yanai2016Society" class="csl-entry">
Yanai, and Lercher. 2016. <em>The Society of Genes</em>.
</div>
</div>


</section>

 ]]></description>
  <category>agents</category>
  <category>AI safety</category>
  <category>bounded compute</category>
  <category>collective knowledge</category>
  <category>computers are awful together</category>
  <category>distributed</category>
  <category>economics</category>
  <category>edge computing</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>incentive mechanisms</category>
  <category>machine learning</category>
  <category>networks</category>
  <guid>https://danmackinlay.name/notebook/multi_level_agency.html</guid>
  <pubDate>Mon, 09 Jun 2025 08:42:11 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/heavenly_hierachy_RP-P-OB-7606.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Value/reward learning</title>
  <link>https://danmackinlay.name/notebook/value_learning.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-fancy-roosters" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-fancy-roosters-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/fancy_roosters_RP-P-OB-81.568.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/fancy_roosters_RP-P-OB-81.568.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-fancy-roosters-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Here is the setup. We are watching some agent — a person, an animal, a robot, a corporation — stumbling around in a world, taking actions, and occasionally looking pleased or displeased with itself. We suspect that this agent <a href="../notebook/utility_if_we_must.html">has a value function</a>, i.e.&nbsp;that there exists some scalar-valued function <img src="https://latex.codecogs.com/png.latex?R"> over states (or state-action pairs, or trajectories) that the agent is, in some sense, optimising. Can we figure out what <img src="https://latex.codecogs.com/png.latex?R"> is from watching the agent’s behaviour?</p>
<p>This is the ML actualisation of the economist’s notion of <em>revealed preference</em> — the idea that we can back out what an agent wants from what it does. Economists have been arguing about this since Samuelson <span class="citation" data-cites="Samuelson1938Note">(Samuelson 1938)</span>, and the arguments are not settled, but the <a href="../notebook/reinforcement_learning.html">reinforcement learning</a> crowd have not waited for the phenomenological dust to settle, preferring to follow the engineer’s path and just build the damn thing. That has given us a formalism.</p>
<p>Suppose the agent lives in a <a href="../notebook/reinforcement_learning.html">Markov Decision Process</a> with states <img src="https://latex.codecogs.com/png.latex?s%20%5Cin%20%5Cmathcal%7BS%7D">, actions <img src="https://latex.codecogs.com/png.latex?a%20%5Cin%20%5Cmathcal%7BA%7D">, transition dynamics <img src="https://latex.codecogs.com/png.latex?T(s'%20%5Cmid%20s,%20a)">, and discount factor <img src="https://latex.codecogs.com/png.latex?%5Cgamma">. The agent follows some policy <img src="https://latex.codecogs.com/png.latex?%5Cpi(a%20%5Cmid%20s)">. We assume there exists a reward function <img src="https://latex.codecogs.com/png.latex?R:%20%5Cmathcal%7BS%7D%20%5Ctimes%20%5Cmathcal%7BA%7D%20%5Cto%20%5Cmathbb%7BR%7D"> such that the agent is behaving (approximately) optimally with respect to the cumulative discounted return <img src="https://latex.codecogs.com/png.latex?%0AG_t%20=%20%5Csum_%7Bk=0%7D%5E%7B%5Cinfty%7D%20%5Cgamma%5Ek%20R(s_%7Bt+k%7D,%20a_%7Bt+k%7D).%0A"> We do not observe <img src="https://latex.codecogs.com/png.latex?R">. We observe trajectories <img src="https://latex.codecogs.com/png.latex?%5Ctau%20=%20(s_0,%20a_0,%20s_1,%20a_1,%20%5Cldots)"> sampled from <img src="https://latex.codecogs.com/png.latex?%5Cpi"> interacting with <img src="https://latex.codecogs.com/png.latex?T">. The question is: can we recover <img src="https://latex.codecogs.com/png.latex?R"> (or something morally equivalent to <img src="https://latex.codecogs.com/png.latex?R">) from a dataset of such trajectories?</p>
<p>The short answer is “kinda, with caveats.” The longer answer is that the problem is underdetermined — many reward functions can explain the same observed behaviour — and the interesting work is in figuring out what extra structure or assumptions let you pin things down anyway, and what kinds of degeneracy we care about etc. This matters practically (if we want a robot to learn what we want by watching us) and philosophically (if we want to talk about <a href="../notebook/utility_fitness.html">what evolution “wants,”</a> or what a firm is “maximising”).</p>
<p>Let me unpack the main lines of attack.</p>
<section id="inverse-reinforcement-learning" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="inverse-reinforcement-learning"><span class="header-section-number">1</span> Inverse Reinforcement Learning</h2>
<p>The most direct approach. Given a set of demonstrated trajectories from an expert policy <img src="https://latex.codecogs.com/png.latex?%5Cpi%5E*">, find a reward function <img src="https://latex.codecogs.com/png.latex?R"> under which <img src="https://latex.codecogs.com/png.latex?%5Cpi%5E*"> is optimal (or near-optimal).</p>
<p>The classic result <span class="citation" data-cites="Ng2000Algorithms">(Ng and Russell 2000)</span> tells us that the set of reward functions consistent with a given optimal policy is large. In particular, <img src="https://latex.codecogs.com/png.latex?R%20=%200"> always works — if everything is equally rewarding, every policy is optimal. So we need tiebreakers. The standard moves are to prefer reward functions that make the demonstrated policy “much better” than alternatives (maximum margin), or to go Bayesian and put a prior over reward functions (maximum entropy IRL, <span class="citation" data-cites="Ziebart2008Maximum">(Ziebart et al. 2008)</span>).</p>
<p>The maximum entropy approach is especially clean. It assumes the agent follows a Boltzmann-rational policy <img src="https://latex.codecogs.com/png.latex?%0A%5Cpi(a%20%5Cmid%20s)%20%5Cpropto%20%5Cexp%5Cbigl(Q%5E*(s,%20a)%5Cbigr)%0A"> where <img src="https://latex.codecogs.com/png.latex?Q%5E*"> is the soft optimal action-value function under <img src="https://latex.codecogs.com/png.latex?R">. This turns the inverse problem into a well-posed maximum likelihood estimation: find the <img src="https://latex.codecogs.com/png.latex?R"> that maximises the likelihood of the observed trajectories under this softened model of rationality. The “soft” part is doing a lot of work — it lets us accommodate the fact that real agents are noisy, rather than insisting on perfect optimality.</p>
<p>In principle we could recover either the reward function <img src="https://latex.codecogs.com/png.latex?R"> or the value function <img src="https://latex.codecogs.com/png.latex?V">; in practice, going after <img src="https://latex.codecogs.com/png.latex?R"> is more portable, since the value function depends on the dynamics <img src="https://latex.codecogs.com/png.latex?T">, whereas <img src="https://latex.codecogs.com/png.latex?R"> does not (or at least, need not).</p>
</section>
<section id="assistance-games" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="assistance-games"><span class="header-section-number">2</span> Assistance Games</h2>
<p>a.k.a. cooperative inverse RL <span class="citation" data-cites="HadfieldMenell2016Cooperative">(Hadfield-Menell et al. 2016)</span>. This is a <a href="../notebook/multi_agent_systems.html">multi-agent setting</a> where the twist is that one agent (the robot) is explicitly trying to help another agent (the human) whose reward function is unknown.</p>
<p>The robot doesn’t just passively observe and infer — it actively chooses actions that are <em>informative</em> about the human’s reward, while simultaneously being <em>useful</em> given its current best guess. This turns value learning from a pure estimation problem into a sequential decision problem under uncertainty about the objective. The elegant bit is that the robot has an incentive to be humble: if it’s uncertain about what the human wants, the optimal policy is to defer, ask, or act conservatively, rather than barrel ahead with a confident but wrong guess. This is one of the <a href="../notebook/alignment_problems.html">AI safety</a> framings that naturally produces cautious, corrigible behaviour without having to bolt it on as a constraint.</p>
</section>
<section id="references" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="references"><span class="header-section-number">3</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Conitzer2023Foundations" class="csl-entry">
Conitzer, and Oesterheld. 2023. <span>“<a href="https://doi.org/10.1609/aaai.v37i13.26791">Foundations of Cooperative AI</a>.”</span> <em>Proceedings of the AAAI Conference on Artificial Intelligence</em>.
</div>
<div id="ref-Fickinger2020MultiPrincipal" class="csl-entry">
Fickinger, Zhuang, Hadfield-Menell, et al. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2007.09540">Multi-Principal Assistance Games</a>.”</span>
</div>
<div id="ref-HadfieldMenell2016Cooperative" class="csl-entry">
Hadfield-Menell, Dragan, Abbeel, et al. 2016. <span>“Cooperative Inverse Reinforcement Learning.”</span> In <em>Proceedings of the 30th International Conference on Neural Information Processing Systems</em>. NIPS’16.
</div>
<div id="ref-Hoiles2020Rationally" class="csl-entry">
Hoiles, Krishnamurthy, and Pattanayak. 2020. <span>“<a href="http://jmlr.org/papers/v21/19-872.html">Rationally Inattentive Inverse Reinforcement Learning Explains YouTube Commenting Behavior</a>.”</span> <em>Journal of Machine Learning Research</em>.
</div>
<div id="ref-Laidlaw2025AssistanceZero" class="csl-entry">
Laidlaw, Bronstein, Guo, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2504.07091">AssistanceZero: Scalably Solving Assistance Games</a>.”</span> In <em>Workshop on Bidirectional Human↔︎AI Alignment</em>.
</div>
<div id="ref-MacDermott2024Measuring" class="csl-entry">
MacDermott, Fox, Belardinelli, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2412.04758">Measuring Goal-Directedness</a>.”</span>
</div>
<div id="ref-Ng2000Algorithms" class="csl-entry">
Ng, and Russell. 2000. <span>“<a href="https://www.cl.cam.ac.uk/~ey204/teaching/ACS/R244_2022_2023/papers/NG_ICML_2000.pdf">Algorithms for Inverse Reinforcement Learning</a>.”</span> In <em>Proceedings of the Seventeenth International Conference on Machine Learning</em>. ICML ’00.
</div>
<div id="ref-Samuelson1938Note" class="csl-entry">
Samuelson. 1938. <span>“<a href="https://doi.org/10.2307/2548836">A Note on the Pure Theory of Consumer’s Behaviour</a>.”</span> <em>Economica</em>.
</div>
<div id="ref-Sharma2024HumanAI" class="csl-entry">
Sharma, Davidson, Khetarpal, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2402.03575">Toward Human-AI Alignment in Large-Scale Multi-Player Games</a>.”</span>
</div>
<div id="ref-Wulfmeier2016Maximum" class="csl-entry">
Wulfmeier, Ondruska, and Posner. 2016. <span>“<a href="https://doi.org/10.48550/arXiv.1507.04888">Maximum Entropy Deep Inverse Reinforcement Learning</a>.”</span>
</div>
<div id="ref-Zhu2023Principled" class="csl-entry">
Zhu, Jordan, and Jiao. 2023. <span>“<a href="https://proceedings.mlr.press/v202/zhu23f.html">Principled Reinforcement Learning with Human Feedback from Pairwise or K-Wise Comparisons</a>.”</span> In <em>Proceedings of the 40th International Conference on Machine Learning</em>.
</div>
<div id="ref-Ziebart2008Maximum" class="csl-entry">
Ziebart, Maas, Bagnell, et al. 2008. <span>“<a href="https://cdn.aaai.org/AAAI/2008/AAAI08-227.pdf?utm_source=chatgpt.com">Maximum Entropy Inverse Reinforcement Learning</a>.”</span> In <em>Proceedings of the Twenty-Third AAAI Conference on Artificial Intelligence</em>. AAAI’08.
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>AI safety</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>gene</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>probability</category>
  <category>sociology</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/value_learning.html</guid>
  <pubDate>Thu, 05 Jun 2025 03:41:13 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/fancy_roosters_RP-P-OB-81.568.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>What use is utility?</title>
  <link>https://danmackinlay.name/notebook/utility_if_we_must.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-flappy-mans" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-flappy-mans-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/flappy_mans_RP-P-1961-465.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/flappy_mans_RP-P-1961-465.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-flappy-mans-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Because machine learning models so often optimise a loss function, there is a degree to which we must internalise a world in which agents have something like a fixed utility which they pursue, because at least some agents do something like that.</p>
<p>If we need to construct such a pretence for animals, what does the implied utility function look like?</p>
<p>cf <a href="../notebook/ecology_of_mind.html">ecology of mind</a>, <a href="../notebook/human_values.html">what are human values</a>.</p>
<p>And note of course, that many ML algorithms <a href="../notebook/open_ended_intelligence.html">don’t need utilities</a>, but might subsist on <a href="../notebook/intrinsic_motivation.html">intrinsic motivation</a>.</p>
<section id="value-learning" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="value-learning"><span class="header-section-number">1</span> Value learning</h2>
<p>One answer comes from <a href="../notebook/reinforcement_learning.html">reinforcement learning</a>.. See <a href="../notebook/value_learning.html">value learning</a>.</p>
</section>
<section id="references" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="references"><span class="header-section-number">2</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Biehl2023Interpreting" class="csl-entry">
Biehl, and Virgo. 2023. <span>“<a href="https://doi.org/10.1007/978-3-031-28719-0_2">Interpreting Systems as Solving POMDPs: A Step Towards a Formal Understanding of Agency</a>.”</span> In.
</div>
<div id="ref-Edelman2025FullStack" class="csl-entry">
Edelman, Tan, Lowe, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2512.03399">Full-Stack Alignment: Co-Aligning AI and Institutions with Thick Models of Value</a>.”</span> In.
</div>
<div id="ref-Gabriel2020Artificial" class="csl-entry">
Gabriel. 2020. <span>“<a href="https://doi.org/10.1007/s11023-020-09539-2">Artificial Intelligence, Values, and Alignment</a>.”</span> <em>Minds and Machines</em>.
</div>
<div id="ref-Gabriel2024Ethics" class="csl-entry">
Gabriel, Manzini, Keeling, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.16244">The Ethics of Advanced AI Assistants</a>.”</span>
</div>
<div id="ref-Hafner2022Action" class="csl-entry">
Hafner, Ortega, Ba, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2009.01791">Action and Perception as Divergence Minimization</a>.”</span>
</div>
<div id="ref-Kim2020Deep" class="csl-entry">
Kim. 2020. <span>“<a href="https://doi.org/10.1016/j.techsoc.2020.101378">Deep Learning and Principal–Agent Problems of Algorithmic Governance: The New Materialism Perspective</a>.”</span> <em>Technology in Society</em>.
</div>
<div id="ref-Klingefjord2024What" class="csl-entry">
Klingefjord, Lowe, and Edelman. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.10636">What Are Human Values, and How Do We Align AI to Them?</a>”</span>
</div>
<div id="ref-Lanctot2025Soft" class="csl-entry">
Lanctot, Larson, Kaisers, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2411.00119">Soft Condorcet Optimization for Ranking of General Agents</a>.”</span>
</div>
<div id="ref-Liu2024Attaining" class="csl-entry">
Liu, Wang, Li, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2405.16588">Attaining Human Desirable Outcomes in Human-AI Interaction via Structural Causal Games</a>.”</span>
</div>
<div id="ref-MacDermott2024Measuring" class="csl-entry">
MacDermott, Fox, Belardinelli, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2412.04758">Measuring Goal-Directedness</a>.”</span>
</div>
<div id="ref-Marklund2025Misalignment" class="csl-entry">
Marklund, Infanger, and Roy. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2507.10995">Misalignment from Treating Means as Ends</a>.”</span>
</div>
<div id="ref-MauraRivero2025Jackpot" class="csl-entry">
Maura-Rivero, Lanctot, Visin, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.19266">Jackpot! Alignment as a Maximal Lottery</a>.”</span>
</div>
<div id="ref-MauraRivero2025Utilityinspired" class="csl-entry">
Maura-Rivero, Nagpal, Patel, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.06248">Utility-Inspired Reward Transformations Improve Reinforcement Learning Training of Language Models</a>.”</span>
</div>
<div id="ref-Munos2024Nash" class="csl-entry">
Munos, Valko, Calandriello, et al. 2024. <span>“<a href="http://arxiv.org/abs/2312.00886">Nash Learning from Human Feedback</a>.”</span> In <em>Proceedings of the 41st International Conference on Machine Learning</em>. ICML’24.
</div>
<div id="ref-Samuelson1938Note" class="csl-entry">
Samuelson. 1938. <span>“<a href="https://doi.org/10.2307/2548836">A Note on the Pure Theory of Consumer’s Behaviour</a>.”</span> <em>Economica</em>.
</div>
<div id="ref-Siththaranjan2023Distributional" class="csl-entry">
Siththaranjan, Laidlaw, and Hadfield-Menell. 2023. <span>“<a href="http://arxiv.org/abs/2312.08358">Distributional Preference Learning: Understanding and Accounting for Hidden Context in RLHF</a>.”</span> In.
</div>
<div id="ref-ZhiXuan2025Preferences" class="csl-entry">
Zhi-Xuan, Carroll, Franklin, et al. 2025. <span>“<a href="https://doi.org/10.1007/s11098-024-02249-w">Beyond Preferences in AI Alignment</a>.”</span> <em>Philosophical Studies</em>.
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>AI safety</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>gene</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>probability</category>
  <category>sociology</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/utility_if_we_must.html</guid>
  <pubDate>Thu, 05 Jun 2025 03:41:13 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/flappy_mans_RP-P-1961-465.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>What are human values?</title>
  <link>https://danmackinlay.name/notebook/human_values.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-grandville-c19-heaven" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-grandville-c19-heaven-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/Grandville_c19_heaven.png" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/Grandville_c19_heaven.png" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-grandville-c19-heaven-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>A placeholder. Let us relax the assumption that <a href="../notebook/utility_if_we_must.html">humans are best understood as acting to maximise their utility</a>. How else can we understand what is good to have more of, from these <a href="../notebook/open_ended_intelligence.html">open-ended intelligences</a>?</p>
<p>cf <a href="../notebook/ecology_of_mind.html">ecology of mind</a>.</p>
<section id="incoming" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="incoming"><span class="header-section-number">1</span> Incoming</h2>
<ul>
<li><p><a href="https://www.effectivealtruism.org/articles/ea-global-2018-paretotopian-goal-alignment?ref=danmackinlay.name">Paretotopian Goal Alignment</a></p></li>
<li><p><a href="https://www.full-stack-alignment.ai/?ref=danmackinlay.name">Full-Stack Alignment: Co-Aligning AI and Institutions with Thick Models of Value</a></p></li>
<li><p><a href="https://thegradient.pub/virtue-ethics-ai-alignment/?ref=danmackinlay.name">After Orthogonality: Virtue-Ethical Agency and AI Alignment</a></p>
<blockquote class="blockquote">
<p>The concept of eudaimonia, I argue, suggests a form of rational activity without a strict distinction between means and ends, or between ‘instrumental’ and ‘terminal’ values. In this model of rational activity, a rational action is an element of a valued practice in roughly the same sense that a note is an element of a melody, a time-step is an element of a computation, and a moment in an organism’s cellular life is an element of that organism’s self-subsistence and self-development.[…]</p>
<p>My central claim is that our intuitions about the nature of human flourishing are implicitly intuitions that eudaimonic rationality can be functionally robust in a sense highly critical to AI alignment. More specifically, I argue that in light of our best intuitions about the nature of human flourishing it’s plausible that eudaimonic rationality is a <em>natural</em> form of agency, and that eudaimonic rationality is <em>effective</em> even by the light of certain consequentialist approximations of its values. I then argue that if our goal is to align AI in support of human flourishing, and if it is furthermore plausible that eudaimonic rationality is natural and efficacious, then many classical AI safety considerations and ‘paradoxes’ of AI alignment speak in favor of trying to instill AIs with eudaimonic rationality._</p>
</blockquote></li>
</ul>
</section>
<section id="references" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="references"><span class="header-section-number">2</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Carroll2024AI" class="csl-entry">
Carroll, Foote, Siththaranjan, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2405.17713">AI Alignment with Changing and Influenceable Reward Functions</a>.”</span>
</div>
<div id="ref-Collins2024Building" class="csl-entry">
Collins, Sucholutsky, Bhatt, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2408.03943">Building Machines That Learn and Think with People</a>.”</span>
</div>
<div id="ref-Doudkin2025AI" class="csl-entry">
Doudkin, Pataranutaporn, and Maes. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.02067">AI Persuading AI Vs AI Persuading Humans: LLMs’ Differential Effectiveness in Promoting Pro-Environmental Behavior</a>.”</span>
</div>
<div id="ref-Edelman2025FullStack" class="csl-entry">
Edelman, Tan, Lowe, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2512.03399">Full-Stack Alignment: Co-Aligning AI and Institutions with Thick Models of Value</a>.”</span> In.
</div>
<div id="ref-Franklin2022Preference" class="csl-entry">
Franklin, and Ashton. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2206.10300">Preference Change in Persuasive Robotics</a>.”</span>
</div>
<div id="ref-Franklin2022Recognising" class="csl-entry">
Franklin, Ashton, Gorman, et al. 2022. <span>“<a href="https://doi.org/10.48550/arXiv.2203.10525">Recognising the Importance of Preference Change: A Call for a Coordinated Multidisciplinary Research Effort in the Age of AI</a>.”</span>
</div>
<div id="ref-Gabriel2020Artificial" class="csl-entry">
Gabriel. 2020. <span>“<a href="https://doi.org/10.1007/s11023-020-09539-2">Artificial Intelligence, Values, and Alignment</a>.”</span> <em>Minds and Machines</em>.
</div>
<div id="ref-Gabriel2024Ethics" class="csl-entry">
Gabriel, Manzini, Keeling, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.16244">The Ethics of Advanced AI Assistants</a>.”</span>
</div>
<div id="ref-HadfieldMenell2018Incomplete" class="csl-entry">
Hadfield-Menell, and Hadfield. 2018. <span>“<a href="https://doi.org/10.48550/arXiv.1804.04268">Incomplete Contracting and AI Alignment</a>.”</span>
</div>
<div id="ref-Hyland2024FreeEnergy" class="csl-entry">
Hyland, Gavenčiak, Costa, et al. 2024. <span>“<a href="https://openreview.net/forum?id=4Ft7DcrjdO">Free-Energy Equilibria: Toward a Theory of Interactions Between Boundedly-Rational Agents</a>.”</span> In.
</div>
<div id="ref-Kim2020Deep" class="csl-entry">
Kim. 2020. <span>“<a href="https://doi.org/10.1016/j.techsoc.2020.101378">Deep Learning and Principal–Agent Problems of Algorithmic Governance: The New Materialism Perspective</a>.”</span> <em>Technology in Society</em>.
</div>
<div id="ref-Klingefjord2024What" class="csl-entry">
Klingefjord, Lowe, and Edelman. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2404.10636">What Are Human Values, and How Do We Align AI to Them?</a>”</span>
</div>
<div id="ref-Kulveit2025Gradual" class="csl-entry">
Kulveit, Douglas, Ammann, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2501.16946">Gradual Disempowerment: Systemic Existential Risks from Incremental AI Development</a>.”</span>
</div>
<div id="ref-Liu2024Attaining" class="csl-entry">
Liu, Wang, Li, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2405.16588">Attaining Human Desirable Outcomes in Human-AI Interaction via Structural Causal Games</a>.”</span>
</div>
<div id="ref-Pettigrew2019Choosing" class="csl-entry">
Pettigrew. 2019. <em><a href="https://doi.org/10.1093/oso/9780198814962.001.0001">Choosing for Changing Selves</a></em>.
</div>
<div id="ref-Samuelson1938Note" class="csl-entry">
Samuelson. 1938. <span>“<a href="https://doi.org/10.2307/2548836">A Note on the Pure Theory of Consumer’s Behaviour</a>.”</span> <em>Economica</em>.
</div>
<div id="ref-Stray2021What" class="csl-entry">
Stray, Vendrov, Nixon, et al. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2107.10939">What Are You Optimizing for? Aligning Recommender Systems with Human Values</a>.”</span>
</div>
<div id="ref-Ying2025Understanding" class="csl-entry">
Ying, Zhi-Xuan, Wong, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2408.12022">Understanding Epistemic Language with a Language-Augmented Bayesian Theory of Mind</a>.”</span>
</div>
<div id="ref-ZhiXuan2025Preferences" class="csl-entry">
Zhi-Xuan, Carroll, Franklin, et al. 2025. <span>“<a href="https://doi.org/10.1007/s11098-024-02249-w">Beyond Preferences in AI Alignment</a>.”</span> <em>Philosophical Studies</em>.
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>AI safety</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>gene</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>probability</category>
  <category>sociology</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/human_values.html</guid>
  <pubDate>Thu, 05 Jun 2025 03:41:13 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/Grandville_c19_heaven.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>Internal model principles</title>
  <link>https://danmackinlay.name/notebook/internal_models.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<p>Placeholder: we’ll talk about the internal model principle, the good regulator theorem, and related results.</p>
<section id="transducers" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="transducers"><span class="header-section-number">1</span> Transducers</h2>
<p>I just saw Fernando Rosas present at <span class="citation" data-cites="Rosas2025AI">Rosas, Boyd, and Baltieri (2025)</span>.</p>
<p>The construction (the <img src="https://latex.codecogs.com/png.latex?%5Cepsilon">-transducer) seems to generalize <img src="https://latex.codecogs.com/png.latex?%5Cepsilon">-machines into active inference about the world, similar to how <a href="../notebook/aixi.html">AIXI</a> generalizes Solomonoff prior-based induction into active learning.</p>
<p>“Bayesian belief updating is the most efficient world model accessible for the agent”.</p>
<p>He would like to connect this to hierarchical emergence in <a href="../notebook/coarse_graining.html">coarse-graining</a>.</p>
<p>See also <span class="citation" data-cites="Boyd2025Monoliths">Boyd et al. (2025)</span>.</p>
</section>
<section id="incoming" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="incoming"><span class="header-section-number">2</span> Incoming</h2>
<p>Alfred Harwood, <a href="https://www.lesswrong.com/posts/fsQzYmuFN65vHcEcH/the-internal-model-principle-a-straightforward-explanation?ref=danmackinlay.name">The Internal Model Principle: A Straightforward Explanation</a>.</p>
<p>Jose Faustino, <a href="https://www.lesswrong.com/posts/g4avk6cLHomHjcFkx/distilling-the-internal-model-principle?ref=danmackinlay.name">Distilling the Internal Model Principle</a>.</p>
<p>To read: <span class="citation" data-cites="CostaCastello2005Demonstration">Costa-Castello, Nebot, and Grino (2005)</span>, <span class="citation" data-cites="Francis1976Internal">Francis and Wonham (1976)</span>, <span class="citation" data-cites="Huang2018Internal">Huang et al. (2018)</span>.</p>
<ul>
<li><a href="https://gokererdogan.github.io/2021/02/12/good-regulator-theorem/?ref=danmackinlay.name">On Conant and Ashby’s “Good Regulator Theorem”</a></li>
<li><a href="https://www.lesswrong.com/posts/YEnTGLBu2crDw5GFo/a-generalization-of-the-good-regulator-theorem?ref=danmackinlay.name">A Generalization of the Good Regulator Theorem — LessWrong</a></li>
<li><a href="https://www.lesswrong.com/posts/JQefBJDHG6Wgffw6T/a-straightforward-explanation-of-the-good-regulator-theorem?ref=danmackinlay.name">A Straightforward Explanation of the Good Regulator Theorem — LessWrong</a></li>
<li><a href="https://www.alignmentforum.org/posts/Dx9LoqsEh3gHNJMDk/fixing-the-good-regulator-theorem?ref=danmackinlay.name">Fixing the Good Regulator Theorem — AI Alignment Forum</a></li>
<li><a href="https://www.lesswrong.com/posts/NZdWYaFpekQJu6LF5/distilling-the-internal-model-principle-part-ii?ref=danmackinlay.name">Distilling the Internal Model Principle Part II — LessWrong</a></li>
</ul>
</section>
<section id="references" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="references"><span class="header-section-number">3</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Baltieri2025Bayesian" class="csl-entry">
Baltieri, Biehl, Capucci, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2503.00511">A Bayesian Interpretation of the Internal Model Principle</a>.”</span>
</div>
<div id="ref-Bin2021Robustness" class="csl-entry">
Bin, Astolfi, and Marconi. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2010.08794">About Robustness of Control Systems Embedding an Internal Model</a>.”</span>
</div>
<div id="ref-Boyd2025Monoliths" class="csl-entry">
Boyd, Nowak, Hyland, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2512.02193">From Monoliths to Modules: Decomposing Transducers for Efficient World Modelling</a>.”</span>
</div>
<div id="ref-Cao2015Free" class="csl-entry">
Cao, Wang, Ouyang, et al. 2015. <span>“<a href="https://doi.org/10.1038/nphys3412">The Free Energy Cost of Accurate Biochemical Oscillations</a>.”</span> <em>Nature Physics</em>.
</div>
<div id="ref-Chirimuuta2025Prehistory" class="csl-entry">
Chirimuuta. 2025. <span>“<a href="https://doi.org/10.1007/s42087-024-00460-z">The Prehistory of the Idea That Thinking Is Modelling</a>.”</span> <em>Human Arenas</em>.
</div>
<div id="ref-Cisek2009Internal" class="csl-entry">
Cisek. 2009. <span>“<a href="https://doi.org/10.1007/978-3-540-29678-2_2528">Internal Models</a>.”</span> In <em>Encyclopedia of Neuroscience</em>.
</div>
<div id="ref-CostaCastello2005Demonstration" class="csl-entry">
Costa-Castello, Nebot, and Grino. 2005. <span>“<a href="https://doi.org/10.1109/TE.2004.832873">Demonstration of the Internal Model Principle by Digital Repetitive Control of an Educational Laboratory Plant</a>.”</span> <em>IEEE Transactions on Education</em>.
</div>
<div id="ref-Diester2024Internal" class="csl-entry">
Diester, Bartos, Bödecker, et al. 2024. <span>“<a href="https://doi.org/10.1016/j.neuron.2024.06.019">Internal World Models in Humans, Animals, and AI</a>.”</span> <em>Neuron</em>.
</div>
<div id="ref-Duncan2025Construction" class="csl-entry">
Duncan. 2025. <span>“<a href="https://doi.org/10.1016/j.neuropsychologia.2024.109062">Construction and Use of Mental Models: Organizing Principles for the Science of Brain and Mind</a>.”</span> <em>Neuropsychologia</em>.
</div>
<div id="ref-Francis1976Internal" class="csl-entry">
Francis, and Wonham. 1976. <span>“<a href="https://doi.org/10.1016/0005-1098(76)90006-6">The Internal Model Principle of Control Theory</a>.”</span> <em>Automatica</em>.
</div>
<div id="ref-Hao2023Reasoning" class="csl-entry">
Hao, Gu, Ma, et al. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2305.14992">Reasoning with Language Model Is Planning with World Model</a>.”</span>
</div>
<div id="ref-Hoel2017When" class="csl-entry">
Hoel. 2017. <span>“<a href="https://doi.org/10.3390/e19050188">When the Map Is Better Than the Territory</a>.”</span> <em>Entropy</em>.
</div>
<div id="ref-Huang2018Internal" class="csl-entry">
Huang, Isidori, Marconi, et al. 2018. <span>“<a href="https://doi.org/10.1109/CDC.2018.8619624">Internal Models in Control, Biology and Neuroscience</a>.”</span> In <em>2018 IEEE Conference on Decision and Control (CDC)</em>.
</div>
<div id="ref-Isidori2003Fundamentals" class="csl-entry">
Isidori, Marconi, and Serrani. 2003. <span>“<a href="https://doi.org/10.1007/978-1-4471-0011-9_1">Fundamentals of Internal-Model-Based Control Theory</a>.”</span> In <em>Robust Autonomous Guidance: An Internal Model Approach</em>.
</div>
<div id="ref-Kawato2021Internal" class="csl-entry">
Kawato, and Cortese. 2021. <span>“<a href="https://doi.org/10.48550/arXiv.2109.12798">From Internal Models Toward Metacognitive AI</a>.”</span>
</div>
<div id="ref-Lewandowski2025World" class="csl-entry">
Lewandowski, Ramesh, Meyer, et al. 2025. <span>“<a href="https://openreview.net/forum?id=gJclyLFSdU">The World Is Bigger: A Computationally-Embedded Perspective on the Big World Hypothesis</a>.”</span> In.
</div>
<div id="ref-Prokopenko2025Biological" class="csl-entry">
Prokopenko, Davies, Harré, et al. 2025. <span>“<a href="https://doi.org/10.1088/2632-072X/ad9cdc">Biological Arrow of Time: Emergence of Tangled Information Hierarchies and Self-Modelling Dynamics</a>.”</span> <em>Journal of Physics: Complexity</em>.
</div>
<div id="ref-Rosas2025AI" class="csl-entry">
Rosas, Boyd, and Baltieri. 2025. <span>“<a href="https://arxiv.org/abs/2504.04608v1">AI in a Vat: Fundamental Limits of Efficient World Modelling for Agent Sandboxing and Interpretability</a>.”</span> In.
</div>
<div id="ref-Touchette2004Informationtheoretic" class="csl-entry">
Touchette, and Lloyd. 2004. <span>“<a href="https://doi.org/10.1016/j.physa.2003.09.007">Information-Theoretic Approach to the Study of Control Systems</a>.”</span> <em>Physica A: Statistical Mechanics and Its Applications</em>.
</div>
<div id="ref-Virgo2025Good" class="csl-entry">
Virgo, Biehl, Baltieri, et al. 2025. <span>“<a href="https://doi.org/10.1162/ISAL.a.874">A “Good Regulator Theorem” for Embodied Agents</a>.”</span> In.
</div>
<div id="ref-Wagner2005Robustness" class="csl-entry">
Wagner. 2005. <em>Robustness and Evolvability in Living Systems</em>. Princeton Studies in Complexity.
</div>
<div id="ref-Wolpert1998Internal" class="csl-entry">
Wolpert, Miall, and Kawato. 1998. <span>“<a href="https://doi.org/10.1016/S1364-6613(98)01221-2">Internal Models in the Cerebellum</a>.”</span> <em>Trends in Cognitive Sciences</em>.
</div>
<div id="ref-Wonham2019Supervisory" class="csl-entry">
Wonham, and Cai. 2019. <em><a href="https://doi.org/10.1007/978-3-319-77452-7">Supervisory Control of Discrete-Event Systems</a></em>. Communications and Control Engineering.
</div>
</div>


</section>

 ]]></description>
  <category>adaptive</category>
  <category>agents</category>
  <category>AI safety</category>
  <category>economics</category>
  <category>evolution</category>
  <category>extended self</category>
  <category>game theory</category>
  <category>gene</category>
  <category>incentive mechanisms</category>
  <category>learning</category>
  <category>mind</category>
  <category>probability</category>
  <category>sociology</category>
  <category>statistics</category>
  <category>statmech</category>
  <category>utility</category>
  <category>wonk</category>
  <guid>https://danmackinlay.name/notebook/internal_models.html</guid>
  <pubDate>Thu, 05 Jun 2025 03:41:13 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/step_fountain_RP-P-1964-2567.thumbnail.avif" medium="image" type="image/avif"/>
</item>
<item>
  <title>The deep history of intelligence</title>
  <link>https://danmackinlay.name/notebook/intelligence_in_deep_history.html</link>
  <description><![CDATA[ 







<div class="quarto-title-meta">

    
    </div>





<div id="fig-john-eats-the-book" class="figure illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-john-eats-the-book-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/john_eats_the_book_gri_33125014730804_0024.avif" class="lightbox" data-gallery="quarto-lightbox-gallery-1" title="Figure&nbsp;1: "><img src="https://danmackinlay.name/images/john_eats_the_book_gri_33125014730804_0024.avif" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-john-eats-the-book-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1
</figcaption>
</figure>
</div>
<p>Let’s reason backwards from civilization’s final destination, if there is such a thing. What intelligences persist at the omega point? With what is <a href="../notebook/superintelligence.html">superintelligence</a> aligned in the <a href="../notebook/big_history.html">big picture</a>?</p>
<p>Various authors have tried to place modern AI developments in continuity with historical trends from less materially sophisticated societies, through more legible, compute-oriented societies, to some set of attractors at the end of history. Computational superorganisms. Singularities. Some authors even start before humans and roll the story back to microbes or prebiotic systems.</p>
<p>I consider all those models that speculate about big-picture trends in information processing to be models of intelligence in <a href="../notebook/big_history.html">big history</a>.</p>
<p>cf <a href="../notebook/intrinsic_motivation.html">Empowerment</a>, <a href="../notebook/utility_fitness.html">fitness and loss functions</a>, …</p>
<section id="from-cells-to-superorganisms" class="level2" data-number="1">
<h2 data-number="1" class="anchored" data-anchor-id="from-cells-to-superorganisms"><span class="header-section-number">1</span> From Cells to Superorganisms</h2>
<p>OK, if we want this to work, we need to decide: What even is intelligence? We can imagine intelligence as that which is possessed by a clever individual—a human, an octopus, perhaps an AI. Can we formally identify intelligence as some property of superorganisms, or generic organized systems? Societies that have evolved for thousands of years? Life that has been evolving and scaling for billions of years?</p>
<p>Across fields like history, <a href="../notebook/evolution.html">evolution</a>, and systems ecology, we find visionaries and cranks (cranksionaries!) who suggest that the story of our universe is one of growing computational power, where “intelligence” is the capacity of a system to harness energy to process information and shape its environment. From such a perspective, a bacterial colony, a forest ecosystem, and a modern megacity might all be points on a continuum of intelligence. They are all systems that create and maintain order against the relentless tide of entropy. And that’s, y’know, smart, dude.</p>
<p>I’m trying to work out whether any of those ideas are useful for generating testable hypotheses or for narrowing the probability space of evolving civilizations, etc.</p>
</section>
<section id="the-thermodynamic-engine" class="level2" data-number="2">
<h2 data-number="2" class="anchored" data-anchor-id="the-thermodynamic-engine"><span class="header-section-number">2</span> The Thermodynamic Engine</h2>
<p>At the most basic level, we can suppose intelligence runs on energy. Eric Chaisson’s work in cosmic evolution provides a putatively universal metric: <em>energy rate density</em> (<img src="https://latex.codecogs.com/png.latex?%5Cphi%20m">), or the flow of energy per second per gram <span class="citation" data-cites="Chaisson2011Energy">(Chaisson 2011)</span>. When we plot this value for various systems, a trend appears. Stars have a low <img src="https://latex.codecogs.com/png.latex?%5Cphi%20m">. Plants have a higher value. Animals are higher still. A modern human society, with its immense metabolism of fossil fuels and electricity, has an energy rate density orders of magnitude greater than any biological system that came before it. In their model, this is the thermodynamic signature of “complexity”. To build and maintain intricate structures, a system must channel vast amounts of energy through its mass.</p>
<p>This perspective resembles Hagens’ conception of the global economy as a mindless, energy-hungry “Superorganism” <span class="citation" data-cites="Hagens2020Economics">(Hagens 2020)</span>. Our civilization’s structure is entirely dependent on a massive throughput of high-quality energy, which allows for the intricate division of labour and information technology that define our modern intelligence. The downside, Hagens argues, is that this superorganism is “growth constrained,” behaviourally locked into myopically maximizing its energy consumption.</p>
</section>
<section id="the-physics-of-prediction" class="level2" data-number="3">
<h2 data-number="3" class="anchored" data-anchor-id="the-physics-of-prediction"><span class="header-section-number">3</span> The Physics of Prediction</h2>
<p>But the link between energy and intelligence is deeper than mere fuel. A fundamental principle of thermodynamics dictates that to be energy-efficient, a system “must” be predictive. Work by Susanne Still and colleagues proposes a formal equivalence between <a href="../notebook/informations.html">thermodynamic waste (dissipated heat) and informational waste</a> <span class="citation" data-cites="Still2012Thermodynamics">(Still et al. 2012)</span> (c.f. <a href="../notebook/utility_fitness.html#selection-theorems">Selection theorems</a>). The information a system remembers about its past can be split into two kinds: a useful part that helps predict the future, and a useless part the authors call “nostalgia”. Their conclusion is that this useless, non-predictive information is directly proportional to the energy the system must dissipate as heat.</p>
<p>In this model, wasted energy is the physical cost of holding onto memories that don’t help a system anticipate what’s next. This is a thermodynamic imperative: any system that evolves towards maximal energy efficiency is, by physical law, evolving to become a better prediction machine. This seems connected to the <a href="../notebook/thermodynamics_of_life.html">thermodynamics of life</a> and the <a href="../notebook/statistical_mechanics_of_statistics.html">statistical mechanics of statistics</a>.</p>
</section>
<section id="a-physics-of-adaptation" class="level2" data-number="4">
<h2 data-number="4" class="anchored" data-anchor-id="a-physics-of-adaptation"><span class="header-section-number">4</span> A Physics of Adaptation</h2>
<p>The principles above suggest that efficient systems must be predictive. Can we roll that concept back further into history and think about the little engines of prediction from a physical perspective rather than a biological one? How did matter become predictive or start managing data in the first place? The most direct and physically grounded attempt, AFAICT, to answer this comes from the work of Jeremy England and colleagues. In <span class="citation" data-cites="England2013Statistical">England (2013)</span>, he argued that self-replication could be a thermodynamically favoured outcome, a highly effective way for matter to dissipate energy. His colleagues have generalized this to “dissipation-driven adaptation” <span class="citation" data-cites="Perunov2016Statistical">(Perunov, Marsland, and England 2016)</span>, which I’ve tried to understand over at the <a href="../notebook/thermodynamics_of_life.html">thermodynamics of life</a> notebook.</p>
<p>They make a formal argument derived from the principles of far-from-equilibrium statistical mechanics. Take any system of particles (like a soup of chemicals). Drive it with an external energy source (like sunlight or chemical fuel). Allow it to dissipate that energy as heat into a surrounding bath (like the ocean). England’s theoretical results suggest that over time, such a system will tend to spontaneously self-organize into structures that are exceptionally good at absorbing and dissipating work from the environment.</p>
<p>The idea is that certain life-like properties are extraordinarily good at dissipating energy. The main example is self-replication. A single, complex molecule can only absorb and dissipate so much energy. But a population of a billion such molecules, created through replication, can dissipate vastly more. (I confess my grasp of this part of the argument is extremely shaky; I have a statistician’s understanding of entropy, not a physicist’s.) England’s framework suggests that replication might be a thermodynamically favoured outcome—a particularly effective solution that matter “discovers” for dissipating energy. In this view, “adaptation” is a physical process that can occur even before Darwinian selection kicks in. The system’s structure physically adapts to the patterns of the energy driving it, becoming “well-adapted” in a purely physical sense.</p>
<p>The <span class="citation" data-cites="Perunov2016Statistical">Perunov, Marsland, and England (2016)</span> argument connects physical adaptation to computation, which links it to something like intelligence. The proposed link is the idea that the system’s physical structure becomes an implicit memory of the environmental forces that shaped it, <a href="../notebook/models_of_computation.html">something memory something something Turing complete</a>.</p>
<p>A system that has self-organized to be good at absorbing a specific type of energy (e.g., light of a certain frequency, or mechanical shaking in a particular pattern) has physically changed its shape. That new shape is a durable record of the environmental conditions that drove its formation, in the way that the shape and orientation of a sand dune record the wind that has blown upon it. Now, if it can learn to predict and configure itself better for what will happen next, it may get better at absorbing the next energetic input and dissipating it, and therefore predominate. If we squint at that, it looks like a motivation for sprouting a brain.</p>
</section>
<section id="i-predict-therefore-i-am" class="level2" data-number="5">
<h2 data-number="5" class="anchored" data-anchor-id="i-predict-therefore-i-am"><span class="header-section-number">5</span> I predict therefore I am</h2>
<p>If the laws of thermodynamics demand that efficient systems be predictive, is there a principle that explains why predictive systems exist at all? This is the territory of <a href="../notebook/predictive_coding.html">Karl Friston’s Free Energy Principle (FEP)</a>, a particularly ambitious—and notoriously difficult-to-parse—attempted unified theory of intelligence and perhaps life <span class="citation" data-cites="Friston2013Life">(Friston 2013)</span>.</p>
<p>The principle posits that any system that persists in a fluctuating world—from a single cell to a brain—must maintain a boundary between itself and its environment. Friston and colleagues call this the <em>Markov blanket</em>, which I believe means the same here as it does in <a href="../notebook/graphical_models.html">probabilistic graphical models</a>. To maintain this boundary and not dissolve back into environmental chaos, the system must act to keep its internal states within a narrow, predictable range. Further, it must minimize “surprise”—or more technically, an upper bound on surprise called “<a href="../notebook/variational_inference.html">variational free energy</a>”, which I think is meant in the same sense as in variational inference.</p>
<p>On one hand, the system acts on the world to make its sensory inputs match its expectations (this is autopoiesis, or self-creation). On the other hand, its internal states become a probabilistic model of the environment, constantly updating to make better predictions in a process of <em>active inference</em>.</p>
<p>An intelligent agent, in the Fristonian sense, is something like a system that embodies a predictive model of its environment and acts to make its own predictions come true.</p>
<p>Danger: the “free energy” in the FEP is an <a href="../notebook/informations.html">information-theoretic quantity</a>, distinct from the thermodynamic free energy of physicists, which causes endless confusion. The debate continues over whether the FEP provides a new fundamental law of nature or a very powerful, but ultimately circular, “as-if” description of any system that manages not to fall apart.</p>
</section>
<section id="greetings-fellow-calculating-machines" class="level2" data-number="6">
<h2 data-number="6" class="anchored" data-anchor-id="greetings-fellow-calculating-machines"><span class="header-section-number">6</span> Greetings, Fellow Calculating Machines</h2>
<p>Now we can see how these pieces fit together. A system uses energy to run computations that implement an information life cycle, and the pressure for energy efficiency forces those computations to become predictive.</p>
<p>David Wolpert and Kyle Harper formalize this at the societal scale with their “Multiple Communicating Machines” (MCM) model <span class="citation" data-cites="Wolpert2025Computational">(David H. Wolpert and Harper 2025)</span>. They treat a society as a computer where occupations and technologies are interacting computational units. A society’s “computational power” is its ability to process information about its environment to effectively extract energy. This creates the central feedback loop of deep history: harvesting more energy allows a society to support more complex computation (more specialized jobs), which in turn allows it to harvest energy more effectively. This is the superorganism’s version of active inference: using its collective intelligence to model its world and act upon that model to ensure its continued existence.</p>
<p>So in this view, the agricultural revolution was a new set of algorithms for manipulating ecosystems. The rise of the state was a new computational architecture for managing large populations.</p>
</section>
<section id="rise-of-the-superorganism" class="level2" data-number="7">
<h2 data-number="7" class="anchored" data-anchor-id="rise-of-the-superorganism"><span class="header-section-number">7</span> Rise of the Superorganism</h2>
<div class="figure illustration sep">
<p><a href="../images/sep_end_brolly.png" class="lightbox" data-gallery="quarto-lightbox-gallery-2"><img src="https://danmackinlay.name/images/sep_end_brolly.png" class="img-fluid"></a></p>
</div>
<p>Many of us — myself included — find it reasonable to view societies as “crude <a href="../notebook/human_superorganisms.html">superorganisms</a>” <span class="citation" data-cites="Boyd1999Complex">(Boyd and Richerson 1999)</span>.</p>
<p>As societies grew and became more interconnected, they began to function as integrated, goal-directed entities.</p>
<p>Michael Wong and Stuart Bartlett argue that civilizations following this kind of superlinear scaling—where growth and energy demand accelerate—are on a trajectory towards “asymptotic burnout” <span class="citation" data-cites="Wong2022Asymptotic">(Wong and Bartlett 2022)</span>. The interval between crises that require major innovation shortens until the pace of innovation can’t keep up, leading to collapse. That’s their solution to the Fermi Paradox.</p>
<div id="fig-wongasymptotic2022-dataome" class="figure foreign illustration right quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-wongasymptotic2022-dataome-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<a href="../images/WongAsymptotic2022_dataome.webp" class="lightbox" data-gallery="quarto-lightbox-gallery-3" title="Figure&nbsp;2: "><img src="https://danmackinlay.name/images/WongAsymptotic2022_dataome.webp" class="img-fluid figure-img"></a>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig quarto-uncaptioned" id="fig-wongasymptotic2022-dataome-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2
</figcaption>
</figure>
</div>
<p>The authors propose two outs: wise civilizations might undergo a <em>homeostatic awakening</em>, using advanced intelligence to recognize a destructive trajectory and consciously shift priorities from unbounded growth to long-term stability. Or they might roll the dice and become a Type III galaxy-spanning expansionist civilization, but we suspect that rarely succeeds; otherwise we’d see more of them.</p>
<p>The growth-based singularity amusingly resembles an idea proposed by my Master’s supervisor, Didier Sornette, who found a similar result by curve-fitting economic data <span class="citation" data-cites="Johansen2001Finitetime">(Johansen and Sornette 2001)</span>. He argued that Earth’s human population and economic output have grown faster than exponential — i.e., in a super‑Malthusian mode — for most of recorded history. These growth rates are compatible with a spontaneous singularity occurring around 2052 ± 10, signalling an abrupt transition to a new regime. YMMV.</p>
</section>
<section id="cognition-all-the-way-down" class="level2" data-number="8">
<h2 data-number="8" class="anchored" data-anchor-id="cognition-all-the-way-down"><span class="header-section-number">8</span> Cognition all the way down</h2>
<p>Levin and Dennett presented a fresh twist on pansychism in <a href="https://aeon.co/essays/how-to-understand-cells-tissues-and-organisms-as-agents-with-agendas?ref=danmackinlay.name">Cognition all the way down</a>.</p>
<p>Related: <span class="citation" data-cites="Falandays2022All Fields2019Somatic Fields2022Competency">(Falandays et al. 2022; Fields and Levin 2019, 2022)</span></p>
<p>TBC</p>
</section>
<section id="planetary-computation-antikythera" class="level2" data-number="9">
<h2 data-number="9" class="anchored" data-anchor-id="planetary-computation-antikythera"><span class="header-section-number">9</span> Planetary computation, Antikythera</h2>
<p>Benjamin Bratton and Blaise Agüera y Arcas have been developing a vision of planetary computation as a framework for understanding how intelligence evolves on Earth and beyond.</p>
<blockquote class="blockquote">
<p><a href="https://journal.antikythera.org/antikythera.org?ref=danmackinlay.name">Antikythera</a> is a research program focused on the reorientation of planetary computation as a philosophical, technological, and geopolitical force. Antikythera takes its name from the first known computerーthe antikythera mechanismーwhich was also an astronomical instrument used for navigation, prediction, and planning. The name serves as inspiration for investigations of computational technologies that reveal and accelerate planetary intelligence.</p>
</blockquote>
<p>Key works: <span class="citation" data-cites="Arcas2024Computational AguerayArcas2025What Bratton2025Antikythera Bratton2025Noocene Bratton2025Planetary Bratton2025Speculative Ionescu2025Cognitive">(Agüera y Arcas et al. 2024; Agüera y Arcas 2025; Bratton 2025b, 2025c, 2025a; Bratton et al. 2025; Ionescu et al. 2025)</span></p>
<p>Coverage here: <a href="https://www.noemamag.com/ai-is-evolving-and-changing-our-understanding-of-intelligence/?ref=danmackinlay.name">AI Is Evolving — And Changing Our Understanding Of Intelligence</a></p>
<blockquote class="blockquote">
<p>In this essay, we will describe five interrelated paradigm shifts informing our development of AI:</p>
<ol type="1">
<li><strong><em>Natural Computing</em></strong> — Computing existed in nature long before we built the first “artificial computers”. Understanding computing as a natural phenomenon will enable fundamental advances not only in computer science and AI but also in physics and biology.</li>
<li><strong><em>Neural Computing</em></strong> — Our brains are an exquisite instance of natural computing. Redesigning the computers that power AI so they work more like a brain will greatly increase AI’s energy efficiency—and its capabilities too.</li>
<li><strong><em>Predictive Intelligence</em></strong> — The success of large language models (LLMs) shows us something fundamental about the nature of intelligence: it involves statistical modeling of the future (including one’s own future actions) given evolving knowledge, observations and feedback from the past. This insight suggests that current distinctions between designing, training and running AI models are transitory; more sophisticated AI will evolve, grow and learn continuously and interactively, as we do.</li>
<li><strong><em>General Intelligence</em></strong> — Intelligence does not necessarily require biologically based computation. Although AI models will continue to improve, they are already broadly capable, tackling an increasing range of cognitive tasks with a skill level approaching and, in some cases, exceeding individual human capability. In this sense, “Artificial General Intelligence” (AGI) may already be here—we just keep shifting the goalposts.</li>
<li><strong><em>Collective Intelligence</em></strong> — Brains, AI agents and societies can all become more capable through increased scale. However, size alone is not enough. Intelligence is fundamentally social, powered by cooperation and the division of labor among many agents. In addition to causing us to rethink the nature of human (or “more than human”) intelligence, this insight suggests social aggregations of intelligences and multi-agent approaches to AI development that could reduce computational costs, increase AI heterogeneity and reframe AI safety debates.</li>
</ol>
</blockquote>
<p>There’s a book now — <span class="citation" data-cites="AguerayArcas2025What">Agüera y Arcas (2025)</span>.</p>
</section>
<section id="the-big-table" class="level2" data-number="10">
<h2 data-number="10" class="anchored" data-anchor-id="the-big-table"><span class="header-section-number">10</span> The Big Table</h2>
<p>To clarify the differences, here’s the feature matrix (disclaimer: generated by AI)</p>
<table class="caption-top table">
<colgroup>
<col style="width: 12%">
<col style="width: 26%">
<col style="width: 27%">
<col style="width: 19%">
<col style="width: 14%">
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;"><strong>Model / Framework</strong></th>
<th style="text-align: left;"><strong>What is “Intelligence”?</strong></th>
<th style="text-align: left;"><strong>Engine of Growth/Evolution</strong></th>
<th style="text-align: left;"><strong>Formalism/Methodology</strong></th>
<th style="text-align: left;"><strong>Scale/Domain</strong></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><strong>Still et al.&nbsp;(Thermo. of Prediction)</strong></td>
<td style="text-align: left;">Predictive power: minimizing non-predictive “nostalgic” information.</td>
<td style="text-align: left;">Thermodynamic pressure for energetic efficiency.</td>
<td style="text-align: left;">Statistical Physics (Nonequilibrium Thermodynamics)</td>
<td style="text-align: left;">Universal (any system with memory)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>Friston’s Free Energy Principle</strong></td>
<td style="text-align: left;">Active inference: minimizing variational free energy and embodying a predictive model.</td>
<td style="text-align: left;">An existential imperative to resist dissipation and minimize surprise.</td>
<td style="text-align: left;">Bayesian Statistics, Dynamical Systems Theory.</td>
<td style="text-align: left;">Universal (purportedly from cells to societies)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><strong>England’s Dissipation-Driven Adaptation</strong></td>
<td style="text-align: left;">“Physical adaptation”: structures exceptionally good at absorbing and dissipating energy from their environment.</td>
<td style="text-align: left;">Thermodynamic pressure for systems to self-organize into states that increase entropy production.</td>
<td style="text-align: left;">Causal driver: The physical imperative to dissipate energy creates adaptive, life-like structures.</td>
<td style="text-align: left;">Non-Equilibrium Statistical Mechanics (Fluctuation Theorems)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>Chaisson’s Energy-Rate Density</strong></td>
<td style="text-align: left;">Energy flow per unit mass (<img src="https://latex.codecogs.com/png.latex?%5Cphi%20m">) as a measure of complexity.</td>
<td style="text-align: left;">Increasing capacity to capture and channel energy through a system.</td>
<td style="text-align: left;">Empirical Metric (erg/s/g)</td>
<td style="text-align: left;">Universal (Cosmos to Society)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><strong>Shin et al.&nbsp;(Seshat)</strong></td>
<td style="text-align: left;">Information-processing capacity (e.g., writing, bureaucracy, currency).</td>
<td style="text-align: left;">Phased growth: scaling in size creates pressure for informational innovations.</td>
<td style="text-align: left;">Statistical Analysis (PCA) of historical database.</td>
<td style="text-align: left;">Holocene Societies</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>Wolpert &amp; Harper’s MCM</strong></td>
<td style="text-align: left;">“Computational power”: the ability to process information to achieve goals.</td>
<td style="text-align: left;">Co-evolutionary feedback loop between energy harvesting and computational capacity.</td>
<td style="text-align: left;">Formal Computational Model (new class of automata).</td>
<td style="text-align: left;">Universal (Cells to Societies)</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><strong>Hagens’ Superorganism</strong></td>
<td style="text-align: left;">The emergent metabolic activity of the global economic system.</td>
<td style="text-align: left;">Maximization of financial surplus, tethered to energy and carbon flows.</td>
<td style="text-align: left;">Systems View (conceptual framework with empirical data).</td>
<td style="text-align: left;">Global Human Civilization</td>
</tr>
<tr class="even">
<td style="text-align: left;"><strong>Wong &amp; Bartlett’s Burnout</strong></td>
<td style="text-align: left;">A civilization’s trajectory of accelerating growth (superlinear scaling).</td>
<td style="text-align: left;">Positive feedback loops between population, innovation, and energy demand.</td>
<td style="text-align: left;">Dynamical Systems Theory (conceptual, based on scaling laws).</td>
<td style="text-align: left;">Planetary Civilizations</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><strong>Boyd &amp; Richerson’s Superorganism</strong></td>
<td style="text-align: left;">Cooperative functioning of large-scale societies.</td>
<td style="text-align: left;">Gene-culture co-evolution creating social instincts, managed by cultural “work-arounds”.</td>
<td style="text-align: left;">Evolutionary Theory (conceptual hypothesis).</td>
<td style="text-align: left;">Human Societies</td>
</tr>
</tbody>
</table>
</section>
<section id="understanding-by-building" class="level2" data-number="11">
<h2 data-number="11" class="anchored" data-anchor-id="understanding-by-building"><span class="header-section-number">11</span> Understanding by building</h2>
<p>Can we design <a href="../notebook/open_ended_intelligence.html">open-ended intelligence</a>?</p>
</section>
<section id="biological-anchors" class="level2" data-number="12">
<h2 data-number="12" class="anchored" data-anchor-id="biological-anchors"><span class="header-section-number">12</span> Biological anchors</h2>
<p>Ajeya Cotra attempts to anchor modern synthetic intelligence by comparing it to the compute that has historically been used.</p>
<ul>
<li>Cotra, <a href="https://drive.google.com/drive/u/0/folders/15ArhEPZSTYU8f012bs6ehPS6-xmhtBPP?ref=danmackinlay.name">2020 Draft Report on Biological Anchors</a></li>
<li><a href="https://www.lesswrong.com/posts/ax695frGJEzGxFBK4/biology-inspired-agi-timelines-the-trick-that-never-works?ref=danmackinlay.name">Biology-Inspired AGI Timelines: The Trick That Never Works</a></li>
<li><a href="https://nunosempere.com/blog/2022/08/10/evolutionary-anchor/?ref=danmackinlay.name">A concern about the “evolutionary anchor” of Ajeya Cotra’s report</a></li>
</ul>
</section>
<section id="as-a-design-problem" class="level2" data-number="13">
<h2 data-number="13" class="anchored" data-anchor-id="as-a-design-problem"><span class="header-section-number">13</span> As a design problem</h2>
<p>Start here:</p>
<ul>
<li><a href="https://www.forethought.org/research/better-futures?ref=danmackinlay.name">Better Futures: Making Good Futures Even Better</a></li>
</ul>
</section>
<section id="incoming" class="level2" data-number="14">
<h2 data-number="14" class="anchored" data-anchor-id="incoming"><span class="header-section-number">14</span> Incoming</h2>
<ul>
<li><p>I missed it at the time, but Beff Jezoss <a href="https://beff.substack.com/p/notes-on-eacc-principles-and-tenets?ref=danmackinlay.name">justifies e/acc</a> with a word salad of evolution, thermodynamics and intelligence theory.</p></li>
<li><p><span class="citation" data-cites="Deacon2012Incomplete">Deacon (2012)</span>:</p>
<blockquote class="blockquote">
<p>Incomplete Nature begins by accepting what other theories try to deny: that, although mental contents do indeed lack these material-energetic properties, they are still entirely products of physical processes and have an unprecedented kind of causal power that is unlike anything that physics and chemistry alone have so far explained. Paradoxically, it is the intrinsic incompleteness of these semiotic and teleological phenomena that is the source of their unique form of physical influence in the world. Incomplete Nature meticulously traces the emergence of this special causal capacity from simple thermodynamics to self-organizing dynamics to living and mental dynamics, and it demonstrates how specific absences (or constraints) play the critical causal role in the organization of physical processes that generate these properties.</p>
</blockquote>
<p>Someone recommended this to me at a conference recently, but it seems unnecessarily baffling, and I worry I’ll spend days trying to figure out what the author means by “incompleteness,” only to find it’s kind of bullshit.</p></li>
<li><p>I’ve already been burned by <span class="citation" data-cites="Maturana1992Tree">Maturana (1992)</span>; it looked useful, but I strongly suspect it’s a failed project in the sense of <a href="../notebook/assorted_laws.html#newtons-sword">Newton’s flaming laser sword</a></p></li>
<li><p><a href="https://pibbss.ai/?ref=danmackinlay.name">PIBBSS – Principles of Intelligent Behavior in Biological and Social Systems</a></p></li>
<li><p><a href="https://theeggandtherock.com/p/prediction-life-will-turn-out-to?ref=danmackinlay.name">Prediction: Life will turn out to be everywhere (after a certain point)</a></p></li>
<li><p><a href="https://www.lesswrong.com/posts/QkX2bAkwG2EpGvNug/the-second-law-of-thermodynamics-and-engines-of-cognition?ref=danmackinlay.name">The Second Law of Thermodynamics, and Engines of Cognition</a></p></li>
<li><p><a href="https://www.lesswrong.com/posts/amK9EqxALJXyd9Rb2/paths-to-high-level-machine-intelligence?ref=danmackinlay.name">Paths To High-Level Machine Intelligence</a></p></li>
<li><p><a href="https://www.jimruttshow.com/currents-joscha-bach/?ref=danmackinlay.name">Joscha Bach on Synthetic Intelligence</a> / <a href="https://forum.effectivealtruism.org/posts/wQERLNFoMidffTLar/joscha-bach-on-synthetic-intelligence-annotated?ref=danmackinlay.name">EA Forum annotation</a></p></li>
<li><p><a href="../notebook/ecology_of_mind.html">Ecologies of Minds</a> examines the distinction between evolutionary and optimizing minds.</p></li>
<li><p>What should we call this? Factome, conceptome, empitome, noosphere…?</p></li>
<li><p><a href="https://80000hours.org/podcast/episodes/ian-morris-deep-history-intelligence-explosion/?ref=danmackinlay.name">Ian Morris on whether deep history suggests we’re heading for an intelligence explosion</a></p></li>
<li><p><a href="https://joecarlsmith.com/2024/01/04/deep-atheism-and-ai-risk?ref=danmackinlay.name">Deep Atheism and AI Risk — Joe Carlsmith</a></p></li>
<li><p>Do we need computers to create AIs at all, or <a href="../notebook/ai_without_computers.html">are we all already AIs</a>?</p></li>
<li><p><a href="https://github.com/paradigms-of-intelligence?ref=danmackinlay.name">Paradigms of Intelligence Team</a></p></li>
<li><p><a href="https://www.lesswrong.com/posts/CQAMdzA4MZEhNRtTp/human-values-and-biases-are-inaccessible-to-the-genome?ref=danmackinlay.name">Human values and biases are inaccessible to the genome</a></p></li>
<li><p><a href="https://www.lesswrong.com/posts/JPHeENwRyXn9YFmXc/empowerment-is-almost-all-we-need?ref=danmackinlay.name">Empowerment is (almost) all we need</a></p></li>
<li><p><a href="https://apparentselves.org/publications/?ref=danmackinlay.name">Publications - Center for the Study of Apparent Selves (CSAS)</a></p></li>
</ul>
</section>
<section id="references" class="level2" data-number="15">
<h2 data-number="15" class="anchored" data-anchor-id="references"><span class="header-section-number">15</span> References</h2>
<div id="refs" class="references csl-bib-body hanging-indent" data-entry-spacing="0">
<div id="ref-Abramsky2025Open" class="csl-entry">
Abramsky, Banzhaf, Caves, et al. 2025. <span>“<a href="https://doi.org/10.48550/arXiv.2508.11423">Open Questions about Time and Self-Reference in Living Systems</a>.”</span>
</div>
<div id="ref-AguerayArcas2025What" class="csl-entry">
Agüera y Arcas. 2025. <em><a href="https://whatisintelligence.antikythera.org">What Is Intelligence?: Lessons from AI About Evolution, Computing, and Minds</a></em>. Antikythera.
</div>
<div id="ref-Arcas2024Computational" class="csl-entry">
Agüera y Arcas, Alakuijala, Evans, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2406.19108">Computational Life: How Well-Formed, Self-Replicating Programs Emerge from Simple Interaction</a>.”</span>
</div>
<div id="ref-Aktipis2016Principles" class="csl-entry">
Aktipis. 2016. <span>“<a href="https://doi.org/10.1111/eva.12303">Principles of Cooperation Across Systems: From Human Sharing to Multicellularity and Cancer</a>.”</span> <em>Evolutionary Applications</em>.
</div>
<div id="ref-Axelrod1984Evolution" class="csl-entry">
Axelrod, Robert M. 1984. <em><a href="https://web.archive.org/web/20210604174838/http://www.eleutera.org/wp-content/uploads/2015/07/The-Evolution-of-Cooperation.pdf">The evolution of cooperation</a></em>.
</div>
<div id="ref-Axelrod1981Evolution" class="csl-entry">
Axelrod, Robert, and Hamilton. 1981. <span>“<a href="http://www.jstor.org/stable/1685895">The Evolution of Cooperation</a>.”</span> <em>Science</em>, New Series,.
</div>
<div id="ref-Beaulieu2020Learning" class="csl-entry">
Beaulieu, Frati, Miconi, et al. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2002.09571">Learning to Continually Learn</a>.”</span>
</div>
<div id="ref-Best1999Kevin" class="csl-entry">
Best, and Kellner. 1999. <span>“<a href="https://doi.org/10.1177/1086026699122001">Kevin Kelly’s Complexity Theory: The Politics and Ideology of Self-Organizing Systems</a>.”</span> <em>Organization &amp; Environment</em>.
</div>
<div id="ref-Bowles2003Coevolution" class="csl-entry">
Bowles, Choi, and Hopfensitz. 2003. <span>“<a href="https://doi.org/10.1016/S0022-5193(03)00060-2">The Co-Evolution of Individual Behaviors and Social Institutions</a>.”</span> <em>Journal of Theoretical Biology</em>.
</div>
<div id="ref-Boyd1999Complex" class="csl-entry">
Boyd, and Richerson. 1999. <span>“Complex Societies: The Evolutionary Origins of a Crude Superorganism.”</span> <em>Human Nature</em>.
</div>
<div id="ref-Boyd2005Origin" class="csl-entry">
Boyd, and Richerson. 2005. <em>The Origin and Evolution of Cultures</em>. Evolution and Cognition.
</div>
<div id="ref-Bratton2025Speculative" class="csl-entry">
Bratton. 2025a. <span>“<a href="https://doi.org/10.1162/ANTI.5CZE">A Speculative Philosophy of Planetary Computation</a>.”</span> <em>Antikythera Digital Journal</em>.
</div>
<div id="ref-Bratton2025Antikythera" class="csl-entry">
———. 2025b. <span>“<a href="https://doi.org/10.1162/ANTI.5CZ9">Antikythera</a>.”</span> <em>Antikythera Digital Journal</em>.
</div>
<div id="ref-Bratton2025Noocene" class="csl-entry">
———. 2025c. <span>“<a href="https://doi.org/10.1162/ANTI.5D05">The Noocene: Computation and Cosmology from Antikythera to AI</a>.”</span> <em>Antikythera Digital Journal</em>.
</div>
<div id="ref-Bratton2025Planetary" class="csl-entry">
Bratton, Newman, Galison, et al. 2025. <span>“<a href="https://doi.org/10.1162/ANTI.5D0A">Planetary Sapience Symposium</a>.”</span> <em>Antikythera Digital Journal</em>.
</div>
<div id="ref-Chaisson2011Energy" class="csl-entry">
Chaisson. 2011. <span>“<a href="https://doi.org/10.1002/cplx.20323">Energy Rate Density as a Complexity Metric and Evolutionary Driver</a>.”</span> <em>Complexity</em>.
</div>
<div id="ref-Chapman2016How" class="csl-entry">
Chapman, Childers, and Vallino. 2016. <span>“<a href="https://doi.org/10.1093/biosci/biv166">How the Second Law of Thermodynamics Has Informed Ecosystem Ecology Through Its History</a>.”</span> <em>BioScience</em>.
</div>
<div id="ref-Clune2020AIGAs" class="csl-entry">
Clune. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.1905.10985">AI-GAs: AI-Generating Algorithms, an Alternate Paradigm for Producing General Artificial Intelligence</a>.”</span>
</div>
<div id="ref-Cully2015Robots" class="csl-entry">
Cully, Clune, Tarapore, et al. 2015. <span>“<a href="https://doi.org/10.1038/nature14422">Robots that can adapt like animals</a>.”</span> <em>Nature</em>.
</div>
<div id="ref-Dafoe2020Open" class="csl-entry">
Dafoe, Hughes, Bachrach, et al. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2012.08630">Open Problems in Cooperative AI</a>.”</span>
</div>
<div id="ref-Deacon2012Incomplete" class="csl-entry">
Deacon. 2012. <em>Incomplete Nature: How Mind Emerged from Matter</em>.
</div>
<div id="ref-Ecoffet2021First" class="csl-entry">
Ecoffet, Huizinga, Lehman, et al. 2021. <span>“<a href="https://doi.org/10.1038/s41586-020-03157-9">First Return, Then Explore</a>.”</span> <em>Nature</em>.
</div>
<div id="ref-Egel2012Lifes" class="csl-entry">
Egel. 2012. <span>“<a href="https://doi.org/10.3390/life2040323">Life’s Order, Complexity, Organization, and Its Thermodynamic–Holistic Imperatives</a>.”</span> <em>Life : Open Access Journal</em>.
</div>
<div id="ref-England2013Statistical" class="csl-entry">
England. 2013. <span>“<a href="https://doi.org/10.1063/1.4818538">Statistical Physics of Self-Replication</a>.”</span> <em>The Journal of Chemical Physics</em>.
</div>
<div id="ref-Falandays2022All" class="csl-entry">
Falandays, Kaaronen, Moser, et al. 2022. <span>“<a href="https://doi.org/10.31234/osf.io/jhrp6">All Intelligence Is Collective Intelligence</a>.”</span>
</div>
<div id="ref-Faldor2024OMNIEPIC" class="csl-entry">
Faldor, Zhang, Cully, et al. 2024. <span>“<a href="https://openreview.net/forum?id=Y1XkzMJpPd">OMNI-EPIC: Open-Endedness via Models of Human Notions of Interestingness with Environments Programmed in Code</a>.”</span> In.
</div>
<div id="ref-Fields2019Somatic" class="csl-entry">
Fields, and Levin. 2019. <span>“<a href="https://doi.org/10.1080/19420889.2019.1643666">Somatic Multicellularity as a Satisficing Solution to the Prediction-Error Minimization Problem</a>.”</span> <em>Communicative &amp; Integrative Biology</em>.
</div>
<div id="ref-Fields2022Competency" class="csl-entry">
———. 2022. <span>“<a href="https://doi.org/10.3390/e24060819">Competency in Navigating Arbitrary Spaces as an Invariant for Analyzing Cognition in Diverse Embodiments</a>.”</span> <em>Entropy</em>.
</div>
<div id="ref-Fletcher2007Evolution" class="csl-entry">
Fletcher, and Zwick. 2007. <span>“<a href="https://doi.org/10.1016/j.jtbi.2006.09.030">The evolution of altruism: game theory in multilevel selection and inclusive fitness</a>.”</span> <em>Journal of Theoretical Biology</em>.
</div>
<div id="ref-Friston2013Life" class="csl-entry">
Friston. 2013. <span>“<a href="https://doi.org/10.1098/rsif.2013.0475">Life as We Know It</a>.”</span> <em>Journal of The Royal Society Interface</em>.
</div>
<div id="ref-Galesic2022Collective" class="csl-entry">
Galesic, Barkoczi, Berdahl, et al. 2022. <span>“<a href="https://doi.org/10.31235/osf.io/5f2ad">Beyond Collective Intelligence: Collective Adaptation</a>.”</span>
</div>
<div id="ref-Hagens2020Economics" class="csl-entry">
Hagens. 2020. <span>“<a href="https://doi.org/10.1016/j.ecolecon.2019.106520">Economics for the Future – Beyond the Superorganism</a>.”</span> <em>Ecological Economics</em>.
</div>
<div id="ref-Harari2018Homo" class="csl-entry">
Harari. 2018. <em>Homo Deus: A Brief History of Tomorrow</em>.
</div>
<div id="ref-Hetzer2009OtherRegarding" class="csl-entry">
Hetzer, and Sornette. 2009. <span>“<a href="http://papers.ssrn.com/abstract=1468517">Other-Regarding Preferences and Altruistic Punishment: A Darwinian Perspective</a>.”</span> SSRN Scholarly Paper ID 1468517.
</div>
<div id="ref-Hoffman2014Objects" class="csl-entry">
Hoffman, and Prakash. 2014. <span>“<a href="https://doi.org/10.3389/fpsyg.2014.00577">Objects of consciousness</a>.”</span> <em>Frontiers in Psychology</em>.
</div>
<div id="ref-Ionescu2025Cognitive" class="csl-entry">
Ionescu, Frisch, Farghly, et al. 2025. <span>“<a href="https://doi.org/10.1162/ANTI.5CZG">Cognitive Infrastructures</a>.”</span> <em>Antikythera Digital Journal</em>.
</div>
<div id="ref-Johansen2001Finitetime" class="csl-entry">
Johansen, and Sornette. 2001. <span>“<a href="https://doi.org/10.1016/S0378-4371(01)00105-4">Finite-Time Singularity in the Dynamics of the World Population, Economic and Financial Indices</a>.”</span> <em>Physica A: Statistical Mechanics and Its Applications</em>.
</div>
<div id="ref-Kauffman1993Origins" class="csl-entry">
Kauffman, Stuart A. 1993. <em>The Origins of Order: Self-Organization and Selection in Evolution</em>.
</div>
<div id="ref-Kauffman1996Home" class="csl-entry">
Kauffman, Stuart A. 1996. <em>At Home in the Universe: The Search for the Laws of Self-Organization and Complexity</em>.
</div>
<div id="ref-Lang2014Thermodynamics" class="csl-entry">
Lang, Fisher, Mora, et al. 2014. <span>“<a href="https://doi.org/10.1103/PhysRevLett.113.148103">Thermodynamics of Statistical Inference by Cells</a>.”</span> <em>Physical Review Letters</em>.
</div>
<div id="ref-Levin2024Artificial" class="csl-entry">
Levin. 2024. <span>“<a href="https://doi.org/10.1002/aisy.202401034">Artificial Intelligences: A Bridge Toward Diverse Intelligence and Humanity’s Future</a>.”</span> <em>Advanced Intelligent Systems</em>.
</div>
<div id="ref-Marsland2018Limits" class="csl-entry">
Marsland, and England. 2018. <span>“<a href="https://doi.org/10.1088/1361-6633/aa9101">Limits of Predictions in Thermodynamic Systems: A Review</a>.”</span> <em>Reports on Progress in Physics</em>.
</div>
<div id="ref-Maturana1992Tree" class="csl-entry">
Maturana. 1992. <em>The Tree Of Knowledge: The Biological Roots of Human Understanding</em>.
</div>
<div id="ref-Mercier2011Why" class="csl-entry">
Mercier, and Sperber. 2011. <span>“<a href="https://doi.org/10.1017/S0140525X10000968">Why Do Humans Reason? Arguments for an Argumentative Theory</a>.”</span> <em>Behavioral and Brain Sciences</em>.
</div>
<div id="ref-Mercier2017Enigma" class="csl-entry">
———. 2017. <em><a href="https://doi.org/10.4159/9780674977860">The Enigma of Reason</a></em>.
</div>
<div id="ref-Mesoudi2008Multiple" class="csl-entry">
Mesoudi, and Whiten. 2008. <span>“<a href="https://doi.org/10.1098/rstb.2008.0129">The Multiple Roles of Cultural Transmission Experiments in Understanding Human Cultural Evolution</a>.”</span> <em>Philosophical Transactions of the Royal Society B: Biological Sciences</em>.
</div>
<div id="ref-Meulemans2024Multiagent" class="csl-entry">
Meulemans, Kobayashi, Oswald, et al. 2024. <span>“<a href="https://doi.org/10.48550/arXiv.2410.18636">Multi-Agent Cooperation Through Learning-Aware Policy Gradients</a>.”</span> In.
</div>
<div id="ref-Morris2014Measure" class="csl-entry">
Morris. 2014. <em>The Measure of Civilization: How Social Development Decides the Fate of Nations</em>.
</div>
<div id="ref-Muthukrishna2023Theory" class="csl-entry">
Muthukrishna. 2023. <em>A Theory of Everyone: The New Science of Who We Are, How We Got Here, and Where We’re Going</em>.
</div>
<div id="ref-Nowak2006Five" class="csl-entry">
Nowak. 2006. <span>“<a href="https://doi.org/10.1126/science.1133755">Five Rules for the Evolution of Cooperation</a>.”</span> <em>Science</em>.
</div>
<div id="ref-Omohundro2008Basic" class="csl-entry">
Omohundro. 2008. <span>“<a href="https://selfawaresystems.files.wordpress.com/2008/01/ai_drives_final.pdf">The Basic AI Drives</a>.”</span> In <em>Proceedings of the 2008 Conference on Artificial General Intelligence 2008: Proceedings of the First AGI Conference</em>.
</div>
<div id="ref-Ortega2013Thermodynamics" class="csl-entry">
Ortega, and Braun. 2013. <span>“<a href="https://doi.org/10.1098/rspa.2012.0683">Thermodynamics as a Theory of Decision-Making with Information-Processing Costs</a>.”</span> <em>Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences</em>.
</div>
<div id="ref-Perunov2016Statistical" class="csl-entry">
Perunov, Marsland, and England. 2016. <span>“<a href="https://doi.org/10.1103/PhysRevX.6.021036">Statistical Physics of Adaptation</a>.”</span> <em>Physical Review X</em>.
</div>
<div id="ref-Prakash2021Fitness" class="csl-entry">
Prakash, Stephens, Hoffman, et al. 2021. <span>“<a href="https://doi.org/10.1007/s10441-020-09400-0">Fitness Beats Truth in the Evolution of Perception</a>.”</span> <em>Acta Biotheoretica</em>.
</div>
<div id="ref-Ringstrom2023Reward" class="csl-entry">
Ringstrom. 2023. <span>“<a href="https://doi.org/10.48550/arXiv.2211.10851">Reward Is Not Necessary: How to Create a Modular &amp; Compositional Self-Preserving Agent for Life-Long Learning</a>.”</span>
</div>
<div id="ref-Schneider1994Life" class="csl-entry">
Schneider, and Kay. 1994. <span>“Life as a Manifestation of the Second Law of Thermodynamics.”</span> <em>Mathematical and Computer Modelling</em>.
</div>
<div id="ref-Shin2020Scale" class="csl-entry">
Shin, Price, Wolpert, et al. 2020. <span>“<a href="https://doi.org/10.1038/s41467-020-16035-9">Scale and Information-Processing Thresholds in Holocene Social Evolution</a>.”</span> <em>Nature Communications</em>.
</div>
<div id="ref-Sornette2003Critical" class="csl-entry">
Sornette. 2003. <span>“<a href="https://doi.org/10.1016/S0370-1573(02)00634-8">Critical Market Crashes</a>.”</span> <em>Physics Reports</em>.
</div>
<div id="ref-Still2012Thermodynamics" class="csl-entry">
Still, Sivak, Bell, et al. 2012. <span>“<a href="https://doi.org/10.1103/PhysRevLett.109.120604">Thermodynamics of Prediction</a>.”</span> <em>Physical Review Letters</em>.
</div>
<div id="ref-Suki2012Major" class="csl-entry">
Suki. 2012. <span>“<a href="https://doi.org/10.3389/fphys.2012.00094">The Major Transitions of Life from a Network Perspective</a>.”</span> <em>Frontiers in Physiology</em>.
</div>
<div id="ref-Thagard1997Collaborative" class="csl-entry">
Thagard. 1997. <span>“Collaborative Knowledge.”</span> <em>Noûs</em>.
</div>
<div id="ref-Wang2019POET" class="csl-entry">
Wang, Lehman, Clune, et al. 2019. <span>“<a href="https://doi.org/10.1145/3321707.3321799">POET: Open-Ended Coevolution of Environments and Their Optimized Solutions</a>.”</span> In <em>Proceedings of the Genetic and Evolutionary Computation Conference</em>. GECCO ’19.
</div>
<div id="ref-Wang2020Enhanced" class="csl-entry">
Wang, Lehman, Rawal, et al. 2020. <span>“<a href="https://doi.org/10.48550/arXiv.2003.08536">Enhanced POET: Open-Ended Reinforcement Learning Through Unbounded Invention of Learning Challenges and Their Solutions</a>.”</span>
</div>
<div id="ref-Wolpert2006Information" class="csl-entry">
Wolpert, David H. 2006. <span>“<a href="http://arxiv.org/abs/cond-mat/0402508">Information Theory — The Bridge Connecting Bounded Rational Game Theory and Statistical Physics</a>.”</span> In <em>Complex Engineered Systems</em>. Understanding Complex Systems.
</div>
<div id="ref-Wolpert2008Physical" class="csl-entry">
Wolpert, David H. 2008. <span>“<a href="https://doi.org/10.1016/j.physd.2008.03.040">Physical Limits of Inference</a>.”</span> <em>Physica D: Nonlinear Phenomena</em>, Novel Computing Paradigms: Quo Vadis?,.
</div>
<div id="ref-Wolpert2017Constraints" class="csl-entry">
Wolpert, David. 2017. <span>“<a href="https://arxiv.org/abs/1711.03499v3">Constraints on Physical Reality Arising from a Formalization of Knowledge</a>.”</span>
</div>
<div id="ref-Wolpert2018Theories" class="csl-entry">
Wolpert, David H. 2018. <span>“<a href="https://doi.org/10.1007/978-3-319-72478-2_9">Theories of Knowledge and Theories of Everything</a>.”</span> In <em>The Map and the Territory: Exploring the Foundations of Science, Thought and Reality</em>. The Frontiers Collection.
</div>
<div id="ref-Wolpert2019Stochastic" class="csl-entry">
———. 2019. <span>“<a href="https://doi.org/10.1088/1751-8121/ab0850">Stochastic Thermodynamics of Computation</a>.”</span>
</div>
<div id="ref-Wolpert2011Probability" class="csl-entry">
Wolpert, David H, Bieniawski, and Rajnarayan. 2011. <span>“Probability Collectives in Optimization.”</span>
</div>
<div id="ref-Wolpert2025Computational" class="csl-entry">
Wolpert, David H., and Harper. 2025. <span>“<a href="https://doi.org/10.31219/osf.io/qj83z">The Computational Power of a Human Society: A New Model of Social Evolution</a>.”</span>
</div>
<div id="ref-Wolpert2026What" class="csl-entry">
Wolpert, David H, and Korbel. 2026. <span>“<a href="https://doi.org/10.1088/2632-072X/ae3af8">What Does It Mean for a System to Compute?</a>”</span> <em>Journal of Physics: Complexity</em>.
</div>
<div id="ref-Wolpert1999Introduction" class="csl-entry">
Wolpert, David H., and Tumer. 1999. <span>“<a href="http://arxiv.org/abs/cs/9908014">An Introduction to Collective Intelligence</a>.”</span> <em>arXiv:cs/9908014</em>.
</div>
<div id="ref-Wong2022Asymptotic" class="csl-entry">
Wong, and Bartlett. 2022. <span>“<a href="https://doi.org/10.1098/rsif.2022.0029">Asymptotic Burnout and Homeostatic Awakening: A Possible Solution to the Fermi Paradox?</a>”</span> <em>Journal of The Royal Society Interface</em>.
</div>
</div>


</section>

 ]]></description>
  <category>adversarial</category>
  <category>AI safety</category>
  <category>catastrophe</category>
  <category>economics</category>
  <category>faster pussycat</category>
  <category>innovation</category>
  <category>language</category>
  <category>machine learning</category>
  <category>mind</category>
  <category>neural nets</category>
  <category>NLP</category>
  <category>security</category>
  <category>technology</category>
  <guid>https://danmackinlay.name/notebook/intelligence_in_deep_history.html</guid>
  <pubDate>Wed, 04 Jun 2025 23:52:17 GMT</pubDate>
  <media:content url="https://danmackinlay.name/generated_thumbnails/site_previews/images/john_eats_the_book_gri_33125014730804_0024.thumbnail.avif" medium="image" type="image/avif"/>
</item>
</channel>
</rss>
