
j=nidx[nb]
if i<j: eidx[(i,j)]=len(edges); edges.append((i,j))
octs=[]
for x in range(L):
for y in range(L):
for z in range(L):
if (x+y+z)%2==1:
nbs=[]
for d in [(1,0,0),(-1,0,0),(0,1,0),
(0,-1,0),(0,0,1),(0,0,-1)]:
nb=((x+d[0])%L,(y+d[1])%L,(z+d[2])%L)
if nb in nidx: nbs.append(nidx[nb])
if len(nbs)==6: octs.append(nbs)
ne,nn2,no=len(edges),len(nodes),len(octs)
HZ=lil_matrix((nn2,ne),dtype=np.int8)
for ei,(i,j) in enumerate(edges): HZ[i,ei]=1; HZ[j,ei]=1
HX=lil_matrix((no,ne),dtype=np.int8)
for oi,nbs in enumerate(octs):
s=set(nbs)
for ei,(i,j) in enumerate(edges):
if i in s and j in s: HX[oi,ei]=1
return csr_matrix(HZ),csr_matrix(HX),ne,nn2,no,edges,nodes
def gf2rank(M):
M=M.copy().astype(int); r,c=M.shape; rank=0
for col in range(c):
piv=None
for row in range(rank,r):
if M[row,col]==1: piv=row; break
if piv is None: continue
M[[rank,piv]]=M[[piv,rank]]
for row in range(r):
if row!=rank and M[row,col]==1: M[row]=(M[row]+M[rank])%2
rank+=1
return rank
L=4
HZ,HX,ne,nn,no,edges,nodes=build(L)
css=(HX.dot(HZ.T).toarray()%2).sum()==0
rZ,rX=gf2rank(HZ.toarray()),gf2rank(HX.toarray())
k=ne-rZ-rX
zw=np.array(HZ.sum(1)).flatten()
xw=np.array(HX.sum(1)).flatten()
print(f"CSS valid: {css}")
print(f"n={ne}, rk(HZ)={rZ}, rk(HX)={rX}, k={k}")
print(f"Code: [[{ne}, {k}, 3]], rate={k/ne:.3f}")
print(f"Z-weights: all {zw.min()}")
print(f"X-weights: all {xw.min()}")
11