-
Notifications
You must be signed in to change notification settings - Fork 41
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
130 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,10 +42,137 @@ A Julia package for large-scale tensor computations, with a hint of category the | |
[aqua-img]: https://raw.githubusercontent.com/JuliaTesting/Aqua.jl/master/badge.svg | ||
[aqua-url]: https://github.com/JuliaTesting/Aqua.jl | ||
|
||
Install via the package manager. | ||
## Release notes for v0.13 | ||
|
||
TensorKit v0.13 brings a number of performance improvements, but also comes with a number of | ||
breaking changes: | ||
|
||
1. The scalar type (the `eltype` of the tensor data) is now an explicit parameter of the | ||
the `TensorMap` type, and appears in the first position. As a consequence, `TensorMap{T}(undef, codomain ← domain)` can and should now be used to create a `TensorMap` with uninitialised data with scalar type `T`. | ||
|
||
2. The constructors for creating tensors with randomly initialised data, of the form | ||
`TensorMap(randn, T, codomain ← domain)`, are being replaced with | ||
`randn(T, codomain ← domain)`. Hence, we overload the methods `rand` and `randn` from | ||
Base (actually, Random, and also `Random.randexp`) and mimick the `Array` constructors, | ||
relying on the fact that we use spaces instead of integers to characterise the tensor | ||
structure. As with integer-based `rand` and `randn`, a custom random number generator | ||
from the `Random` module can be passed as the first argument, and the scalar type `T` is | ||
optional, defaulting to `Float64`. The old constructors | ||
`TensorMap(randn, T, codomain ← domain)` still exist in deprecation mode, and will be | ||
removed in the 1.0 release. | ||
|
||
3. The `TensorMap` data structure has been changed (simplified), so that all tensor data now | ||
resides in a single array of type `<:DenseVector`. While this should not does not lead to | ||
breaking changes in the interface, it does mean that `TensorMap` objects from | ||
TensorKit.jl v0.12.7 or earlier that were saved to disk using e.g. JLD2.jl, cannot simply | ||
be read back in using the new version of TensorKit.jl. We provide a script below export | ||
data in a format that can be read back in by TensorKit.jl v0.13. | ||
|
||
Major non-breaking changes include: | ||
|
||
* Support for [TensorOperations.jl v5](https://github.com/Jutho/TensorOperations.jl), and | ||
with this the new backend and allocator support within the `@tensor` macro. | ||
* The part of TensorKit.jl that defines `Sector` type hierarchy and its corresponding | ||
interface, as well as the implementation of all of the standard symmetries, has been | ||
moved to a separate package called [TensorKitSectors.jl](https://github.com/QuantumKitHub/TensorKitSectors.jl), | ||
so that it can also be used by other packages and is a more lightweight dependency. | ||
TensorKitSectors.jl a direct dependency and is automatically installed when installing | ||
TensorKit.jl. Furthermore, its public interface is re-exported by TensorKit.jl, so that | ||
this should not have any observable consequences. | ||
* The `fusiontrees` iterator now iterates over `FusionTree` objects in a different order, | ||
which will facilitate speeding up certain operations in the future. Furthermore, it now | ||
also accepts a `ProductSpace` object as first input, instead of simply a tuple of `Sector` | ||
objects. This also affects the data ordering in the `TensorMap` objects. | ||
* The structural information associated with a `TensorMap` object (or rather with the | ||
`HomSpace` instance that represents the space to which the tensor belongs) is no longer | ||
stored within the tensor, but is cached in a global (or task local) dictionary. As a | ||
result, this information does not need to be recomputed when new `TensorMap` objects are | ||
created, thus eliminating some overhead that can be significant in certain applications. | ||
|
||
### Transferring `TensorMap` data from older versions to v0.13: | ||
|
||
To export `TensorMap` data from TensorKit.jl v0.12.7 or earlier, you should first export the | ||
data there in a format that is explicit about how tensor data is associated with the | ||
structural part of the tensor, i.e. the splitting and fusion tree pairs. Therefore, on the | ||
older version of TensorKit.jl, use the following code to save teh data | ||
|
||
```julia | ||
using JLD2 | ||
filename = "choose_some_filename.jld2" | ||
t_dict = Dict(:space => space(t), :data => Dict((f₁, f₂) => t[f₁, f₂] for (f₁, f₂) in fusiontrees(t))) | ||
jldsave(filename; t_dict) | ||
``` | ||
|
||
If you have already upgraded to TensorKit.jl v0.13, you can still install the old version in | ||
a separate environment, for example a temporary environment. To do this, run | ||
|
||
```julia | ||
]activate --temp | ||
]add TensorKit@0.12.7 | ||
``` | ||
|
||
or | ||
|
||
```julia | ||
import Pkg | ||
Pkg.activate(; temp = true) | ||
Pkg.add("[email protected]") | ||
``` | ||
|
||
Then, in the environment where you have TensorKit.jl v0.13 installed, you can read in the | ||
data and reconstruct the tensor as follows: | ||
|
||
```julia | ||
using JLD2 | ||
filename = "choose_some_filename.jld2" | ||
t_dict = jldload(filename) | ||
T = eltype(valtype(t_dict[:data])) | ||
t = TensorMap{T}(undef, t_dict[:space]) | ||
for ((f₁, f₂), val) in t_dict[:data] | ||
t[f₁, f₂] .= val | ||
end | ||
``` | ||
|
||
## Overview | ||
|
||
TensorKit.jl is a package that provides a types and methods to represent and manipulate | ||
tensors with symmetries. The emphasis is on the structure and functionality needed to build | ||
tensor network algorithms for the simulation of quantum many-body systems. Such tensors are | ||
typically invariant under a symmetry group which acts via specific representions on each of | ||
the indices of the tensor. TensorKit.jl provides the functionality for constructing such | ||
tensors and performing typical operations such as tensor contractions and decompositions, | ||
thereby preserving the symmetries and exploiting them for optimal performance. | ||
|
||
While most common symmetries are already shipped with TensorKit.jl, there exist several extensions: [SUNRepresentations.jl](https://github.com/maartenvd/SUNRepresentations.jl) provides support for SU(N), while [CategoryData.jl](https://github.com/lkdvos/CategoryData.jl) incorporates a large collection of *small* fusion categories. | ||
Additionally, for libraries that implement tensor network algorithms on top of TensorKit.jl, check out [MPSKit.jl](https://github.com/maartenvd/MPSKit.jl), [MERAKit.jl](https://github.com/mhauru/MERAKit.jl) and [PEPSKit.jl](https://github.com/quantumghent/PEPSKit.jl). | ||
|
||
Check out the [tutorial](https://jutho.github.io/TensorKit.jl/stable/man/tutorial/) and the full [documentation](https://jutho.github.io/TensorKit.jl/stable). | ||
|
||
## Installation | ||
`TensorKit.jl` can be installed with the Julia package manager. | ||
From the Julia REPL, type `]` to enter the Pkg REPL mode and run: | ||
``` | ||
pkg> add TensorKit | ||
``` | ||
|
||
While most common symmetries are already shipped with TensorKit.jl, there exist several extensions: [SUNRepresentations.jl](https://github.com/maartenvd/SUNRepresentations.jl) provides support for SU(N), while [CategoryData.jl](https://github.com/lkdvos/CategoryData.jl) incorporates a large collection of *small* fusion categories. | ||
Additionally, for libraries that implement tensor network algorithms on top of TensorKit.jl, check out [MPSKit.jl](https://github.com/maartenvd/MPSKit.jl), [MERAKit.jl](https://github.com/mhauru/MERAKit.jl) and [PEPSKit.jl](https://github.com/quantumghent/PEPSKit.jl). | ||
Or, equivalently, via the `Pkg` API: | ||
```julia | ||
julia> import Pkg; Pkg.add("TensorKit.jl") | ||
``` | ||
|
||
## Documentation | ||
|
||
- [**STABLE**][docs-stable-url] - **documentation of the most recently tagged version.** | ||
- [**DEVEL**][docs-dev-url] - *documentation of the in-development version.* | ||
|
||
## Project Status | ||
|
||
The package is tested against Julia versions `1.8`, `1.10` and the latest `1.x` release, as | ||
well as against teh nightly builds of the Julia `master` branch on Linux, macOS, and Windows | ||
platforms with a 64-bit architecture. | ||
|
||
## Questions and Contributions | ||
|
||
Contributions are very welcome, as are feature requests and suggestions. Please open an [issue][issues-url] if you encounter any problems. | ||
|
||
[issues-url]: https://github.com/Jutho/TensorKit.jl/issues |
ba4e27b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@JuliaRegistrator register
ba4e27b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Registration pull request created: JuliaRegistries/General/118650
Tip: Release Notes
Did you know you can add release notes too? Just add markdown formatted text underneath the comment after the text
"Release notes:" and it will be added to the registry PR, and if TagBot is installed it will also be added to the
release that TagBot creates. i.e.
To add them here just re-invoke and the PR will be updated.
Tagging
After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.
This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:
ba4e27b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks a lot for the updated docs and conversion script !
Additionally, since the
TensorOperations
backends are now supported I was wondering if this means that GPU/CUDA can be used ?If so, has there been any benchmarking to see when/where this advantageous ?