Exemple #1
0
    def _estimate(self, trajs):
        """
        Parameters
        ----------
        trajs : ndarray(T, 2) or list of ndarray(T_i, 2)
            Thermodynamic trajectories. Each trajectory is a (T_i, 2)-array
            with T_i time steps. The first column is the thermodynamic state
            index, the second column is the configuration state index.
        """
        # format input if needed
        if isinstance(trajs, _np.ndarray):
            trajs = [trajs]
        # validate input
        assert _types.is_list(trajs)
        for ttraj in trajs:
            _types.assert_array(ttraj, ndim=2, kind='numeric')
            assert _np.shape(ttraj)[1] >= 2

        # harvest state counts
        self.state_counts_full = _util.state_counts(
            [_np.ascontiguousarray(t[:, :2]).astype(_np.intc) for t in trajs],
            nthermo=self.nthermo,
            nstates=self.nstates_full)

        # active set
        self.active_set = _np.where(self.state_counts_full.sum(axis=0) > 0)[0]
        self.state_counts = _np.ascontiguousarray(
            self.state_counts_full[:, self.active_set].astype(_np.intc))
        self.bias_energies = _np.ascontiguousarray(
            self.bias_energies_full[:, self.active_set], dtype=_np.float64)

        # run estimator
        self.therm_energies, self.conf_energies, self.increments, self.loglikelihoods = \
            _wham.estimate(
                self.state_counts, self.bias_energies,
                maxiter=self.maxiter, maxerr=self.maxerr,
                therm_energies=self.therm_energies, conf_energies=self.conf_energies,
                save_convergence_info=self.save_convergence_info)

        # get stationary models
        models = [
            _StationaryModel(
                pi=_np.exp(self.therm_energies[K, _np.newaxis] -
                           self.bias_energies[K, :] - self.conf_energies),
                f=self.bias_energies[K, :] + self.conf_energies,
                normalize_energy=False,
                label="K=%d" % K) for K in range(self.nthermo)
        ]

        # set model parameters to self
        self.set_model_params(models=models,
                              f_therm=self.therm_energies,
                              f=self.conf_energies)

        # done
        return self
Exemple #2
0
    def _estimate(self, trajs):
        # check input
        assert isinstance(trajs, (tuple, list))
        assert len(trajs) == 2
        ttrajs = trajs[0]
        dtrajs = trajs[1]
        # validate input
        for ttraj, dtraj in zip(ttrajs, dtrajs):
            _types.assert_array(ttraj, ndim=1, kind='numeric')
            _types.assert_array(dtraj, ndim=1, kind='numeric')
            assert _np.shape(ttraj)[0] == _np.shape(dtraj)[0]

        # harvest state counts
        self.state_counts_full = _util.state_counts(ttrajs,
                                                    dtrajs,
                                                    nthermo=self.nthermo,
                                                    nstates=self.nstates_full)

        # active set
        self.active_set = _np.where(self.state_counts_full.sum(axis=0) > 0)[0]
        self.state_counts = _np.ascontiguousarray(
            self.state_counts_full[:, self.active_set].astype(_np.intc))
        self.bias_energies = _np.ascontiguousarray(
            self.bias_energies_full[:, self.active_set], dtype=_np.float64)

        # run estimator
        pg = _ProgressReporter()
        stage = 'WHAM'
        with pg.context(stage=stage):
            self.therm_energies, self.conf_energies, self.increments, self.loglikelihoods = \
                _wham.estimate(
                    self.state_counts, self.bias_energies,
                    maxiter=self.maxiter, maxerr=self.maxerr,
                    therm_energies=self.therm_energies, conf_energies=self.conf_energies,
                    save_convergence_info=self.save_convergence_info,
                    callback=_ConvergenceProgressIndicatorCallBack(
                        pg, stage, self.maxiter, self.maxerr))

        # get stationary models
        models = [
            _StationaryModel(
                pi=_np.exp(self.therm_energies[K, _np.newaxis] -
                           self.bias_energies[K, :] - self.conf_energies),
                f=self.bias_energies[K, :] + self.conf_energies,
                normalize_energy=False,
                label="K=%d" % K) for K in range(self.nthermo)
        ]

        # set model parameters to self
        self.set_model_params(models=models,
                              f_therm=self.therm_energies,
                              f=self.conf_energies)

        # done
        return self
Exemple #3
0
    def _estimate(self, X):
        ttrajs, dtrajs_full, btrajs = X
        # shape and type checks
        assert len(ttrajs) == len(dtrajs_full) == len(btrajs)
        for t in ttrajs:
            _types.assert_array(t, ndim=1, kind='i')
        for d in dtrajs_full:
            _types.assert_array(d, ndim=1, kind='i')
        for b in btrajs:
            _types.assert_array(b, ndim=2, kind='f')
        # find dimensions
        self.nstates_full = max(_np.max(d) for d in dtrajs_full) + 1
        self.nthermo = max(_np.max(t) for t in ttrajs) + 1
        # dimensionality checks
        for t, d, b, in zip(ttrajs, dtrajs_full, btrajs):
            assert t.shape[0] == d.shape[0] == b.shape[0]
            assert b.shape[1] == self.nthermo

        # cast types and change axis order if needed
        ttrajs = [
            _np.require(t, dtype=_np.intc, requirements='C') for t in ttrajs
        ]
        dtrajs_full = [
            _np.require(d, dtype=_np.intc, requirements='C')
            for d in dtrajs_full
        ]
        btrajs = [
            _np.require(b, dtype=_np.float64, requirements='C') for b in btrajs
        ]

        # find state visits
        self.state_counts_full = _util.state_counts(ttrajs, dtrajs_full)
        self.therm_state_counts_full = self.state_counts_full.sum(axis=1)

        self.active_set = _np.sort(
            _np.where(self.state_counts_full.sum(axis=0) > 0)[0])
        self.state_counts = _np.ascontiguousarray(
            self.state_counts_full[:, self.active_set].astype(_np.intc))

        if self.direct_space:
            mbar = _mbar_direct
        else:
            mbar = _mbar
        pg = _ProgressReporter()
        with pg.context():
            self.therm_energies, self.unbiased_conf_energies_full, self.biased_conf_energies_full, \
                self.increments = mbar.estimate(
                    self.state_counts_full.sum(axis=1), btrajs, dtrajs_full,
                    maxiter=self.maxiter, maxerr=self.maxerr,
                    save_convergence_info=self.save_convergence_info,
                    callback=_ConvergenceProgressIndicatorCallBack(
                        pg, 'MBAR', self.maxiter, self.maxerr),
                    n_conf_states=self.nstates_full)
        try:
            self.loglikelihoods = _np.nan * self.increments
        except TypeError:
            self.loglikelihoods = None

        # get stationary models
        models = [
            _StationaryModel(f=self.biased_conf_energies_full[K,
                                                              self.active_set],
                             normalize_energy=False,
                             label="K=%d" % K) for K in range(self.nthermo)
        ]

        # set model parameters to self
        self.set_model_params(
            models=models,
            f_therm=self.therm_energies,
            f=self.unbiased_conf_energies_full[self.active_set])

        self.btrajs = btrajs

        # done
        return self
Exemple #4
0
    def _estimate(self, trajs):
        # TODO: fix docstring
        """
        Parameters
        ----------
        X : tuple of (ttrajs, dtrajs)
            Simulation trajectories. ttrajs contain the indices of the thermodynamic state and
            dtrajs contains the indices of the configurational states.
        ttrajs : list of numpy.ndarray(X_i, dtype=int)
            Every elements is a trajectory (time series). ttrajs[i][t] is the index of the
            thermodynamic state visited in trajectory i at time step t.
        dtrajs : list of numpy.ndarray(X_i, dtype=int)
            dtrajs[i][t] is the index of the configurational state (Markov state) visited in
            trajectory i at time step t.
        """
        # check input
        assert isinstance(trajs, (tuple, list))
        assert len(trajs) == 2
        ttrajs = trajs[0]
        dtrajs = trajs[1]
        # validate input
        for ttraj, dtraj in zip(ttrajs, dtrajs):
            _types.assert_array(ttraj, ndim=1, kind='numeric')
            _types.assert_array(dtraj, ndim=1, kind='numeric')
            assert _np.shape(ttraj)[0] == _np.shape(dtraj)[0]

        # harvest state counts
        self.state_counts_full = _util.state_counts(ttrajs,
                                                    dtrajs,
                                                    nthermo=self.nthermo,
                                                    nstates=self.nstates_full)

        # active set
        self.active_set = _np.where(self.state_counts_full.sum(axis=0) > 0)[0]
        self.state_counts = _np.ascontiguousarray(
            self.state_counts_full[:, self.active_set].astype(_np.intc))
        self.bias_energies = _np.ascontiguousarray(
            self.bias_energies_full[:, self.active_set], dtype=_np.float64)

        # run estimator
        self.therm_energies, self.conf_energies, self.increments, self.loglikelihoods = \
            _wham.estimate(
                self.state_counts, self.bias_energies,
                maxiter=self.maxiter, maxerr=self.maxerr,
                therm_energies=self.therm_energies, conf_energies=self.conf_energies,
                save_convergence_info=self.save_convergence_info,
                callback=_ConvergenceProgressIndicatorCallBack(
                    self, 'WHAM', self.maxiter, self.maxerr))
        self._progress_force_finish(stage='WHAM')

        # get stationary models
        models = [
            _StationaryModel(
                pi=_np.exp(self.therm_energies[K, _np.newaxis] -
                           self.bias_energies[K, :] - self.conf_energies),
                f=self.bias_energies[K, :] + self.conf_energies,
                normalize_energy=False,
                label="K=%d" % K) for K in range(self.nthermo)
        ]

        # set model parameters to self
        self.set_model_params(models=models,
                              f_therm=self.therm_energies,
                              f=self.conf_energies)

        # done
        return self