<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Causal Inference on My Hugo Project</title><link>https://ostensible-paradox.pages.dev/en/tags/causal-inference/</link><description>Recent content in Causal Inference on My Hugo Project</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 22 May 2026 22:20:00 +0800</lastBuildDate><atom:link href="https://ostensible-paradox.pages.dev/en/tags/causal-inference/index.xml" rel="self" type="application/rss+xml"/><item><title>Erbar-Maas Singular Causal Interventions</title><link>https://ostensible-paradox.pages.dev/en/posts/erbar_mass_en/</link><pubDate>Fri, 22 May 2026 22:20:00 +0800</pubDate><guid>https://ostensible-paradox.pages.dev/en/posts/erbar_mass_en/</guid><description>An interactive laboratory demonstrating singular limits on Continuous-Time Markov Chains.</description><content:encoded><![CDATA[<p>How do we reconcile the physical, continuous dynamics of a thermodynamic system with the discontinuous, logical operations of causal graph surgery?</p>
<p>In classical causal inference (Pearl, 2009), a causal intervention is modeled via the <strong>do-operator</strong>, which surgically severs incoming causal links to a target variable and forces it to a fixed value. While mathematically clean, this &ldquo;graph surgery&rdquo; is a discontinuous operation: it instantly zeroes out transition rates, defying physical processes which must obey continuous probability conservation and finite transmission speeds.</p>
<p>The <strong>Erbar-Maas Singular Intervention Theorem</strong> provides a rigorous mathematical bridge. By representing causal interventions as the infinite-rate singular limit of continuous-time restoration forces, we recover Pearl&rsquo;s discontinuous causal surgery exactly as a timescale separation limit on Continuous-Time Markov Chains (CTMCs).</p>
<p>Below is an interactive mathematical laboratory showcasing the convergence, Wasserstein geometry, and entropy gradient flows behind this theorem.</p>
<hr>
<link rel="stylesheet" href="/css/interactive-proof.min.11d50387654578442c07d15c73d8dff500cc122fc7e3ba51459ca4daf7307c7b.css" integrity="sha256-EdUDh2VFeEQsB9Fcc9jf9QDMEi/H47pRRZyk2vcwfHs=">

<div id="interactive-proof-lab" class="interactive-proof-lab">
  
  <div class="ipl-intro">
    <div class="ipl-badge">
      <svg class="ipl-icon" viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="20" x2="18" y2="10"></line><line x1="12" y1="20" x2="12" y2="4"></line><line x1="6" y1="20" x2="6" y2="14"></line></svg>
      Causal Modeling Limit
    </div>
    <h2 class="ipl-title">Erbar-Maas Singular Intervention Theorem</h2>
    <p class="ipl-subtitle">
      Interactive theorem builder proving that Pearl’s discontinuous graph surgeries can be recovered exactly as the infinite-rate singular state perturbation of physical Continuous-Time Markov Chain (CTMC) models.
    </p>
  </div>

  
  <div class="ipl-grid">
    
    
    <div class="ipl-left-panel">
      
      <div class="ipl-panel-gridbg"></div>
      
      
      <div class="ipl-panel-header">
        <span class="ipl-status-indicator">
          <span class="ipl-pulse-dot"></span>
          CTMC CAUSAL SIMULATOR 1.2
        </span>
        <span id="ipl-slide-number">SLIDE 1 / 7</span>
      </div>

      
      <div class="ipl-board-arena">
        
        
        <div class="ipl-visualizer-row">
          
          
          <div id="causal-graph-map" class="ipl-graph-box">
            <span class="ipl-box-label">Finite Causal State Network</span>
            
            
            <div class="ipl-graph-workspace">
              
              
              <div class="ipl-node-container ipl-node-a" data-node="0">
                <div class="ipl-node">A</div>
                <span class="ipl-node-prob">0.650</span>
              </div>

              
              <div class="ipl-node-container ipl-node-b" data-node="1">
                <div class="ipl-node">B</div>
                <span class="ipl-node-prob">0.250</span>
              </div>

              
              <div class="ipl-node-container ipl-node-c" data-node="2">
                <div class="ipl-node">C<span class="ipl-do-badge ipl-hidden" id="ipl-do-badge">DO</span></div>
                <span class="ipl-node-prob">0.100</span>
              </div>

              
              <svg class="ipl-graph-svg" viewBox="0 0 320 240">
                <defs>
                  <marker id="ipl-arrow-orange" viewBox="0 0 10 10" refX="24" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
                    <path d="M 0 0 L 10 5 L 0 10 z" fill="#d97706" />
                  </marker>
                  <marker id="ipl-arrow-blue" viewBox="0 0 10 10" refX="24" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
                    <path d="M 0 0 L 10 5 L 0 10 z" fill="#818cf8" />
                  </marker>
                </defs>

                
                
                <line id="ipl-line-ac" x1="70" y1="170" x2="150" y2="70" stroke="#818cf8" stroke-width="2" marker-end="url(#ipl-arrow-blue)" class="ipl-transition-line" />
                
                
                <line id="ipl-line-bc" x1="250" y1="170" x2="170" y2="70" stroke="#818cf8" stroke-width="2" marker-end="url(#ipl-arrow-blue)" class="ipl-transition-line" />

                
                <line id="ipl-line-ab" x1="100" y1="190" x2="220" y2="190" stroke="#818cf8" stroke-width="1.5" class="ipl-transition-line" />
              </svg>

            </div>

            
            <div id="ipl-legend-badge" class="ipl-legend-badge">
              Standard reversible paths
            </div>
          </div>

          
          <div id="generator-heatmap-detail" class="ipl-matrix-box">
            <div class="ipl-matrix-header">
              <span class="ipl-box-label">Active Matrix Algebra</span>
              <p id="ipl-matrix-name" class="ipl-matrix-name">REVERSIBLE GENERATOR Q</p>
            </div>

            
            <div class="ipl-matrix-grid" id="ipl-matrix-grid">
              
            </div>

            
            <div id="ipl-lambda-control" class="ipl-slider-container ipl-hidden">
              <div class="ipl-slider-label-row">
                <span>RESTORATIVE RATE λ (Forcing Power):</span>
                <span id="ipl-lambda-value" class="ipl-value-highlight">λ = 5</span>
              </div>
              <input 
                id="forcing-power-slider"
                type="range"
                min="1"
                max="40"
                step="1"
                value="5"
                class="ipl-range-slider"
              />
            </div>
          </div>

        </div>

        
        <div id="simulation-monitor" class="ipl-monitor-bar">
          <div class="ipl-monitor-col">
            <span class="ipl-monitor-label">Active Simulation Time t</span>
            <div class="ipl-time-control">
              <input 
                id="simulation-time-slider"
                type="range"
                min="0.1"
                max="5.0"
                step="0.1"
                value="1.0"
                class="ipl-range-slider"
              />
              <span id="ipl-time-value" class="ipl-monitor-value-small">1.0s</span>
            </div>
          </div>

          <div class="ipl-monitor-col border-left">
            <span class="ipl-monitor-label">Information Entropy H(p|π)</span>
            <span id="ipl-entropy-value" class="ipl-monitor-value value-emerald">
              0.00000 nats
            </span>
          </div>

          <div class="ipl-monitor-col border-left">
            <span class="ipl-monitor-label">State-Space Mass</span>
            <span id="ipl-mass-value" class="ipl-monitor-value value-indigo">
              A: 65% • B: 25% • C: 10%
            </span>
          </div>
        </div>

        
        <div class="ipl-explanation-banner">
          <h3 id="ipl-step-title" class="ipl-step-title">Reversible CTMC & Causal State Space</h3>
          <p id="ipl-step-explanation" class="ipl-step-explanation">We formulate our system on a finite state graph with generator Q. Reversibility (detailed balance with respect to stationary measure π) guarantees our chain lacks circulating currents, enabling a clean potential landscape.</p>
        </div>

      </div>

      
      <div class="ipl-control-panel">
        
        
        <div class="ipl-scrubber-row">
          <span class="ipl-scrubber-limit-label">1. BASE STOCHASTICS</span>
          <div class="ipl-scrubber-bar" id="ipl-scrubber-bar">
            
          </div>
          <span class="ipl-scrubber-limit-label">7. CAUSAL LIMIT</span>
        </div>

        <div class="ipl-buttons-row">
          
          
          <div class="ipl-media-controls">
            <button id="btn-prev-step" class="ipl-btn-icon" title="Previous Slide" disabled>
              <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="19" y1="12" x2="5" y2="12"></line><polyline points="12 19 5 12 12 5"></polyline></svg>
            </button>

            <button id="btn-autoplay-toggle" class="ipl-btn-text" title="Auto Play">
              
              <svg id="autoplay-play-icon" class="ipl-media-icon" viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="currentColor" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"></polygon></svg>
              
              <svg id="autoplay-pause-icon" class="ipl-media-icon ipl-hidden" viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="currentColor" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="4" width="4" height="16"></rect><rect x="14" y="4" width="4" height="16"></rect></svg>
              <span id="autoplay-btn-label">Auto-Play</span>
            </button>

            <button id="btn-next-step" class="ipl-btn-icon" title="Next Slide">
              <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg>
            </button>

            <button id="btn-reset-timeline" class="ipl-btn-icon" title="Reset Simulator Settings">
              <svg viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path></svg>
            </button>
          </div>

          
          <div id="ipl-speed-control" class="ipl-speed-control ipl-hidden">
            <span>AUTOPLAY LAPSE:</span>
            <input
              id="autoplay-speed-slider"
              type="range"
              min="2000"
              max="8000"
              step="500"
              value="3500"
              class="ipl-range-slider-mini"
            />
            <span id="ipl-speed-value">3.5s</span>
          </div>

          
          <div class="ipl-scene-jump">
            <span>STAGE:</span>
            <select id="scene-selection-dropdown" class="ipl-dropdown">
              
            </select>
          </div>

        </div>

      </div>

    </div>

    
    <div class="ipl-right-panel">
      
      
      <div id="theory-knowledge-card" class="ipl-card">
        <h3 class="ipl-card-title">
          <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"></path><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"></path></svg>
          Dynamic Knowledge Base
        </h3>
        
        
        <div class="ipl-tab-row" id="ipl-concept-tabs">
          
        </div>

        
        <div id="concept-details-container" class="ipl-concept-box">
          <div id="concept-details-content">
            
          </div>
        </div>
      </div>

      
      <div id="equation-display-container" class="ipl-card ipl-eq-card">
        <div class="ipl-card-badge">Algebraic Proof Face</div>
        <h4 class="ipl-card-sub-title">Active Mathematical Statement</h4>
        
        <div id="math-display" class="ipl-math-display">
          
        </div>

        <p class="ipl-help-text">
          <svg viewBox="0 0 24 24" width="10" height="10" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
          Anchor nodes: click any <span class="ipl-underline-dashed">underlined algebraic sequence</span> above to toggle detailed tutoring.
        </p>
      </div>

      
      <div id="log-mean-calculator-widget" class="ipl-card">
        <h4 class="ipl-card-title-small">
          <svg viewBox="0 0 24 24" width="15" height="15" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
          Erbar-Maas Edge Mobility Calculator
        </h4>
        <p class="ipl-widget-desc">
          Continuous entropy trajectories evaluate edge weights using the Logarithmic Mean Λ(p_i, p_j). Compute live values between hypothetical state density distributions:
        </p>
        
        <div class="ipl-calc-row">
          <div class="ipl-calc-col">
            <span class="ipl-calc-label">DENSITY P_A:</span>
            <div class="ipl-calc-slider-wrapper">
              <span class="ipl-calc-bound">0.05</span>
              <input 
                id="calc-slider-a"
                type="range"
                min="0.05"
                max="0.95"
                step="0.05"
                value="0.65"
                disabled
                class="ipl-range-slider-mini"
              />
              <span class="ipl-calc-bound">0.95</span>
            </div>
            <div class="ipl-calc-display-box" id="calc-display-a">
              p_A = 0.650
            </div>
          </div>

          <div class="ipl-calc-divider">↔</div>

          <div class="ipl-calc-col">
            <span class="ipl-calc-label">DENSITY P_B:</span>
            <div class="ipl-calc-slider-wrapper">
              <span class="ipl-calc-bound">0.05</span>
              <input 
                id="calc-slider-b"
                type="range"
                min="0.05"
                max="0.95"
                step="0.05"
                value="0.25"
                disabled
                class="ipl-range-slider-mini"
              />
              <span class="ipl-calc-bound">0.95</span>
            </div>
            <div class="ipl-calc-display-box" id="calc-display-b">
              p_B = 0.250
            </div>
          </div>
        </div>

        <div class="ipl-calc-result-box">
          <span class="ipl-calc-result-label">Λ(p_A, p_B) = </span>
          <span id="ipl-calc-result-value" class="ipl-calc-result-value">0.417237</span>
        </div>
      </div>

    </div>

  </div>

  
  <div id="tutor-discussion-drawer" class="ipl-drawer ipl-hidden">
    
    <div class="ipl-drawer-left">
      <div class="ipl-drawer-meta-section">
        <span class="ipl-drawer-eyebrow">Active Mathematical Factor</span>
        <h3 id="ipl-drawer-factor-label" class="ipl-drawer-factor-title">Detailed Balance Equation</h3>
        <div class="ipl-drawer-bar"></div>
        <p class="ipl-drawer-role-row">
          ALGEBRAIC ROLE: <span id="ipl-drawer-factor-role" class="value-orange-dark">Symmetric Energy Landscape</span>
        </p>
        <p id="ipl-drawer-factor-details" class="ipl-drawer-details">
          Ensures that microscopic transitions are balanced in equilibrium. In physics, this equates to time-reversal symmetry.
        </p>
      </div>

      
      <button id="btn-close-highlight" class="ipl-btn-primary uppercase-tracking">
        Clear Highlight
      </button>
    </div>

    
    <div class="ipl-drawer-right">
      <div class="ipl-drawer-right-header">
        <h4 class="ipl-drawer-chat-title">
          <svg viewBox="0 0 24 24" width="16" height="16" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>
          Algebraic Tutor & Q&A Discussion
        </h4>
        <span class="ipl-drawer-chat-badge">VIRTUAL COACH</span>
      </div>

      
      <div id="comment-chat-history" class="ipl-chat-history">
        
      </div>

      
      <div id="faq-shortcuts-area" class="ipl-faq-section">
        <span class="ipl-faq-header">Direct Explanatory Inquiries:</span>
        <div id="ipl-faq-list" class="ipl-faq-list">
          
        </div>
      </div>

      
      <form id="ipl-chat-form" class="ipl-chat-form">
        <input
          id="custom-math-query-input"
          type="text"
          placeholder="Ask a custom question regarding this theorem structure..."
          class="ipl-chat-input"
          autocomplete="off"
        />
        <button id="btn-submit-tutor" type="submit" class="ipl-btn-primary uppercase-tracking flex-center gap-1">
          <svg viewBox="0 0 24 24" width="12" height="12" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg>
          Send
        </button>
      </form>
    </div>
  </div>

  
  <div id="standby-notice-container" class="ipl-standby-notice">
    <div class="ipl-standby-left">
      <div class="ipl-standby-icon-box">
        <svg viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="ipl-pulse-fast"><path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"></path><line x1="9" y1="18" x2="15" y2="18"></line><line x1="10" y1="22" x2="14" y2="22"></line></svg>
      </div>
      <div>
        <h4 class="ipl-standby-title">Click Algebraic Statements to Discuss</h4>
        <p class="ipl-standby-desc">
          We have embedded active highlighted anchors inside the math formulations. Click any underlined statement in the active math block to open the interactive discussion tutor.
        </p>
      </div>
    </div>
    <button id="btn-discover-anchor" class="ipl-btn-primary uppercase-tracking flex-center gap-1">
      <svg viewBox="0 0 24 24" width="14" height="14" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon></svg>
      Quick Demo Highlight
    </button>
  </div>

</div>
<script defer src="/js/interactive-proof.min.be39078ef25af25606a8dbb6bbf27bbee509fe8e86d683f7e51ee9bb32105e92.js" integrity="sha256-vjkHjvJa8lYGqNu2u/J7vuUJ/o6G1oP35R7puzIQXpI="></script>

<hr>
<h2 id="the-mathematical-framework">The Mathematical Framework</h2>
<p>To understand the core details of this singular limit, we can outline the mathematical structures that govern the simulation above:</p>
<h3 id="1-continuous-time-markov-chains-ctmcs">1. Continuous-Time Markov Chains (CTMCs)</h3>
<p>Let our system be defined on a finite state graph with three states $\mathcal{S} = {A, B, C}$. The state distribution $p(t) = [p_A(t), p_B(t), p_C(t)]$ evolves according to the Kolmogorov forward equation:</p>
<p>$$\dot{p}(t) = p(t) Q$$</p>
<p>where $Q$ is the infinitesimal generator matrix satisfying:</p>
<ul>
<li>$Q_{ij} \geq 0$ for all $i \neq j$ (positive transition intensities).</li>
<li>$\sum_{j} Q_{ij} = 0$ (probability conservation).</li>
</ul>
<h3 id="2-detailed-balance-and-gradient-flow">2. Detailed Balance and Gradient Flow</h3>
<p>We assume the unperturbed chain is reversible with respect to a stationary distribution $\pi$, satisfying the detailed balance condition:</p>
<p>$$\pi_i Q_{ij} = \pi_j Q_{ji}$$</p>
<p>Under this symmetry, the linear Markovian evolution can be rewritten as the steepest descent (gradient flow) of the relative entropy:</p>
<p>$$\mathcal{H}(p \mid \pi) = \sum_{i \in \mathcal{S}} p_i \log \frac{p_i}{\pi_i}$$</p>
<p>under the discrete Riemannian metric introduced by Erbar and Maas. The metric tensor equips the probability simplex with a discrete Wasserstein geometry, where the mobility along edge $(i, j)$ is weighted by the <strong>logarithmic mean</strong> of their densities:</p>
<p>$$\Lambda(p_i, p_j) = \frac{p_i - p_j}{\log p_i - \log p_j}$$</p>
<h3 id="3-pearls-graph-surgery-vs-singular-perturbation">3. Pearl&rsquo;s Graph Surgery vs. Singular Perturbation</h3>
<p>A hard intervention forcing the system into state $C$ corresponds to severing incoming rates into $C$:</p>
<p>$$Q_{do} = \begin{pmatrix}</p>
<ul>
<li>(Q_{AB} + 0) &amp; Q_{AB} &amp; 0 \
Q_{BA} &amp; - (Q_{BA} + 0) &amp; 0 \
Q_{CA} &amp; Q_{CB} &amp; - (Q_{CA} + Q_{CB})
\end{pmatrix}$$</li>
</ul>
<p>Alternatively, we model this physically by adding a restorative term $\lambda R$ that forces mass into $C$ with rate parameter $\lambda$:</p>
<p>$$Q_\lambda = Q_{do} + \lambda R_C$$</p>
<p>As $\lambda \to \infty$, the system exhibits two distinct timescales:</p>
<ol>
<li><strong>Fast transient phase ($O(1/\lambda)$):</strong> Any arbitrary initial probability mass collapses onto the intervention face (State $C$) via a projection operator $\Pi_C$.</li>
<li><strong>Slow evolutionary phase:</strong> The remaining probability mass evolves under the projected slow dynamics $\Pi_C Q_{do} \Pi_C$ constrained to the target subspace.</li>
</ol>
<p>The equivalence is established via:</p>
<p>$$\lim_{\lambda \to \infty} e^{t Q_\lambda} = \Pi_C e^{t \Pi_C Q_{do} \Pi_C}$$</p>
<p>proving that causal graph surgery is the exact singular limit of physical restoration.</p>
]]></content:encoded></item><item><title>From Boolean Verdicts to Quantitative Witnesses: Why DAG Topology Needs a Trail Semantics</title><link>https://ostensible-paradox.pages.dev/en/posts/from-boolean-verdicts-to-quantitative-witnesses/</link><pubDate>Tue, 19 May 2026 03:30:00 +0800</pubDate><guid>https://ostensible-paradox.pages.dev/en/posts/from-boolean-verdicts-to-quantitative-witnesses/</guid><description>&lt;p>Since Pearl (2009), causal inference on DAGs has crystallized around a powerful but austere toolkit: boolean d-separation and do-calculus. Does evidence flow? Full stop. Does it flow after an intervention? Full stop. This framework is sufficient for causal &lt;em>identification&lt;/em>—determining whether an effect is estimable from observed data. But it is curiously silent on a question that seems equally natural: &lt;strong>how much&lt;/strong> flows, &lt;strong>through which channels&lt;/strong>, and with &lt;strong>what residual structure&lt;/strong>?&lt;/p></description><content:encoded><![CDATA[<p>Since Pearl (2009), causal inference on DAGs has crystallized around a powerful but austere toolkit: boolean d-separation and do-calculus. Does evidence flow? Full stop. Does it flow after an intervention? Full stop. This framework is sufficient for causal <em>identification</em>—determining whether an effect is estimable from observed data. But it is curiously silent on a question that seems equally natural: <strong>how much</strong> flows, <strong>through which channels</strong>, and with <strong>what residual structure</strong>?</p>
<p>I want to argue that this silence is not a minor gap; it is a symptom of two communities talking past each other. And the bridge between them is a rigorous notion of <em>trail as witness</em>.</p>
<hr>
<h2 id="the-boolean-trap">The Boolean Trap</h2>
<p>Traditional DAG analysis gives you a verdict at the endpoints. $X$ is d-separated from $Y$ given $Z$: True or False. The intervened distribution $P(y \mid do(x))$ is identifiable: Yes or No. This is the &ldquo;full stop&rdquo; regime.</p>
<p>But a boolean verdict discards the path. It tells you that water reaches the tap, but not whether it travelled through lead pipes, detoured through a cistern, or was siphoned off midway. To know the <em>texture</em> of a causal chain—to distinguish a default association from a derived conclusion, or to know whether an observed correlation persists because of the presence of one variable or the absence of another—you need to traverse the trail in slow motion, node by node, junction by junction.</p>
<p>Trail traversal gives the texture of causal chains; endpoint booleans do not.</p>
<hr>
<h2 id="two-communities-one-missing-link">Two Communities, One Missing Link</h2>
<p>Remarkably, two intellectual neighborhoods have been circling this problem from opposite ends without quite meeting in the middle:</p>
<p><strong>The Causal Inference community (Pearl et al.)</strong> is structurally obsessed. It abstracts the world into absolute black-and-white: if d-separation holds, the answer is True; otherwise, False. They are plumbers who care only whether the pipe is open, not what contaminant rides the flow. After 2009, the field&rsquo;s theoretical engine on this particular front seems to have stalled—perhaps because every remaining graph-theoretic challenge starts to look like the Four Color Problem, solvable only by brute force unless a new representational insight appears.</p>
<p><strong>The Quantitative Information Flow (QIF) community (Alvim, Palamidessi, Smith et al.)</strong> is capacity-obsessed. They compute leakage in bits, bound it with Shannon capacity, and seek KKT certificates for optimality. But their channel models are often toy simplifications, stripped of topological depth. They measure the volume of water without being able to trace the pipe&rsquo;s winding route through the labyrinth.</p>
<p>Both communities study DAGs plus information flow. Yet:</p>
<ul>
<li>Causal inference has the topology but no quantitative bound.</li>
<li>QIF has the quantitative machinery but no trail-level topological witness.</li>
</ul>
<p>No one has connected them. Why? Because the causal side asks &ldquo;Is it identifiable?&rdquo; and the QIF side asks &ldquo;How many bits leak?&quot;—and neither side has a formalism that answers both at once while retaining the path as a first-class object.</p>
<hr>
<h2 id="lemma-1-the-collider-ancestor-leak--rerouting">Lemma 1: The Collider Ancestor Leak &amp; Rerouting</h2>
<p>Consider a collider $u \rightarrow w \leftarrow v$. Textbook d-separation says evidence can pass through $w$ only when $w$ or a descendant is observed. But this description conflates two distinct phenomena.</p>
<p>Suppose we are testing whether $X$ and $Y$ are d-separated given $Z$. If a descendant of $w$ leads <em>only</em> to $X$ or $Y$ and <strong>not</strong> to $Z$, then the collider is not &ldquo;activated by $Z$&rdquo; in any global sense. It is activated because it creates a connected route from a source to a destination. The conditioning set is, locally, a red herring.</p>
<h3 id="path-normalization--rerouting">Path Normalization / Rerouting</h3>
<p><strong>Claim:</strong> If a descendant of $w$ leads to $X$, the original long path was never necessary; the descendant path itself provides a shorter route.</p>
<p><em>Proof sketch.</em> Take any active trail passing through collider $w$ and reaching $X$ via descendant $d$. Replace the subpath from $w$ to $X$ with $w \leadsto d \leadsto X$. By minimality of active trails (or induction on cutset size), the rerouted path is no longer than the original and preserves endpoint connectivity. The original trail was therefore non-minimal, containing a redundant detour shortcuttable through the collider&rsquo;s own descendant. ∎</p>
<p>The upshot: collider &ldquo;activation&rdquo; is often just topological connectivity leaking outward, not a special global event mediated by the conditioning set.</p>
<hr>
<h2 id="lemma-2-the-junction-obligation-problem">Lemma 2: The Junction Obligation Problem</h2>
<p>If we accept that trails matter, we need a local criterion for their validity that does not require re-scanning the entire graph at every step.</p>
<h3 id="decompiling-the-trail">Decompiling the Trail</h3>
<p>Decompose an active trail into a stateful path type—call it <code>ActiveRoute</code> or <code>BayesBallPathT</code>. Each traversal step carries a direction tag:</p>
<ul>
<li><strong><code>outOf</code></strong>: leaving via an outgoing edge.</li>
<li><strong><code>into</code></strong>: entering via an incoming edge.</li>
</ul>
<p>These tags are not bookkeeping; they encode the <em>obligation</em> imposed by the junction just traversed.</p>
<h3 id="global-topology--local-type-constraints">Global Topology → Local Type Constraints</h3>
<p>In the global formulation, a junction $(A, B, C)$ is valid only after inspecting the whole graph and the conditioning set. Under the state-machine view:</p>
<ol>
<li><strong>Obligations are pushed to interfaces.</strong> The direction label at a boundary encodes what junction type is expected on the other side.</li>
<li><strong>Composition is type checking.</strong> Concatenating two path segments requires only that the output state of the first matches the input obligation of the second. No global inspection needed.</li>
<li><strong>Local consistency implies global consistency.</strong> If every adjacent pair of segments satisfies their shared interface obligation, the entire trail is valid by construction.</li>
</ol>
<p>The global topological constraint of d-separation becomes a <strong>local type-system constraint</strong> on path segments. The type of a segment is its pair of boundary states; composition is well-typed iff obligations align.</p>
<hr>
<h2 id="what-is-still-missing">What Is Still Missing</h2>
<p>Lemmas 1 and 2 give us a cleaner, more local way to reason about <em>whether</em> a trail is active. But they do not yet answer the quantitative question:</p>
<blockquote>
<p>Not &ldquo;does information flow?&rdquo; but &ldquo;how many bits flow through this specific trail?&rdquo;</p></blockquote>
<p>That question requires machinery that currently lives only in QIF:</p>
<ul>
<li><strong>Channel capacity</strong> between observables and secrets along a specific topological route.</li>
<li><strong>KKT conditions</strong> to certify that a given leakage bound is optimal under the graph&rsquo;s structural constraints.</li>
<li><strong>Shannon bounds</strong> that respect the DAG&rsquo;s conditional-independence structure rather than assuming a flat channel matrix.</li>
</ul>
<p>What does not yet exist—and what I am groping toward—is a framework where:</p>
<ol>
<li>The DAG provides the topological syntax.</li>
<li>The trail provides the witness (the specific path whose capacity we measure).</li>
<li>KKT + channel capacity provide the quantitative certificate.</li>
<li>A proof assistant (Lean4, Coq) checks both the topological type constraints (Lemma 2) and the information-theoretic bounds.</li>
</ol>
<hr>
<h2 id="takeaway">Takeaway</h2>
<p>Pearl&rsquo;s boolean tools are not wrong; they are <em>insufficient</em> for anyone who wants to know the texture of a causal chain. QIF&rsquo;s quantitative tools are not wrong; they are <em>topologically blind</em>. The missing piece is a <strong>trail semantics</strong> that makes the path a first-class object—so that we can ask not only whether an intervention opens a channel, but how wide that channel is, what contaminants it carries, and whether the leakage is bounded.</p>
<p>We need to move from &ldquo;full stop&rdquo; to &ldquo;slow-motion replay.&rdquo; The trail is the witness.</p>
]]></content:encoded></item></channel></rss>