Asi last-passage-percolation
Last Passage Percolation models: geometric LPP, exponential weights, Tracy-Widom limits, matrix product ansatz, and connections to TASEP and random matrices.
git clone https://github.com/plurigrid/asi
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/last-passage-percolation" ~/.claude/skills/plurigrid-asi-last-passage-percolation && rm -rf "$T"
skills/last-passage-percolation/SKILL.mdLast Passage Percolation Skill
Status: ✅ Production Ready Trit: 0 (ERGODIC - coordinator) Color: #20B2AA (Light Sea Green) Principle: Maximum weight paths as discrete KPZ Frame: Tracy-Widom fluctuations, geodesics, RSK correspondence
Overview
Last Passage Percolation (LPP) is the discrete progenitor of KPZ universality:
- Passage Times: Maximum weight over up-right paths
- Fluctuations: Tracy-Widom distributed
- Geodesics: Competition interfaces
- Exactly Solvable: Via determinantal point processes
The Model
Geometric/Exponential LPP
Grid: ℤ₊² with i.i.d. weights w(i,j) Path: π from (1,1) to (m,n), up-right steps only Weight: W(π) = Σ w(i,j) along π Passage time: G(m,n) = max_π W(π)
struct LPP weights::Matrix{Float64} distribution::Distribution # Exponential, Geometric, etc. end function passage_time(lpp::LPP, start, finish) m, n = finish # Dynamic programming G = zeros(m, n) G[1, 1] = lpp.weights[1, 1] for i in 2:m G[i, 1] = G[i-1, 1] + lpp.weights[i, 1] end for j in 2:n G[1, j] = G[1, j-1] + lpp.weights[1, j] end for i in 2:m, j in 2:n G[i, j] = max(G[i-1, j], G[i, j-1]) + lpp.weights[i, j] end return G[m, n] end
Tracy-Widom Limit
# Limiting distribution for diagonal direction function tracy_widom_limit(lpp, n) # For exponential weights: # G(n,n) ≈ 4n + 2^(4/3) n^(1/3) χ_GUE G = passage_time(lpp, (1,1), (n,n)) mean = 4 * n std = 2^(4/3) * n^(1/3) χ = (G - mean) / std return χ # Converges to Tracy-Widom GUE end
Weight Distributions
| Distribution | Mean | Parameters | Limit |
|---|---|---|---|
| Exponential(1) | 1 | rate = 1 | GUE |
| Geometric(p) | (1-p)/p | p ∈ (0,1) | GUE |
| Bernoulli(p) | p | p ∈ (0,1) | GOE (boundary) |
| Inverse-Gamma | α/(β-1) | α, β | Whittaker |
# Different weight types lpp_exp = LPP(rand(Exponential(1), n, n), Exponential(1)) lpp_geo = LPP(rand(Geometric(0.5), n, n), Geometric(0.5))
Geodesics and Competition Interfaces
Geodesic Computation
function geodesic(lpp::LPP, start, finish) # Backtrack from finish to start path = [finish] i, j = finish while (i, j) != start if i == 1 j -= 1 elseif j == 1 i -= 1 else # Choose direction that maintains optimality if G[i-1, j] > G[i, j-1] i -= 1 else j -= 1 end end pushfirst!(path, (i, j)) end return path end
Competition Interface
When two geodesics compete:
function competition_interface(lpp, source1, source2) # Interface where optimal paths from two sources meet interface = [] for point in lattice_points geo1 = passage_time(lpp, source1, point) geo2 = passage_time(lpp, source2, point) if abs(geo1 - geo2) < ε push!(interface, point) end end return interface # Converges to Airy₂ process end
Matrix Product Ansatz
For stationary LPP (boundary conditions matching bulk):
struct MatrixProductLPP D::Matrix # Creation operator E::Matrix # Annihilation operator W::Vector # Left boundary V::Vector # Right boundary end function stationary_weight(mpa::MatrixProductLPP, config) # Weight = ⟨W| ∏ᵢ Mᵢ |V⟩ # where Mᵢ = D if occupied, E if empty result = mpa.W' for c in config result = result * (c == 1 ? mpa.D : mpa.E) end result = result * mpa.V return result[1] end # DEHP algebra relations # DE - qED = D + E # ⟨W|E = ⟨W| # D|V⟩ = |V⟩
RSK Correspondence
Robinson-Schensted-Knuth connects LPP to Young tableaux:
# RSK: Matrix → (P, Q) pair of tableaux function rsk(weight_matrix) P, Q = empty_tableau(), empty_tableau() for (i, j, w) in entries(weight_matrix) for _ in 1:w row_insert!(P, j) record_insert!(Q, i) end end return P, Q end # Passage time = shape of P-tableau @test passage_time(lpp, (1,1), (n,n)) == shape(rsk(lpp.weights)[1])[1]
Connection to TASEP
LPP is equivalent to Totally Asymmetric Simple Exclusion Process:
# TASEP: particles hop right, cannot pass struct TASEP positions::Vector{Int} # Particle positions L::Int # System size end # LPP passage time = TASEP current @test passage_time(lpp) == integrated_current(tasep) # Geodesic = second class particle trajectory
Two-Layer Gibbs Structure
Like KPZ stationary measures, LPP has two-layer structure:
# Layer 1: Uncolored non-crossing paths uncolored = sample_non_crossing_paths(n) # Layer 2: Color assignment via Pitman colored = pitman_transform(uncolored) # Joint measure μ(colored) = μ_uncolored(paths) × P(coloring | paths)
Pitman Transform
function pitman_transform(paths) # Sort paths by endpoint # Apply successive Pitman operators result = paths for i in 1:length(paths)-1 result[i], result[i+1] = pitman_2(result[i], result[i+1]) end return result end function pitman_2(path1, path2) # Pitman's 2M-X theorem for Brownian motion # Discrete version for random walks return (path1 ∨ path2, path1 ∧ path2) # max/min operations end
Integration with KPZ Universality
LPP is the discrete model; KPZ is the scaling limit:
using KPZUniversality, LPP # LPP → Directed Landscape function lpp_to_landscape(lpp, ε) # Rescale by 1:2:3 exponents L(x, s, y, t) = ε^(1/2) * passage_time(lpp, round(Int, ε^(-1) * x), round(Int, ε^(-3/2) * s), round(Int, ε^(-1) * y), round(Int, ε^(-3/2) * t) ) return L end # In limit ε → 0, converges to directed landscape
GF(3) Triad Assignment
| Trit | Skill | Role |
|---|---|---|
| -1 | yang-baxter-integrability | Structure |
| 0 | last-passage-percolation | Discrete model |
| +1 | louisville-quantum-gravity | Measures |
Conservation: (-1) + (0) + (+1) = 0 ✓
Commands
# Simulate LPP just lpp-simulate n=100 weights=exponential # Compute passage time just lpp-passage start=1,1 end=100,100 # Find geodesic just lpp-geodesic # Check Tracy-Widom just lpp-verify-tw # Matrix product ansatz just lpp-mpa q=0.5
Configuration
# last-passage-percolation.yaml model: grid_size: 100 weight_distribution: exponential # or geometric, bernoulli analysis: compute_geodesics: true tracy_widom_test: true competition_interface: false matrix_product: q: 0.5 boundary: stationary
Related Skills
- kpz-universality (0): Scaling limit
- yang-baxter-integrability (-1): Algebraic structure
- louisville-quantum-gravity (+1): Stationary measures
- colored-vertex-model (+1): Colored particles
- gay-mcp (+1): Deterministic paths
Research References
- Johansson (2000): "Shape fluctuations and random matrices"
- Baik-Deift-Johansson (1999): "On the distribution of the length of the longest increasing subsequence"
- Ferrari-Spohn (2005): "Scaling limit for the space-time covariance of the stationary TASEP"
- Corwin (2012): "The Kardar-Parisi-Zhang equation and universality class"
Skill Name: last-passage-percolation Type: Discrete KPZ Model Trit: 0 (ERGODIC) Key Property: Tracy-Widom fluctuations, geodesic competition Status: ✅ Production Ready
Cat# Integration
Trit: 0 (ERGODIC) Home: DiscreteProb Poly Op: ⊗ Kan Role: Adj Color: #20B2AA
Passage Time as Profunctor
G: ℤ₊² ↛ ℝ G(start, end) = max path weight
Satisfies semi-group property:
G(a, c) = max_b [G(a, b) + G(b, c)]
GF(3) Naturality
(-1) + (0) + (+1) ≡ 0 (mod 3)
Autopoietic Marginalia
Paths compete. Weights accumulate. The maximum emerges.
Every use of this skill is an opportunity for worlding:
- MEMORY (-1): Record geodesic patterns
- REMEMBERING (0): Connect to TASEP dynamics
- WORLDING (+1): Discover new limit shapes
Add Interaction Exemplars here as the skill is used.