Example #1
0
    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())
Example #2
0
    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]