Skip to content

[Phase 7] Analysis & Correlations #9

@Sakeeb91

Description

@Sakeeb91

Objective

Implement statistical analysis comparing neural sampler vs MCMC baseline.

Deliverables

  • Pair correlation function C(r) computation
  • Magnetization distribution P(M) histogram
  • Autocorrelation time comparison
  • CorrelationPlot React component
  • /analysis/compare endpoint

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    frontendFrontend/UI workmlMachine learning workphaseImplementation phase

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions