def end_initphase(): if not gp.initphase: return if not gp.endgame: return if gp.chi2 < gp.chi2tol and gp.chi2t_nu < gp.chi2t_sig: # TODO: include kap condition? gp.endcount -= 1; print('gp.endcount = ',gp.endcount) if gp.chi2 < gp.chi2tol/10.: print('really really small chi2! stopping init phase') else: # if gp.chi2 really really small: stop NOW! # do not accept too high stepsizes (must be < 5% in dens) if abs(np.median(gp.parstep.dens/gp.pars.dens)) > 0.05: return # do not stop unless gp.endcount counted down if gp.endcount > 0: return # if none of the above conditions hold: print( '*** initialization phase over ***') print( '*********************************') gp.initphase = False if gp.denslog: # use parstep if possible gp.parstep.dens = abs(np.log10(phys.densdefault(gp.pars.dens+\ abs(gp.parstep.dens)))-np.log10(phys.densdefault(gp.pars.dens))) # ^-- 2nd abs to avoid knot gp.pars.dens = np.log10(phys.densdefault(gp.pars.dens)) gp.parst.dens = np.log10(phys.densdefault(gp.parst.dens)) # or get 10% step # gp.parstep.dens = abs(np.log10(phys.densdefault(gp.pars.dens*1.05))-\ # np.log10(phys.densdefault(gp.pars.dens))) # 2) use constant step, from largest step, factor-wise # mul = np.median(gp.parstep.dens/gp.pars.dens) # # # gp.parstep.dens = mul*np.log10(phys.densdefault(gp.pars.dens)) # not proportional # # # gp.parstep.dens = abs(np.log10(phys.densdefault(gp.pars.dens))*mul) # prop, wrong for arg = 0 # gp.parstep.dens = np.ones(gp.nipol)*abs(np.log10(\ # phys.densdefault(gp.pars.dens)[-1])*mul) # gp.pars.dens = np.log10(phys.densdefault(gp.pars.dens)) # gp.parst.dens = np.log10(phys.densdefault(gp.parst.dens)) # constant stepsize over all xipol, from highest contrib from # last point, same sign everywhere (even if first point is log10>0.) # end 2) # 3) use real space density change # den = phys.densdefault(gp.pars.dens) # denerr = phys.densdefault(gp.pars.dens+gp.parstep.dens/2)-phys.densdefault(gp.pars.dens) # gp.parstep.dens = np.array(np.log10(den+denerr)-np.log10(den)) # boundbelow = [max(x, max(gp.parstep.dens)/10) for x in gp.parstep.dens] # give last bins a chance # gp.parstep.dens = np.array(boundbelow) # gp.pars.dens = np.array(np.log10(den)) # gp.parst.dens = np.array(np.log10(phys.densdefault(gp.parst.dens))) # end 3) else: gp.parstep.dens = abs(phys.densdefault(gp.pars.dens+gp.parstep.dens)-\ phys.densdefault(gp.pars.dens)) gp.pars.dens = phys.densdefault(gp.pars.dens) gp.parst.dens = phys.densdefault(gp.parst.dens) # gp.parst.dens = np.array(phys.calculate_dens(gp.xipol,M_anf(gp.xipol))) # ^-- cheat: start off, from near analytic 1 pop result # gp.parstep.dens = gp.parst.dens/20. gp.parstep.adaptall(gp.scaleafterinit) gp.stepafterrunaway = 1. gp.poly = False gp.safepars.assign(gp.pars) gp.safeparstep.assign(gp.parstep) gp.safechi2 = gp.chi2 # create folder to hold all output files import os; import os.path if not os.path.exists(gp.files.outdir): os.makedirs(gp.files.outdir) os.makedirs(gp.files.outdir+'/programs/') # copy across all programs to get working copy for easy repetition import os os.system('cp '+ gp.files.progdir+'/*.py '+gp.files.outdir+'/programs/') gfile.adump() # only do after endinit return
def accept_reject(n): if npr.rand() < gp.fnewoverf: gp.accrate.update(True) gp.pars.assign(gp.parst) gp.chi2 = gp.chi2t gp.lasterr = 'None' gp.d1wild = False; gp.d2wild = False; gp.dens2wild = False gp.b2wild = False; gp.sig2wild = False; gp.nu2wild = 1000 gfile.store_working_pars(n, gp.pars, gp.chi2, gp.parstep) # fplot if npr.rand() < max(0.01, (1.*gp.chi2-gp.chi2tol)/gp.chi2tol/100.)\ or (gp.initphase and gp.adaptstepwait == 1): gpl.update_plot() np.set_printoptions(precision=3) if gp.pops == 1: gp.LOG.warning('n: %d, chi2:'+gh.pretty(gp.chi2,1)+\ ' rate:'+gh.pretty(100*gp.accrate.rate(),2)+\ ' nu1:'+gh.pretty(100*\ abs(np.median((phys.nu(gp.pars.nu1+gp.parstep.nu1)\ -phys.nu(gp.pars.nu1))/\ phys.nu(gp.pars.nu1))),3)+\ ' d1:'+gh.pretty(100*\ abs(np.median(gp.parstep.delta1/gp.pars.delta1)),3)+\ ' dens:'+gh.pretty(100*\ abs(np.median((phys.densdefault(gp.parstep.dens+\ gp.pars.dens)\ -phys.densdefault(gp.pars.dens))/\ phys.densdefault(gp.pars.dens))),3)+\ ' norm1:'+gh.pretty(100*\ abs(np.median(gp.parstep.norm1/gp.pars.norm1)),3), n) else: print('n:',n, ' chi2:',gh.pretty(gp.chi2,1),\ ' rate:',gh.pretty(100*gp.accrate.rate(),2),\ ' nu1:',gh.pretty(100*\ abs(np.median((phys.nu(gp.pars.nu1+gp.parstep.nu1)\ -phys.nu(gp.pars.nu1))/\ phys.nu(gp.pars.nu1))),3),\ ' nu2:',gh.pretty(100*\ abs(np.median((phys.nu(gp.pars.nu2+gp.parstep.nu2)\ -phys.nu(gp.pars.nu2))/\ phys.nu(gp.pars.nu2))),3),\ ' d1:',gh.pretty(100*\ abs(np.median(gp.parstep.delta1/gp.pars.delta1)),3),\ ' d2:',gh.pretty(100* abs(np.median(gp.parstep.delta2/gp.pars.delta2)),3),\ ' dens:',gh.pretty(100*\ abs(np.median((phys.densdefault(gp.parstep.dens+\ gp.pars.dens)-phys.densdefault(gp.pars.dens))/\ phys.densdefault(gp.pars.dens))),3)) adapt_stepsize() end_initphase() else: gp.accrate.update(False) # jump back to last known good point faraway = gp.farinit if gp.initphase else gp.farover if gp.chi2t > gp.chi2 * faraway: gp.LOG.warning(' too far off, setting back to last known good point') gfile.get_working_pars(scale=False) # TODO: check that scale=gp.iniphase is really not the right thing return