MultivariateOrthogonalPolynomials.jl icon indicating copy to clipboard operation
MultivariateOrthogonalPolynomials.jl copied to clipboard

Either: PartialDerivative{k}(<:Basis) or Inclusion(::Basis) should err (or both)

Open MikaelSlevinsky opened this issue 4 years ago • 5 comments

julia> P = JacobiTriangle()
JacobiTriangle(0, 0, 0)

julia> Q = JacobiTriangle(2, 2, 2)
JacobiTriangle(2, 2, 2)

julia> ∂x = PartialDerivative{1}(P)
PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}

julia> Q \ (∂x^2 * P)
ERROR: DimensionMismatch("Second axis of A, Inclusion(JacobiTriangle(0, 0, 0)), and first axis of B, Inclusion(DomainSets.FixedUnitSimplex{SVector{2, Float64}, :closed}()) must match")
Stacktrace:
 [1] _check_mul_axes(A::PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, B::ApplyQuasiMatrix{Float64, typeof(*), Tuple{JacobiTriangle{Float64, Int64}, BandedBlockBandedMatrix{Float64, Adjoint{Float64, LazyBandedMatrices.BlockBroadcastArray{Float64, 2, typeof(hcat), Tuple{LazyArrays.BroadcastVector{Float64, typeof(/), Tuple{LazyArrays.BroadcastVector{Int64, typeof(*), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Fill{Int64, 1, Tuple{Base.OneTo{Int64}}}, Type{Fill}, Tuple{InfiniteArrays.OneToInf{Int64}, InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{StepRange{Int64, Int64}, typeof(*), Tuple{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Float64, typeof(/), Tuple{LazyArrays.BroadcastVector{Int64, typeof(*), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Fill{Int64, 1, Tuple{Base.OneTo{Int64}}}, Type{Fill}, Tuple{InfiniteArrays.OneToInf{Int64}, InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}}}, Int64}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{StepRange{Int64, Int64}, typeof(*), Tuple{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}}}}, BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}})
   @ ArrayLayouts ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:87
 [2] check_mul_axes(::PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, ::ApplyQuasiMatrix{Float64, typeof(*), Tuple{JacobiTriangle{Float64, Int64}, BandedBlockBandedMatrix{Float64, Adjoint{Float64, LazyBandedMatrices.BlockBroadcastArray{Float64, 2, typeof(hcat), Tuple{LazyArrays.BroadcastVector{Float64, typeof(/), Tuple{LazyArrays.BroadcastVector{Int64, typeof(*), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Fill{Int64, 1, Tuple{Base.OneTo{Int64}}}, Type{Fill}, Tuple{InfiniteArrays.OneToInf{Int64}, InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{StepRange{Int64, Int64}, typeof(*), Tuple{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Float64, typeof(/), Tuple{LazyArrays.BroadcastVector{Int64, typeof(*), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Fill{Int64, 1, Tuple{Base.OneTo{Int64}}}, Type{Fill}, Tuple{InfiniteArrays.OneToInf{Int64}, InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}}}, Int64}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{StepRange{Int64, Int64}, typeof(*), Tuple{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}}}}, BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}})
   @ ArrayLayouts ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:89
 [3] instantiate
   @ ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:101 [inlined]
 [4] materialize
   @ ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:105 [inlined]
 [5] mul
   @ ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:106 [inlined]
 [6] *(A::PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, B::ApplyQuasiMatrix{Float64, typeof(*), Tuple{JacobiTriangle{Float64, Int64}, BandedBlockBandedMatrix{Float64, Adjoint{Float64, LazyBandedMatrices.BlockBroadcastArray{Float64, 2, typeof(hcat), Tuple{LazyArrays.BroadcastVector{Float64, typeof(/), Tuple{LazyArrays.BroadcastVector{Int64, typeof(*), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Fill{Int64, 1, Tuple{Base.OneTo{Int64}}}, Type{Fill}, Tuple{InfiniteArrays.OneToInf{Int64}, InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{StepRange{Int64, Int64}, typeof(*), Tuple{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Float64, typeof(/), Tuple{LazyArrays.BroadcastVector{Int64, typeof(*), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Fill{Int64, 1, Tuple{Base.OneTo{Int64}}}, Type{Fill}, Tuple{InfiniteArrays.OneToInf{Int64}, InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}}}, Int64}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}, LazyArrays.BroadcastVector{Int64, typeof(+), Tuple{BlockVector{Int64, LazyArrays.BroadcastVector{StepRange{Int64, Int64}, typeof(*), Tuple{Int64, LazyArrays.BroadcastVector{Base.OneTo{Int64}, Type{Base.OneTo}, Tuple{InfiniteArrays.OneToInf{Int64}}}}}, Tuple{BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}, Int64}}}}}}}, BlockedUnitRange{RangeCumsum{Int64, InfiniteArrays.OneToInf{Int64}}}}}})
   @ QuasiArrays ~/.julia/packages/QuasiArrays/bxqu9/src/matmul.jl:23
 [7] *(App::ApplyQuasiMatrix{Float64, typeof(^), Tuple{PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, Int64}}, b::JacobiTriangle{Float64, Int64})
   @ QuasiArrays ~/.julia/packages/QuasiArrays/bxqu9/src/lazyquasiarrays.jl:231
 [8] top-level scope
   @ REPL[72]:1

julia> Q \ (∂x.^2 * P)
ERROR: DimensionMismatch("Second axis of A, Inclusion(JacobiTriangle(0, 0, 0)), and first axis of B, Inclusion(DomainSets.FixedUnitSimplex{SVector{2, Float64}, :closed}()) must match")
Stacktrace:
 [1] _check_mul_axes(A::BroadcastQuasiMatrix{Float64, typeof(Base.literal_pow), Tuple{Base.RefValue{typeof(^)}, PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, Base.RefValue{Val{2}}}}, B::JacobiTriangle{Float64, Int64})
   @ ArrayLayouts ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:87
 [2] check_mul_axes(::BroadcastQuasiMatrix{Float64, typeof(Base.literal_pow), Tuple{Base.RefValue{typeof(^)}, PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, Base.RefValue{Val{2}}}}, ::JacobiTriangle{Float64, Int64})
   @ ArrayLayouts ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:89
 [3] instantiate
   @ ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:101 [inlined]
 [4] materialize(M::ArrayLayouts.Mul{LazyArrays.BroadcastLayout{typeof(Base.literal_pow)}, ContinuumArrays.BasisLayout, BroadcastQuasiMatrix{Float64, typeof(Base.literal_pow), Tuple{Base.RefValue{typeof(^)}, PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, Base.RefValue{Val{2}}}}, JacobiTriangle{Float64, Int64}})
   @ ArrayLayouts ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:105
 [5] mul
   @ ~/.julia/packages/ArrayLayouts/mTQvg/src/mul.jl:106 [inlined]
 [6] *(A::BroadcastQuasiMatrix{Float64, typeof(Base.literal_pow), Tuple{Base.RefValue{typeof(^)}, PartialDerivative{1, Float64, Inclusion{Float64, JacobiTriangle{Float64, Int64}}}, Base.RefValue{Val{2}}}}, B::JacobiTriangle{Float64, Int64})
   @ QuasiArrays ~/.julia/packages/QuasiArrays/bxqu9/src/matmul.jl:23
 [7] top-level scope
   @ REPL[73]:1

julia> 

MikaelSlevinsky avatar Jun 04 '21 16:06 MikaelSlevinsky

Should be PartialDerivative{1}(axes(P,1))

dlfivefifty avatar Jun 04 '21 18:06 dlfivefifty

Ok, so the real issue is that the user isn't being prevented from constructing junk.

MikaelSlevinsky avatar Jun 04 '21 18:06 MikaelSlevinsky

Correct: it should at minimum only allow taking in a AbstractQuasiVector

dlfivefifty avatar Jun 04 '21 19:06 dlfivefifty

TBF up until now I was the only user and I never passed in junk. So perhaps the real issue is that the user base has doubled and is now too big 😂

dlfivefifty avatar Jun 04 '21 19:06 dlfivefifty

https://www.youtube.com/watch?v=G19B7lTgwCE

MikaelSlevinsky avatar Jun 04 '21 20:06 MikaelSlevinsky