"""Exact collinearity and near-collinearity examples; rational arithmetic not roundoff."""
from fractions import Fraction as F
import json
def predict(X,w):return [sum(a*b for a,b in zip(row,w)) for row in X]
def fit_two_columns(X,y):
    a=sum(r[0]*r[0] for r in X);b=sum(r[0]*r[1] for r in X);c=sum(r[1]*r[1] for r in X)
    d=sum(r[0]*v for r,v in zip(X,y));e=sum(r[1]*v for r,v in zip(X,y));det=a*c-b*b
    if det==0:raise ValueError('nonunique coefficients in this full-rank-only solver')
    return [(d*c-b*e)/det,(a*e-b*d)/det],det
def demo():
    exactX=[[F(i),F(i)] for i in [1,2,3]];target=[F(2*i) for i in [1,2,3]]
    alternatives=[[F(1),F(1)],[F(0),F(2)],[F(4),F(-2)]]
    assert all(predict(exactX,w)==target for w in alternatives)
    singular=False
    try:fit_two_columns(exactX,target)
    except ValueError:singular=True
    eps=F(1,1000);delta=F(1,100)
    X=[[F(1),F(1)],[F(1),F(1)+eps],[F(1),F(1)-eps]]
    y=predict(X,[F(1),F(1)]);changed=[y[0],y[1]+delta,y[2]-delta]
    before,det=fit_two_columns(X,y);after,det2=fit_two_columns(X,changed)
    assert before==[F(1),F(1)] and after==[F(-9),F(11)] and det==det2>0 and singular
    assert predict(X,before)==y and predict(X,after)==changed
    return {'no_intercept':True,'exact_X':[[str(x) for x in row] for row in exactX],'exact_target':[str(x) for x in target],'same_prediction_weights':[[str(x) for x in row] for row in alternatives],'singular_solver_rejected':singular,'near_X':[[str(x) for x in row] for row in X],'near_normal_determinant':str(det),'baseline_y':[str(x) for x in y],'perturbed_y':[str(x) for x in changed],'baseline_fit':[str(x) for x in before],'perturbed_fit':[str(x) for x in after],'maximum_target_change':str(delta),'query_1_1_before_after':[str(predict([[F(1),F(1)]],w)[0]) for w in [before,after]],'query_1_2_before_after':[str(predict([[F(1),F(2)]],w)[0]) for w in [before,after]],'floating_point_error_simulated':False,'causal_effect_claimed':False}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=False,indent=2))
