LocalOperators.jl
LocalOperators.jl is a simple package that exports a single struct type, LocalOperator representing an operator acting on a local Hilbert space. When adding, subtracting or multiplying two LocalOperator types together,the appropriate number of identity matrices are padded to each on the left and right such that they are compatible.
Usage
LocalOperators.jl exports only a single struct type:
LocalOperators.LocalOperator — TypeLocalOperator{T<:Number} <: AbstractMatrix{T}Concrete type corresponding to a matrix operator acting on a tensor product of local vector spaces. The operator acts as the matrix stored in the field data on the local vector spaces defined by the field support, and as the identity elsewhere.
Fields
data::Matrix{T}: stores the matrix represention of the operatorsupport::UnitRange{Int}: stores the sites that the operator has support on
A LocalOperator can be constructed like so:
julia> Z = Matrix{ComplexF64}([1 0; 0 -1]); # Pauli Z matrix
julia> r = 0:0; # Support on site 0 only
julia> a = LocalOperator(Z, r)
2×2 1-local LocalOperator{ComplexF64} on sites 0 to 0:
1.0+0.0im 0.0+0.0im
0.0+0.0im -1.0+0.0imWe can also supply an integer instead of a range to easily construct a $1$-local operator,
julia> b = LocalOperator(Z, 2)
2×2 1-local LocalOperator{ComplexF64} on sites 2 to 2:
1.0+0.0im 0.0+0.0im
0.0+0.0im -1.0+0.0imor omit this entirely to use the default index $0$. We can now multiply a and b together to perform $(a \otimes \mathbb{I}) \cdot (\mathbb{I} \otimes b)$:
julia> a * b
4×4 2-local LocalOperator{ComplexF64} on sites 0 to 1:
1.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im -1.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im -1.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 1.0+0.0imWe can also do addition and subtraction
julia> a + b
4×4 2-local LocalOperator{ComplexF64} on sites 0 to 1:
2.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im -2.0+0.0im
julia> b - a
4×4 2-local LocalOperator{ComplexF64} on sites 0 to 1:
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im -2.0+0.0im 0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 2.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0imIf two LocalOperator types have support on the identical sites, then we fall back to the regular operations:
julia> a - a
2×2 1-local LocalOperator{ComplexF64} on sites 0 to 0:
0.0+0.0im 0.0+0.0im
0.0+0.0im 0.0+0.0imOperations between LocalOperator types with differing local dimension are not supported:
julia> a = LocalOperator([1 0; 0 -1], 0:0, 2);
julia> b = LocalOperator([1 0 0; 0 0 0 ; 0 0 -1], 1:1, 3);
julia> a * b
ERROR: LocalDimensionMismatch: local dimensions must match: a has local dim 2, b has local dim 3
[...]