"""Exact two-feature Shapley arithmetic for a fixed-baseline game; not a SHAP-library run."""
from fractions import Fraction as F
import itertools,json
def f(x):return F(3)+2*x[0]+x[1]+x[0]*x[1]
def game(x,baseline,subset):return f(tuple(x[i] if i in subset else baseline[i] for i in range(2)))
def explain(x,baseline):
    coalitions={''.join(str(i+1) for i in subset) or 'empty':str(game(x,baseline,set(subset))) for n in range(3) for subset in itertools.combinations(range(2),n)}
    phi=[F(0),F(0)];traces=[]
    for order in itertools.permutations(range(2)):
        known=set();margins=[]
        for i in order:
            before=game(x,baseline,known);known.add(i);delta=game(x,baseline,known)-before;phi[i]+=delta/F(2);margins.append({'feature':i+1,'marginal':str(delta)})
        traces.append({'order':[i+1 for i in order],'marginals':margins})
    assert sum(phi)==f(x)-f(baseline)
    return {'input':[str(v) for v in x],'baseline':[str(v) for v in baseline],'coalition_values':coalitions,'order_traces':traces,'phi':[str(v) for v in phi],'base_value':str(f(baseline)),'prediction':str(f(x)),'sum_phi':str(sum(phi))}
def demo():
    x=(F(2),F(3));a=explain(x,(F(0),F(0)));b=explain(x,(F(1),F(1)))
    assert a['phi']==['7','6'] and b['phi']==['4','5'];assert a['prediction']==b['prediction']=='16'
    checks=0
    for x1,x2,b1,b2 in itertools.product(range(-1,3),repeat=4):explain((F(x1),F(x2)),(F(b1),F(b2)));checks+=1
    return {'function':'3 + 2*x1 + x2 + x1*x2','masking':'absent feature replaced by chosen single baseline coordinate; not a conditional data distribution','output_unit':'arbitrary scalar, not probability','cases':[a,b],'enumerated_efficiency_checks':checks,'SHAP_library_executed':False,'causal_effect_estimated':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
