Skip to content

v0.5.0

Latest

Choose a tag to compare

@clonker clonker released this 07 Nov 21:04
· 33 commits to main since this release
b8b6481

This release modernizes how deeptime is built and tested, raises the minimum Python version, and collects a few bug fixes. Existing code should keep working unchanged apart from the two breaking changes below.

Breaking changes

  • Python 3.8 and 3.9 are no longer supported. The minimum is now Python 3.10. Wheels are provided for Python 3.10 through 3.15 on Linux, macOS (x86_64 and arm64) and Windows.
  • Sparse matrices are now scipy.sparse arrays. Sparse count matrices and transition matrices, from TransitionCountModel, MarkovStateModel and the deeptime.markov.tools.estimation functions, are returned as csr_array instead of csr_matrix. For these objects * is elementwise multiplication (use @ for matrix products) and the .A / .A1 shortcuts are gone (use .toarray()).

New features

  • Weighted VAMP. VAMP accepts observation weights on the compute_ctt=True code path, and VAMP.partial_fit() gained a weights argument for incremental weighted fitting (#259).

Bug fixes

  • plot_density no longer swaps the x and y axes (#302).
  • SamplerRev accepts sparse count matrices and initial distributions (#310).
  • TRAM: restrict_to_submodel iterated over thermodynamic states instead of trajectories, which skipped trajectories or raised an IndexError with replica-exchange input (#299).
  • reactive_flux: the transition_matrix_tolerance check was inverted and rejected valid transition matrices.
  • AugmentedMSMEstimator.uncertainties raised an AttributeError.
  • The non-reversible transition-matrix sampler ignored its seed.
  • The parallel (n_jobs > 1) effective count matrix used the wrong mact value, giving results that differed from the serial path.
  • The *_sensitivity functions returned None for sparse transition matrices, and forward_committor_sensitivity now sums over the whole target set instead of pairing states elementwise.
  • expectation() raised when a stationary distribution was passed explicitly.
  • Flux: the bottleneck decomposition crashed when the strongest edge directly connects A and B, and producer/consumer detection no longer divides by zero for states without flux.
  • time_relaxations_direct raised a NameError when the largest requested time did not exceed the number of states.
  • is_rate_matrix zeroes the diagonal before the non-negativity check instead of broadcasting it across rows, and works for sparse input.
  • MaximumLikelihoodMSM now raises a clear ValueError when the stationary-distribution constraint is zero on some but not all visited states.
  • Arguments renamed through deprecated_argument were not actually forwarded under the new name.
  • The total-variation derivative stopped early because its convergence check only looked at the first component of the update.
  • atleast_nd works with numpy >= 2.
  • VAMPNet ignored the requested device and dtype at construction time.
  • SINDy stored a feature row in n_output_features_ instead of the column count.
  • Multiprocessing uses a fork-safe context, which avoids the fork() DeprecationWarning on Python 3.13+.
  • various plotting fixes
  • vamp_score could return scores orders of magnitude above the theoretical bound for float32 features with a rank-deficient covariance, such as softmax lobe outputs, because floating-point round-off cancelled the eigenvalue regularization. The regularized eigenvalues are now bounded below by epsilon, and for float32 input the covariances are accumulated in float64 (except on MPS, which has no float64).

Build system and packaging

  • Migrated from scikit-build and versioneer to scikit-build-core and setuptools-scm, with a src/ layout. Building from source requires pybind11 >= 3.1; scipy is no longer a build-time dependency.
  • CI moved from Azure Pipelines to GitHub Actions; the C++ test suite runs again (Catch2 3.7.1) and wheels are published through PyPI trusted publishing.
  • Tests that compared numerical noise, in the Kahan dot product and in the OOM fingerprint timescales, were made robust to compiler and platform differences.
  • Several tests that did not exercise what they described now do (#327, #328, thanks @dylanpulver).

Documentation

  • The custom estimator examples in the developer guide follow the actual fetch_model() interface, and the transition matrix prose correctly describes P_ij as the probability of moving from state i to state j (#326, thanks @dajiaohuang).
  • PCCA+ metastable distributions and indices_by_distribution now document how to sample structures when the active set is a strict subset of the full state space.
  • The example gallery builds again with matplotlib >= 3.9 (matplotlib.cm.get_cmap was removed), the API reference links into the numpy, scipy, scikit-learn, PyTorch and matplotlib documentation through intersphinx, and a few broken cross-references and docstring formatting errors were fixed.

New Contributors

Full Changelog: v0.4.5...v0.5.0