Tspan=args.tspan) x0 = np.hstack(p.sample() for p in pta.params) ndim = x0.size # initial jump covariance matrix cov = np.diag(np.ones(ndim) * 0.01**2) # set up jump groups by red noise groups groups = model_utils.get_parameter_groups(pta) sampler = ptmcmc(ndim, pta.get_lnlikelihood, pta.get_lnprior, cov, groups=groups, outDir=args.outdir, resume=True) achrom_freqs = get_freqs(pta) np.save(args.outdir + 'pars.npy', pta.param_names) np.save(args.outdir + 'par_model.npy', np.array(pta.params).astype(str)) np.save(args.outdir + 'signals.npy', list(pta.signals.keys())) np.savetxt(args.outdir + 'achrom_rn_freqs.txt', achrom_freqs, fmt='%.18e') jp = model_utils.JumpProposal(pta) sampler.addProposalToCycle(jp.draw_from_prior, 15) sampler.addProposalToCycle(jp.draw_from_red_prior, 15) sampler.addProposalToCycle(jp.draw_from_gwb_log_uniform_distribution, 15) if args.bayes_ephem:
def setup_sampler(pta, outdir='chains', resume=False, empirical_distr=None): """ Sets up an instance of PTMCMC sampler. We initialize the sampler the likelihood and prior function from the PTA object. We set up an initial jump covariance matrix with fairly small jumps as this will be adapted as the MCMC runs. We will setup an output directory in `outdir` that will contain the chain (first n columns are the samples for the n parameters and last 4 are log-posterior, log-likelihood, acceptance rate, and an indicator variable for parallel tempering but it doesn't matter because we aren't using parallel tempering). We then add several custom jump proposals to the mix based on whether or not certain parameters are in the model. These are all either draws from the prior distribution of parameters or draws from uniform distributions. """ # dimension of parameter space params = pta.param_names ndim = len(params) # initial jump covariance matrix cov = np.diag(np.ones(ndim) * 0.1**2) # parameter groupings groups = get_parameter_groups(pta) sampler = ptmcmc(ndim, pta.get_lnlikelihood, pta.get_lnprior, cov, groups=groups, outDir=outdir, resume=resume) np.savetxt(outdir+'/pars.txt', list(map(str, pta.param_names)), fmt='%s') np.savetxt(outdir+'/priors.txt', list(map(lambda x: str(x.__repr__()), pta.params)), fmt='%s') # additional jump proposals jp = JumpProposal(pta, empirical_distr=empirical_distr) # always add draw from prior sampler.addProposalToCycle(jp.draw_from_prior, 5) # try adding empirical proposals if empirical_distr is not None: print('Adding empirical proposals...\n') sampler.addProposalToCycle(jp.draw_from_empirical_distr, 10) # Red noise prior draw if 'red noise' in jp.snames: print('Adding red noise prior draws...\n') sampler.addProposalToCycle(jp.draw_from_red_prior, 10) # DM GP noise prior draw if 'dm_gp' in jp.snames: print('Adding DM GP noise prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm_gp_prior, 10) # DM annual prior draw if 'dm_s1yr' in jp.snames: print('Adding DM annual prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm1yr_prior, 10) # DM dip prior draw if 'dmexp' in jp.snames: print('Adding DM exponential dip prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmexpdip_prior, 10) # DM cusp prior draw if 'dm_cusp' in jp.snames: print('Adding DM exponential cusp prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmexpcusp_prior, 10) # DMX prior draw if 'dmx_signal' in jp.snames: print('Adding DMX prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmx_prior, 10) # Ephemeris prior draw if 'd_jupiter_mass' in pta.param_names: print('Adding ephemeris model prior draws...\n') sampler.addProposalToCycle(jp.draw_from_ephem_prior, 10) # GWB uniform distribution draw if 'gw_log10_A' in pta.param_names: print('Adding GWB uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_gwb_log_uniform_distribution, 10) # Dipole uniform distribution draw if 'dipole_log10_A' in pta.param_names: print('Adding dipole uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_dipole_log_uniform_distribution, 10) # Monopole uniform distribution draw if 'monopole_log10_A' in pta.param_names: print('Adding monopole uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_monopole_log_uniform_distribution, 10) # Altpol uniform distribution draw if 'log10Apol_tt' in pta.param_names: print('Adding alternative GW-polarization uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_altpol_log_uniform_distribution, 10) # BWM prior draw if 'bwm_log10_A' in pta.param_names: print('Adding BWM prior draws...\n') sampler.addProposalToCycle(jp.draw_from_bwm_prior, 10) # CW prior draw if 'cw_log10_h' in pta.param_names: print('Adding CW strain prior draws...\n') sampler.addProposalToCycle(jp.draw_from_cw_log_uniform_distribution, 10) if 'cw_log10_Mc' in pta.param_names: print('Adding CW prior draws...\n') sampler.addProposalToCycle(jp.draw_from_cw_distribution, 10) return sampler
def setup_sampler(self, outdir='chains', resume=False, sample_nmodel=True, empirical_distr=None, groups=None): """ Sets up an instance of PTMCMC sampler. We initialize the sampler the likelihood and prior function from the PTA object. We set up an initial jump covariance matrix with fairly small jumps as this will be adapted as the MCMC runs. We will setup an output directory in `outdir` that will contain the chain (first n columns are the samples for the n parameters and last 4 are log-posterior, log-likelihood, acceptance rate, and an indicator variable for parallel tempering but it doesn't matter because we aren't using parallel tempering). We then add several custom jump proposals to the mix based on whether or not certain parameters are in the model. These are all either draws from the prior distribution of parameters or draws from uniform distributions. """ # dimension of parameter space ndim = len(self.param_names) # initial jump covariance matrix cov = np.diag(np.ones(ndim) * 1**2) ## used to be 0.1 # parameter groupings if groups is None: groups = self.get_parameter_groups() sampler = ptmcmc(ndim, self.get_lnlikelihood, self.get_lnprior, cov, groups=groups, outDir=outdir, resume=resume) np.savetxt(outdir+'/pars.txt', self.param_names, fmt='%s') np.savetxt(outdir+'/priors.txt', self.params, fmt='%s') # additional jump proposals jp = JumpProposal(self, self.snames, empirical_distr=empirical_distr) # always add draw from prior sampler.addProposalToCycle(jp.draw_from_prior, 5) # try adding empirical proposals if empirical_distr is not None: print('Adding empirical proposals...\n') sampler.addProposalToCycle(jp.draw_from_empirical_distr, 25) # Red noise prior draw if 'red noise' in self.snames: print('Adding red noise prior draws...\n') sampler.addProposalToCycle(jp.draw_from_red_prior, 10) # DM GP noise prior draw if 'dm_gp' in self.snames: print('Adding DM GP noise prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm_gp_prior, 10) # DM annual prior draw if 'dm_s1yr' in jp.snames: print('Adding DM annual prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm1yr_prior, 10) # DM dip prior draw if 'dmexp' in '\t'.join(jp.snames): print('Adding DM exponential dip prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmexpdip_prior, 10) # DM cusp prior draw if 'dm_cusp' in jp.snames: print('Adding DM exponential cusp prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmexpcusp_prior, 10) # DMX prior draw if 'dmx_signal' in jp.snames: print('Adding DMX prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmx_prior, 10) # SW prior draw if 'gp_sw' in jp.snames: print('Adding Solar Wind DM GP prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm_sw_prior, 10) # Ephemeris prior draw if 'd_jupiter_mass' in self.param_names: print('Adding ephemeris model prior draws...\n') sampler.addProposalToCycle(jp.draw_from_ephem_prior, 10) # GWB uniform distribution draw if 'gw_log10_A' in self.param_names: print('Adding GWB uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_gwb_log_uniform_distribution, 10) # Dipole uniform distribution draw if 'dipole_log10_A' in self.param_names: print('Adding dipole uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_dipole_log_uniform_distribution, 10) # Monopole uniform distribution draw if 'monopole_log10_A' in self.param_names: print('Adding monopole uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_monopole_log_uniform_distribution, 10) # BWM prior draw if 'bwm_log10_A' in self.param_names: print('Adding BWM prior draws...\n') sampler.addProposalToCycle(jp.draw_from_bwm_prior, 10) # FDM prior draw if 'fdm_log10_A' in self.param_names: print('Adding FDM prior draws...\n') sampler.addProposalToCycle(jp.draw_from_fdm_prior, 10) # CW prior draw if 'cw_log10_h' in self.param_names: print('Adding CW prior draws...\n') sampler.addProposalToCycle(jp.draw_from_cw_log_uniform_distribution, 10) # Prior distribution draw for parameters named GW if any([str(p).split(':')[0] for p in list(self.params) if 'gw' in str(p)]): print('Adding gw param prior draws...\n') sampler.addProposalToCycle(jp.draw_from_par_prior( par_names=[str(p).split(':')[0] for p in list(self.params) if 'gw' in str(p)]), 10) # Model index distribution draw if sample_nmodel: if 'nmodel' in self.param_names: print('Adding nmodel uniform distribution draws...\n') sampler.addProposalToCycle(self.draw_from_nmodel_prior, 25) return sampler
def setup_sampler(pta, outdir='chains', resume=False): """ Sets up an instance of PTMCMC sampler. We initialize the sampler the likelihood and prior function from the PTA object. We set up an initial jump covariance matrix with fairly small jumps as this will be adapted as the MCMC runs. We will setup an output directory in `outdir` that will contain the chain (first n columns are the samples for the n parameters and last 4 are log-posterior, log-likelihood, acceptance rate, and an indicator variable for parallel tempering but it doesn't matter because we aren't using parallel tempering). We then add several custom jump proposals to the mix based on whether or not certain parameters are in the model. These are all either draws from the prior distribution of parameters or draws from uniform distributions. """ # dimension of parameter space ndim = len(pta.param_names) # initial jump covariance matrix cov = np.diag(np.ones(ndim) * 0.1**2) # parameter groupings groups = get_parameter_groups(pta) sampler = ptmcmc(ndim, pta.get_lnlikelihood, pta.get_lnprior, cov, groups=groups, outDir=outdir, resume=resume) np.savetxt(outdir + '/pars.txt', list(map(str, pta.param_names)), fmt='%s') np.savetxt(outdir + '/priors.txt', list(map(lambda x: str(x.__repr__()), pta.params)), fmt='%s') # additional jump proposals jp = JumpProposal(pta) # always add draw from prior sampler.addProposalToCycle(jp.draw_from_prior, 5) # Ephemeris prior draw if 'd_jupiter_mass' in pta.param_names: print('Adding ephemeris model prior draws...\n') sampler.addProposalToCycle(jp.draw_from_ephem_prior, 10) # GWB uniform distribution draw if 'log10_A_gw' in pta.param_names: print('Adding GWB uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_gwb_log_uniform_distribution, 10) # Dipole uniform distribution draw if 'log10_A_dipole' in pta.param_names: print('Adding dipole uniform distribution draws...\n') sampler.addProposalToCycle( jp.draw_from_dipole_log_uniform_distribution, 10) # GWB uniform distribution draw if 'log10_A_monopole' in pta.param_names: print('Adding monopole uniform distribution draws...\n') sampler.addProposalToCycle( jp.draw_from_monopole_log_uniform_distribution, 10) return sampler
# initial jump covariance matrix cov = np.diag(np.ones(ndim) * 0.01**2) # Now we figure out which indices the red noise parameters have rn_idx1 = pta.param_names.index(psr.name + '_red_noise_log10_A') rn_idx2 = pta.param_names.index(psr.name + '_red_noise_gamma') # set up jump groups by red noise groups ndim = len(xs) groups = [range(0, ndim)] groups.extend([[rn_idx1, rn_idx2]]) # intialize sampler sampler = ptmcmc(ndim, pta.get_lnlikelihood, pta.get_lnprior, cov, groups=groups, outDir=psroutdir) # sampler for N steps N = int(1e6) x0 = np.hstack(p.sample() for p in pta.params) sampler.sample(x0, N, SCAMweight=30, AMweight=15, DEweight=50) chain = np.loadtxt(psroutdir + 'chain_1.txt') pars = sorted(xs.keys()) burn = int(0.25 * chain.shape[0]) #make dictionary of pulsar parameters from these runs psr_dict[psr.name] = {} for idx, param_name in enumerate(pars):
def setup_sampler(pta, outdir='chains', resume=False, empirical_distr=None, groups=None, human=None): """ Sets up an instance of PTMCMC sampler. We initialize the sampler the likelihood and prior function from the PTA object. We set up an initial jump covariance matrix with fairly small jumps as this will be adapted as the MCMC runs. We will setup an output directory in `outdir` that will contain the chain (first n columns are the samples for the n parameters and last 4 are log-posterior, log-likelihood, acceptance rate, and an indicator variable for parallel tempering but it doesn't matter because we aren't using parallel tempering). We then add several custom jump proposals to the mix based on whether or not certain parameters are in the model. These are all either draws from the prior distribution of parameters or draws from uniform distributions. """ # dimension of parameter space params = pta.param_names ndim = len(params) # initial jump covariance matrix if os.path.exists(outdir + '/cov.npy'): cov = np.load(outdir + '/cov.npy') else: cov = np.diag(np.ones(ndim) * 0.1**2) # parameter groupings if groups is None: groups = get_parameter_groups(pta) sampler = ptmcmc(ndim, pta.get_lnlikelihood, pta.get_lnprior, cov, groups=groups, outDir=outdir, resume=resume) save_runtime_info(pta, sampler.outDir, human) # additional jump proposals jp = JumpProposal(pta, empirical_distr=empirical_distr) sampler.jp = jp # always add draw from prior sampler.addProposalToCycle(jp.draw_from_prior, 5) # try adding empirical proposals if empirical_distr is not None: print('Attempting to add empirical proposals...\n') sampler.addProposalToCycle(jp.draw_from_empirical_distr, 10) # Red noise prior draw if 'red noise' in jp.snames: print('Adding red noise prior draws...\n') sampler.addProposalToCycle(jp.draw_from_red_prior, 10) # DM GP noise prior draw if 'dm_gp' in jp.snames: print('Adding DM GP noise prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm_gp_prior, 10) # DM annual prior draw if 'dm_s1yr' in jp.snames: print('Adding DM annual prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dm1yr_prior, 10) # DM dip prior draw if 'dmexp' in jp.snames: print('Adding DM exponential dip prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmexpdip_prior, 10) # DM cusp prior draw if 'dm_cusp' in jp.snames: print('Adding DM exponential cusp prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmexpcusp_prior, 10) # DMX prior draw if 'dmx_signal' in jp.snames: print('Adding DMX prior draws...\n') sampler.addProposalToCycle(jp.draw_from_dmx_prior, 10) # Ephemeris prior draw if 'd_jupiter_mass' in pta.param_names: print('Adding ephemeris model prior draws...\n') sampler.addProposalToCycle(jp.draw_from_ephem_prior, 10) # GWB uniform distribution draw if np.any([('gw' in par and 'log10_A' in par) for par in pta.param_names]): print('Adding GWB uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_gwb_log_uniform_distribution, 10) # Dipole uniform distribution draw if 'dipole_log10_A' in pta.param_names: print('Adding dipole uniform distribution draws...\n') sampler.addProposalToCycle( jp.draw_from_dipole_log_uniform_distribution, 10) # Monopole uniform distribution draw if 'monopole_log10_A' in pta.param_names: print('Adding monopole uniform distribution draws...\n') sampler.addProposalToCycle( jp.draw_from_monopole_log_uniform_distribution, 10) # Altpol uniform distribution draw if 'log10Apol_tt' in pta.param_names: print( 'Adding alternative GW-polarization uniform distribution draws...\n' ) sampler.addProposalToCycle( jp.draw_from_altpol_log_uniform_distribution, 10) # print('Adding alternative GW-polarization uniform distribution draws...\n') # sampler.addProposalToCycle(jp.draw_from_polar_log_uniform_distribution, 10) # TT uniform distribution draw if 'log10_A_TT' in pta.param_names: print('Adding TT uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_TT_log_uniform_distribution, 10) # ST uniform distribution draw if 'log10_A_ST' in pta.param_names: print('Adding ST uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_ST_log_uniform_distribution, 10) # VL uniform distribution draw if 'log10_A_VL' in pta.param_names: print('Adding VL uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_VL_log_uniform_distribution, 10) # SL uniform distribution draw if 'log10_A_SL' in pta.param_names: print('Adding SL uniform distribution draws...\n') sampler.addProposalToCycle(jp.draw_from_SL_log_uniform_distribution, 10) # BWM prior draw if 'bwm_log10_A' in pta.param_names: print('Adding BWM prior draws...\n') sampler.addProposalToCycle(jp.draw_from_bwm_prior, 10) # FDM prior draw if 'fdm_log10_A' in pta.param_names: print('Adding FDM prior draws...\n') sampler.addProposalToCycle(jp.draw_from_fdm_prior, 10) # CW prior draw if 'cw_log10_h' in pta.param_names: print('Adding CW strain prior draws...\n') sampler.addProposalToCycle(jp.draw_from_cw_log_uniform_distribution, 10) if 'cw_log10_Mc' in pta.param_names: print('Adding CW prior draws...\n') sampler.addProposalToCycle(jp.draw_from_cw_distribution, 10) # SL uniform distribution draw if 'bin_orf_A1' in pta.param_names: print('Adding bin-orf prior draws...\n') sampler.addProposalToCycle(jp.draw_from_bin_orf_uniform_distribution, 10) return sampler
## sampler ## ############### # dimension of parameter space x0 = np.hstack(p.sample() for p in pta.params) ndim = len(x0) # initial jump covariance matrix cov = np.diag(np.ones(ndim) * 0.1**2) # parameter groupings groups = get_parameter_groups(pta) sampler = ptmcmc(ndim, pta.get_lnlikelihood, pta.get_lnprior, cov, groups=groups, outDir=rundir, resume=False) # add prior draws to proposal cycle jp = JumpProposal(pta) sampler.addProposalToCycle(jp.draw_from_prior, 5) sampler.addProposalToCycle(jp.draw_from_bwm_prior, 5) if amp_prior == 'uniform': draw_bwm_loguni = jp.build_log_uni_draw('bwm_log10_A', logminA, logmaxA, logparam=True) sampler.addProposalToCycle(draw_bwm_loguni, 10)
t0=par[9], epsilon=par[10], zeta=par[11], eta=par[12], Ms=par[13], theta=par[14], sigma=par[15], e0=par[16], rho=par[17]) model = mr.mergerrate(M1, q, z, f, **initpar).hmodelt(fbin=None)[0] l = -0.5 / (data[:, 5] * data[:, 5]) * (model - data[:, 2]) * ( model - data[:, 2]) - 0.5 * np.log10(2 * np.pi) #detection return np.sum(l) x0 = np.array([ -2.8, -0.2, 11.25, -1.25, 0., 0.025, 0.8, 0., 0., 1., 0., -0.5, 0., 8.25, 1., 0.4, 0.5, 0. ]) ndim = len(x0) cov = np.diag(np.ones(ndim) * 0.01**2) N = 1000000 sampler = ptmcmc(ndim, log_likelihood, log_prior, cov, outDir='./output', resume=False) sampler.sample(x0, N, SCAMweight=30, AMweight=15, DEweight=50)