Skip to content

Commit 28403a8

Browse files
committed
new sampler
Signed-off-by: Anto Idicherian Lonappan <[email protected]>
1 parent 3557165 commit 28403a8

File tree

3 files changed

+249
-85
lines changed

3 files changed

+249
-85
lines changed

GPconfig.ini

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
[GENERAL]
2+
n_tasks = 2
3+
self_scale = True
4+
5+
[KERNEL]
6+
interpolate = True
7+
method = cubic
8+
n_points = 100
9+
10+
[COSMO]
11+
cosmo_model = LCDM
12+
sample = False
13+
14+
[ANALYSIS]
15+
method = optimise
16+
17+
[Task_1]
18+
model = SE
19+
nu = 0.0
20+
l_min = 0.001
21+
l_max = 10.0
22+
sigma_f_min = 0.001
23+
sigma_f_max = 10.0
24+
25+
[Task_2]
26+
model = SE
27+
nu = 0.0
28+
l_min = 0.001
29+
l_max = 10.0
30+
sigma_f_min = 0.001
31+
sigma_f_max = 10.0
32+
33+
[INTRINSIC_SCATTER]
34+
sigma_int = 0.1
35+
offset = 0.0001
36+

marcia/Archive/sampler.py

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import emcee
2+
import numpy as np
3+
from marcia import Likelihood as lk
4+
from marcia import temporarily_false
5+
from getdist import plots, MCSamples
6+
import scipy.optimize as op
7+
from chainconsumer import ChainConsumer
8+
import logging
9+
import os
10+
11+
12+
13+
14+
15+
class Sampler:
16+
17+
def __init__(self,model,parameters,data,initial_guess,prior_file=None,
18+
max_n=100000,nwalkers=100,sampler_file='sampler.h5',
19+
resume=False,converge=False):
20+
21+
self.likelihood = lk(model,parameters,data,prior_file)
22+
self.ndim = len(self.likelihood.priors)
23+
self.nwalkers = nwalkers
24+
self.initial_guess = initial_guess
25+
self.max_n = max_n
26+
self.sampler_file = sampler_file
27+
self.resume = resume
28+
self.converge = converge
29+
self.mle = {}
30+
31+
32+
def MLE(self,verbose=True):
33+
if 'result' not in self.mle.keys():
34+
nll = lambda x: -1*self.likelihood.logProb(x)
35+
result = op.minimize(nll, x0=self.initial_guess, method = 'Nelder-Mead', options={'maxfev': None})
36+
if verbose:
37+
print(f'Best-fit values: {result.x}')
38+
print(f'Max-Likelihood value (including prior likelihood):{self.likelihood.logProb(result.x)}')
39+
self.mle['result'] = result.x
40+
41+
return self.mle['result']
42+
43+
44+
def sampler_pos(self):
45+
mle = self.MLE()
46+
pos = [mle+ 1e-4*np.random.randn(self.ndim) for i in range(self.nwalkers)]
47+
return pos
48+
49+
def sampler_w_covergence(self):
50+
backend = emcee.backends.HDFBackend(self.sampler_file)
51+
if os.path.isfile(self.sampler_file) and (not self.resume):
52+
return backend
53+
else:
54+
if self.resume:
55+
print('Resuming from previous run')
56+
else:
57+
backend.reset(self.nwalkers, self.ndim)
58+
sampler = emcee.EnsembleSampler(self.nwalkers, self.ndim, self.likelihood.logProb, backend=backend)
59+
index = 0
60+
autocorr = np.empty(self.max_n)
61+
old_tau = np.inf
62+
for sample in sampler.sample(self.sampler_pos(), iterations=self.max_n, progress=True):
63+
64+
if sampler.iteration % 100:
65+
continue
66+
tau = sampler.get_autocorr_time(tol=0)
67+
autocorr[index] = np.mean(tau)
68+
index += 1
69+
converged = np.all(tau * 100 < sampler.iteration)
70+
converged &= np.all(np.abs(old_tau - tau) / tau < 0.01)
71+
print(f'I:{sampler.iteration}, A:{(tau*100)-sampler.iteration}, T:{np.abs(old_tau - tau) / tau}')
72+
if converged:
73+
print(f'Converged at iteration {sampler.iteration}')
74+
break
75+
old_tau = tau
76+
77+
return sampler
78+
def sampler_wo_covergence(self):
79+
backend = emcee.backends.HDFBackend(self.sampler_file)
80+
if os.path.isfile(self.sampler_file) and (not self.resume):
81+
return backend
82+
else:
83+
if self.resume:
84+
print('Resuming from previous run')
85+
else:
86+
backend.reset(self.nwalkers, self.ndim)
87+
sampler = emcee.EnsembleSampler(self.nwalkers, self.ndim, self.likelihood.logProb, backend=backend)
88+
sampler.run_mcmc(self.sampler_pos(), self.max_n, progress=True)
89+
return sampler
90+
91+
def sampler(self):
92+
if self.converge:
93+
return self.sampler_w_covergence()
94+
else:
95+
return self.sampler_wo_covergence()
96+
97+
#@temporarily_false('resume')
98+
def get_burnin(self):
99+
try:
100+
tau = self.sampler().get_autocorr_time()
101+
burnin = int(2 * np.max(tau))
102+
thin = int(0.5 * np.min(tau))
103+
except:
104+
burnin = 50
105+
thin = 1
106+
return burnin, thin
107+
108+
@temporarily_false('resume')
109+
def get_chain(self,getdist=False):
110+
sampler = self.sampler()
111+
burnin, thin = self.get_burnin()
112+
samples = sampler.get_chain(discard=burnin, thin=thin, flat=True)
113+
if getdist:
114+
lnprob = sampler.get_log_prob(discard=burnin, thin=thin, flat=True)
115+
lnprior = sampler.get_blobs(discard=burnin, thin=thin, flat=True)
116+
if lnprior is None:
117+
lnprior = np.zeros_like(lnprob)
118+
samples = np.concatenate((lnprob[:,None],lnprior[:,None],samples),axis=1)
119+
return samples
120+
121+
@temporarily_false('resume')
122+
def corner_plot(self,getdist=False):
123+
chains = self.get_chain()
124+
names = self.likelihood.theory.param.parameters
125+
labels = [p.replace('$','') for p in self.likelihood.theory.labels]
126+
if getdist:
127+
samples = MCSamples(samples=chains,names=names,labels=labels)
128+
g = plots.get_subplot_plotter()
129+
g.triangle_plot([samples], filled=True)
130+
else:
131+
c = ChainConsumer().add_chain(chains, parameters=self.likelihood.theory.labels)
132+
fig = c.plotter.plot(truth=list(self.MLE(False)))
133+
fig.set_size_inches(3 + fig.get_size_inches())
134+
135+
136+
137+
138+

marcia/sampler.py

+75-85
Original file line numberDiff line numberDiff line change
@@ -1,140 +1,130 @@
11
import emcee
22
import numpy as np
33
from marcia import Likelihood as lk
4-
from marcia import temporarily_false
54
from getdist import plots, MCSamples
65
import scipy.optimize as op
76
from chainconsumer import ChainConsumer
87
import logging
98
import os
109

11-
logging.basicConfig(filename="sampler.log",format='%(asctime)s %(message)s',filemode='w')
12-
logger = logging.getLogger()
13-
logger.setLevel(logging.INFO)
14-
15-
16-
1710
class Sampler:
1811

19-
def __init__(self,model,parameters,data,initial_guess,prior_file=None,
20-
max_n=100000,nwalkers=100,sampler_file='sampler.h5',
21-
resume=False,converge=False):
22-
23-
self.likelihood = lk(model,parameters,data,prior_file)
12+
def __init__(self, model, parameters, data, initial_guess, prior_file=None,
13+
max_n=100000, nwalkers=100, sampler_file='sampler.h5', converge=False,):
14+
15+
self.likelihood = lk(model, parameters, data, prior_file)
2416
self.ndim = len(self.likelihood.priors)
2517
self.nwalkers = nwalkers
2618
self.initial_guess = initial_guess
2719
self.max_n = max_n
28-
self.sampler_file = sampler_file
29-
self.resume = resume
20+
self.HDFBackend = emcee.backends.HDFBackend(sampler_file)
3021
self.converge = converge
3122
self.mle = {}
3223

33-
34-
def MLE(self,verbose=True):
35-
if 'result' not in self.mle.keys():
36-
nll = lambda x: -1*self.likelihood.logProb(x)
37-
result = op.minimize(nll, x0=self.initial_guess, method = 'Nelder-Mead', options={'maxfev': None})
24+
def MLE(self, verbose=True):
25+
if 'result' not in self.mle:
26+
nll = lambda x: -1 * self.likelihood.logProb(x)
27+
result = op.minimize(nll, x0=self.initial_guess, method='Nelder-Mead', options={'maxfev': None})
3828
if verbose:
3929
print(f'Best-fit values: {result.x}')
40-
print(f'Max-Likelihood value (including prior likelihood):{self.likelihood.logProb(result.x)}')
30+
print(f'Max-Likelihood value (including prior likelihood): {self.likelihood.logProb(result.x)}')
4131
self.mle['result'] = result.x
42-
32+
4333
return self.mle['result']
44-
4534

4635
def sampler_pos(self):
4736
mle = self.MLE()
48-
pos = [mle+ 1e-4*np.random.randn(self.ndim) for i in range(self.nwalkers)]
37+
pos = [mle + 1e-4 * np.random.randn(self.ndim) for _ in range(self.nwalkers)]
4938
return pos
50-
51-
def sampler_w_covergence(self):
52-
backend = emcee.backends.HDFBackend(self.sampler_file)
53-
if os.path.isfile(self.sampler_file) and (not self.resume):
54-
return backend
55-
else:
56-
if self.resume:
57-
print('Resuming from previous run')
58-
else:
59-
backend.reset(self.nwalkers, self.ndim)
60-
sampler = emcee.EnsembleSampler(self.nwalkers, self.ndim, self.likelihood.logProb, backend=backend)
61-
index = 0
62-
autocorr = np.empty(self.max_n)
63-
old_tau = np.inf
64-
for sample in sampler.sample(self.sampler_pos(), iterations=self.max_n, progress=True):
6539

66-
if sampler.iteration % 100:
67-
continue
68-
tau = sampler.get_autocorr_time(tol=0)
69-
autocorr[index] = np.mean(tau)
70-
index += 1
71-
converged = np.all(tau * 100 < sampler.iteration)
72-
converged &= np.all(np.abs(old_tau - tau) / tau < 0.01)
73-
logger.info(f'I:{sampler.iteration}, A:{(tau*100)-sampler.iteration}, T:{np.abs(old_tau - tau) / tau}')
74-
if converged:
75-
print(f'Converged at iteration {sampler.iteration}')
76-
break
77-
old_tau = tau
78-
79-
return sampler
80-
def sampler_wo_covergence(self):
81-
backend = emcee.backends.HDFBackend(self.sampler_file)
82-
if os.path.isfile(self.sampler_file) and (not self.resume):
83-
return backend
84-
else:
85-
if self.resume:
86-
print('Resuming from previous run')
40+
def sampler(self,reset=False):
41+
try:
42+
self.HDFBackend.iteration
43+
except OSError:
44+
self.HDFBackend.reset(self.nwalkers, self.ndim)
45+
46+
last_iteration = self.HDFBackend.iteration if self.HDFBackend.iteration is not None else 0
47+
48+
if last_iteration < self.max_n:
49+
if last_iteration == 0:
50+
print('Sampling begins')
8751
else:
88-
backend.reset(self.nwalkers, self.ndim)
89-
sampler = emcee.EnsembleSampler(self.nwalkers, self.ndim, self.likelihood.logProb, backend=backend)
90-
sampler.run_mcmc(self.sampler_pos(), self.max_n, progress=True)
91-
return sampler
92-
93-
def sampler(self):
94-
if self.converge:
95-
return self.sampler_w_covergence()
52+
if reset:
53+
print(f'Reseting sampling from iteration: {last_iteration}')
54+
self.HDFBackend.reset(self.nwalkers, self.ndim)
55+
else:
56+
print(f'Sampling resuming from iteration: {last_iteration}')
57+
sampler = emcee.EnsembleSampler(self.nwalkers, self.ndim, self.likelihood.logProb, backend=self.HDFBackend)
58+
if self.converge:
59+
index = 0
60+
autocorr = np.empty(self.max_n)
61+
old_tau = np.inf
62+
for sample in sampler.sample(self.sampler_pos(), iterations=self.max_n, progress=True):
63+
if sampler.iteration % 100:
64+
continue
65+
tau = sampler.get_autocorr_time(tol=0)
66+
autocorr[index] = np.mean(tau)
67+
index += 1
68+
converged = np.all(tau * 100 < sampler.iteration)
69+
converged &= np.all(np.abs(old_tau - tau) / tau < 0.01)
70+
print(f'I:{sampler.iteration}, A:{(tau*100)-sampler.iteration}, T:{np.abs(old_tau - tau) / tau}')
71+
if converged:
72+
print(f'Converged at iteration {sampler.iteration}')
73+
break
74+
old_tau = tau
75+
return sampler
76+
else:
77+
sampler.run_mcmc(self.sampler_pos(), self.max_n, progress=True)
78+
return sampler
9679
else:
97-
return self.sampler_wo_covergence()
80+
if reset:
81+
print(f'Reseting sampling from iteration: {last_iteration}')
82+
self.HDFBackend.reset(self.nwalkers, self.ndim)
83+
return self.sampler()
84+
print(f'Already completed {last_iteration} iterations')
85+
return self.HDFBackend
9886

99-
#@temporarily_false('resume')
10087
def get_burnin(self):
101-
try:
88+
if self.converge:
10289
tau = self.sampler().get_autocorr_time()
10390
burnin = int(2 * np.max(tau))
10491
thin = int(0.5 * np.min(tau))
105-
except:
92+
else:
10693
burnin = 50
10794
thin = 1
10895
return burnin, thin
10996

110-
@temporarily_false('resume')
111-
def get_chain(self,getdist=False):
112-
sampler = self.sampler()
97+
def get_chain(self, getdist=False,reset=False):
98+
sampler = self.sampler(reset=reset)
11399
burnin, thin = self.get_burnin()
114100
samples = sampler.get_chain(discard=burnin, thin=thin, flat=True)
115101
if getdist:
116102
lnprob = sampler.get_log_prob(discard=burnin, thin=thin, flat=True)
117103
lnprior = sampler.get_blobs(discard=burnin, thin=thin, flat=True)
118104
if lnprior is None:
119105
lnprior = np.zeros_like(lnprob)
120-
samples = np.concatenate((lnprob[:,None],lnprior[:,None],samples),axis=1)
106+
samples = np.concatenate((lnprob[:, None], lnprior[:, None], samples), axis=1)
121107
return samples
122-
123-
@temporarily_false('resume')
124-
def corner_plot(self,getdist=False):
108+
109+
def corner_plot(self, getdist=False):
125110
chains = self.get_chain()
126111
names = self.likelihood.theory.param.parameters
127-
labels = [p.replace('$','') for p in self.likelihood.theory.labels]
112+
labels = [p.replace('$', '') for p in self.likelihood.theory.labels]
128113
if getdist:
129-
samples = MCSamples(samples=chains,names=names,labels=labels)
114+
samples = MCSamples(samples=chains, names=names, labels=labels)
130115
g = plots.get_subplot_plotter()
131116
g.triangle_plot([samples], filled=True)
132117
else:
133118
c = ChainConsumer().add_chain(chains, parameters=self.likelihood.theory.labels)
134119
fig = c.plotter.plot(truth=list(self.MLE(False)))
135-
fig.set_size_inches(3 + fig.get_size_inches())
136-
137-
138-
139-
120+
fig.set_size_inches(3 + fig.get_size_inches())
140121

122+
def get_simple_stat(self):
123+
samples = self.get_chain()
124+
names = self.likelihood.theory.param.parameters
125+
data = {}
126+
for i,name in enumerate(names):
127+
data[name] = {}
128+
data[name]['mean'] = np.mean(samples[:,i])
129+
data[name]['std'] = np.std(samples[:,i])
130+
return data

0 commit comments

Comments
 (0)