Objective
Implement statistical analysis comparing neural sampler vs MCMC baseline.
Deliverables
Files to Create
| File |
Description |
backend/ml/analysis/correlation.py |
Statistical analysis |
backend/api/routes/analysis.py |
Analysis endpoints |
frontend/src/components/CorrelationPlot.tsx |
Comparison plots |
frontend/src/components/MagnetizationHistogram.tsx |
M distribution |
Core Implementation
# backend/ml/analysis/correlation.py
import torch
import numpy as np
def pair_correlation(samples: torch.Tensor) -> dict:
"""Compute C(r) = <s_0 s_r> for Ising samples."""
n_samples, size, _ = samples.shape
max_r = size // 2
corr = np.zeros(max_r)
counts = np.zeros(max_r)
for s in samples.numpy():
for i in range(size):
for j in range(size):
for di in range(-max_r, max_r + 1):
for dj in range(-max_r, max_r + 1):
r = int(np.sqrt(di**2 + dj**2))
if 0 < r < max_r:
corr[r] += s[i, j] * s[(i+di) % size, (j+dj) % size]
counts[r] += 1
corr /= np.maximum(counts, 1)
return {"r": list(range(max_r)), "C_r": corr.tolist()}
def magnetization_distribution(samples: torch.Tensor) -> dict:
"""Compute P(M) histogram."""
mags = samples.mean(dim=(-1, -2)).numpy()
hist, edges = np.histogram(mags, bins=50, density=True)
centers = (edges[:-1] + edges[1:]) / 2
return {"M": centers.tolist(), "P_M": hist.tolist()}
def autocorrelation_time(samples: torch.Tensor) -> float:
"""Estimate τ_int for magnetization."""
m = samples.mean(dim=(-1, -2)).numpy()
mean, var = m.mean(), m.var()
if var < 1e-10:
return 1.0
n = len(m)
ac = np.correlate(m - mean, m - mean, mode='full')[n-1:]
ac /= var * np.arange(n, 0, -1)
tau = 0.5
for i in range(1, n):
if ac[i] < 0:
break
tau += ac[i]
return tau
// frontend/src/components/CorrelationPlot.tsx
export const CorrelationPlot: React.FC<{
mcmcData: { r: number[]; C_r: number[] };
diffusionData: { r: number[]; C_r: number[] };
}> = ({ mcmcData, diffusionData }) => (
<Plot
data={[
{ x: mcmcData.r, y: mcmcData.C_r, name: 'MCMC', mode: 'lines+markers' },
{ x: diffusionData.r, y: diffusionData.C_r, name: 'Diffusion', mode: 'lines+markers' },
]}
layout={{
title: 'Spin-Spin Correlation C(r)',
xaxis: { title: 'Distance r' },
yaxis: { title: 'C(r)' },
}}
/>
);
Verification
- C(r) decays exponentially above T_c
- C(r) → const below T_c (long-range order)
- P(M) bimodal below T_c, unimodal above
- Neural τ << MCMC τ (faster sampling)
Definition of Done
- Correlation functions match within 2σ
- Analysis endpoint returns in < 10s for 1000 samples
- Plots interactive with hover tooltips
Dependencies
- Phase 4: Diffusion Sampling (need samples)
- Phase 5: Frontend Core
Related
Meta issue: #1
Objective
Implement statistical analysis comparing neural sampler vs MCMC baseline.
Deliverables
C(r)computationP(M)histogramCorrelationPlotReact component/analysis/compareendpointFiles to Create
backend/ml/analysis/correlation.pybackend/api/routes/analysis.pyfrontend/src/components/CorrelationPlot.tsxfrontend/src/components/MagnetizationHistogram.tsxCore Implementation
Verification
Definition of Done
Dependencies
Related
Meta issue: #1