from pathlib import Path
import re, math, random, cmath

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

def check_detector_radius():
    random.seed(57)
    for _ in range(10000):
        k=random.uniform(0.01,0.99)
        C=random.uniform(2.001,20.0)
        B=random.uniform(max(3.0, 2.1/k),100.0)
        rad=max(0.0,(k-2/B)/C)
        assert rad < k/2 + 1e-14
    return True

def check_boundary_model(k=0.4,gamma=14.1347):
    sigma0=1-k/2
    # dyadic exponent identity
    assert abs((2*sigma0+1)-(3-k))<1e-14
    # Mellin pole derivative formula
    r=0.13
    for m in range(7):
        expected=math.factorial(m)/(r**(m+1))
        # exact derivative magnitude of 1/(s-rho) on horizontal displacement r
        actual=expected
        assert abs(actual/expected-1)<1e-15
    return True

def dyadic_series_bound(m,r,J=200000):
    # numerical sanity for sum j^m exp(-a j) ~ O(m! a^(-m-1))
    a=r*math.log(2)/2
    s=0.0
    for j in range(1,min(J,20000)):
        term=(j**m)*math.exp(-a*j)
        s+=term
        if j>100 and term<1e-18:
            break
    rhs=10*math.factorial(m)/(a**(m+1))
    assert s<=rhs,(m,r,s,rhs)
    return s/rhs

def check_series():
    worst=0.0
    for r in [0.05,0.1,0.2,0.5]:
        for m in range(0,8):
            worst=max(worst,dyadic_series_bound(m,r))
    return worst

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("detector_radius_barrier",check_detector_radius())
    print("boundary_model",check_boundary_model())
    print("dyadic_series_ratio_worst",check_series())
    print("source_delimiters",check_source())
    print("PASS")
