Exemple #1
0
    def launch(eps_start, init_pool=None):
        print eps_start 
        eps = abcpmc.ConstEps(T, eps_start)
        mpi_pool = mpi_util.MpiPool()
        pools = []
        abcpmc_sampler = abcpmc.Sampler(
                N=N_part,               #N_particles
                Y=fake_obs,             #data
                postfn=simz,            #simulator 
                dist=multivariate_rho,  #distance function  
                pool=mpi_pool)  
        abcpmc_sampler.particle_proposal_cls = abcpmc.ParticleProposal
        f = open(tolerance_file(abcrun), "w")
        f.close()
        eps_str = ''
        for pool in abcpmc_sampler.sample(prior, eps):
            #while pool.ratio > 0.01:
            new_eps_str = '\t'.join(np.array(pool.eps).astype('str'))+'\n'
            if eps_str != new_eps_str:  # if eps is different, open fiel and append 
                f = open(tolerance_file(abcrun) , "a")
                eps_str = new_eps_str
                f.write(eps_str)
                f.close()
            print("T:{0},ratio: {1:>.4f}".format(pool.t, pool.ratio))
            print pool.eps

            # write theta, w, and rhos to file 
            np.savetxt(theta_file(pool.t, abcrun), pool.thetas)
            np.savetxt(w_file(pool.t, abcrun), pool.ws)
            np.savetxt(dist_file(pool.t, abcrun) , pool.dists)
            
            # plot theta
            plot_thetas(pool.thetas, pool.ws , pool.t, 
                    truths=data_hod, plot_range=prior_range, 
                    theta_filename=theta_file(pool.t, abcrun),
                    output_dir=util.abc_dir())

            eps.eps = np.median(np.atleast_2d(pool.dists), axis = 0)

            pools.append(pool)
        abcpmc_sampler.close()
        return pools
Exemple #2
0
def ABCpmc_HOD(T, eps_val, N_part=1000, prior_name='first_try', observables=['nbar', 'xi'], 
        abcrun=None, data_dict={'Mr':21, 'b_normal':0.25}):
    '''
    ABC-PMC implementation. 

    Parameters
    ----------
    - T : Number of iterations 
    - eps_val : 
    - N_part : Number of particles
    - observables : list of observables. Options are 'nbar', 'gmf', 'xi'
    - data_dict : dictionary that specifies the observation keywords 
    '''
    if abcrun is None: 
        raise ValueError("Specify the name of the abcrun!") 

    #Initializing the vector of observables and inverse covariance matrix
    fake_obs, Cii_list = getObvs(observables, **data_dict)

    # True HOD parameters
    data_hod_dict = Data.data_hod_param(Mr=data_dict['Mr'])
    data_hod = np.array([
        data_hod_dict['logM0'],                 # log M0 
        np.log(data_hod_dict['sigma_logM']),    # log(sigma)
        data_hod_dict['logMmin'],               # log Mmin
        data_hod_dict['alpha'],                 # alpha
        data_hod_dict['logM1']                  # log M1
        ])

    # Priors
    prior_min, prior_max = PriorRange(prior_name)
    prior = abcpmc.TophatPrior(prior_min, prior_max)
    prior_range = np.zeros((len(prior_min),2))
    prior_range[:,0] = prior_min
    prior_range[:,1] = prior_max

    # Simulator
    our_model = ABC_HODsim(Mr=data_dict['Mr'], b_normal=data_dict['b_normal'])    # initialize model
    kwargs = {'prior_range': prior_range, 'observables': observables}
    def simz(tt): 
        sim = our_model(tt, **kwargs)
        if sim is None: 
            pickle.dump(tt, open(util.crash_dir()+"simz_crash_theta.p", 'wb'))
            pickle.dump(kwargs, open(util.crash_dir()+'simz_crash_kwargs.p', 'wb'))
            raise ValueError('Simulator is giving NonetType')
        return sim

    def multivariate_rho(model, datum): 
        dists = [] 
        if observables == ['nbar','xi']: 
            nbar_Cii = Cii_list[0] 
            xi_Cii = Cii_list[1]
            dist_nbar = (datum[0] - model[0])**2. / nbar_Cii 
 	    dist_xi = np.sum((datum[1:] - model[1:])**2. / xi_Cii)
            dists = [dist_nbar , dist_xi]
        elif observables == ['nbar','gmf']:
            nbar_Cii = Cii_list[0] 
            gmf_Cii = Cii_list[1]
            dist_nbar = (datum[0] - model[0])**2. / nbar_Cii 
            # omitting the first GMF bin in the model ([1:])
            dist_gmf = np.sum((datum[1:] - model[1][1:])**2. / gmf_Cii)
            dists = [dist_nbar , dist_gmf]
        elif observables == ['xi']: 
            xi_Cii = Cii_list[0]
            dist_xi = np.sum((datum- model)**2. / xi_Cii)
    	    dists = [dist_xi]
        return np.array(dists)

    tolerance_file = lambda name: ''.join([util.abc_dir(), "abc_tolerance", '.', name, '.dat'])
    theta_file = lambda tt, name: ''.join([util.abc_dir(), 
        util.observable_id_flag(observables), '_theta_t', str(tt), '.', name, '.dat'])
    w_file = lambda tt, name: ''.join([util.abc_dir(), 
        util.observable_id_flag(observables), '_w_t', str(tt), '.', name, '.dat'])
    dist_file = lambda tt, name: ''.join([util.abc_dir(), 
        util.observable_id_flag(observables), '_dist_t', str(tt), '.', name, '.dat'])

    def launch(eps_start, init_pool=None):
        print eps_start 
        eps = abcpmc.ConstEps(T, eps_start)
        mpi_pool = mpi_util.MpiPool()
        pools = []
        abcpmc_sampler = abcpmc.Sampler(
                N=N_part,               #N_particles
                Y=fake_obs,             #data
                postfn=simz,            #simulator 
                dist=multivariate_rho,  #distance function  
                pool=mpi_pool)  
        abcpmc_sampler.particle_proposal_cls = abcpmc.ParticleProposal
        f = open(tolerance_file(abcrun), "w")
        f.close()
        eps_str = ''
        for pool in abcpmc_sampler.sample(prior, eps):
            #while pool.ratio > 0.01:
            new_eps_str = '\t'.join(np.array(pool.eps).astype('str'))+'\n'
            if eps_str != new_eps_str:  # if eps is different, open fiel and append 
                f = open(tolerance_file(abcrun) , "a")
                eps_str = new_eps_str
                f.write(eps_str)
                f.close()
            print("T:{0},ratio: {1:>.4f}".format(pool.t, pool.ratio))
            print pool.eps

            # write theta, w, and rhos to file 
            np.savetxt(theta_file(pool.t, abcrun), pool.thetas)
            np.savetxt(w_file(pool.t, abcrun), pool.ws)
            np.savetxt(dist_file(pool.t, abcrun) , pool.dists)
            
            # plot theta
            plot_thetas(pool.thetas, pool.ws , pool.t, 
                    truths=data_hod, plot_range=prior_range, 
                    theta_filename=theta_file(pool.t, abcrun),
                    output_dir=util.abc_dir())

            eps.eps = np.median(np.atleast_2d(pool.dists), axis = 0)

            pools.append(pool)
        abcpmc_sampler.close()
        return pools
         
    print "Initial launch of the sampler"
    pools = launch(eps_val)