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
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
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
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