diff --git a/src/operators/mpohamiltonian.jl b/src/operators/mpohamiltonian.jl index 97f938609..2b3a6d518 100644 --- a/src/operators/mpohamiltonian.jl +++ b/src/operators/mpohamiltonian.jl @@ -43,7 +43,7 @@ function FiniteMPOHamiltonian(Ws::AbstractVector{O}) where {O <: MPOTensor} return FiniteMPOHamiltonian{O}(Ws) end -const InfiniteMPOHamiltonian{O <: MPOTensor} = MPOHamiltonian{O, PeriodicVector{O}} +const InfiniteMPOHamiltonian{O <: MPOTensor} = MPOHamiltonian{O, <:PeriodicVector{O}} Base.isfinite(::Type{<:InfiniteMPOHamiltonian}) = false function InfiniteMPOHamiltonian(Ws::AbstractVector{O}) where {O <: MPOTensor} diff --git a/src/utility/periodicarray.jl b/src/utility/periodicarray.jl index 14ce75b65..867c714eb 100644 --- a/src/utility/periodicarray.jl +++ b/src/utility/periodicarray.jl @@ -26,11 +26,17 @@ A[-1, 1], A[1, 1], A[4, 5] See also [`PeriodicVector`](@ref), [`PeriodicMatrix`](@ref) """ -struct PeriodicArray{T, N} <: AbstractArray{T, N} - data::Array{T, N} +struct PeriodicArray{T, N, A <: AbstractArray{T, N}} <: AbstractArray{T, N} + data::A + PeriodicArray{T,N}(data::A) where A <: AbstractArray{T,N} where {T,N} = new{T,N,A}(data) + PeriodicArray{T,N,A}(data::A) where A <: AbstractArray{T,N} where {T,N} = new{T,N,A}(data) end -PeriodicArray(data::AbstractArray{T, N}) where {T, N} = PeriodicArray{T, N}(data) -PeriodicArray{T}(data::AbstractArray{T, N}) where {T, N} = PeriodicArray{T, N}(data) +PeriodicArray(data::AbstractArray{T,N}) where {T,N} = PeriodicArray{T,N}(data) +PeriodicArray{T}(data::AbstractArray{T,N}) where {T,N} = PeriodicArray{T,N}(data) + + + + function PeriodicArray{T}(initializer, args...) where {T} return PeriodicArray(Array{T}(initializer, args...)) end @@ -88,15 +94,15 @@ end Base.BroadcastStyle(::Type{T}) where {T <: PeriodicArray} = Broadcast.ArrayStyle{T}() function Base.similar( - bc::Broadcast.Broadcasted{<:Broadcast.ArrayStyle{<:PeriodicArray}}, ::Type{T} - ) where {T} - return PeriodicArray(similar(Array{T}, axes(bc))) + bc::Broadcast.Broadcasted{Broadcast.ArrayStyle{PeriodicArray{T, N, A}}}, ::Type{ElType} + ) where {A <: AbstractArray{T, N}} where {T, N, ElType} + return PeriodicArray(similar(convert(Broadcast.Broadcasted{typeof(Broadcast.BroadcastStyle(A))}, bc), ElType)) end # Conversion # ---------- -Base.convert(::Type{T}, A::AbstractArray) where {T <: PeriodicArray} = T(A) +Base.convert(::Type{PeriodicArray}, A::AbstractArray) = PeriodicArray(A) Base.convert(::Type{T}, A::PeriodicArray) where {T <: AbstractArray} = convert(T, parent(A)) # fix ambiguities -Base.convert(::Type{T}, A::PeriodicArray) where {T <: PeriodicArray} = A -Base.convert(::Type{T}, A::PeriodicArray) where {T <: Array} = parent(A) +Base.convert(::Type{PeriodicArray}, A::PeriodicArray) = A +Base.convert(::Type{T}, A::PeriodicArray) where {T <: AbstractArray} = convert(T, parent(A))