"""NiubiGEO原创、确定性教学计算；不联网，不调用模型，非客户实测。"""
from pathlib import Path
import json, math, statistics, itertools

ROOT=Path(__file__).resolve().parent
def wilson(k,n,z=1.96):
    p=k/n;den=1+z*z/n
    mid=(p+z*z/(2*n))/den
    half=z*math.sqrt(p*(1-p)/n+z*z/(4*n*n))/den
    return [round(mid-half,6),round(mid+half,6)]
def softmax(values,t):
    a=[math.exp((v-max(values))/t) for v in values]
    return [round(x/sum(a),6) for x in a]
out={}
out['P14']={'planned_cells':30,'initial_http_attempts':30,'recovery_attempts':3,'http_attempts':33,'complete_answers':24,'initial_errors':9,'unresolved':6,'mentioned':12,'cited':8,'recommended':5,'mention_rate':12/24,'citation_rate':8/24,'recommendation_rate':5/24,'completion_rate':24/30,'missing_sensitivity':[12/30,18/30],'wilson_illustrative_only':wilson(12,24),'equal_scenario_weighted_rate':0.5*(6/18)+0.5*(6/6)}
tpre=[.20,.25,.30,.25];tpost=[.40,.45,.45,.50]
cpre=[.20,.25,.20,.35];cpost=[.25,.30,.30,.35]
changes=[b-a for a,b in zip(tpre,tpost)]+[b-a for a,b in zip(cpre,cpost)]
observed=statistics.mean(changes[:4])-statistics.mean(changes[4:])
permutations=[]
for inds in itertools.combinations(range(8),4):
    others=[i for i in range(8) if i not in inds]
    permutations.append(statistics.mean(changes[i] for i in inds)-statistics.mean(changes[i] for i in others))
out['P15']={'treatment_pre':tpre,'treatment_post':tpost,'control_pre':cpre,'control_post':cpost,'group_means':[statistics.mean(x) for x in [tpre,tpost,cpre,cpost]],'did':round(observed,6),'randomization_assignments':len(permutations),'two_sided_randomization_p':sum(abs(x)>=abs(observed)-1e-10 for x in permutations)/len(permutations),'assumption':'Only meaningful if 8 independent page clusters were randomly assigned; toy values are not an actual experiment.'}
truth={'price':99,'currency':'CNY','billing':'month','seats':5,'export':'CSV','region':'CN'}
html=dict(truth);schema={**truth,'price':79};md={**truth,'seats':3}
diffs={name:[k for k in truth if value[k]!=truth[k]] for name,value in [('html',html),('schema',schema),('markdown',md)]}
out['P11']={'truth':truth,'representations':{'html':html,'schema':schema,'markdown':md},'mismatches':diffs,'consistent_cells':sum(6-len(x) for x in diffs.values()),'total_cells':18}
out['P12']={'conditions':['same question','same intent','same target language','same history','same search setting','same source set','same model snapshot','same account context'],'shared':[True,True,True,True,False,False,False,False],'comparable_fields':4,'total_fields':8,'outcome_sets':{'API':['甲','乙','丙'],'web':['乙','丙','丁']},'jaccard':2/4,'notice':'Artificial label sets; no real platform calls.'}
out['P13']={'logits':[2,1,0],'distributions':{str(t):softmax([2,1,0],t) for t in [.5,1,2]},'repeated_counts':[4,7,5,6],'n_per_batch':10,'pooled_rate':22/40,'wilson_illustrative_only':wilson(22,40),'prob_at_least_one_mention_given_p_half_and_3_independent':1-.5**3}
units={'50 mm':50,'5 cm':50,'0.05 m':50,'50 cm':500}
out['P16']={'normalized_mm':units,'facts_per_format':6,'correct_by_format':{'poster_transcription':3,'flat_text':5,'semantic_table':6},'coverage_by_format':{'poster_transcription':3/6,'flat_text':5/6,'semantic_table':6/6},'notice':'Manually stipulated extraction records, not measured OCR/model accuracy.'}
tasks=[{'id':'A','public_facts':True,'constraints':True,'destination':True,'approval':False},{'id':'B','public_facts':True,'constraints':False,'destination':True,'approval':False},{'id':'C','public_facts':True,'constraints':True,'destination':False,'approval':False},{'id':'D','public_facts':True,'constraints':True,'destination':True,'approval':True}]
out['P17']={'tasks':tasks,'ready_to_prepare':sum(x['public_facts'] and x['constraints'] and x['destination'] for x in tasks),'ready_to_submit':sum(all(x[k] for k in ['public_facts','constraints','destination','approval']) for x in tasks),'submissions_executed':0}
sourcegroups={'vendor_release':['u1','u2','u3','u4'],'independent_test':['u5','u6'],'customer_record':['u7'],'paid_placement':['u8']}
out['P18']={'source_groups':sourcegroups,'urls':8,'provenance_groups':4,'independent_primary_observations':2,'claim_support_labels':['supports','partial','unsupported','supports'],'full_support':2,'claims':4}
out['P19']={'platform_impressions':10000,'site_referred_sessions':180,'form_events':18,'unique_contacts':15,'qualified_leads':9,'won_orders':3,'gross_collected_CNY':24000,'refunds_CNY':4000,'net_collected_CNY':20000,'form_events_per_session':18/180,'qualified_share_of_contacts':9/15,'order_share_of_qualified':3/9,'self_report_ai_contacts':6,'overlap_with_referred_contacts':4,'deduplicated_ai_related_contacts':15+6-4,'notice':'Different universes. This union assumes all 15 contact IDs are referral-attributed; not a platform-to-person join.'}
out['P20']={'baseline':.20,'after':.28,'absolute_percentage_points':8,'relative_growth':.28/.20-1,'individual_relative_changes':[.4,.1,0,-.2],'mean_individual_relative_change':statistics.mean([.4,.1,0,-.2]),'improved_units':2,'units':4,'source_word_example':{'answer_words':200,'single_source_sentence_words':40,'two_source_sentence_words':60,'allocated_words':40+60/2,'allocated_share':70/200}}
result={'label':'全部为NiubiGEO原创教学数据，非客户实测、非论文复现、非平台比较成绩。','deterministic':True,'examples':out}
ROOT.mkdir(parents=True,exist_ok=True)
(ROOT/'results.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n')
for k,v in out.items():(ROOT/(k+'-result.json')).write_text(json.dumps(v,ensure_ascii=False,indent=2)+'\n')
print(json.dumps({k: v for k,v in out.items()},ensure_ascii=False,indent=2))
