示例#1
0
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
示例#2
0
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