"""Independent limits and actual coordinate/source/mixture refinement. No preflightconstants as producers.""" import signal signal.signal(signal.SIGALRM,lambda *_:(_ for _ in()).throw(TimeoutError('120s producer cap')));signal.alarm(120) import argparse,math,hashlib import numpy as np from scipy.integrate import quad,solve_ivp,dblquad from evolution import histories,formed,incoming,delay_cdf,response,simulate from compare import finite_rows,log_probabilities from io_helpers import PACKAGE,read_json,write_json,family,fixed_inputs from pathlib import Path def main(): parser=argparse.ArgumentParser();parser.add_argument('--records',type=Path,default=Path('results/records'));parser.add_argument('--reference',type=Path,default=Path('results/reference'));parser.add_argument('--real-data',type=Path);parser.add_argument('--output',type=Path,default=Path('results/validation.json'));args=parser.parse_args();fixed=fixed_inputs();maximum={'bulk':0.,'elementScaled':0.,'abundanceDex':0.,'gasAnalytic':0.,'gasInventory':0.,'elementInventory':0.,'mixtureMeanLogDensity':0.,'convolutionRelative':0.,'sourceIntegral':0.};details=[] datasets=[('synthetic',finite_rows(read_json(PACKAGE/'inputs/own-observations.json')))]; if args.real_data:datasets.append(('Hillconditional',finite_rows(read_json(args.real_data)))) initialMg=fixed['initialFeFraction']*fixed['netCC']['mg']/fixed['netCC']['fe'] for p in family(): path=args.records/(p['name']+'.npz');coarse=read_json(path);reference=read_json(args.reference/(p['name']+'.npz'));a=np.array(coarse['states']);time=np.array(coarse['timeGyr']);bracket=np.array(coarse['abundances']) assert reference['coarseRecordSha256']==hashlib.sha256(path.read_bytes()).hexdigest() for key in ['bulk','elementScaled','abundanceDex']:maximum[key]=max(maximum[key],reference['refinement'][key]) for row in reference['observationRefinement']: data_path=PACKAGE/'inputs/own-observations.json'if row['data']=='synthetic'else args.real_data if data_path is None:continue assert row['dataSha256']==hashlib.sha256(data_path.read_bytes()).hexdigest() maximum['mixtureMeanLogDensity']=max(maximum['mixtureMeanLogDensity'],row['adjacentBirthBinMeanAbsoluteLogDensity'],row['productionToPositiveGL8MeanAbsoluteLogDensity'],row['GL4to8MeanAbsoluteLogDensity']) assert reference['earlyPositiveSupport']['firstFeFraction']>0 and reference['earlyPositiveSupport']['firstMgFraction']>0 exact=np.array([1+incoming(t,p)-(.6+p['eta'])*formed(t,p)for t in time]);maximum['gasAnalytic']=max(maximum['gasAnalytic'],float(np.max(np.abs(a[:,0]-exact))));maximum['gasInventory']=max(maximum['gasInventory'],float(np.max(np.abs(a[:,0]+a[:,1]+a[:,2]-a[:,3]-1)))) for element,initial in [(0,initialMg),(1,1e-6)]:maximum['elementInventory']=max(maximum['elementInventory'],float(np.max(np.abs(a[:,4+element]+a[:,6+element]+a[:,8+element]-a[:,10+element]-a[:,12+element]-initial)))) nodes,weights=np.polynomial.legendre.leggauss(384) for t in [.151,.8,3.71,7.93]: lo=.15;hi=t;delay=(hi-lo)/2*nodes+(hi+lo)/2;A=.1/(.15**-.1-15**-.1);independent=(hi-lo)/2*np.dot(weights,[histories(t-u,p)[0]*A*u**-1.1 for u in delay]);q=response(t,p);maximum['convolutionRelative']=max(maximum['convolutionRelative'],abs(independent-q)/max(abs(q),1e-14)) for t in [.2,1,8]: source=quad(lambda u:response(u,p),.15,t,points=[x for x in [3.7,4]if .15