def fit( self, model: abstract.AbstractPriorModel, analysis: abstract_search.Analysis ): best_likelihood = float("-inf") best_instance = None likelihoods = list() for list_ in make_lists( no_dimensions=model.prior_count, step_size=self.step_size ): instance = model.instance_from_unit_vector( list_ ) likelihood = analysis.log_likelihood_function( instance ) likelihoods.append(likelihood) if likelihood > best_likelihood: best_likelihood = likelihood best_instance = instance return Result( samples=MockSamples( max_log_likelihood_instance=best_instance, log_likelihood_list=likelihoods, gaussian_tuples=None ), model=model )
def _fit(self, model: AbstractPriorModel, analysis, log_likelihood_cap=None): if self.fit_fast: result = self._fit_fast(model=model, analysis=analysis) return result if model.prior_count == 0: raise AssertionError( "There are no priors associated with the model!") if model.prior_count != len(model.unique_prior_paths): raise AssertionError( "Prior count doesn't match number of unique prior paths") index = 0 unit_vector = model.prior_count * [0.5] while True: try: instance = model.instance_from_unit_vector(unit_vector) fit = analysis.log_likelihood_function(instance) break except exc.FitException as e: unit_vector[index] += 0.1 if unit_vector[index] >= 1: raise e index = (index + 1) % model.prior_count samples = MockSamples( samples=samples_with_log_likelihood_list(self.sample_multiplier * fit), model=model, gaussian_tuples=[ (prior.mean, prior.width if math.isfinite(prior.width) else 1.0) for prior in sorted(model.priors, key=lambda prior: prior.id) ], ) self.paths.save_samples(samples) return MockResult( model=model, samples=samples, )