|
612 | 612 | ptrace(QO::QuantumObject{<:AbstractArray,BraQuantumObject}, sel::Union{AbstractVector{Int},Tuple}) = ptrace(QO', sel) |
613 | 613 |
|
614 | 614 | function ptrace(QO::QuantumObject{<:AbstractArray,OperatorQuantumObject}, sel::Union{AbstractVector{Int},Tuple}) |
| 615 | + # TODO: support for special cases when some of the subsystems have same `to` and `from` space |
615 | 616 | isa(QO.dimensions, GeneralDimensions) && |
616 | 617 | (get_dimensions_to(QO) != get_dimensions_from(QO)) && |
617 | | - throw(ArgumentError("Invalid partial trace for dims = $(QO.dims)")) |
| 618 | + throw(ArgumentError("Invalid partial trace for dims = $(_get_dims_string(QO.dimensions))")) |
618 | 619 |
|
619 | 620 | _non_static_array_warning("sel", sel) |
620 | 621 |
|
@@ -800,6 +801,11 @@ function permute( |
800 | 801 | A::QuantumObject{<:AbstractArray{T},ObjType}, |
801 | 802 | order::Union{AbstractVector{Int},Tuple}, |
802 | 803 | ) where {T,ObjType<:Union{KetQuantumObject,BraQuantumObject,OperatorQuantumObject}} |
| 804 | + # TODO: fix this (should be able to permute arbitrary GeneralDimensions) |
| 805 | + isa(A.dimensions, GeneralDimensions) && |
| 806 | + (get_dimensions_to(A) != get_dimensions_from(A)) && |
| 807 | + throw(ArgumentError("Invalid permute for dims = $(_get_dims_string(A.dimensions))")) |
| 808 | + |
803 | 809 | (length(order) != length(A.dimensions)) && |
804 | 810 | throw(ArgumentError("The order list must have the same length as the number of subsystems (A.dims)")) |
805 | 811 |
|
@@ -829,8 +835,9 @@ _dims_and_perm(::OperatorQuantumObject, dims::SVector{N,Int}, order::AbstractVec |
829 | 835 | reverse(vcat(dims, dims)), reverse((2 * L + 1) .- vcat(order, order .+ L)) |
830 | 836 |
|
831 | 837 | # if dims originates from GeneralDimensions |
832 | | -_dims_and_perm(::OperatorQuantumObject, dims::SVector{2,SVector{N,Int}}, order::AbstractVector{Int}, L::Int) where {N} = |
833 | | - reverse(vcat(dims[1], dims[2])), reverse((2 * L + 1) .- vcat(order, order .+ L)) |
| 838 | +# TODO: fix this |
| 839 | +#= _dims_and_perm(::OperatorQuantumObject, dims::SVector{2,SVector{N,Int}}, order::AbstractVector{Int}, L::Int) where {N} = |
| 840 | + reverse(vcat(dims[1], dims[2])), reverse((2 * L + 1) .- vcat(order, order .+ L)) =# |
834 | 841 |
|
835 | 842 | _order_dimensions(dimensions::Dimensions{N}, order::AbstractVector{Int}) where {N} = Dimensions{N}(dimensions.to[order]) |
836 | 843 | _order_dimensions(dimensions::GeneralDimensions{N}, order::AbstractVector{Int}) where {N} = |
|
0 commit comments