"""Build data/timings.csv and data/paths.xyz.gz from time_geodesic.py output. python reproduce/build_tables.py OUTDIR # OUTDIR holds times_{before,after}{1,2,3}.csv, paths_*.xyz.gz Each path's sha256 is over its text block in paths_*.xyz.gz (all images, repr floats), so equal hashes mean bit-identical coordinates. """ import csv, gzip, hashlib, io, shutil, sys from pathlib import Path HERE = Path(__file__).resolve().parent.parent def path_hashes(fn): blocks = {} lines = gzip.open(fn, "rt").read().splitlines() i = 0 while i < len(lines): n = int(lines[i]); head = lines[i + 1].split() key = (head[0], head[1].split("=")[1]) blocks.setdefault(key, []).extend(lines[i:i + 2 + n]) i += 2 + n return {k: hashlib.sha256("\n".join(v).encode()).hexdigest() for k, v in blocks.items()} def main(): src = Path(sys.argv[1]) rows = [] for version in ("before", "after"): for rnd in (1, 2, 3): h = path_hashes(src / f"paths_{version}{rnd}.xyz.gz") for r in csv.DictReader(open(src / f"times_{version}{rnd}.csv")): rows.append({"idx": r["idx"], "nimages": r["nimages"], "version": version, "round": rnd, "seconds": f"{float(r['seconds']):.4f}", "path_sha256": h[(r["idx"], r["nimages"])]}) (HERE / "data").mkdir(exist_ok=True) with open(HERE / "data" / "timings.csv", "w", encoding="utf-8", newline="") as out: w = csv.DictWriter(out, fieldnames=list(rows[0])); w.writeheader(); w.writerows(rows) with gzip.open(src / "paths_after1.xyz.gz", "rt") as fi, \ io.TextIOWrapper(gzip.GzipFile(HERE / "data" / "paths.xyz.gz", "wb", compresslevel=9, mtime=0), encoding="utf-8") as fo: shutil.copyfileobj(fi, fo) print(len(rows), "timing rows") if __name__ == "__main__": main()