From 35f83beb7a50ca8c762ad97e10e8051dea7de04f Mon Sep 17 00:00:00 2001 From: genecatrambone Date: Thu, 21 Aug 2025 14:03:59 -1000 Subject: [PATCH] Add Wilson loop demo (perimeter/area plots) --- figs/wilson_area_vs_logW.png | Bin 0 -> 13479 bytes figs/wilson_perimeter_vs_logW.png | Bin 0 -> 14160 bytes src/wilson_loops.py | 143 ++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) create mode 100644 figs/wilson_area_vs_logW.png create mode 100644 figs/wilson_perimeter_vs_logW.png create mode 100644 src/wilson_loops.py diff --git a/figs/wilson_area_vs_logW.png b/figs/wilson_area_vs_logW.png new file mode 100644 index 0000000000000000000000000000000000000000..f6a326ccc71decdef30101c74c73febeed587f7f GIT binary patch literal 13479 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 literal 0 HcmV?d00001 diff --git a/figs/wilson_perimeter_vs_logW.png b/figs/wilson_perimeter_vs_logW.png new file mode 100644 index 0000000000000000000000000000000000000000..8f30e3e0be65d6ce9db1ad5d0ab55aa3fc50a0e9 GIT binary patch literal 14160 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 None: + os.makedirs(path, exist_ok=True) + +def parse_rects(rects_str: str): + rects = [] + for item in rects_str.split(","): + item = item.strip() + if "x" not in item: + continue + a, b = item.lower().split("x") + rects.append((int(a), int(b))) + return rects + +# --- Random ±1 link configurations with controllable mean m = tanh(beta) --- +def sample_config(L: int, beta: float, rng: np.random.Generator): + """ + Returns three arrays (ux, uy, uz) of shape (L,L,L) with entries ±1, interpreted as + link variables on edges in +x, +y, +z directions. We bias toward +1 with mean m=tanh(beta). + """ + m = np.tanh(beta) + p = (1.0 + m) / 2.0 # prob(+1) + ux = np.where(rng.random((L, L, L)) < p, 1, -1) + uy = np.where(rng.random((L, L, L)) < p, 1, -1) + uz = np.where(rng.random((L, L, L)) < p, 1, -1) + return ux, uy, uz + +# --- Wilson loop product on the XY plane (periodic boundary) --- +def loop_product_xy(ux: np.ndarray, uy: np.ndarray, x0: int, y0: int, z: int, a: int, b: int) -> int: + """ + Oriented rectangular loop with sides a (x-direction) and b (y-direction) on the XY plane at height z. + Periodic boundary conditions. For Z2 variables (±1), reversing direction uses the same link value. + """ + L = ux.shape[0] + prod = 1 + x, y = x0, y0 + + # +x, a steps + for _ in range(a): + prod *= ux[x % L, y % L, z % L] + x += 1 + + # +y, b steps + for _ in range(b): + prod *= uy[x % L, y % L, z % L] + y += 1 + + # -x, a steps + for _ in range(a): + x -= 1 + prod *= ux[x % L, y % L, z % L] # inverse is itself for ±1 + + # -y, b steps + for _ in range(b): + y -= 1 + prod *= uy[x % L, y % L, z % L] + + return prod + +def wilson_loop_expectation(L: int, a: int, b: int, plane: str, beta: float, nsamples: int, rng: np.random.Generator) -> float: + """ + Estimates by averaging the loop product over random positions and fresh random + link configs. For biased ±1 links with mean m=tanh(beta), the signal exhibits a clear + perimeter scaling: -log ~ (const) * perimeter, when beta > 0. + """ + if plane != "xy": + raise NotImplementedError("This first demo implements plane='xy' only (we'll add yz/zx next).") + acc = 0.0 + for _ in range(nsamples): + ux, uy, uz = sample_config(L, beta, rng) + x0 = int(rng.integers(0, L)) + y0 = int(rng.integers(0, L)) + z = int(rng.integers(0, L)) + acc += loop_product_xy(ux, uy, x0, y0, z, a, b) + return acc / float(nsamples) + +def main(): + ap = argparse.ArgumentParser(description="Wilson loop perimeter/area demo (Z2-biased links).") + ap.add_argument("--L", type=int, default=12, help="lattice size per dimension") + ap.add_argument("--plane", type=str, default="xy", choices=["xy"], help="loop plane (xy only in this demo)") + ap.add_argument("--rects", type=str, default="1x1,1x2,2x2,3x2,3x3", help="comma-separated rectangle sizes axb") + ap.add_argument("--beta", type=float, default=0.35, help="bias parameter (mean m = tanh(beta))") + ap.add_argument("--nsamples", type=int, default=800, help="number of loop samples") + ap.add_argument("--plot", action="store_true", help="save perimeter/area plots under figs/") + ap.add_argument("--seed", type=int, default=1234, help="random seed") + args = ap.parse_args() + + rng = np.random.default_rng(args.seed) + rects = parse_rects(args.rects) + + perims, areas, neglogWs = [], [], [] + for (a, b) in rects: + W = wilson_loop_expectation(args.L, a, b, args.plane, args.beta, args.nsamples, rng) + # numerical guard + W_clip = max(min(W, 1.0 - 1e-12), 1e-12) + perim = 2 * (a + b) + area = a * b + nlw = -math.log(W_clip) + perims.append(perim); areas.append(area); neglogWs.append(nlw) + print(f"rect {a}x{b: <2} | perimeter={perim:2d} | area={area:2d} | ≈ {W: .4f} | -log≈ {nlw: .4f}") + + if args.plot: + try: + import matplotlib.pyplot as plt # noqa + ensure_dir("figs") + # Perimeter plot + plt.figure() + plt.scatter(perims, neglogWs) + plt.xlabel("Perimeter (2[a+b])") + plt.ylabel("-log ⟨W(C)⟩") + plt.title("Wilson loop: -log⟨W⟩ vs Perimeter") + out1 = "figs/wilson_perimeter_vs_logW.png" + plt.savefig(out1, bbox_inches="tight") + print(f"Saved plot to {out1}") + + # Area plot + plt.figure() + plt.scatter(areas, neglogWs) + plt.xlabel("Area (a×b)") + plt.ylabel("-log ⟨W(C)⟩") + plt.title("Wilson loop: -log⟨W⟩ vs Area") + out2 = "figs/wilson_area_vs_logW.png" + plt.savefig(out2, bbox_inches="tight") + print(f"Saved plot to {out2}") + except Exception as e: + print(f"Plotting skipped: {e}") + +if __name__ == "__main__": + main()