ARC-AGI / pemf /scripts /fix_and_inspect_logs.py
Roger MT
move fles into pemf folder
feb08d1
import glob, json, numpy as np, os
from pprint import pprint
def load_latest(pattern):
files = sorted(glob.glob(pattern))
return files[-1] if files else None
logs_path = load_latest("experiments/*_logs.json")
phi_path = load_latest("experiments/*_phi_best.npy")
res_path = load_latest("experiments/*_result.json")
print("logs:", logs_path)
print("phi_best:", phi_path)
print("result:", res_path)
if not logs_path:
raise SystemExit("No logs file found")
logs = json.load(open(logs_path))
res = json.load(open(res_path)) if res_path else {}
# coerce gate values to booleans for all depth entries
def coerce_gates(g):
if not isinstance(g, dict):
return g
out = {}
for k,v in g.items():
if isinstance(v, str):
lv = v.strip().lower()
if lv in ("true","1","yes"):
out[k] = True
elif lv in ("false","0","no"):
out[k] = False
else:
try:
out[k] = bool(int(v))
except Exception:
out[k] = v
else:
out[k] = v
return out
for depth_idx, depth in enumerate(logs):
for entry in depth:
if 'gates' in entry:
entry['gates'] = coerce_gates(entry['gates'])
# attach phi_best into the first accepted entry (if not present)
accepted_entry = None
for entry in logs[0]:
if entry.get('accepted'):
accepted_entry = entry
break
phi = np.load(phi_path) if phi_path else None
if accepted_entry is not None:
if 'candidate_array' not in accepted_entry:
accepted_entry['candidate_array'] = phi.tolist() if phi is not None else None
# Corrected target from real ARC task 007bbfb7 (Kronecker self-similar)
TARGET_GRID = [
[0,0,0,0,7,7,0,7,7],
[0,0,0,7,7,7,7,7,7],
[0,0,0,0,7,7,0,7,7],
[0,7,7,0,7,7,0,7,7],
[7,7,7,7,7,7,7,7,7],
[0,7,7,0,7,7,0,7,7],
[0,0,0,0,7,7,0,7,7],
[0,0,0,7,7,7,7,7,7],
[0,0,0,0,7,7,0,7,7],
]
TARGET = np.array(TARGET_GRID, dtype=int)
def tile_transform(phi, out_shape):
a = np.array(phi)
h_out, w_out = out_shape
h_in, w_in = a.shape
reps_h = (h_out + h_in - 1) // h_in
reps_w = (w_out + w_in - 1) // w_in
tiled = np.tile(a, (reps_h, reps_w))
return tiled[:h_out, :w_out]
if accepted_entry is not None and accepted_entry.get('candidate_array') is not None:
cand = np.array(accepted_entry['candidate_array'], dtype=float)
if cand.shape != TARGET.shape:
cand_resized = tile_transform(cand, TARGET.shape)
else:
cand_resized = cand
cand_q = np.rint(cand_resized).astype(int)
l1 = float(np.sum(np.abs(cand_q - TARGET)))
print("Recomputed L1 residue for first accepted candidate:", l1)
print("Candidate unique values:", np.unique(cand_q))
diff = (cand_q != TARGET).astype(int)
print("Changed cells count:", int(diff.sum()))
print("Diff map (1=diff):")
print(diff)
else:
print("No candidate array available in logs or phi_best missing.")
# write fixed logs copy
fixed_path = logs_path.replace("_logs.json", "_logs.fixed.json")
with open(fixed_path, "w") as fh:
json.dump(logs, fh, indent=2)
print("Wrote fixed logs to", fixed_path)