"""Standalone synthetic teaching example. Run locally with Python, not in the HTML."""
import json
import numpy as np
import pandas as pd
from scipy.special import expit

def clean(value):
    if isinstance(value, dict): return {str(k):clean(v) for k,v in value.items()}
    if isinstance(value,(list,tuple,np.ndarray)): return [clean(v) for v in value]
    if isinstance(value,(np.integer,)): return int(value)
    if isinstance(value,(float,np.floating)): return float(value) if np.isfinite(value) else None
    if isinstance(value,(np.bool_,)): return bool(value)
    return value

def print_result(result):
    print(json.dumps(clean(result),ensure_ascii=False,allow_nan=False))


def best_split(x, y, min_leaf=1):
    """One-feature squared-error stump. None means no positive valid gain."""
    x, y = np.asarray(x,float), np.asarray(y,float)
    if x.ndim != 1 or y.shape != x.shape or min_leaf < 1:
        raise ValueError("Expected matching 1D arrays and min_leaf>=1")
    if len(x)==0 or not np.isfinite(x).all() or not np.isfinite(y).all():
        raise ValueError("Expected nonempty finite data")
    order = np.argsort(x,kind="stable"); xs, ys = x[order], y[order]
    parent = np.sum((ys-ys.mean())**2)
    best = None; best_sse = parent
    for i in range(min_leaf, len(x)-min_leaf+1):
        if xs[i-1] == xs[i]:
            continue
        left, right = ys[:i].mean(), ys[i:].mean()
        sse = np.sum((ys[:i]-left)**2)+np.sum((ys[i:]-right)**2)
        if sse < best_sse-1e-12:
            best_sse = sse
            best = (float((xs[i-1]+xs[i])/2), float(left), float(right), float(sse))
    return best

if __name__ == "__main__":
    x=np.arange(1,7); y=np.array([0.,0.,1.,4.,5.,5.])
    split=best_split(x,y)
    np.testing.assert_allclose(split,[3.5,1/3,14/3,4/3],atol=1e-12)
    assert best_split(np.ones(3),np.array([1.,2.,3.])) is None
    assert best_split(x,np.ones(6)) is None
    assert best_split(np.array([1.,1.,2.,2.]),np.array([0.,0.,1.,1.]))[0]==1.5
    print_result({"threshold":split[0],"left_mean":split[1],"right_mean":split[2],
        "child_sse":split[3],"parent_sse":np.sum((y-y.mean())**2),
        "averaging_variance_rho_0_8_B_100":.8+(1-.8)/100})
