test: accumulate same-trajectory space-time GPU rounding ledger
This commit is contained in:
@@ -102,6 +102,10 @@ class Host(unittest.TestCase):
|
||||
args = (p,t,state,state,g0,g0,phases,pre,h)
|
||||
ledger = gpu.rounding_ledger(*args,registers)
|
||||
self.assertEqual(max(map(abs,ledger['unexplained'])),0)
|
||||
np.testing.assert_array_equal(ledger['physical_collision'],np.array(ledger['coarse_collision'])
|
||||
+ledger['fine0_collision']+ledger['fine1_collision'])
|
||||
np.testing.assert_array_equal(ledger['child_rounding'],np.array(ledger['child_cast'])+ledger['child_interpolation'])
|
||||
np.testing.assert_array_equal(ledger['collision_cell_mass'],np.zeros((3,4)))
|
||||
registers[0] = .01
|
||||
with self.assertRaisesRegex(AssertionError,'register mismatch'):
|
||||
gpu.rounding_ledger(*args,registers)
|
||||
@@ -149,6 +153,7 @@ class Host(unittest.TestCase):
|
||||
self.assertEqual(run.health_counts.tolist(),[0,0,0,0,1,0])
|
||||
|
||||
def test_warmup_resets_arrivals_and_counters(self):
|
||||
audits=[]
|
||||
class Fake:
|
||||
def initialize(self,state):
|
||||
self.state=ref.cpu.State(state.coarse_f.copy(),state.fine_f.copy())
|
||||
@@ -156,13 +161,40 @@ class Host(unittest.TestCase):
|
||||
def download(self):
|
||||
return ref.cpu.State(self.state.coarse_f.copy(),self.state.fine_f.copy(),tick=2*self.step_count)
|
||||
def step(self,*,audit):
|
||||
assert audit is False
|
||||
audits.append(audit)
|
||||
self.step_count+=1; self.state.coarse_f[:]+=1e-4
|
||||
fake=Fake(); check=Mock(); state=initial(self.plan)
|
||||
actual,warm=trajectory.warm_and_reset(fake,state,check)
|
||||
np.testing.assert_array_equal(actual.coarse_f,state.coarse_f)
|
||||
self.assertEqual(check.call_count,32); self.assertEqual(fake.step_count,0)
|
||||
self.assertTrue(warm['reset_verified']); self.assertEqual(warm['intervals'],32)
|
||||
trajectory.warm_and_reset(fake,state,check,audit=True)
|
||||
self.assertEqual(audits,[False]*32+[True]*32)
|
||||
|
||||
def test_accumulated_drift_ledger_and_exact_samples(self):
|
||||
totals=trajectory.LedgerTotals()
|
||||
for sign in (1.,-1.):
|
||||
ledger={name:np.zeros(9) for name in totals.names}
|
||||
ledger['coarse_collision'][0]=sign*2.**-20
|
||||
ledger['physical_collision']=ledger['coarse_collision'].copy()
|
||||
ledger['child_cast'][5]=sign*2.**-30
|
||||
ledger['child_interpolation'][5]=sign*2.**-50
|
||||
ledger['child_rounding']=ledger['child_cast']+ledger['child_interpolation']
|
||||
ledger['receiver_rounding'][5]=-sign*2.**-32
|
||||
ledger['net_change']=sum(ledger[k] for k in ('physical_collision','child_rounding','receiver_rounding'))
|
||||
mass=ledger['coarse_collision'].sum()
|
||||
ledger.update(unexplained_bound=1e-12,collision_cell_mass=[[mass,max(mass,0.),min(mass,0.),abs(mass)],[0.]*4,[0.]*4])
|
||||
totals.add(ledger)
|
||||
result=totals.snapshot(np.zeros(9))
|
||||
self.assertEqual(result['intervals'],2)
|
||||
self.assertEqual(result['components']['physical_collision']['directional'],[0.]*9)
|
||||
self.assertGreater(result['components']['physical_collision']['absolute_step_mass_momentum_sum'][0],0)
|
||||
self.assertEqual(result['components']['physical_collision']['max_absolute_interval_step'][0],1)
|
||||
self.assertEqual(totals.snapshot()['endpoint_status'],'not_measured')
|
||||
self.assertFalse(totals.snapshot(np.ones(9)*1e-8)['closure_pass'])
|
||||
self.assertEqual(trajectory.differing_fields(dict(a=1.,b=[0.,2.]),dict(a=1.,b=[0.,2.])),[])
|
||||
self.assertEqual(trajectory.differing_fields(dict(a=0.),dict(a=-0.)),['a'])
|
||||
self.assertEqual(trajectory.differing_fields(dict(a=1.),dict(a=np.nextafter(1.,2.))),['a'])
|
||||
|
||||
def test_trajectory_screens_differences_and_json(self):
|
||||
rows=[dict(tstar=t,velocity_l2=np.float64(.01),pressure_l2=.03,energy_relative=.01,
|
||||
|
||||
Reference in New Issue
Block a user