from pathlib import Path
import re, math, random

HERE=Path(__file__).resolve().parent
PAPER=HERE/"CSM_RH_Paper_52_Polylogarithmic_Zero_Window_Gram_Reduction_and_Weighted_Beta_Mass_Frontier_v0.1_2026-09-08.md"

def h(x):
    return 1.0/(1.0+abs(x))

def numeric_integral_conv(d, R=300.0, steps=120000):
    lo=-R
    hi=d+R
    dx=(hi-lo)/steps
    s=0.0
    for k in range(steps):
        x=lo+(k+0.5)*dx
        s += h(x)*h(x-d)
    return s*dx

def check_convolution():
    worst=0.0
    for d in [0,0.5,1,2,5,10,30,100]:
        val=numeric_integral_conv(d)
        base=math.log(2.0+d)/(1.0+d)
        ratio=val/base
        worst=max(worst,ratio)
        assert val <= 20.0*base, (d,val,20.0*base)
    return worst

def check_layer_cake_exact():
    random.seed(52)
    N=10007.0
    betas=[0.5+0.49*random.random() for _ in range(50)]
    weights=[random.random() for _ in betas]
    lhs=sum(w*N**(2*b-2) for b,w in zip(betas,weights))
    baseline=N**-1*sum(weights)
    # Integrate each step-function contribution analytically.
    integral=0.0
    for b,w in zip(betas,weights):
        integral += w*(N**(2*b-2)-N**-1)/(2.0*math.log(N))
    rhs=baseline+2.0*math.log(N)*integral
    err=abs(lhs-rhs)
    assert err < 1e-12, err
    return err

def check_source():
    s=PAPER.read_text(encoding="utf-8")
    forbidden=[
        r"(?<!\\)\\\(",
        r"(?<!\\)\\\)",
        r"(?<!\\)\\\[",
        r"(?<!\\)\\\]",
    ]
    for pat in forbidden:
        assert re.search(pat,s) is None, pat
    assert s.count("$$")%2==0
    tmp=re.sub(r"\$\$.*?\$\$","",s,flags=re.S)
    assert len(re.findall(r"(?<!\\)\$",tmp))%2==0
    return True

if __name__=="__main__":
    print("convolution_constant_ratio_worst",check_convolution())
    print("layer_cake_exact_error",check_layer_cake_exact())
    print("source_delimiters",check_source())
    print("PASS")
