import numpy as np from spectral_world_models.v12_causal_decomposition import summarize_strata,paired_bootstrap_delta,_episode_tags from spectral_world_models.v9_causal_generalization import INTERP def test_tags_detect_boundary_and_bins_inputs(): st=(10.,10.,1.,2.,'circle',2.) a=np.array([[2.1,10.],[3.,10.]],np.float32); b=np.array([[20.,10.],[21.,10.]],np.float32) t=_episode_tags(st,a,b,INTERP,b-a) assert t['boundary_contact'] and t['initial_speed']>2 def test_summary_and_paired_bootstrap(): rows=[] for e in range(8): rows.append(dict(regime='interpolation',episode=e,program='left_right',horizon=30,trajectory_cosine=.6,magnitude_ratio=.8,magnitude_ratio_mae=.2,log_gain_error=.25,initial_speed=1.,oracle_effect_path_mag=2.,boundary_contact=False,occlusion_zone_exposure=False,speed_bin='mid',effect_bin='mid')) s=summarize_strata(rows); assert any(x['stratum_type']=='program' for x in s) ctl=[dict(x,trajectory_cosine=.2) for x in rows] z=paired_bootstrap_delta(rows,ctl,n_boot=100,seed=1); assert abs(z['delta_v9_minus_control']-.4)<1e-6 and z['ci95_low']>0