def optimise(self, problem, rundir=None): if rundir is not None: self.dump(filename=op.join(rundir, 'optimiser.yaml')) history = ModelHistory(problem, nchains=self.nchains, path=rundir, mode='w') chains = self.chains(problem, history) niter = self.niterations isbad_mask = None self._tlog_last = 0 for iiter in range(niter): iphase, phase, iiter_phase = self.get_sampler_phase(iiter) self.log_progress(problem, iiter, niter, phase, iiter_phase) sample = phase.get_sample(problem, iiter_phase, chains) sample.iphase = iphase if isbad_mask is not None and num.any(isbad_mask): isok_mask = num.logical_not(isbad_mask) else: isok_mask = None misfits = problem.misfits(sample.model, mask=isok_mask) bootstrap_misfits = problem.combine_misfits( misfits, extra_weights=self.get_bootstrap_weights(problem), extra_residuals=self.get_bootstrap_residuals(problem)) isbad_mask_new = num.isnan(misfits[:, 0]) if isbad_mask is not None and num.any( isbad_mask != isbad_mask_new): errmess = [ 'problem %s: inconsistency in data availability' ' at iteration %i' % (problem.name, iiter)] for target, isbad_new, isbad in zip( problem.targets, isbad_mask_new, isbad_mask): if isbad_new != isbad: errmess.append(' %s, %s -> %s' % ( target.string_id(), isbad, isbad_new)) raise BadProblem('\n'.join(errmess)) isbad_mask = isbad_mask_new if num.all(isbad_mask): raise BadProblem( 'Problem %s: all target misfit values are NaN.' % problem.name) history.append( sample.model, misfits, bootstrap_misfits, sample.pack_context())
def get_history(self, subset=None): if subset not in self._histories: self._histories[subset] = \ ModelHistory( self.get_problem(), nchains=self.get_optimiser().nchains, path=meta.xjoin(self.get_rundir_path(), subset)) return self._histories[subset]