"""Synthetic computational fixtures; not scientific performance measurements.""" import unittest from copy import deepcopy import numpy as np from peppa.compiled import Node,Plan,validate_plan,execute,replay,fit_ensemble,aggregate,release,robust_reward,redesign_schedule class CompiledTests(unittest.TestCase): def setUp(self): self.registry={'double':{'revision':'r1','run':lambda p,s:{'b':p['a']*2},'validate':lambda r:None},'plus':{'revision':'r2','run':lambda p,s:{'c':p['b']+1},'validate':lambda r:None}} self.plan=Plan((Node('02','plus','r2',('b',),('c',)),Node('01','double','r1',('a',),('b',))),('c',),2) def test_dependency_schedule_replay_and_cache(self): cache={};a=execute(self.plan,{'a':2},self.registry,cache) self.registry['double']['run']=lambda *args: self.fail('cache was bypassed') b=execute(self.plan,{'a':2},self.registry,cache) self.assertEqual(a,b);self.assertEqual(replay(a['events']),{'a':2,'b':4,'c':5}) def test_cycle_missing_and_overwrite(self): for nodes in [(Node('01','double','r1',('c',),('b',)),Node('02','plus','r2',('b',),('c',))), (Node('01','double','r1',('a',),('a',)),)]: with self.assertRaises(ValueError):validate_plan(Plan(nodes,('c',),5),{'a':2},self.registry) def test_budget_and_revision_before_execution(self): with self.assertRaises(ValueError):validate_plan(Plan(self.plan.nodes,('c',),1),{'a':2},self.registry) self.registry['double']['revision']='changed' with self.assertRaises(ValueError):execute(self.plan,{'a':2},self.registry) def test_failure_blocks_dependency_and_charges(self): self.registry['double']['run']=lambda p,s:{'bad':3} a=execute(self.plan,{'a':2},self.registry) self.assertFalse(a['complete']);self.assertEqual(a['spent'],1) self.assertEqual(a['artifacts'],{'a':2}) self.assertTrue(any(e['kind']=='blocked' for e in a['events'])) def test_retry_bound(self): self.registry['double']['run']=lambda p,s:{'b':float('nan')} plan=Plan((Node('01','double','r1',('a',),('b',),attempts=3),),('b',),3) a=execute(plan,{'a':1},self.registry) self.assertEqual(a['spent'],3);self.assertFalse(a['complete']) def test_trace_tampering(self): a=execute(self.plan,{'a':2},self.registry);a['events'][1]['result']['b']=999 with self.assertRaises(ValueError):replay(a['events']) def test_duplicate_invariance(self): a=np.array([[1,2],[2,4],[3,6],[4,8.]]) y=np.array([1,2,3,4.]);f=fit_ensemble(a,y,['a','b']) b=np.column_stack([a,a[:,0]]) g=fit_ensemble(b,y,['a','b','a']) self.assertEqual(f,g);np.testing.assert_equal(aggregate(a,['a','b'],f)[0],aggregate(b,['a','b','a'],g)[0]) def test_conflicting_lineage(self): with self.assertRaises(ValueError):fit_ensemble([[1,2],[3,4]],[1,3],['a','a']) def candidate(self): return {'id':'a','sequence':'ACDE','chemistry_verified':True,'scores':{'p':{'value':2,'lower':1,'upper':3,'unit':'u','support':'calibrated','lineage':'m1','domain_ok':True}}} def obligations(self):return [{'id':'p','unit':'u','support':'calibrated','threshold':.5,'direction':'ge','scale':1}] def test_complete_release_and_shortfall(self): r=release([self.candidate()],self.obligations(),12) self.assertEqual(r['selected'],['a']);self.assertEqual(r['unfilled'],11) def test_missing_unit_domain_proxy_chemistry(self): for fault in ['missing','unit','domain','support','chemistry']: c=self.candidate() if fault=='missing':c['scores']={} if fault=='unit':c['scores']['p']['unit']='wrong' if fault=='domain':c['scores']['p']['domain_ok']=False if fault=='support':c['scores']['p']['support']='proxy' if fault=='chemistry':c['chemistry_verified']=False r=release([c],self.obligations());self.assertEqual(r['selected'],[],fault) def test_robust_context_penalty(self): self.assertLess(robust_reward([[2,-2],[2,2]],[.5,.5]),robust_reward([[2,2],[2,2]],[.5,.5])) def test_redesign_ties(self): self.assertEqual(redesign_schedule({'specificity':3,'binding':3,'cmc':1},5),['binding','specificity','cmc','binding','specificity']) if __name__=='__main__':unittest.main()