Skip to content

Commit 11182ac

Browse files
authored
Remove deprecated CK Test validator (#258)
1 parent 1729ab7 commit 11182ac

File tree

8 files changed

+10
-193
lines changed

8 files changed

+10
-193
lines changed

deeptime/decomposition/_vamp.py

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,12 @@
88

99
import numpy as np
1010

11-
from ._koopman import CovarianceKoopmanModel, KoopmanObservable
11+
from ._koopman import CovarianceKoopmanModel
1212
from ..base import EstimatorTransformer
1313
from ..basis import Identity
1414
from ..covariance import Covariance, CovarianceModel
1515
from ..numeric import spd_inv_split
16-
from ..util.decorators import deprecated_method
1716
from ..util.types import to_dataset
18-
from ..util.validation import DeprecatedCKValidator
1917

2018

2119
class VAMP(EstimatorTransformer):
@@ -460,31 +458,3 @@ def fetch_model(self) -> CovarianceKoopmanModel:
460458
self._model = self._decompose(self._covariance_estimator.fetch_model())
461459
self._covariance_estimator = None
462460
return self._model
463-
464-
@deprecated_method("Deprecated in v0.4.1 and will be removed soon, please use model.ck_test.")
465-
def chapman_kolmogorov_validator(self, mlags, test_model: CovarianceKoopmanModel = None,
466-
n_observables=None, observables='phi', statistics='psi'):
467-
r""" Replaced by `deeptime.decomposition.CovarianceKoopmanModel.ck_test`. """
468-
test_model = self.fetch_model() if test_model is None else test_model
469-
assert test_model is not None, "We need a test model via argument or an estimator which was already " \
470-
"fit to data."
471-
472-
def fit_for_lag(data, lagtime):
473-
est = VAMP(lagtime=lagtime, dim=self.dim, var_cutoff=self.var_cutoff, scaling=self.scaling,
474-
epsilon=self.epsilon, observable_transform=self.observable_transform)
475-
return est.fit(data).fetch_model()
476-
477-
if isinstance(observables, str) and observables == 'phi':
478-
observables = test_model.singular_vectors_right[:, :n_observables]
479-
observables_mean_free = True
480-
else:
481-
observables_mean_free = False
482-
483-
if isinstance(statistics, str) and statistics == 'psi':
484-
statistics = test_model.singular_vectors_left[:, :n_observables]
485-
statistics_mean_free = True
486-
else:
487-
statistics_mean_free = False
488-
489-
observable = KoopmanObservable(observables, statistics, observables_mean_free, statistics_mean_free)
490-
return DeprecatedCKValidator(self, fit_for_lag, mlags, observable, test_model)

deeptime/markov/hmm/_bayesian_hmm.py

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,19 @@
33
from typing import Optional, Union, List
44

55
import numpy as np
6-
7-
from deeptime.markov.tools.analysis import is_connected
8-
from deeptime.markov.tools.estimation import sample_tmatrix, transition_matrix
6+
from deeptime.markov.hmm._hmm_bindings import util as _bd_util
97

108
from deeptime.base import Estimator
9+
from deeptime.markov import TransitionCountModel, compute_dtrajs_effective, number_of_states
1110
from deeptime.markov._base import BayesianMSMPosterior
1211
from deeptime.markov._transition_matrix import stationary_distribution
1312
from deeptime.markov.hmm import HiddenMarkovModel
14-
from ._output_model import DiscreteOutputModel
15-
from ._util import observations_in_state, sample_hidden_state_trajectory
1613
from deeptime.markov.msm import MarkovStateModel
17-
from deeptime.markov import TransitionCountModel, compute_dtrajs_effective, number_of_states
18-
from deeptime.markov.hmm._hmm_bindings import util as _bd_util
14+
from deeptime.markov.tools.analysis import is_connected
15+
from deeptime.markov.tools.estimation import sample_tmatrix, transition_matrix
1916
from deeptime.util.types import ensure_dtraj_list
20-
21-
__author__ = 'noe, clonker'
22-
23-
__all__ = [
24-
'BayesianHMMPosterior',
25-
'BayesianHMM',
26-
]
27-
28-
from ...util.decorators import deprecated_method
17+
from ._output_model import DiscreteOutputModel
18+
from ._util import observations_in_state, sample_hidden_state_trajectory
2919

3020
from ...util.platform import handle_progress_bar
3121
from ...util.validation import ck_test
@@ -651,28 +641,3 @@ def _append_sample(self, models, prior, sample_model):
651641
reversible=self.reversible, count_model=count_model),
652642
output_model=model_copy.output_model, initial_distribution=model_copy.initial_distribution,
653643
hidden_state_trajectories=model_copy.hidden_trajs))
654-
655-
@deprecated_method("Deprecated in v0.4.1 and will be removed soon, please use model.ck_test.")
656-
def chapman_kolmogorov_validator(self, mlags, test_model: BayesianHMMPosterior = None):
657-
r""" Replaced by `deeptime.markov.hmm.BayesianHMMPosterior.ck_test`. """
658-
test_model = self.fetch_model() if test_model is None else test_model
659-
assert test_model is not None, "We need a test model via argument or an estimator which was already" \
660-
"fit to data."
661-
662-
from . import DiscreteOutputModel
663-
assert isinstance(test_model.prior.output_model, DiscreteOutputModel), \
664-
"Can only perform CKTest for discrete output models"
665-
666-
from deeptime.markov._observables import MembershipsObservable
667-
obs = MembershipsObservable(test_model, np.eye(test_model.prior.n_hidden_states))
668-
from deeptime.util.validation import DeprecatedCKValidator
669-
670-
def fit_for_lag(data, lag):
671-
estimator = BayesianHMM.default(dtrajs=data, n_hidden_states=self.initial_hmm.n_hidden_states,
672-
lagtime=lag, n_samples=self.n_samples, stride=self.stride,
673-
initial_distribution_prior=self.initial_distribution_prior,
674-
transition_matrix_prior=self.transition_matrix_prior,
675-
reversible=self.reversible, stationary=self.stationary)
676-
return estimator.fit(data).fetch_model()
677-
678-
return DeprecatedCKValidator(self, fit_for_lag, mlags, obs, test_model)

deeptime/markov/hmm/_maximum_likelihood_hmm.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from ..msm import MarkovStateModel
1111
from .. import TransitionCountModel, compute_dtrajs_effective
1212
from ._hmm_bindings import util as _util
13-
from ...util.decorators import deprecated_method
1413
from ...util.types import ensure_timeseries_data
1514

1615

@@ -423,30 +422,3 @@ def _update_model(self, model: _HMMModelStorage, observations: List[np.ndarray],
423422
model.initial_distribution[:] = pi
424423
model.transition_matrix[:] = T
425424
model.output_model.fit(observations, gammas)
426-
427-
@deprecated_method("Deprecated in v0.4.1 and will be removed soon, please use model.ck_test.")
428-
def chapman_kolmogorov_validator(self, mlags, test_model: HiddenMarkovModel = None):
429-
r""" Replaced by `deeptime.markov.hmm.MaximumLikelihoodHMM.ck_test`. """
430-
test_model = self.fetch_model() if test_model is None else test_model
431-
assert test_model is not None, "We need a test model via argument or an estimator which was already" \
432-
"fit to data."
433-
from . import DiscreteOutputModel
434-
assert isinstance(test_model.output_model, DiscreteOutputModel), \
435-
"Can only perform CKTest for discrete output models"
436-
437-
from deeptime.markov._observables import MembershipsObservable
438-
obs = MembershipsObservable(test_model, np.eye(test_model.n_hidden_states))
439-
from deeptime.util.validation import DeprecatedCKValidator
440-
441-
def fit_for_lag(data, lag):
442-
from .init.discrete import metastable_from_data
443-
initial_model = metastable_from_data(data, n_hidden_states=test_model.n_hidden_states, lagtime=lag,
444-
stride=self.stride, reversible=self.reversible,
445-
stationary=self.stationary)
446-
estimator = MaximumLikelihoodHMM(initial_model, lagtime=lag, reversible=self.reversible,
447-
stationary=self.stationary, accuracy=self.accuracy,
448-
maxit=self.maxit, maxit_reversible=self.maxit_reversible)
449-
hmm = estimator.fit(data).fetch_model()
450-
return hmm.submodel_largest(dtrajs=data)
451-
452-
return DeprecatedCKValidator(self, fit_for_lag, mlags, obs, test_model)

deeptime/markov/msm/_bayesian_msm.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33

44
import numpy as np
55

6+
from . import MarkovStateModel, MaximumLikelihoodMSM
7+
from .._base import _MSMBaseEstimator, BayesianMSMPosterior
68
from .._transition_counting import TransitionCountEstimator
79
from ...base import Estimator
810
from ...numeric import is_square_matrix
9-
from .._base import _MSMBaseEstimator, BayesianMSMPosterior
10-
from . import MarkovStateModel, MaximumLikelihoodMSM
11-
from ...util.decorators import deprecated_method
1211

1312
__author__ = 'noe, marscher, clonker'
1413

@@ -353,25 +352,3 @@ def fit_from_counts(self, counts, callback=None, **kw):
353352
sparse=self.sparse, maxiter=self.maxiter, maxerr=self.maxerr
354353
).fit(counts).fetch_model()
355354
return self.fit_from_msm(msm, callback=callback, **kw)
356-
357-
@deprecated_method("Deprecated in v0.4.1 and will be removed soon, please use model.ck_test.")
358-
def chapman_kolmogorov_validator(self, n_metastable_sets: int, mlags, test_model=None):
359-
r""" Replaced by `deeptime.markov.msm.BayesianMSMPosterior.ck_test`. """
360-
test_model = self.fetch_model() if test_model is None else test_model
361-
assert test_model is not None, "We need a test model via argument or an estimator which was already" \
362-
"fit to data."
363-
prior = test_model.prior
364-
assert prior.has_count_model, "The test model needs to have a count model, i.e., be estimated from data."
365-
pcca = prior.pcca(n_metastable_sets)
366-
from deeptime.markov._observables import MembershipsObservable
367-
obs = MembershipsObservable(test_model, pcca)
368-
from deeptime.util.validation import DeprecatedCKValidator
369-
370-
def fit_for_lag(data, lag):
371-
from deeptime.markov import TransitionCountEstimator
372-
counting_mode = test_model.prior.count_model.counting_mode
373-
counts = TransitionCountEstimator(lag, counting_mode).fit(data, n_jobs=1).fetch_model().submodel_largest()
374-
return self.fit(counts).fetch_model()
375-
376-
return DeprecatedCKValidator(self, fit_for_lag, mlags, obs, test_model)
377-

deeptime/markov/msm/_maximum_likelihood_msm.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from .._base import _MSMBaseEstimator
1010
from .._transition_counting import TransitionCountModel, TransitionCountEstimator
1111
from ...numeric import is_square_matrix
12-
from ...util.decorators import deprecated_method
1312

1413
log = logging.getLogger(__file__)
1514

@@ -358,22 +357,3 @@ def fit(self, data, *args, **kw):
358357
raise ValueError("To fit directly from a discrete timeseries, a lagtime must be provided!")
359358
return self.fit_from_discrete_timeseries(data, kw.pop('lagtime', self.lagtime),
360359
kw.pop("count_mode", "sliding"))
361-
362-
@deprecated_method("Deprecated in v0.4.1 and will be removed soon, please use model.ck_test.")
363-
def chapman_kolmogorov_validator(self, n_metastable_sets: int, mlags, test_model=None):
364-
r""" Removed and replaced by `deeptime.markov.msm.MarkovStateModel.ck_test`. """
365-
from deeptime.markov._observables import MembershipsObservable
366-
test_model = self.fetch_model() if test_model is None else test_model
367-
assert test_model is not None, "We need a test model via argument or an estimator which was already" \
368-
"fit to data."
369-
assert test_model.has_count_model, "The test model needs to have a count model, i.e., be estimated from data."
370-
pcca = test_model.pcca(n_metastable_sets)
371-
obs = MembershipsObservable(test_model, pcca)
372-
from deeptime.util.validation import DeprecatedCKValidator
373-
374-
def fit_for_lag(data, lag):
375-
counting_mode = test_model.count_model.counting_mode
376-
counts = TransitionCountEstimator(lag, counting_mode).fit(data).fetch_model().submodel_largest()
377-
return self.fit(counts).fetch_model()
378-
379-
return DeprecatedCKValidator(self, fit_for_lag, mlags, obs, test_model)

deeptime/util/validation.py

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from .decorators import plotting_function
44
from .platform import handle_progress_bar
5-
from ..base import Observable, BayesianModel, Estimator
5+
from ..base import Observable, BayesianModel
66

77

88
def implied_timescales(models, n_its=None):
@@ -364,26 +364,3 @@ def plot(self, height=2.5, aspect=1., conf: float = 0.95, color=None, grid = Non
364364
from deeptime.plots import plot_ck_test
365365
return plot_ck_test(self, height=height, aspect=aspect, conf=conf, color=color, grid=grid, legend=legend,
366366
xlabel=xlabel, ylabel=ylabel, y01=y01, sharey=sharey, **plot_kwargs)
367-
368-
369-
class DeprecatedCKValidator(Estimator):
370-
371-
def __init__(self, estimator, fit_for_lag, mlags, observable, test_model):
372-
super().__init__()
373-
self.estimator = estimator
374-
self.mlags = mlags
375-
self.fit_for_lag = fit_for_lag
376-
self.observable = observable
377-
self.test_model = test_model
378-
379-
def fit(self, data, **kwargs):
380-
if hasattr(self.test_model, 'prior'):
381-
test_lag = self.test_model.prior.lagtime
382-
else:
383-
test_lag = self.test_model.lagtime
384-
models = []
385-
for factor in range(1, self.mlags):
386-
lagtime = factor * test_lag
387-
models.append(self.fit_for_lag(data, lagtime))
388-
self._model = ck_test(models, observable=self.observable, test_model=self.test_model)
389-
return self

tests/decomposition/test_vamp.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,6 @@ def test_cktest():
255255
models.append(VAMP(lag, dim=1).fit_fetch(traj))
256256
test_model = models[0]
257257
ck_test = test_model.ck_test(models)
258-
# validator = estimator.chapman_kolmogorov_validator(4)
259-
# cktest = validator.fit(traj).fetch_model()
260258
np.testing.assert_almost_equal(ck_test.predictions, ck_test.estimates, decimal=1)
261259

262260

tests/plots/test_ck_test.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,3 @@ def test_sanity_vamp(fractional):
4747
plot_ck_test(models[0].ck_test(models))
4848
else:
4949
plot_ck_test(models[0].ck_test(models))
50-
51-
52-
@pytest.mark.parametrize("hidden", [False, True], ids=lambda x: f"hidden={x}")
53-
@pytest.mark.parametrize("bayesian", [False, True], ids=lambda x: f"bayesian={x}")
54-
def test_sanity_deprecated_msm(hidden, bayesian):
55-
traj = ellipsoids().observations(20000)
56-
dtraj = KMeans(n_clusters=15).fit_transform(traj)
57-
est, _ = estimate_markov_model(1, dtraj, hidden=hidden, bayesian=bayesian, n_hidden=2, return_estimator=True)
58-
with pytest.deprecated_call():
59-
if not hidden:
60-
validator = est.chapman_kolmogorov_validator(2, 5)
61-
else:
62-
validator = est.chapman_kolmogorov_validator(5)
63-
64-
validator.fit_fetch(dtraj)
65-
66-
67-
def test_deprecated_vamp():
68-
with pytest.deprecated_call():
69-
traj = ellipsoids().observations(20000)
70-
validator = VAMP(1, dim=2).fit(traj).chapman_kolmogorov_validator(mlags=10)
71-
validator.fit_fetch(traj)

0 commit comments

Comments
 (0)