"""Arithmetic on constructed prediction tables, not trained models."""
import json
def majority(columns):
    if len(columns)!=3 or len({len(c) for c in columns})!=1:raise ValueError("three equal-length columns required")
    if any(x not in [0,1] for c in columns for x in c):raise ValueError("binary labels required")
    return [int(sum(c[i] for c in columns)>=2) for i in range(len(columns[0]))]
def correct(pred,truth):return sum(p==y for p,y in zip(pred,truth))
if __name__=="__main__":
    truth=[0,0,0,1,1,1]
    models=[[1-y if i in e else y for i,y in enumerate(truth)] for e in [(0,1),(2,3),(4,5)]]
    voted=majority(models);correlated=majority([models[0]]*3)
    assert [correct(c,truth) for c in models]==[4,4,4]
    assert correct(voted,truth)==6 and correct(correlated,truth)==4
    overlaps=[sum(a!=y and b!=y for a,b,y in zip(models[i],models[j],truth)) for i,j in [(0,1),(0,2),(1,2)]]
    assert overlaps==[0,0,0]
    print(json.dumps({"individual_correct_out_of_six":[4,4,4],"different_error_majority":6,"shared_error_majority":4,"pairwise_joint_errors":overlaps,"trained_model_count":0},indent=2))
