Skip to content

Commit

Permalink
Fixes for Chebyshev
Browse files Browse the repository at this point in the history
  • Loading branch information
blegat committed Mar 12, 2024
1 parent c92c229 commit ecd714d
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 31 deletions.
37 changes: 7 additions & 30 deletions src/mstructures.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,13 @@ struct UnsafeAddMul{M<:Union{typeof(*),MultiplicativeStructure}}
structure::M
end

function MA.operate_to!(
res::SparseCoefficients,
ms::MultiplicativeStructure,
v::AbstractCoefficients,
w::AbstractCoefficients,
)
function MA.operate_to!(res, ms::MultiplicativeStructure, v, w)
if res === v || res === w
throw(ArgumentError("No alias allowed"))
end
MA.operate!(zero, res)
res = MA.operate!(UnsafeAddMul(ms), res, v, w)
__canonicalize!(res)
return res
return __canonicalize!(res)
end

function MA.operate!(
Expand All @@ -66,36 +63,16 @@ function MA.operate!(
return mc
end

function MA.operate!(
ms::UnsafeAddMul,
res::SparseCoefficients,
v::AbstractCoefficients,
w::AbstractCoefficients,
)
function MA.operate!(ms::UnsafeAddMul, res, v, w)
for (kv, a) in pairs(v)
for (kw, b) in pairs(w)
c = ms.structure(kv, kw) # ::AbstractCoefficients
c = ms.structure(kv, kw)
MA.operate!(UnsafeAddMul(*), res, a * b, c)
end
end
return res
end

function MA.operate_to!(
res::AbstractVector,
ms::MultiplicativeStructure,
X::AbstractVector,
Y::AbstractVector,
)
if res === X || res === Y
throw(ArgumentError("No alias allowed"))
end
MA.operate!(zero, res)
MA.operate!(UnsafeAddMul(ms), res, X, Y)
res = __canonicalize!(res)
return res
end

__canonicalize!(sv::SparseVector) = dropzeros!(sv)
__canonicalize!(v::AbstractVector) = v
struct DiracMStructure{Op} <: MultiplicativeStructure
Expand Down
10 changes: 9 additions & 1 deletion src/types.jl
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,17 @@ struct AlgebraElement{A,T,V} <: MA.AbstractMutable
parent::A
end

function AlgebraElement(coeffs::AbstractVector, A::AbstractStarAlgebra)
function _sanity_checks(coeffs, A::AbstractStarAlgebra)
@assert keytype(coeffs) == keytype(basis(A))
end
function _sanity_checks(coeffs::AbstractVector, A::AbstractStarAlgebra)
@assert keytype(coeffs) == keytype(basis(A))
@assert Base.haslength(basis(A))
@assert length(coeffs) == length(basis(A))
end

function AlgebraElement(coeffs, A::AbstractStarAlgebra)
_sanity_checks(coeffs, A)
return AlgebraElement{typeof(A),valtype(coeffs),typeof(coeffs)}(coeffs, A)
end

Expand Down

0 comments on commit ecd714d

Please sign in to comment.