Compute As and example0 now works

This commit is contained in:
Deaglan Bartlett 2025-04-16 17:56:40 +02:00
parent 778aa6feb2
commit 1102fd781b
4 changed files with 278 additions and 8 deletions

222
Plotting.ipynb Normal file

File diff suppressed because one or more lines are too long

View file

@ -120,7 +120,7 @@ def get_spectra(ini_name, dirname, mcmc_steps, which_field='BORG_final_density',
idx = mcmc_steps[i] idx = mcmc_steps[i]
with h5.File(dirname + "/mcmc_%d.h5" % idx,'r') as mcmc_file: with h5.File(dirname + "/mcmc_%d.h5" % idx,'r') as mcmc_file:
delta2 = np.array(mcmc_file['scalars/{which_field}'][...],dtype=np.float64) delta2 = np.array(mcmc_file[f'scalars/{which_field}'][...],dtype=np.float64)
with suppress_stdout(): with suppress_stdout():
Pk = PKL.XPk([delta1.astype(np.float32),delta2.astype(np.float32)], boxsize, axis=0, MAS=[MAS, MAS], threads=1) Pk = PKL.XPk([delta1.astype(np.float32),delta2.astype(np.float32)], boxsize, axis=0, MAS=[MAS, MAS], threads=1)

View file

@ -40,6 +40,42 @@ def get_cosmopar(ini_file):
cpar.n_s = float(config['cosmology']['n_s']) cpar.n_s = float(config['cosmology']['n_s'])
cpar.w = float(config['cosmology']['w']) cpar.w = float(config['cosmology']['w'])
cpar.wprime = float(config['cosmology']['wprime']) cpar.wprime = float(config['cosmology']['wprime'])
cpar = compute_As(cpar)
return cpar
def compute_As(cpar):
"""
Compute As given values of sigma8
Args:
:cpar (borg.cosmo.CosmologicalParameters): Cosmological parameters with wrong As
Returns:
:cpar (borg.cosmo.CosmologicalParameters): Cosmological parameters with updated As
"""
# requires BORG-CLASS
if not hasattr(borg.cosmo, 'ClassCosmo'):
raise ImportError(
"BORG-CLASS is required to compute As, but is not installed.")
sigma8_true = jnp.copy(cpar.sigma8)
cpar.sigma8 = 0
cpar.A_s = 2.3e-9
k_max, k_per_decade = 10, 100
extra_class = {}
extra_class['YHe'] = '0.24'
cosmo = borg.cosmo.ClassCosmo(cpar, k_per_decade, k_max, extra=extra_class)
cosmo.computeSigma8()
cos = cosmo.getCosmology()
cpar.A_s = (sigma8_true/cos['sigma_8'])**2*cpar.A_s
cpar.sigma8 = sigma8_true
print('Updated cosmology:', cpar)
return cpar return cpar
@ -73,7 +109,8 @@ class MyLikelihood(borg.likelihood.BaseLikelihood):
self.grad_like = jax.grad(self.dens2like) self.grad_like = jax.grad(self.dens2like)
def updateCosmology(self, cosmo: borg.cosmo.CosmologicalParameters) -> None: def updateCosmology(self, cosmo: borg.cosmo.CosmologicalParameters) -> None:
self.fwd.setCosmoParams(cosmo) cpar = compute_As(cosmo)
self.fwd.setCosmoParams(cpar)
def updateMetaParameters(self, state: borg.likelihood.MarkovState) -> None: def updateMetaParameters(self, state: borg.likelihood.MarkovState) -> None:
""" """
@ -83,7 +120,8 @@ class MyLikelihood(borg.likelihood.BaseLikelihood):
- state (borg.likelihood.MarkovState): The state object to be used in the likelihood. - state (borg.likelihood.MarkovState): The state object to be used in the likelihood.
""" """
cpar = state['cosmology'] cosmo = state['cosmology']
cpar = compute_As(cosmo)
self.fwd.setCosmoParams(cpar) self.fwd.setCosmoParams(cpar)
def initializeLikelihood(self, state: borg.likelihood.MarkovState) -> None: def initializeLikelihood(self, state: borg.likelihood.MarkovState) -> None:
@ -115,6 +153,7 @@ class MyLikelihood(borg.likelihood.BaseLikelihood):
# This version is self-consistnet # This version is self-consistnet
dens = np.zeros(self.fwd.getOutputBoxModel().N) dens = np.zeros(self.fwd.getOutputBoxModel().N)
myprint('Running forward model') myprint('Running forward model')
myprint(self.fwd.getCosmoParams())
self.fwd.forwardModel_v2(s_hat) self.fwd.forwardModel_v2(s_hat)
self.fwd.getDensityFinal(dens) self.fwd.getDensityFinal(dens)
state["BORG_final_density"][:] = dens state["BORG_final_density"][:] = dens
@ -128,6 +167,8 @@ class MyLikelihood(borg.likelihood.BaseLikelihood):
myprint('From mock') myprint('From mock')
self.saved_s_hat = s_hat.copy() self.saved_s_hat = s_hat.copy()
self.logLikelihoodComplex(s_hat, False) self.logLikelihoodComplex(s_hat, False)
self.commitAuxiliaryFields(state)
myprint('Done')
def dens2like(self, output_density: np.ndarray): def dens2like(self, output_density: np.ndarray):
@ -149,7 +190,7 @@ class MyLikelihood(borg.likelihood.BaseLikelihood):
def logLikelihoodComplex(self, s_hat:np.ndarray, gradientIsNext:bool): def logLikelihoodComplex(self, s_hat:np.ndarray, gradientIsNext:bool):
myprint('Getting density field now') # myprint('Getting density field now')
# Get the density field from the forward model # Get the density field from the forward model
dens = np.zeros(self.fwd.getOutputBoxModel().N) dens = np.zeros(self.fwd.getOutputBoxModel().N)
self.fwd.forwardModel_v2(s_hat) self.fwd.forwardModel_v2(s_hat)
@ -193,7 +234,7 @@ class MyLikelihood(borg.likelihood.BaseLikelihood):
""" """
self.updateCosmology(self.fwd.getCosmoParams()) self.updateCosmology(self.fwd.getCosmoParams())
self.dens2like(self.delta) self.dens2like(self.delta)
state["BORG_final_density"][:] = self.delta state["BORG_final_density"][:] = self.delta.copy()
@borg.registerGravityBuilder @borg.registerGravityBuilder
@ -215,7 +256,7 @@ def build_gravity_model(state: borg.likelihood.MarkovState, box: borg.forward.Bo
myprint("Building gravity model") myprint("Building gravity model")
# READ FROM INI FILE # READ FROM INI FILE
which_model = 'cola' which_model = 'lpt'
ai = 0.05 # Initial scale factor ai = 0.05 # Initial scale factor
af = 1.0 # Final scale factor af = 1.0 # Final scale factor
supersampling = 2 supersampling = 2
@ -228,11 +269,15 @@ def build_gravity_model(state: borg.likelihood.MarkovState, box: borg.forward.Bo
chain.addModel(borg.forward.models.HermiticEnforcer(box)) chain.addModel(borg.forward.models.HermiticEnforcer(box))
# CLASS transfer function # CLASS transfer function
# chain @= borg.forward.model_lib.M_PRIMORDIAL_AS(box) chain @= borg.forward.model_lib.M_PRIMORDIAL_AS(box)
transfer_class = borg.forward.model_lib.M_TRANSFER_CLASS(box, opts=dict(a_transfer=1.0)) transfer_class = borg.forward.model_lib.M_TRANSFER_CLASS(box, opts=dict(a_transfer=1.0))
transfer_class.setModelParams({"extra_class_arguments":{'YHe':'0.24'}}) # helps deals with errors with primordial physics in CLASS for weird cosmologies transfer_class.setModelParams({"extra_class_arguments":{'YHe':'0.24'}}) # helps deals with errors with primordial physics in CLASS for weird cosmologies
chain @= transfer_class chain @= transfer_class
# This one works
# chain @= borg.forward.models.Primordial(box, ai)
# chain @= borg.forward.models.EisensteinHu(box)
# Gravity model # Gravity model
if which_model == 'lpt': if which_model == 'lpt':
mod = borg.forward.model_lib.M_LPT_CIC( mod = borg.forward.model_lib.M_LPT_CIC(
@ -280,12 +325,15 @@ def build_gravity_model(state: borg.likelihood.MarkovState, box: borg.forward.Bo
pm_nsteps=nsteps, # Number of steps in the PM solver pm_nsteps=nsteps, # Number of steps in the PM solver
tcola=True tcola=True
)) ))
else:
raise ValueError(f"Unknown model {which_model}")
mod.accumulateAdjoint(True) mod.accumulateAdjoint(True)
chain @= mod chain @= mod
# Cosmological parameters # Cosmological parameters
cpar = get_cosmopar(borg.getIniConfigurationFilename()) cpar = get_cosmopar(borg.getIniConfigurationFilename())
print('Setting cosmo params', cpar)
chain.setCosmoParams(cpar) chain.setCosmoParams(cpar)
return chain return chain

View file

@ -53,7 +53,7 @@ beta = 1.5
z0 = 0 z0 = 0
[mock] [mock]
sigma_dens = 0.1 sigma_dens = 1
[gravity] [gravity]
which_model = lpt which_model = lpt