def __init__(self, priors, likelihood, global_options={}, manual_constraints={}, fixed_parameters={}): """Constructor.""" self.init_args = { 'priors': priors, 'likelihood': likelihood, 'global_options': global_options, 'manual_constraints': manual_constraints, 'fixed_parameters': fixed_parameters } self.parameters = eos.Parameters.Defaults() self.global_options = eos.Options() self.log_likelihood = eos.LogLikelihood(self.parameters) self.log_posterior = eos.LogPosterior(self.log_likelihood) self.varied_parameters = [] self.bounds = [] eos.info( 'Creating analysis with {nprior} priors, {nconst} EOS-wide constraints, {nopts} global options, {nmanual} manually-entered constraints and {nparams} fixed parameters.' .format(nprior=len(priors), nconst=len(likelihood), nopts=len(global_options), nmanual=len(manual_constraints), nparams=len(fixed_parameters))) eos.debug('priors:') for p in priors: eos.debug(' - {name} ({type}) [{min}, {max}]'.format( name=p['parameter'], type=p['type'], min=p['min'], max=p['max'])) eos.debug('constraints:') for cn in likelihood: eos.debug(' - {name}'.format(name=cn)) eos.debug('manual_constraints:') for cn, ce in manual_constraints.items(): eos.debug(' - {name}'.format(name=cn)) eos.debug('fixed_parameters:') for pn, pe in fixed_parameters.items(): eos.debug(' - {name}'.format(name=pn)) # collect the global options for key, value in global_options.items(): self.global_options.set(key, value) # Fix specified parameters for param, value in fixed_parameters.items(): self.parameters.set(param, value) # create the priors for prior in priors: parameter = prior['parameter'] minv = prior['min'] maxv = prior['max'] prior_type = prior['type'] if 'type' in prior else 'uniform' if 'uniform' == prior_type or 'flat' == prior_type: self.log_posterior.add( eos.LogPrior.Flat(self.parameters, parameter, eos.ParameterRange(minv, maxv)), False) elif 'gauss' == prior_type or 'gaussian' == prior_type: central = prior['central'] sigma = prior['sigma'] if type(sigma) is list or type(sigma) is tuple: sigma_lo = sigma[0] sigma_hi = sigma[1] else: sigma_lo = sigma sigma_hi = sigma self.log_posterior.add( eos.LogPrior.Gauss(self.parameters, parameter, eos.ParameterRange(minv, maxv), central - sigma_lo, central, central + sigma_hi), False) else: raise ValueError( 'Unknown prior type \'{}\''.format(prior_type)) self.bounds.append((minv, maxv)) p = self.parameters[parameter] p.set_min(minv) p.set_max(maxv) self.varied_parameters.append(p) # create the likelihood for constraint_name in likelihood: constraint = eos.Constraint.make(constraint_name, self.global_options) self.log_likelihood.add(constraint) # add manual constraints to the likelihood for constraint_name, constraint_data in manual_constraints.items(): import yaml yaml_string = yaml.dump(constraint_data) constraint_entry = eos.ConstraintEntry.deserialize( constraint_name, yaml_string) constraint = constraint_entry.make(constraint_name, self.global_options) self.log_likelihood.add(constraint) # perform some sanity checks varied_parameter_names = set( [p.name() for p in self.varied_parameters]) used_parameter_names = set() for observable in self.log_likelihood.observable_cache(): for i in observable.used_parameter_ids(): used_parameter_names.add(self.parameters.by_id(i).name()) used_but_unvaried = used_parameter_names - varied_parameter_names if (len(used_but_unvaried) > 0): eos.info( 'likelihood probably depends on {} parameter(s) that do not appear in the prior; check prior?' .format(len(used_but_unvaried))) for n in used_but_unvaried: eos.debug('used, but not included in any prior: \'{}\''.format(n)) for n in varied_parameter_names - used_parameter_names: eos.warn( 'likelihood does not depend on parameter \'{}\'; remove from prior or check options!' .format(n))
def __init__(self, priors, likelihood, global_options=None): """Constructor.""" self.init_args = { 'priors': priors, 'likelihood': likelihood, 'global_options': global_options } self.parameters = eos.Parameters.Defaults() self.global_options = eos.Options() self.log_likelihood = eos.LogLikelihood(self.parameters) self.log_posterior = eos.LogPosterior(self.log_likelihood) self.varied_parameters = [] self.bounds = [] # collect the global options if global_options: for key, value in global_options.items(): self.global_options.set(key, value) # create the priors for prior in priors: parameter = prior['parameter'] minv = prior['min'] maxv = prior['max'] prior_type = prior['type'] if 'type' in prior else 'uniform' if 'uniform' == prior_type or 'flat' == prior_type: self.log_posterior.add( eos.LogPrior.Flat(self.parameters, parameter, eos.ParameterRange(minv, maxv)), False) elif 'gauss' == prior_type or 'gaussian' == prior_type: central = prior['central'] sigma = prior['sigma'] if type(sigma) is list or type(sigma) is tuple: sigma_lo = sigma[0] sigma_hi = sigma[1] else: sigma_lo = sigma sigma_hi = sigma self.log_posterior.add( eos.LogPrior.Gauss(self.parameters, parameter, eos.ParameterRange(minv, maxv), central - sigma_lo, central, central + sigma_hi), False) else: raise ValueError( 'Unknown prior type \'{}\''.format(prior_type)) self.bounds.append((minv, maxv)) self.varied_parameters.append(self.parameters[parameter]) # create the likelihood for constraint_name in likelihood: constraint = eos.Constraint.make(constraint_name, self.global_options) self.log_likelihood.add(constraint) # perform some sanity checks varied_parameter_names = set( [p.name() for p in self.varied_parameters]) used_parameter_names = set() for observable in self.log_likelihood.observable_cache(): for i in observable.used_parameter_ids(): used_parameter_names.add(self.parameters.by_id(i).name()) for n in used_parameter_names - varied_parameter_names: info( 'likelihood probably depends on parameter \'{}\', but this parameter does not appear in the prior; check prior?' .format(n)) for n in varied_parameter_names - used_parameter_names: warn( 'likelihood does not depend on parameter \'{}\'; remove from prior or check options!' .format(n))