diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..cc0720870 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,49 @@ +--- +name: Bug report +about: Something isn't working as expected +title: "" +labels: bug +--- + +## Description + +A clear and concise description of what went wrong, and what you expected to happen instead. + +## Minimal working example (MWE) + +Please include the smallest possible piece of code that reproduces the issue. +Trim away everything that is not needed to trigger the bug (unrelated setup, unused imports, etc). + +```julia +using MPSKit, TensorKit + +# ... +``` + +## Error / output + +Paste the full error message and stacktrace (or the incorrect output), if any. + +``` +paste here +``` + +## Version info + +Please include the versions of MPSKit and its main dependencies. +From the Julia REPL: + +```julia-repl +julia> using Pkg +julia> Pkg.status(["MPSKit", "TensorKit"]) +``` + +Also include the Julia version: + +```julia-repl +julia> versioninfo() +``` + +## Additional context + +Anything else that might help (OS, whether it also happens on the latest `main`, related issues, etc). diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..e41ec019f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Open-ended discussion + url: https://github.com/QuantumKitHub/MPSKit.jl/discussions + about: Ideas, feature brainstorming, or anything that isn't a specific question or bug report. For a concrete question about using MPSKit, use the Question template above. + - name: Documentation + url: https://quantumkithub.github.io/MPSKit.jl/stable/ + about: The manual and examples, which may already cover what you are after. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 000000000..c7215fe11 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,27 @@ +--- +name: Question +about: Ask a question about using MPSKit +title: "" +labels: question +--- + +## What are you trying to do? + +Describe the physics or the workflow you are trying to set up. + +## What have you tried? + +If applicable, include the code you have so far, and what result you got (or expected but didn't get). + +```julia +using MPSKit, TensorKit + +# ... +``` + +## Version info (optional but helpful) + +```julia-repl +julia> using Pkg +julia> Pkg.status(["MPSKit", "TensorKit"]) +``` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..7ebcdbbed --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +## Description + +Briefly describe what this PR changes and why. + +## Checklist + +- [ ] Tests pass locally (`julia --project=test test/runtests.jl`, or the relevant subset) +- [ ] Documentation updated, if this PR changes public API (docstrings, `docs/src/`) +- [ ] Runic formatter is run +- [ ] Changelog entry added under `[Unreleased]` in `docs/src/changelog.md`, if this PR is user-facing (new feature, behavior change, bug fix, deprecation, or removal) diff --git a/.gitignore b/.gitignore index 6d9656c0c..9afd56d56 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ benchmark/results **/.vitepress/cache/ **/.vitepress/dist/ package-lock.json + +# generated from CONTRIBUTING.md by docs/make.jl +docs/src/contributing.md diff --git a/CITATION.cff b/CITATION.cff index 8592b6a9a..edb2b2ac9 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -12,7 +12,23 @@ authors: orcid: "https://orcid.org/0000-0002-0858-291X" title: "MPSKit" -version: 0.13.11 +version: 0.13.13 doi: 10.5281/zenodo.10654900 -date-released: 2026-05-04 +date-released: 2026-06-09 url: "https://github.com/QuantumKitHub/MPSKit.jl" + +references: +- type: article + authors: + - family-names: "Devos" + given-names: "Lukas" + orcid: "https://orcid.org/0000-0002-0256-4200" + - family-names: "Haegeman" + given-names: "Jutho" + orcid: "https://orcid.org/0000-0002-0858-291X" + title: "TensorKit.jl: A Julia package for large-scale tensor computations, with a hint of category theory" + journal: "arXiv" + year: 2025 + doi: "10.48550/arXiv.2508.10076" + url: "https://arxiv.org/abs/2508.10076" + notes: "MPSKit is built on TensorKit.jl; please consider citing it as well." diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..4e9b4f35f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,112 @@ +# Contributing to MPSKit.jl + +Thanks for taking the time to contribute! +We are open to any and all suggestions and welcome new and advanced developers alike. +This document is a short, practical guide to reporting issues, asking questions, and submitting changes. + +## Asking questions and reporting bugs + +Use [GitHub issues](https://github.com/QuantumKitHub/MPSKit.jl/issues) for both. +There are two templates to help you: + +- **Bug report** — for something that doesn't work as expected. +- **Question** — for anything else, from "how do I model X" to "is Y possible". + +Open-ended discussion that isn't really a question or a bug is also welcome on [GitHub Discussions](https://github.com/QuantumKitHub/MPSKit.jl/discussions). + +A good bug report is one we can act on immediately, and it typically needs two things: + +1. A minimal working example (MWE): the smallest snippet of code that reproduces the problem. + Strip away everything not needed to trigger the bug — unrelated setup, unused imports, alternative approaches you also tried. +2. Version information for MPSKit, TensorKit, and Julia, obtained with: + + ```julia-repl + julia> using Pkg + julia> Pkg.status(["MPSKit", "TensorKit"]) + ``` + + ```julia-repl + julia> versioninfo() + ``` + +Please also include the full error message and stacktrace, if there is one. + +## Contributing code + +We are very happy to take contributions, and will gladly make the time to review code. +Note that this might take a bit of time, so please be patient with us. + +For small issues, fixes and typos, feel free to open a PR directly. +For larger amounts of work, it might be beneficial to open an issue first, so we can discuss the solution strategy beforehand. +Often, it might be the case that there are other ideas, or partial solutions that already were in the make, and we want to avoid duplicate or wasted work as much as possible. + +There is no restriction for the use of AI-tooling to assist you, although we do ask that you take the time to review the code yourself. +Additionally, please do not just copy-paste LLM generated responses into code reviews or discussions, as we take the time and effort to review your code and expect the same amount of effort from you. +Do note however, that this means that overly large PRs might not get reviewed, since the review process for these is too resource-intensive. + +### Development setup + +Fork and clone the repository, then point Julia at your local checkout instead of the released version: + +```julia-repl +pkg> dev /path/to/your/clone/MPSKit.jl +``` + +Alternatively, you can tell Julia to clone the repository automatically, which will put it in a local `dev/` folder next to your Project.toml: + +```julia-repl +pkg> dev --local MPSKit +``` + +If you just want to try out the current `main` without a fork, `pkg> add MPSKit#main` is enough. + +### Running the tests + +The repository root is a Julia workspace (`Project.toml` lists `test`, `docs`, and `examples` as workspace projects), and `test/Project.toml` already points `MPSKit` back at the repo checkout. +From the repository root, you can therefore run the full suite with: + +``` +julia --project=test test/runtests.jl +``` + +The test suite is organized by topic under `test/` (`algorithms/`, `states/`, `operators/`, `misc/`, `gpu/`), with shared setup code in `test/setup/`. +GPU tests only run when a functional CUDA/cuTENSOR install is detected, so most contributors will only ever exercise the CPU tests. + +Additionally, a number of CLI flags can be added to run the tests selectively, as these will be filtered by folder and filename +A `--fast` flag is available for a quicker, reduced run while iterating. + +``` +julia --project=test test/runtests.jl states +julia --project=test test/runtests.jl operators algorithms/groundstate +julia --project=test test/runtests.jl misc --fast +``` + +### Building the documentation + +The docs use Documenter.jl with the DocumenterVitepress backend, so a full render needs Node.js in addition to Julia. +For routine verification of code examples (fast, no Node required), you can run the doctests directly: + +``` +julia --project=docs -e 'using Documenter, MPSKit; doctest(MPSKit)' +``` + +For a full local site build (slower, needs `npm`): + +``` +julia --project=docs docs/make.jl +``` + +### Code formatting + +This repository is formatted with [Runic](https://github.com/fredrikekre/Runic.jl). +Formatting is checked automatically on pull requests, and there is a [pre-commit](https://pre-commit.com/) hook (`.pre-commit-config.yaml`) that runs Runic locally if you use pre-commit. +Please format any Julia files you touch before opening a PR, and refrain from making any formatting changes to code that is not relevant to your PR. + +### Changelog entries + +If your change is user-facing (new feature, behavior change, bug fix, deprecation, or removal), add an entry under the `[Unreleased]` section of `docs/src/changelog.md`, in the category that matches your change. + +### Opening a pull request + +Small, focused pull requests are easiest to review. +Please describe what the change does and why, link any related issues, and make sure the checklist in the PR template is filled in before requesting review. diff --git a/README.md b/README.md index 215b4145a..0543e08b8 100644 --- a/README.md +++ b/README.md @@ -2,119 +2,103 @@ # MPSKit.jl -Contains code for tackling one-dimensional quantum and two-dimensional statistical mechanics -problems using tensor network algorithms. The main focus is on matrix product states (MPS) -and matrix product operators (MPO), both finite and infinite. +[![][docs-stable-img]][docs-stable-url] [![][docs-dev-img]][docs-dev-url] [![DOI][doi-img]][doi-url] +[![CI][ci-img]][ci-url] [![PkgEval][pkgeval-img]][pkgeval-url] [![Codecov][codecov-img]][codecov-url] -| **Documentation** | **Digital Object Identifier** | -|:-----------------:|:-----------------------------:| -| [![][docs-stable-img]][docs-stable-url] [![][docs-dev-img]][docs-dev-url] | [![DOI][doi-img]][doi-url] | +Tensor network algorithms based on matrix product states (MPS) and matrix product operators (MPO), for (quasi) one-dimensional quantum lattices and two-dimensional statistical mechanics models, as well as quantum circuit simulation or boundary-MPS methods. +This library highlights support for both finite systems and systems directly in the thermodynamic limit, and both have a large variety of implemented algorithms. -| **Build Status** | **PkgEval** | **Coverage** | -|:----------------:|:------------:|:------------:| -| [![CI][ci-img]][ci-url] | [![PkgEval][pkgeval-img]][pkgeval-url] | [![Codecov][codecov-img]][codecov-url] | +MPSKit builds on [TensorKit.jl](https://github.com/QuantumKitHub/TensorKit.jl) for its tensors, which makes abelian, non-abelian, fermionic and anyonic symmetries available throughout. +The toolbox covers ground states and leading boundary states, real and imaginary time evolution, excitation spectra, and more. -[docs-stable-img]: https://img.shields.io/badge/docs-stable-blue.svg -[docs-stable-url]: https://QuantumKitHub.github.io/MPSKit.jl/stable - -[docs-dev-img]: https://img.shields.io/badge/docs-dev-blue.svg -[docs-dev-url]: https://QuantumKitHub.github.io/MPSKit.jl/dev - -[doi-img]: https://zenodo.org/badge/DOI/10.5281/zenodo.10654900.svg -[doi-url]: https://doi.org/10.5281/zenodo.10654900 - -[codecov-img]: https://codecov.io/gh/QuantumKitHub/MPSKit.jl/branch/master/graph/badge.svg?token=rmp3bu7qn3 -[codecov-url]: https://codecov.io/gh/QuantumKitHub/MPSKit.jl - -[ci-img]: https://github.com/QuantumKitHub/MPSKit.jl/actions/workflows/Tests.yml/badge.svg -[ci-url]: https://github.com/QuantumKitHub/MPSKit.jl/actions/workflows/Tests.yml - -[pkgeval-img]: https://JuliaCI.github.io/NanosoldierReports/pkgeval_badges/M/MPSKit.svg -[pkgeval-url]: https://JuliaCI.github.io/NanosoldierReports/pkgeval_badges/M/MPSKit.html - -The framework is built upon -[TensorKit.jl](https://github.com/jutho/TensorKit.jl), which provides functionality for -generic symmetries. - -The toolbox contains different algorithms for finding MPS representations of groundstates or -leading boundary states, performing time evolution, finding excitations and much more. Check -out the [examples](https://QuantumKitHub.github.io/MPSKit.jl/dev/examples/) for concrete -use-cases. - -This package is under active development and new algorithms are added regularly. -Nevertheless, the documentation is quite terse, so feel free to open an issue if you have -any questions. +The [documentation](https://QuantumKitHub.github.io/MPSKit.jl/stable) contains the manual and the full API reference. +The [examples](https://QuantumKitHub.github.io/MPSKit.jl/dev/examples/) work through complete calculations, from ground states to dynamical correlators. ## Installation -The package can be installed through the Julia general registry, via the package manager: - -```julia-repl -pkg> add MPSKit -``` - -Because of the heavy use of [TensorKit.jl](https://github.com/jutho/TensorKit.jl), it is -recommended to install the latest version of this package as well. Additionally, several -extension packages exist that provide additional symmetries, which should all be compatible -with MPSKit. For example, to install the package with support for SU(N) symmetries, -[SUNRepresentations.jl](https://github.com/QuantumKitHub/SUNRepresentations.jl) can be used. +MPSKit is registered in the Julia general registry, and often is best combined with TensorKit.jl and MPSKitModels.jl. ```julia-repl -pkg> add TensorKit +pkg> add MPSKit TensorKit MPSKitModels ``` -Finally, several pre-defined operators, Hamiltonians and statistical mechanics models are available in [MPSKitModels.jl](https://github.com/QuantumKitHub/MPSKitModels.jl). It is recommended to install this package too. - -```julia-repl -pkg> add MPSKitModels -``` +[TensorKit.jl](https://github.com/QuantumKitHub/TensorKit.jl) provides the tensors and their symmetry sectors, and [MPSKitModels.jl](https://github.com/QuantumKitHub/MPSKitModels.jl) a library of common operators, Hamiltonians and statistical mechanics models. +Symmetries beyond the ones TensorKit itself ships with come from extension packages, such as [SUNRepresentations.jl](https://github.com/QuantumKitHub/SUNRepresentations.jl) for SU(N). ## Quickstart -After following the installation process, it should now be possible to load the packages and -start simulating. For example, to obtain the ground state of the 1D Ising model, we can use -the following code: +Sweeping the transverse field of the Ising model in the thermodynamic limit and measuring the magnetization: ```julia using MPSKit, MPSKitModels, TensorKit using ProgressMeter, Plots # for demonstration purposes -L = 16 # length of the chain D = 4 # bonddimension -init_state = FiniteMPS(L, ℂ^2, ℂ^D) +init_state = InfiniteMPS(ℂ^2, ℂ^D) -g_values = 0:0.1:2 +g_values = 0.1:0.1:2 M = @showprogress map(g_values) do g - H = periodic_boundary_conditions(transverse_field_ising(; g=g), L) - groundstate, environment, δ = find_groundstate(init_state, H; verbosity=0) - return abs(sum(expectation_value(groundstate, i => σᶻ()) for i in 1:L)) / L + H = transverse_field_ising(; g=g) + groundstate, environment, δ = find_groundstate(init_state, H, VUMPS(; verbosity=0)) + return abs(expectation_value(groundstate, 1 => σᶻ())) end scatter(g_values, M, xlabel="g", ylabel="M", label="D=$D", title="Magnetization") ``` -![Magnetization](docs/src/assets/README_ising_finite.png) +![Magnetization](docs/src/assets/README_ising_infinite.png) -Similarly, these simulations can be carried out directly in the thermodynamic limit, with -very minor code-changes: +The order parameter vanishes at `g ≥ 1`, where the chain becomes critical and transitions to the disordered phase. +Replacing the `InfiniteMPS` with a `FiniteMPS` and the ground-state algorithm to `DMRG` runs the same sweep on a finite chain instead; the [examples](https://QuantumKitHub.github.io/MPSKit.jl/dev/examples/) cover that case along with time evolution, excitations and two-dimensional partition functions. -```julia -using MPSKit, MPSKitModels, TensorKit -using ProgressMeter, Plots # for demonstration purposes +## Getting help and contributing -D = 4 # bonddimension -init_state = InfiniteMPS(ℂ^2, ℂ^D) +MPSKit is under active development and new algorithms are added regularly. +Questions and general discussion belong on [GitHub Discussions](https://github.com/QuantumKitHub/MPSKit.jl/discussions), bug reports and feature requests in the [issue tracker](https://github.com/QuantumKitHub/MPSKit.jl/issues). +See [`CONTRIBUTING.md`](CONTRIBUTING.md) if you would like to contribute code or documentation. -g_values = 0.1:0.1:2 +## Citing -M = @showprogress map(g_values) do g - H = transverse_field_ising(; g=g) - groundstate, environment, δ = find_groundstate(init_state, H, VUMPS(; verbosity=0)) - return abs(expectation_value(groundstate, 1 => σᶻ())) -end +If you use MPSKit.jl in your research, please cite it. +See [`CITATION.cff`](CITATION.cff) for the up-to-date citation metadata, or use the BibTeX entry below. -scatter(g_values, M, xlabel="g", ylabel="M", label="D=$D", title="Magnetization") +Please consider citing [TensorKit.jl](https://github.com/QuantumKitHub/TensorKit.jl) as well. +It provides the (symmetric) tensors that MPSKit is built on, and does much of the heavy lifting behind every algorithm here. + +```bibtex +@software{mpskitjl, + author = {Devos, Lukas and Van Damme, Maarten and Haegeman, Jutho}, + title = {{MPSKit.jl}}, + version = {v0.13.13}, + doi = {10.5281/zenodo.10654900}, + url = {https://github.com/QuantumKitHub/MPSKit.jl}, + year = {2026} +} + +@article{tensorkitjl, + author = {Devos, Lukas and Haegeman, Jutho}, + title = {{TensorKit.jl}: A Julia package for large-scale tensor computations, with a hint of category theory}, + journal = {arXiv preprint arXiv:2508.10076}, + doi = {10.48550/arXiv.2508.10076}, + year = {2025} +} ``` -![Magnetization](docs/src/assets/README_ising_infinite.png) +[docs-stable-img]: https://img.shields.io/badge/docs-stable-blue.svg +[docs-stable-url]: https://QuantumKitHub.github.io/MPSKit.jl/stable + +[docs-dev-img]: https://img.shields.io/badge/docs-dev-blue.svg +[docs-dev-url]: https://QuantumKitHub.github.io/MPSKit.jl/dev + +[doi-img]: https://zenodo.org/badge/DOI/10.5281/zenodo.10654900.svg +[doi-url]: https://doi.org/10.5281/zenodo.10654900 + +[codecov-img]: https://codecov.io/gh/QuantumKitHub/MPSKit.jl/branch/master/graph/badge.svg?token=rmp3bu7qn3 +[codecov-url]: https://codecov.io/gh/QuantumKitHub/MPSKit.jl + +[ci-img]: https://github.com/QuantumKitHub/MPSKit.jl/actions/workflows/Tests.yml/badge.svg +[ci-url]: https://github.com/QuantumKitHub/MPSKit.jl/actions/workflows/Tests.yml + +[pkgeval-img]: https://JuliaCI.github.io/NanosoldierReports/pkgeval_badges/M/MPSKit.svg +[pkgeval-url]: https://JuliaCI.github.io/NanosoldierReports/pkgeval_badges/M/MPSKit.html diff --git a/docs/make.jl b/docs/make.jl index 5922e4ee3..2549e0060 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -21,6 +21,20 @@ quantum_pages = map(readdir(joinpath(example_dir, "quantum1d"))) do dir return joinpath("examples", "quantum1d", dir, "index.md") end +# contributing guide: `CONTRIBUTING.md` in the repository root is canonical, since that is the +# location GitHub links to from the issue and pull request forms. Copy it in as a page so it is +# reachable from the manual as well, with an `EditURL` pointing back at the real source file. +open(joinpath(@__DIR__, "src", "contributing.md"), "w") do io + println( + io, """ + ```@meta + EditURL = "https://github.com/QuantumKitHub/MPSKit.jl/blob/main/CONTRIBUTING.md" + ``` + """ + ) + return write(io, read(joinpath(@__DIR__, "..", "CONTRIBUTING.md"), String)) +end + # bibliography bibpath = joinpath(@__DIR__, "src", "assets", "mpskit.bib") bib = CitationBibliography(bibpath; style = :authoryear) @@ -60,6 +74,7 @@ makedocs(; "Library" => "lib/lib.md", "References" => "references.md", "Changelog" => "changelog.md", + "Contributing" => "contributing.md", ], checkdocs = :exports, doctest = true, diff --git a/docs/src/assets/mpskit.bib b/docs/src/assets/mpskit.bib index 76f9fc9fe..44e762933 100644 --- a/docs/src/assets/mpskit.bib +++ b/docs/src/assets/mpskit.bib @@ -144,6 +144,31 @@ @article{devos2022 abstract = {We calculate the Haldane gap of the SU⁡(3) spin [300] Heisenberg model using variational uniform fully symmetric SU⁡(3) matrix product states, and find that the minimal gap {$\Delta$}/{$J$}=0.0263 is obtained in the [210] sector at momentum 2⁢{$\pi$}/3. We also discuss the symmetry protected topological order of the ground state, and determine the full dispersion relation of the elementary excitations and the correlation lengths of the system.} } +@misc{devos2025tensorkit, + title = {{{TensorKit.jl}}: A {{Julia}} Package for Large-Scale Tensor Computations, with a Hint of Category Theory}, + author = {Devos, Lukas and Haegeman, Jutho}, + year = {2025}, + month = aug, + number = {arXiv:2508.10076}, + eprint = {2508.10076}, + primaryclass = {cs.MS}, + publisher = {arXiv}, + doi = {10.48550/arXiv.2508.10076}, + url = {https://arxiv.org/abs/2508.10076}, + archiveprefix = {arXiv} +} + +@misc{devos2026mpskit, + title = {{{MPSKit.jl}}}, + author = {Devos, Lukas and Van Damme, Maarten and Haegeman, Jutho}, + year = {2026}, + month = jun, + version = {0.13.13}, + publisher = {Zenodo}, + doi = {10.5281/zenodo.10654900}, + url = {https://github.com/QuantumKitHub/MPSKit.jl} +} + @article{gleis2023, title = {Controlled {{Bond Expansion}} for {{Density Matrix Renormalization Group Ground State Search}} at {{Single-Site Costs}}}, author = {Gleis, Andreas and Li, Jheng-Wei and {von Delft}, Jan}, diff --git a/docs/src/index.md b/docs/src/index.md index dd86bb1ba..2b9265209 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -39,12 +39,18 @@ features: ## Table of contents -- [Prerequisites](@ref) -- [States](@ref um_states) -- [Operators](@ref um_operators) -- [Algorithms](@ref um_algorithms) -- [Parallelism in julia](@ref) -- [Lattices](@ref lattices) +- Manual + - [Prerequisites](@ref) + - [States](@ref um_states) + - [Operators](@ref um_operators) + - [Algorithms](@ref um_algorithms) + - [Parallelism in julia](@ref) + - [Lattices](@ref lattices) +- [Examples](@ref) +- [Library](@ref "Library documentation") +- [References](@ref) — how to cite MPSKit, and publications that have used it +- [Changelog](@ref) +- [Contributing](@ref "Contributing to MPSKit.jl") ## Installation diff --git a/docs/src/references.md b/docs/src/references.md index d092016fb..e857f9fdd 100644 --- a/docs/src/references.md +++ b/docs/src/references.md @@ -1,5 +1,13 @@ # References +## Citing MPSKit + +If you use MPSKit in your research, please cite it: [devos2026mpskit](@cite). +The [`CITATION.cff`](https://github.com/QuantumKitHub/MPSKit.jl/blob/main/CITATION.cff) file in the repository carries the up-to-date metadata, including the DOI of the specific release you used. + +Please consider citing [TensorKit.jl](https://github.com/QuantumKitHub/TensorKit.jl) as well: [devos2025tensorkit](@cite). +It provides the (symmetric) tensors that MPSKit is built on, and does much of the heavy lifting behind every algorithm here. + ## Publications using MPSKit Below you can find a list of publications that have made use of MPSKit. If you have used