From bb287be3bd001893016c6694f512d55edffdc115 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Thu, 10 Oct 2024 16:06:59 +0000 Subject: [PATCH] build based on 728aefb --- previews/PR215/.documenter-siteinfo.json | 2 +- previews/PR215/alternatives.html | 2 +- previews/PR215/ansatz/chain.html | 2 +- previews/PR215/ansatz/product.html | 2 +- previews/PR215/contraction.html | 2 +- previews/PR215/developer/type-hierarchy.html | 2 +- previews/PR215/index.html | 2 +- previews/PR215/quantum.html | 2 +- previews/PR215/references.html | 2 +- previews/PR215/tensor-network.html | 10 +++++----- previews/PR215/tensors.html | 12 ++++++------ previews/PR215/transformations-638d118b.png | Bin 20158 -> 0 bytes previews/PR215/transformations-a6efaaec.png | Bin 0 -> 20270 bytes previews/PR215/transformations.html | 4 ++-- previews/PR215/visualization.html | 2 +- 15 files changed, 23 insertions(+), 23 deletions(-) delete mode 100644 previews/PR215/transformations-638d118b.png create mode 100644 previews/PR215/transformations-a6efaaec.png diff --git a/previews/PR215/.documenter-siteinfo.json b/previews/PR215/.documenter-siteinfo.json index 30d6cab4..d8713559 100644 --- a/previews/PR215/.documenter-siteinfo.json +++ b/previews/PR215/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-10-09T03:41:04","documenter_version":"1.7.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.5","generation_timestamp":"2024-10-10T16:06:54","documenter_version":"1.7.0"}} \ No newline at end of file diff --git a/previews/PR215/alternatives.html b/previews/PR215/alternatives.html index 56d36e27..043bb452 100644 --- a/previews/PR215/alternatives.html +++ b/previews/PR215/alternatives.html @@ -1,2 +1,2 @@ -Alternatives · Tenet.jl

Alternatives

Tenet is strongly opinionated. We acknowledge that it may not suit all cases (although we try 🙂). If your case doesn't fit Tenet's design, you can try the following libraries:

+Alternatives · Tenet.jl

Alternatives

Tenet is strongly opinionated. We acknowledge that it may not suit all cases (although we try 🙂). If your case doesn't fit Tenet's design, you can try the following libraries:

diff --git a/previews/PR215/ansatz/chain.html b/previews/PR215/ansatz/chain.html index 2edb8248..eb8a59c1 100644 --- a/previews/PR215/ansatz/chain.html +++ b/previews/PR215/ansatz/chain.html @@ -21,4 +21,4 @@ Label(fig[1,1, Bottom()], "Open") # hide Label(fig[1,2, Bottom()], "Periodic") # hide -fig # hide

In Tenet, the generic MatrixProduct ansatz implements this topology. Type variables are used to address their functionality (State or Operator) and their boundary conditions (Open or Periodic).

Missing docstring.

Missing docstring for MatrixProduct. Check Documenter's build log for details.

Missing docstring.

Missing docstring for MatrixProduct(::Any). Check Documenter's build log for details.

+fig # hide

In Tenet, the generic MatrixProduct ansatz implements this topology. Type variables are used to address their functionality (State or Operator) and their boundary conditions (Open or Periodic).

Missing docstring.

Missing docstring for MatrixProduct. Check Documenter's build log for details.

Missing docstring.

Missing docstring for MatrixProduct(::Any). Check Documenter's build log for details.

diff --git a/previews/PR215/ansatz/product.html b/previews/PR215/ansatz/product.html index 7bbe1a56..c6c5ddb3 100644 --- a/previews/PR215/ansatz/product.html +++ b/previews/PR215/ansatz/product.html @@ -1,2 +1,2 @@ -Product ansatz · Tenet.jl
+Product ansatz · Tenet.jl
diff --git a/previews/PR215/contraction.html b/previews/PR215/contraction.html index 7010122d..cf5c6d6a 100644 --- a/previews/PR215/contraction.html +++ b/previews/PR215/contraction.html @@ -1,2 +1,2 @@ -Contraction · Tenet.jl

Contraction

Contraction path optimization and execution is delegated to the EinExprs library. A EinExpr is a lower-level form of a Tensor Network, in which the contraction path has been laid out as a tree. It is similar to a symbolic expression (i.e. Expr) but in which every node represents an Einstein summation expression (aka einsum).

EinExprs.einexprMethod
einexpr(tn::AbstractTensorNetwork; optimizer = EinExprs.Greedy, output = inds(tn, :open), kwargs...)

Search a contraction path for the given AbstractTensorNetwork and return it as a EinExpr.

Keyword Arguments

  • optimizer Contraction path optimizer. Check EinExprs documentation for more info.
  • outputs Indices that won't be contracted. Defaults to open indices.
  • kwargs Options to be passed to the optimizer.

See also: contract.

source
Missing docstring.

Missing docstring for contract(::Tenet.TensorNetwork). Check Documenter's build log for details.

+Contraction · Tenet.jl

Contraction

Contraction path optimization and execution is delegated to the EinExprs library. A EinExpr is a lower-level form of a Tensor Network, in which the contraction path has been laid out as a tree. It is similar to a symbolic expression (i.e. Expr) but in which every node represents an Einstein summation expression (aka einsum).

EinExprs.einexprMethod
einexpr(tn::AbstractTensorNetwork; optimizer = EinExprs.Greedy, output = inds(tn, :open), kwargs...)

Search a contraction path for the given AbstractTensorNetwork and return it as a EinExpr.

Keyword Arguments

  • optimizer Contraction path optimizer. Check EinExprs documentation for more info.
  • outputs Indices that won't be contracted. Defaults to open indices.
  • kwargs Options to be passed to the optimizer.

See also: contract.

source
Missing docstring.

Missing docstring for contract(::Tenet.TensorNetwork). Check Documenter's build log for details.

diff --git a/previews/PR215/developer/type-hierarchy.html b/previews/PR215/developer/type-hierarchy.html index 80aa867b..f9ce45b1 100644 --- a/previews/PR215/developer/type-hierarchy.html +++ b/previews/PR215/developer/type-hierarchy.html @@ -9,4 +9,4 @@ id3(Ansatz) --> Chain style id1 stroke-dasharray: 5 5 style id2 stroke-dasharray: 5 5 - style id3 stroke-dasharray: 5 5 + style id3 stroke-dasharray: 5 5 diff --git a/previews/PR215/index.html b/previews/PR215/index.html index 3bd2afb4..24d00ffa 100644 --- a/previews/PR215/index.html +++ b/previews/PR215/index.html @@ -2,4 +2,4 @@ Home · Tenet.jl

Tenet.jl

BSC-Quantic's Registry

Tenet and some of its dependencies are located in our own Julia registry. In order to download Tenet, add our registry to your Julia installation by using the Pkg mode in a REPL session,

using Pkg
 pkg"registry add https://github.com/bsc-quantic/Registry"

A Julia library for Tensor Networks. Tenet can be executed both at local environments and on large supercomputers. Its goals are,

  • Expressiveness Simple to use 👶
  • Flexibility Extend it to your needs 🔧
  • Performance Goes brr... fast 🏎️

A video of its presentation at JuliaCon 2023 can be seen here:

-

Features

  • Optimized Tensor Network contraction, powered by EinExprs
  • Tensor Network slicing/cuttings
  • Automatic Differentiation of TN contraction, powered by EinExprs and ChainRules
  • 3D visualization of large networks, powered by Makie
+

Features

diff --git a/previews/PR215/quantum.html b/previews/PR215/quantum.html index 7a0139dd..ef8f1586 100644 --- a/previews/PR215/quantum.html +++ b/previews/PR215/quantum.html @@ -1,2 +1,2 @@ -Introduction · Tenet.jl

Quantum Tensor Networks

Tenet.QuantumType
Quantum

Tensor Network with a notion of "causality". This leads to the notion of sites and directionality (input/output).

Notes

  • Indices are referenced by Sites.
source
Base.adjointMethod
adjoint(q::Quantum)

Returns the adjoint of a Quantum Tensor Network; i.e. the conjugate Tensor Network with the inputs and outputs swapped.

source

Queries

Missing docstring.

Missing docstring for Tenet.inds(::Quantum; kwargs...). Check Documenter's build log for details.

Missing docstring.

Missing docstring for Tenet.tensors(::Quantum; kwargs...). Check Documenter's build log for details.

Connecting Quantum Tensor Networks

Missing docstring.

Missing docstring for inputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for outputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for lanes. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ninputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for noutputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for nlanes. Check Documenter's build log for details.

Missing docstring.

Missing docstring for Socket. Check Documenter's build log for details.

Tenet.ScalarType
Scalar <: Socket

Socket representing a scalar; i.e. a Tensor Network with no open sites.

source
Tenet.StateType
State <: Socket

Socket representing a state; i.e. a Tensor Network with only input sites (or only output sites if dual = true).

source
Tenet.OperatorType
Operator <: Socket

Socket representing an operator; i.e. a Tensor Network with both input and output sites.

source
Missing docstring.

Missing docstring for Base.merge(::Quantum, ::Quantum...). Check Documenter's build log for details.

+Introduction · Tenet.jl

Quantum Tensor Networks

Tenet.QuantumType
Quantum

Tensor Network with a notion of "causality". This leads to the notion of sites and directionality (input/output).

Notes

  • Indices are referenced by Sites.
source
Base.adjointMethod
adjoint(q::Quantum)

Returns the adjoint of a Quantum Tensor Network; i.e. the conjugate Tensor Network with the inputs and outputs swapped.

source

Queries

Missing docstring.

Missing docstring for Tenet.inds(::Quantum; kwargs...). Check Documenter's build log for details.

Missing docstring.

Missing docstring for Tenet.tensors(::Quantum; kwargs...). Check Documenter's build log for details.

Connecting Quantum Tensor Networks

Missing docstring.

Missing docstring for inputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for outputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for lanes. Check Documenter's build log for details.

Missing docstring.

Missing docstring for ninputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for noutputs. Check Documenter's build log for details.

Missing docstring.

Missing docstring for nlanes. Check Documenter's build log for details.

Missing docstring.

Missing docstring for Socket. Check Documenter's build log for details.

Tenet.ScalarType
Scalar <: Socket

Socket representing a scalar; i.e. a Tensor Network with no open sites.

source
Tenet.StateType
State <: Socket

Socket representing a state; i.e. a Tensor Network with only input sites (or only output sites if dual = true).

source
Tenet.OperatorType
Operator <: Socket

Socket representing an operator; i.e. a Tensor Network with both input and output sites.

source
Missing docstring.

Missing docstring for Base.merge(::Quantum, ::Quantum...). Check Documenter's build log for details.

diff --git a/previews/PR215/references.html b/previews/PR215/references.html index ebd5c113..379d3eca 100644 --- a/previews/PR215/references.html +++ b/previews/PR215/references.html @@ -1,2 +1,2 @@ -References · Tenet.jl

References

  • Fishman, M.; White, S. R. and Stoudenmire, E. M. (2022). The ITensor Software Library for Tensor Network Calculations. SciPost Phys. Codebases, 4.
  • Gray, J. (2018), quimb: A python package for quantum information and many-body calculations. Journal of Open Source Software 3, 819.
  • Gray, J. and Kourtis, S. (2021). Hyper-optimized tensor network contraction. Quantum 5, 410.
  • Hauschild, J.; Pollmann, F. and Zaletel, M. (2021). The Tensor Network Python (TeNPy) Library. In: APS March Meeting Abstracts, Vol. 2021; p. R21–006.
  • Ramón Pareja Monturiol, J.; Pérez-García, D. and Pozas-Kerstjens, A. (2023). TensorKrowch: Smooth integration of tensor networks in machine learning, arXiv e-prints, arXiv–2306.
+References · Tenet.jl

References

  • Fishman, M.; White, S. R. and Stoudenmire, E. M. (2022). The ITensor Software Library for Tensor Network Calculations. SciPost Phys. Codebases, 4.
  • Gray, J. (2018), quimb: A python package for quantum information and many-body calculations. Journal of Open Source Software 3, 819.
  • Gray, J. and Kourtis, S. (2021). Hyper-optimized tensor network contraction. Quantum 5, 410.
  • Hauschild, J.; Pollmann, F. and Zaletel, M. (2021). The Tensor Network Python (TeNPy) Library. In: APS March Meeting Abstracts, Vol. 2021; p. R21–006.
  • Ramón Pareja Monturiol, J.; Pérez-García, D. and Pozas-Kerstjens, A. (2023). TensorKrowch: Smooth integration of tensor networks in machine learning, arXiv e-prints, arXiv–2306.
diff --git a/previews/PR215/tensor-network.html b/previews/PR215/tensor-network.html index a60cbb63..301547da 100644 --- a/previews/PR215/tensor-network.html +++ b/previews/PR215/tensor-network.html @@ -2,8 +2,8 @@ Tensor Networks · Tenet.jl

Tensor Networks

Tensor Networks (TN) are a graphical notation for representing complex multi-linear functions. For example, the following equation

\[\sum_{ijklmnop} A_{im} B_{ijp} C_{njk} D_{pkl} E_{mno} F_{ol}\]

can be represented visually as

Sketch of a Tensor Network
Sketch of a Tensor Network
-

The graph's nodes represent tensors and edges represent tensor indices.

In Tenet, these objects are represented by the TensorNetwork type.

Tenet.TensorNetworkType
TensorNetwork

Graph of interconnected tensors, representing a multilinear equation. Graph vertices represent tensors and graph edges, tensor indices.

source

Information about a TensorNetwork can be queried with the following functions.

Query information

Missing docstring.

Missing docstring for inds(::Tenet.TensorNetwork). Check Documenter's build log for details.

Base.sizeMethod
size(tn::AbstractTensorNetwork)
-size(tn::AbstractTensorNetwork, index)

Return a mapping from indices to their dimensionalities.

If index is set, return the dimensionality of index. This is equivalent to size(tn)[index].

source
Missing docstring.

Missing docstring for tensors(::Tenet.TensorNetwork). Check Documenter's build log for details.

Modification

Add/Remove tensors

Base.push!Method
push!(tn::AbstractTensorNetwork, tensor::Tensor)

Add a new tensor to the Tensor Network.

See also: append!, pop!.

source
Base.append!Method
append!(tn::TensorNetwork, tensors::AbstractVecOrTuple{<:Tensor})

Add a list of tensors to a TensorNetwork.

See also: push!, merge!.

source
Base.merge!Method
merge!(self::TensorNetwork, others::TensorNetwork...)
-merge(self::TensorNetwork, others::TensorNetwork...)

Fuse various TensorNetworks into one.

See also: append!.

source
Base.pop!Method
pop!(tn::TensorNetwork, tensor::Tensor)
-pop!(tn::TensorNetwork, i::Union{Symbol,AbstractVecOrTuple{Symbol}})

Remove a tensor from the Tensor Network and returns it. If a Tensor is passed, then the first tensor satisfies egality (i.e. or ===) will be removed. If a Symbol or a list of Symbols is passed, then remove and return the tensors that contain all the indices.

See also: push!, delete!.

source

Replace existing elements

Base.replace!Function
replace!(tn::AbstractTensorNetwork, old => new...)
-replace(tn::AbstractTensorNetwork, old => new...)

Replace the element in old with the one in new. Depending on the types of old and new, the following behaviour is expected:

  • If Symbols, it will correspond to a index renaming.
  • If Tensors, first element that satisfies egality ( or ===) will be replaced.
source

Slicing

Miscelaneous

Missing docstring.

Missing docstring for Base.rand(::Type{TensorNetwork}, n::Integer, regularity::Integer). Check Documenter's build log for details.

+

The graph's nodes represent tensors and edges represent tensor indices.

In Tenet, these objects are represented by the TensorNetwork type.

Tenet.TensorNetworkType
TensorNetwork

Graph of interconnected tensors, representing a multilinear equation. Graph vertices represent tensors and graph edges, tensor indices.

source

Information about a TensorNetwork can be queried with the following functions.

Query information

Missing docstring.

Missing docstring for inds(::Tenet.TensorNetwork). Check Documenter's build log for details.

Base.sizeMethod
size(tn::AbstractTensorNetwork)
+size(tn::AbstractTensorNetwork, index)

Return a mapping from indices to their dimensionalities.

If index is set, return the dimensionality of index. This is equivalent to size(tn)[index].

source
Missing docstring.

Missing docstring for tensors(::Tenet.TensorNetwork). Check Documenter's build log for details.

Modification

Add/Remove tensors

Base.push!Method
push!(tn::AbstractTensorNetwork, tensor::Tensor)

Add a new tensor to the Tensor Network.

See also: append!, pop!.

source
Base.append!Method
append!(tn::TensorNetwork, tensors::AbstractVecOrTuple{<:Tensor})

Add a list of tensors to a TensorNetwork.

See also: push!, merge!.

source
Base.merge!Method
merge!(self::TensorNetwork, others::TensorNetwork...)
+merge(self::TensorNetwork, others::TensorNetwork...)

Fuse various TensorNetworks into one.

See also: append!.

source
Base.pop!Method
pop!(tn::TensorNetwork, tensor::Tensor)
+pop!(tn::TensorNetwork, i::Union{Symbol,AbstractVecOrTuple{Symbol}})

Remove a tensor from the Tensor Network and returns it. If a Tensor is passed, then the first tensor satisfies egality (i.e. or ===) will be removed. If a Symbol or a list of Symbols is passed, then remove and return the tensors that contain all the indices.

See also: push!, delete!.

source
Base.delete!Method
delete!(tn::TensorNetwork, x)

Like pop! but return the TensorNetwork instead.

source

Replace existing elements

Base.replace!Function
replace!(tn::AbstractTensorNetwork, old => new...)
+replace(tn::AbstractTensorNetwork, old => new...)

Replace the element in old with the one in new. Depending on the types of old and new, the following behaviour is expected:

  • If Symbols, it will correspond to a index renaming.
  • If Tensors, first element that satisfies egality ( or ===) will be replaced.
source

Slicing

Base.selectdimFunction
selectdim(tn::AbstractTensorNetwork, index::Symbol, i)

Return a copy of the AbstractTensorNetwork where index has been projected to dimension i.

See also: view, slice!.

source
Tenet.slice!Function
slice!(tn::AbstractTensorNetwork, index::Symbol, i)

In-place projection of index on dimension i.

See also: selectdim, view.

source
Base.viewMethod
view(tn::AbstractTensorNetwork, index => i...)

Return a copy of the AbstractTensorNetwork where each index has been projected to dimension i. It is equivalent to a recursive call of selectdim.

See also: selectdim, slice!.

source

Miscelaneous

Base.copyMethod
copy(tn::TensorNetwork)

Return a shallow copy of a TensorNetwork.

source
Missing docstring.

Missing docstring for Base.rand(::Type{TensorNetwork}, n::Integer, regularity::Integer). Check Documenter's build log for details.

diff --git a/previews/PR215/tensors.html b/previews/PR215/tensors.html index d4a1428a..3bee1e9b 100644 --- a/previews/PR215/tensors.html +++ b/previews/PR215/tensors.html @@ -1,11 +1,11 @@ Tensors · Tenet.jl

Tensors

There are many jokes[1] about how to define a tensor. The definition we are giving here might not be the most correct one, but it is good enough for our use case (don't kill me please, mathematicians). A tensor $T$ of order[2] $n$ is a multilinear[3] application between $n$ vector spaces over a field $\mathcal{F}$.

\[T : \mathcal{F}^{\dim(1)} \times \dots \times \mathcal{F}^{\dim(n)} \mapsto \mathcal{F}\]

In layman's terms, it is a linear function whose inputs are vectors and the output is a scalar number.

\[T(\mathbf{v}^{(1)}, \dots, \mathbf{v}^{(n)}) = c \in \mathcal{F} \qquad\qquad \forall i, \mathbf{v}^{(i)} \in \mathcal{F}^{\dim(i)}\]

Tensor algebra is a higher-order generalization of linear algebra, where scalar numbers can be viewed as order-0 tensors, vectors as order-1 tensors, matrices as order-2 tensors, ...

Letters are used to identify each of the vector spaces the tensor relates to. In computer science, you would intuitively think of tensors as "n-dimensional arrays with named dimensions".

\[T_{ijk} \iff \mathtt{T[i,j,k]}\]

The Tensor type

In Tenet, a tensor is represented by the Tensor type, which wraps an array and a list of symbols. As it subtypes AbstractArray, many array operations can be dispatched to it.

You can create a Tensor by passing an array and a list of Symbols that name indices.

julia> Tᵢⱼₖ = Tensor(rand(3,5,2), (:i,:j,:k))3×5×2 Tensor{Float64, 3, Array{Float64, 3}}:
 [:, :, 1] =
- 0.363958  0.415425   0.921957  0.356455  0.151699
- 0.583937  0.0206827  0.155136  0.319872  0.0525211
- 0.816205  0.154856   0.110185  0.67421   0.568474
+ 0.197618   0.203551  0.384015  0.239109  0.388469
+ 0.0863329  0.576607  0.869166  0.079995  0.57958
+ 0.529524   0.610879  0.89365   0.135614  0.201409
 
 [:, :, 2] =
- 0.775277   0.378791   0.861924  0.140973  0.460296
- 0.856018   0.935169   0.343515  0.172275  0.003734
- 0.0520545  0.0108267  0.669582  0.997262  0.82435

The dimensionality or size of each index can be consulted using the size function.

Base.sizeMethod
Base.size(::Tensor[, i])

Return the size of the underlying array or the dimension i (specified by Symbol or Integer).

source
julia> size(Tᵢⱼₖ)(3, 5, 2)
julia> size(Tᵢⱼₖ, :j)5
julia> length(Tᵢⱼₖ)30

Operations

Contraction

Tenet.contractMethod
contract(a::Tensor[, b::Tensor]; dims=nonunique([inds(a)..., inds(b)...]))

Perform tensor contraction operation.

source

Factorizations

LinearAlgebra.svdMethod
LinearAlgebra.svd(tensor::Tensor; left_inds, right_inds, virtualind, kwargs...)

Perform SVD factorization on a tensor.

Keyword arguments

  • left_inds: left indices to be used in the SVD factorization. Defaults to all indices of t except right_inds.
  • right_inds: right indices to be used in the SVD factorization. Defaults to all indices of t except left_inds.
  • virtualind: name of the virtual bond. Defaults to a random Symbol.
source
LinearAlgebra.qrMethod
LinearAlgebra.qr(tensor::Tensor; left_inds, right_inds, virtualind, kwargs...)

Perform QR factorization on a tensor.

Keyword arguments

  • left_inds: left indices to be used in the QR factorization. Defaults to all indices of t except right_inds.
  • right_inds: right indices to be used in the QR factorization. Defaults to all indices of t except left_inds.
  • virtualind: name of the virtual bond. Defaults to a random Symbol.
source
LinearAlgebra.luMethod
LinearAlgebra.lu(tensor::Tensor; left_inds, right_inds, virtualind, kwargs...)

Perform LU factorization on a tensor.

Keyword arguments

  • left_inds: left indices to be used in the LU factorization. Defaults to all indices of t except right_inds.
  • right_inds: right indices to be used in the LU factorization. Defaults to all indices of t except left_inds.
  • virtualind: name of the virtual bond. Defaults to a random Symbol.
source
  • 1For example, recursive definitions like a tensor is whatever that transforms as a tensor.
  • 2The order of a tensor may also be known as rank or dimensionality in other fields. However, these can be missleading, since it has nothing to do with the rank of linear algebra nor with the dimensionality of a vector space. We prefer to use word order.
  • 3Meaning that the relationships between the output and the inputs, and the inputs between them, are linear.
+ 0.725178 0.666707 0.904233 0.749851 0.448543 + 0.211241 0.688225 0.617232 0.0822884 0.915417 + 0.250292 0.698221 0.0399437 0.36157 0.968274

The dimensionality or size of each index can be consulted using the size function.

Base.sizeMethod
Base.size(::Tensor[, i])

Return the size of the underlying array or the dimension i (specified by Symbol or Integer).

source
julia> size(Tᵢⱼₖ)(3, 5, 2)
julia> size(Tᵢⱼₖ, :j)5
julia> length(Tᵢⱼₖ)30

Operations

Contraction

Tenet.contractMethod
contract(a::Tensor[, b::Tensor]; dims=nonunique([inds(a)..., inds(b)...]))

Perform tensor contraction operation.

source

Factorizations

LinearAlgebra.svdMethod
LinearAlgebra.svd(tensor::Tensor; left_inds, right_inds, virtualind, kwargs...)

Perform SVD factorization on a tensor.

Keyword arguments

  • left_inds: left indices to be used in the SVD factorization. Defaults to all indices of t except right_inds.
  • right_inds: right indices to be used in the SVD factorization. Defaults to all indices of t except left_inds.
  • virtualind: name of the virtual bond. Defaults to a random Symbol.
source
LinearAlgebra.qrMethod
LinearAlgebra.qr(tensor::Tensor; left_inds, right_inds, virtualind, kwargs...)

Perform QR factorization on a tensor.

Keyword arguments

  • left_inds: left indices to be used in the QR factorization. Defaults to all indices of t except right_inds.
  • right_inds: right indices to be used in the QR factorization. Defaults to all indices of t except left_inds.
  • virtualind: name of the virtual bond. Defaults to a random Symbol.
source
LinearAlgebra.luMethod
LinearAlgebra.lu(tensor::Tensor; left_inds, right_inds, virtualind, kwargs...)

Perform LU factorization on a tensor.

Keyword arguments

  • left_inds: left indices to be used in the LU factorization. Defaults to all indices of t except right_inds.
  • right_inds: right indices to be used in the LU factorization. Defaults to all indices of t except left_inds.
  • virtualind: name of the virtual bond. Defaults to a random Symbol.
source
diff --git a/previews/PR215/transformations-638d118b.png b/previews/PR215/transformations-638d118b.png deleted file mode 100644 index 48f42e3b23b84fba1028a7e722818df2cb634155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20158 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

}ohQ*wx) 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 diff --git a/previews/PR215/transformations-a6efaaec.png b/previews/PR215/transformations-a6efaaec.png new file mode 100644 index 0000000000000000000000000000000000000000..d32272d8c107738716c361dddaa0b80a468bb2f2 GIT binary patch literal 20270 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�e8KvqQ`e0NqYGj;eu!Gs?8z7RDJnO9X`YI?;lL4H(*z8H7=+ z*4jVxMRt%Nh|Ha4Vy8w>B_Qhd?b`=BNN##L@>AU`^jtqZb^ZLB|5+OwDD#%XZzu@# z**H}QG?b>L)m5)m`ZMurHIMg~nbxx^d|H~y?`IXd=4bRB9R{ow8i}>{6TCx%ypMU7 z-V(7UOBKlV*!-o$Lm*=H85YN3R#n zp$kFgnXL&dtgP5QuLR%x{6zz=^?86!mw&?+=H^m&XT1IWhZG-EC>*;>W2G!ACf3y0 z*b7*PHWFk|-?BSWG06UV_wHR?UHw>4Kt)4Cxw}rYxN8EGm?*9F;DJdyX zg;4XM5YhQpPO7a7965r$R8mn{SX@MzILJh7P@y8QPb*)#w1XtOa`Y#XEGR0-v*hX1 z$RFtAFp+?70k%=JZ``=?UpRw7{+*e@O&azT+zKW#Dx4@dN8I@K{d)g$l3d_1ug%h!m>y_XawL+gwlWFQp=MoT^sIdt8{6O9 zEX>cJQc!Rg=n*u^xFabIsOF?qM?qmBPA0aZmCuNhLhJu|0kUZc-acfpe{e7;BxJ)W zACwE!3JZ?X93%|Ctp|uDE38kObH`jMRb+e(5*Zkbv==k_i{o{^q}=PC9Y&gk*p18y9$)0Sz5EC2%G&{w)9o#VC*2Fcva`0zB_Y(Wd8SeEpRsEJLvjI#Pc&VU=?7> zcbESjzEoSlRc$*+5?2+cwcB-W zG{V8NH7GMv80hNt>l+s?Z1rV8D%*xW-Aq)Z^VP#A<*mopRi{r{k!6M__`$wqd^|25 zH-!w3e25)E=ZyauvH}koQ9=rNX!M=&QXj79A)7sAws|Wz5W9xB;m`KFI`<%A$g^w+%G-$-(i9jghHW=TYdig&7X}e z1Y@P!xBp`IO%Kg*=p_6|zCgPF*~a%YX%sGir5C`?-+%nLcJ(R>b2|=6Ljyh6r>$`lq00`DJBg#l^)H7fYcb0MZbwB76Z7tkCtM_QpmuwIi1HsXONA=OjIg}}eZi}vtj>*lNKzL5bAF{au1VT9uKbIfX(n{Izr>feT+9oBw zun1v;qaZKHqkMcHU_gKSfq?-V8=DsEuclo}PH*U#Nm9>j z$AczsiY1Gxi1s{b-?q zBSA&)>Fe{fw-d(i{pjf_E-jTgae}2xkdZ);MWdU@by>f2v!w6`-|?ugjg^&8Lqid7 zt>3<#vqEp5g@uJT^gIqN5+INQiUF7^3J@Uv>({T>nafBaZjMux2N`rd~vYW-_#>sg|-l7P+B z=&zw06K#8#H#xb`Vb@nv6G7#Lt)Q}!L{04vcA&}6;^nnTwiS47zB+S&iRcGg4a(1t z4{K{{xSgeQ!bljf=wR`XhC07}OI6wR=8EI$BK`Gx zUK6Fq1>a6OIiV#K;-fcdXJLW97$Csrav4>*AZYg~Fms%?-Me=q19;7iwj!sG<#a>! zgjqz|W2GI})7i=9r4K4G@jcrZ40Orc6C0(arB$}R5RKd(7S@JK0{$KT^QRf5JAxh_ zHeCQIw3Z|#B~9g*tyz^{@}0As8g+efmG${j{Kr5`6O%dgD{E>LI5}SdN8t^~q5J8R z2|55sB9v0(tY)ykzMy3znq66+c^}}Db>p=PE)~<6lJkB_| zR8+r*hQgjcMPpkvRtALkT^fN9Ac1Z(a7#*xIRNvYd1PwDs+PL?)qLCQnwmSKlo1D;)QL(9jNQZ)rg<3|HF+ z?-9PfdbMkW?HIC*w>RN`qO>Q^-}+{RD*cN*+LmoBI>xQ|RN!84(%tGkkRH&`m<3HD za#3ut5sO`(&^YI=T-I5A$E(+Uo_}hmk9SY6w0RgO412ve%tBXlOuBMR(ble1WLlpa z+bP3FZW==sM5n>e&kte;I(&Qg>YAJLhn`1WMSG*EzFt#JZ7IIWV`=6rblkuop{aY} zk%s-+)QtKr%g*Laa6`b$w0Z(95TsIsC|)QPKSuB!{=en`j1ilT5(XQi+!SmtBvn2*M(zc%ei6CpJUydHYwv}e^B8O}ryDMA?Fz~Js> zVMp4_$OVvASX88R{yezAFY#gQSHkPpfCiHH|HP6-Uj_!P7reh0Kf7CmdhI_|E#i3U zc>l7-ai8O=g(yXIwyv(2;0`{h*&2S13yqiGYp$&ES_P)f8nytNsN*BZ?jH(B3)UN&I&1ms= zcawYUP=Nt;P}*T0Lr2S3!uHaoM;RH@kd-99>!60Igz~<3a+Gd9;-=l<$Ali#v#_w8 z*FDdOaF-7XdvBmV`Z8%mur22lk%+Y_13TG%p*{CDC58R3Il)^!M43$ZSm&wt>6cX;^8W5;gUf7?YmucISz_^<_flD(H% zqBL#~+b#@!S#vhMgam>;@*lTM^O>Oa-uPm2oOIteJvMvEUT-oj&lVO`VfFyv*25=H z&I25RBzar|3U02ihp^aCTbl~dV`(`)HC1BMEe3voR}mEx6VnXrCv$V|5Vb5U4sU#k zKtk3_-|stMa4JrAO?U8P^QH9PF7| zNrV2$O_&yLW4L;k|^_8sGtJqjC zq$N0>f}O}wGWh#<&wDGj0509;g1(ci0r7Fk=Q27qcaYYb*ifo`(Zx5ivU-QD7#wV~ zqlFU^SRHv8g*8F(G2W1q%LJ|sT>9W3I-;lZTq;Is?RHQEj80A>mE1xX$H#kEB{uHF zg{<6nhYn}{wXuM9{rx)xmKR;Sw-6HKU0jxX3LU_%(Pk<;rg&Rhn{DsjZg^&Jz@j4~ z?=uy_AO}4HiIXXS+L&6(mzw<^I6zO2)X}3MzP_Rd%Z?u`V>S>5Izb;EbPV)~apejJ z9LZy&qgi=*)|Qso-4%s9{!BNFjpc|yq{#ZvSH6DLKyNqm`Ygr3AvjyhnLv}F1>np> zmVj6&eDo-gAxaXm97;JF0%`BwK`BLMz2T%mC?^IOMZSMO53>b8KIlVft0?#)AKx&v zH_&E$C`!`hBWQxKDoD}LQ&6)S62Y|~_aM*~C1X2rc+kj1rv%NI0d;3WdEEN!=l$?K zfMxa~xr-O=VqpQp;*@lJ}|PCQH02%#mbhcTH#wL zG%!(u4xl}k_U4Tfn!IG#U^;}#h?DrngvNMhurKxK@FM(~OS8uA?rY`m1pJ;r%s>!r zr>BSX4eu0D^ECy*9z+4T7T9iTY6@2iHxDeUJs+LzF`pTS;+woksly(Sot1?P z1iyeE57tF@$SuTptj+iDI{aDXPbvv!L1G2HCYP;h=CofBsxjau>Ug5`sQYeOK3RgD70%&Bi_M_N^#> z$bP^uM|H9cN4;1@p2N!Qsf8?hC{AT7pO~+!L@S_Ah0!a^3RiDjHjAd$P0$+K1yR zMA07j82l-Lg)&?mC1S!P@J)xx?*z^(qP_BB)d0OwrjbG`y`J)=wx%_}a z|MV2*-krSxM2JiBOh_&(D=R5kzel|dSnjJQ0?Y|A2RAnp34bQHkV}|3sb=U?v5MpaIS*Q zK;zs*E=3N;X;{sn3|Hzc^V&pT(Q|c59Ex`21_fcbQX~y_)9maW!cS)yK~eJUm6G?u?M2`O|6O1%(tN4T-C-kP{tl-;R0t5;|YsNX0S?TDTwbH^nXv@IW}q zo*)c-MDh&b1T&0830j$|fu9$iZtl<-SyK~}^SsQZ-`%9ARNdv@fdhb10Bec9;Q8ie zCw+Nxyy{;0cV{9OuHc6&C8h5n)mOiVhhY+xaa*v4;|pMN4RklYoT7o6nw6awtP*?& z2V$>RP+%!U@^ArdgdI2m5|~BXo>Grhr`o6J9SA{tw6wHzls!r?^ak0$`kOVr_-2>t zw|T1ItS(YJj4gLY$1l#0y&iP=J{vB5xnUvm`=O}V+Gnsn6ySY;oDlSWEyXVXz+$wu zwMRxq0?WoA`+Wm={k)&m`>c0hPlaK7M+cmA$}dhp3JAUBJPMeMi4A}zq_hj%p-97E z^=~dkJ8f>P_w^e9JZz0p*3#6hZ)|+YFJ@cz{$c4;iT&cyW@l=`Q{0P-Z~*?NxK{1= zTJvGDw6;DWDk>@>0$Zb@lM`Ws5(`0(U4V>&Q6YYQev!E|u%HJ71VG~gZ3MC@gwl~? zTJLFogp)vM1Dt>cioayY@&cRl_pb&-U<*D_Nk~e;Uat% zBc41tucA_VdkDidp(!c+K4%P#jNnZ8QeWSlWh4j8bocIEC#Mfkf3>upV?5#P*)5l~ z4GU0o2R=h%gm>0go;xWy8LW@7@vQUY_gkRh2nA>tx6DI`gg71$7H~Zf=0OFa1bQ0Cu(EJx6{e*%eEw|q z<*k5U3!nh-5Bhu?kV3d5`3c_oFi2WxXQ7VaJurN-(VLDM+0)hafa&S8XP-nS0h!R; zB*sHkhWq%JYRkWw8MM6t{6s{g3BJHiOIv{OaGJ<~RmT6wc7IYuvoC!mdc*tn!B0}? zIQBIs=XebV5x|U>ITh>9HMg+{Q53ocQ@ITYL~Z7~6sZb9c*L?@;Qpd$4?3 z-MEp1=`PHJ`B$hTL!x$f zcL&r}BzkPD?KUvb);0s>6%vBVV$H(?KlUM9CCwXJLp4nCP~ub%4h_AB(hcaq?T4WV zbxlnu`EXoBBqcMG zaoaXHfzJ_Nq6d?ZfX@6|EIOui5YyN{j5h6A8f7HVAG{mHpSRhLkxy9#KRelA3tC% zWJb@GIkeR+foLIazzfCsg_j9=o;<10-VVo#0M78 zBJ@DdVNag4bawt38(W?ZK;1$~1JVUYsE##3Udv2PHF7s0c(V3zQ}xfz4l1&-MW7Xw zsgr&0!&BJWySpW!(?P0$sEd{QH8kY0wsZ?z7aRzsK*oLP3C=>?*|UWO1=wFGb`6b< zv)Y*BtlIrRo<#iVK!OVfeM*?vZyd;90772;UAq&&4jqXy3~)hz2f~0M%j4hh_9{8b z83*irf40lNn~;HF(iM&d-N0_a9h;9{8xR`?EuiJ0YT#^P3yS*pO`pFUqXQylrCJj z1*l;YhCBwARdkNlFl%79;EWK6Pk)wC6;`Ee{TDQ@KIC&?{f(u;$AH8hUuq7NI8FUP zokzj^d03mEAOK{EU%IFSY5%_-hQRERabS9n4MA9@tgPA~XDTV(u(c-ORt<0(C1D|k zcnY}bvH0HdNVqG27*ervj0EoS0i1v4BxLDtXaHjQAauw%$P>z2?uUdtM@w8Il{`V| zw{@qxhsS@-OZ1oWd=|mo6aRbhVp1zH5n|npz$mUqxsd^rHUkq{8G7izzlw@F<*_oi z#THo({5=QFr~sM?7#QlocY)(&WH1C^^Ce^(!7v3b6Aq4-!1S1xqTzBxg+?+$)qLcIPO)uH`1tX!$Oy2%E-{AcX={rEY9RVBM*#8n=I1ShwKT9Y3?-uN zw>IBtu=E1(Gy`oDNl7;pXiTh?6Ds7UVVuI`EqELikkXQ??=oufP+@I z9Nq!byTe40zMfpFd^p%YTu)Aost-92TMfY`mJeT@?V+4d`~rWJE4h9BBMt6M)ch&R)gk z_c|#nh!omcXAFQg08M}3uVYR*;0kF4(J@C@V*oJ#E$Xp(G z6B!xl4$T-9sIhSh#KWp14dQT#_>P@BjZIDc1#}FljBeezW9mdB671;Y1ds`93=AG- zUlerX*iaIX8Q@_=e+L6({^YA(N46B==l@>jB@3L3b%gwY9D<|>?g45A*AklDDBUMc zp0tQ&dhiLD8WT@fuU$KS>=c2Lma))xbL6q?h6F4EFhs>p{Np(XA?5jVEhwb;S>UsV zNeO~?CWNwffUUXtd7xi}l&g4GcQ=GC@+@SDHhGj4t#Wh)%#A5T&SM64Z3MoxLn<*a zrtOV~{&hbhLR?BJ23Vx0XJ2dtTpUtUeI=48E`VL);^JIf@y=neIzxGk-9TW%Ovru~ zM`aV!F)$VGWMRQL%MGXJvD^XzdzqOv^z@2xJY*hY4FbY(Ob;DA2+B{kY>JA8eULeN z)D{`q<224=r6`uwC!bhRrh>}(>J=w5b7jjZs=xrKg6Nw9ZTv*Gn4WGT-{&SU2pRps zY6!CjK+%Oum*9#^MG&C5{`M{TNGHHeb>qg0^})l3yO5e%T14oY)L~LK%Oa47Wa$<| z7x+WmZP(S&oAu9y5Gi!@^m^|tcah^_{cwn`=GIrr#g_y z(al3oRzz}}G+KL55tK2{g9?U$%Z3n2!Wj@$q$4DsWYkFzKCnGh$d6{toM^v-{Nj(m zc-^PuseB84L#gS~vNLjWn7uTAG&O}_HB`|$;^j>&E#=goqA`>Jf~yjtkBxVMI|b%6 ztP?UDJ{M&3{oTmZ1Oh`n`MCf@F3e|S+H5m^bT5>e^Y;FU4|e@3d|{9fln*dPzVzq1 z+5GDI<;%PnC7C=xAn>C5`1Y+U+CM;H$bkdmv^z)uD^LXb`<_D;hw!do`JZ3S_!>kC z9AfyU6c!_6(0Lbe--oVid;1Ao&&iWlFc{C}2tb3XC!|*}^Rc_~{B}f>uAec6pvZ%p zaPgxMRFfB8{ar?eEd*Xf6QC4KQ3x6=`M~er*!pnbhY$`)5SI z4zQ5%_HB{V6xiTia)2m24hW!u__5{y8*xa83W-#S0D$of^8jR;yC}Ov>4zBu^U04Ovgf~ND2xj8@EC)UA?Q$3fgZ+tO>AvLm|#{h)Hp#1pnxt) zAb2zIv%umP1f8(3(8b-o_~An(sO&j8x0RL2h|+Cwa(bHF@YYfx1kn8NjSYwD!jX<* zFt7)2myFm$q*n-2SQ;=IcmV*E?=cl&!0AHbTukT|eA_rxxsfpdD~NJijkT2+#?`Kf^i4Sv^X1=N7>}v z6VQpnBORE4hJfGEw1d>Ub?XB#V_bu0`X-bQ++JBpGr}LEOBm>6JROcg05C;ca*AN6 zgX|Q!u?x-G8*{D5YRSq`WVkd+=|PUR*t3=8DP-f07j7G)Cb<6vz&6N@*bj`c6%;Fp0VpE z#Kln(nICM1|AEj9pV!LY`>54Gp&nWoLx49I$~9EFmY>Nm&B>w^*2sddbNgZZ9jbZR zq(YJg)FTV$7W5u!P5wq4+ODUoyEpXwq=Q>FbV^L(V-VR%p|VT>w_noigF}gNs+C?* z&y0krc>F|337X7|29w~})6;K+7MgsG*kJ{VkW96uhFQTdUth{Ta!{a^&lh?g_X5BPJCDTe-$WAZ zM)F!(VzRRP$(pC*K)DZ+uUVzvR%l`XZH^fb|YmR`^o~hll&}EOvSVEJofQ zY2q+89{lpqgg{_#pln5kly(DVaB>ze8|(bw!R*E!vRbNOG%-kEx8~{ z+pr3_JNm^7JPjiW4;nxL1N&qT zfa4G!jP#5&4tNdEaR{cj@Z0PGKSv^P7xYzHnfgM2laP=S-Yy20V3x+;< zLS$e70iB1K$wWe|Rz~Cgg!KwUsJylkyyGuxYWgyb|MLRj%!D=ty%_^Tke-mNVWs(R zWDuR4aXejtiG+EK>J4XGJR$`E0OY@-Y(FlRx+)7jP>3C<_NHcLn;WZti1COgEdA)H zxnB$Xxw7s{-bUY{N+91rnhcAMp7{B*qO$VW#6-~NQ3p&t+j4-&!+8haE#S`%66!nP z))HneN;gqbZm{E-5KUE8xj?zV2cJI4qilfB0%{qvJ56*5`8~lDKXf5LN}LUlTIjUm zd0s@@v6f9-}9d%J%leldW`ua6Ca|fValoLq&ywlmh2Q zY;0Ll67`>9Tp$y7SS@?N`a-uIc}QLwZXlpUwoQ6GTPNXbC!L^Q3z~8>@Tb=y)k9<( z3&jXBfFj`C+#b2-o zKsDy}gGOr+sE-DA;)Sr8W{)PQVd>E)ESSTUs@ag;ZkU+(dD&W74I+Epo#hTN!ebi% zVOi*??I5G<`NztF9;!|hwYlv$Q zp%=`e6{Oh_T5_0akGA%nsCv$<C0ZX20oPK(*E7pjPj7poIbS}(<@m~WjC_X zROolK=B6ny7M_`}bGt%E?FIS=&E-~)u5 zD?*+-9+j4q9jHtZb59r$Y011&5wgpyQOBaJFGG1+Mu7t8Y_$d&|QHQO8WJ|lu ztzUlVR+^v4uBSi5p+O#lL?@xAXYzI-DIQbcr@^ez6LO4((@G{*m^G+t&kMH=)Nafv zFpJ*LZvB>c&hqYE33hrXN5`y_N5YSQH(6Ux0@}A0PGKJ9E6d%;-AslR+D;!!l9Gmy zdVpqH=YQJcbPc+eylN8js7Gf2!(Mf)JfUCkdtMvk@DJHb>;oY>Wj{bzzp`kM*+Jti zOLB8t#WN0&`H%xh#AQ5N07F=eZqyV$aB2ls&0>uA@n=nVZ&4ZHlsuP@XU&A3H?g-@ zOTGN{g^$mccr}Ue-tb*?{yKsoefh#HbhFFuK4*}tU+?T2(~>B2=ZYK_IknXQ5}9s# z2O#IDOB%Y4m!iec>r8=owAyPU){TxDr_|juL3lFMQqw|WHpF2f7w+mr5yUhz_M7{J zd1#j~-oX>D)O9Gp(JFF31H-j+Cy*DvCwO2DuoXh^yLpYF2+Dhw6|-+eT=&!m9YKnU z%x0PI)*oO~M5=B5g+u{UE*Y5e$eauZ1_P3Nb*#J!3EbZF*Wr5lZxb^|rM6g3N}A0mTWsCa-o ztit;4V_y%x`(~NnoxIja7*Kr=j{+KBP#F?hzla2PP9*KE5Y#I`H8y8!D4 zW`hS76?Gx458Xbc3-d;8W8={5U6o|b159%Z3w1-c^SgVyx>7qQB7}4mh-70-^^N$g zw0Y9qFOQb1C@CEg5}IFKhvxsReh3)U@$^fdGiOpS$ekOhcGF~S`SPBDuAjr_nkC0zk;F|R{IQ3&RJZA zNf2tS7oJ!I!Sn}axvvU7hf++sUtuT`rHtssYy%7o5)Q){1ic|^S*ZiEnf}eP>$OU9 zP{@-}c06t>->518PdSQhW~1}hJKBlC9g73};Yv^rD16G{h5KgtzIzH+*EZ$|v(CN^ zX`>edKX=gECqaW6oJFzF=4IYNQczUH6JCI%9*27q2s8N=JfwkO9YM&CGf*bLeD*z% zXW%$}0+cAaapB`1JfCb}Gl185paD;Fg2-E}ZwK88r6RVO+$88bL?jTrxTLtL0LBN{ rZ)TA}xkLbg{8%$@W8(ksZx Transformations · Tenet.jl

Transformations

In tensor network computations, it is good practice to apply various transformations to simplify the network structure, reduce computational cost, or prepare the network for further operations. These transformations modify the network's structure locally by permuting, contracting, factoring or truncating tensors.

A crucial reason why these methods are indispensable lies in their ability to drastically reduce the problem size of the contraction path search and also the contraction. This doesn't necessarily involve reducing the maximum rank of the Tensor Network itself, but more importantly, it reduces the size (or rank) of the involved tensors.

Our approach is based in (Gray and Kourtis, 2021), which can also be found in quimb.

In Tenet, we provide a set of predefined transformations which you can apply to your TensorNetwork using both the transform/transform! functions.

Tenet.transformFunction
transform(tn::TensorNetwork, config::Transformation)
-transform(tn::TensorNetwork, configs)

Return a new TensorNetwork where some Transformation has been performed into it.

See also: transform!.

source
Tenet.transform!Function
transform!(tn::TensorNetwork, config::Transformation)
-transform!(tn::TensorNetwork, configs)

In-place version of transform.

source

Available transformations

Hyperindex converter

Tenet.HyperFlattenType
HyperFlatten <: Transformation

Convert hyperindices to COPY-tensors, represented by DeltaArrays. This transformation is always used by default when visualizing a TensorNetwork with plot.

See also: HyperGroup.

source

Contraction simplification

Example block output

Diagonal reduction

Tenet.DiagonalReductionType
DiagonalReduction <: Transformation

Reduce the dimension of a Tensor in a TensorNetwork when it has a pair of indices that fulfil a diagonal structure.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-12.
source
Example block output

Anti-diagonal reduction

Tenet.AntiDiagonalGaugingType
AntiDiagonalGauging <: Transformation

Reverse the order of tensor indices that fulfill the anti-diagonal condition. While this transformation doesn't directly enhance computational efficiency, it sets up the TensorNetwork for other operations that do.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-12.
  • skip List of indices to skip. Defaults to [].
source

Dimension truncation

Tenet.TruncateType
Truncate <: Transformation

Truncate the dimension of a Tensor in a TensorNetwork when it contains columns with all elements smaller than atol.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-12.
  • skip List of indices to skip. Defaults to [].
source
Example block output

Split simplification

Tenet.SplitSimplificationType
SplitSimplification <: Transformation

Reduce the rank of tensors in the TensorNetwork by decomposing them using the Singular Value Decomposition (SVD). Tensors whose factorization do not increase the maximum rank of the network are left decomposed.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-10.
source
Example block output
+transform(tn::TensorNetwork, configs)

Return a new TensorNetwork where some Transformation has been performed into it.

See also: transform!.

source
Tenet.transform!Function
transform!(tn::TensorNetwork, config::Transformation)
+transform!(tn::TensorNetwork, configs)

In-place version of transform.

source

Available transformations

Hyperindex converter

Tenet.HyperFlattenType
HyperFlatten <: Transformation

Convert hyperindices to COPY-tensors, represented by DeltaArrays. This transformation is always used by default when visualizing a TensorNetwork with plot.

See also: HyperGroup.

source

Contraction simplification

Example block output

Diagonal reduction

Tenet.DiagonalReductionType
DiagonalReduction <: Transformation

Reduce the dimension of a Tensor in a TensorNetwork when it has a pair of indices that fulfil a diagonal structure.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-12.
source
Example block output

Anti-diagonal reduction

Tenet.AntiDiagonalGaugingType
AntiDiagonalGauging <: Transformation

Reverse the order of tensor indices that fulfill the anti-diagonal condition. While this transformation doesn't directly enhance computational efficiency, it sets up the TensorNetwork for other operations that do.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-12.
  • skip List of indices to skip. Defaults to [].
source

Dimension truncation

Tenet.TruncateType
Truncate <: Transformation

Truncate the dimension of a Tensor in a TensorNetwork when it contains columns with all elements smaller than atol.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-12.
  • skip List of indices to skip. Defaults to [].
source
Example block output

Split simplification

Tenet.SplitSimplificationType
SplitSimplification <: Transformation

Reduce the rank of tensors in the TensorNetwork by decomposing them using the Singular Value Decomposition (SVD). Tensors whose factorization do not increase the maximum rank of the network are left decomposed.

Keyword Arguments

  • atol Absolute tolerance. Defaults to 1e-10.
source
Example block output diff --git a/previews/PR215/visualization.html b/previews/PR215/visualization.html index 382a7b06..1796b0e5 100644 --- a/previews/PR215/visualization.html +++ b/previews/PR215/visualization.html @@ -1,4 +1,4 @@ Visualization · Tenet.jl

Visualization

Tenet provides a Package Extension for Makie support. You can just import a Makie backend and call GraphMakie.graphplot on a TensorNetwork.

GraphMakie.graphplotMethod
graphplot(tn::TensorNetwork; kwargs...)
 graphplot!(f::Union{Figure,GridPosition}, tn::TensorNetwork; kwargs...)
-graphplot!(ax::Union{Axis,Axis3}, tn::TensorNetwork; kwargs...)

Plot a TensorNetwork as a graph.

Keyword Arguments

  • labels If true, show the labels of the tensor indices. Defaults to false.
  • The rest of kwargs are passed to GraphMakie.graphplot.
source
graphplot(tn, layout=Stress(), labels=true)
Example block output
+graphplot!(ax::Union{Axis,Axis3}, tn::TensorNetwork; kwargs...)

Plot a TensorNetwork as a graph.

Keyword Arguments

  • labels If true, show the labels of the tensor indices. Defaults to false.
  • The rest of kwargs are passed to GraphMakie.graphplot.
source
graphplot(tn, layout=Stress(), labels=true)
Example block output