Skip to content

Commit

Permalink
Expand functions in P'(x .^2 .* P)
Browse files Browse the repository at this point in the history
  • Loading branch information
dlfivefifty committed Oct 20, 2024
1 parent 61991d4 commit 9dc5f38
Showing 1 changed file with 33 additions and 2 deletions.
35 changes: 33 additions & 2 deletions src/bases/bases.jl
Original file line number Diff line number Diff line change
Expand Up @@ -145,15 +145,46 @@ function _broadcast_mul_ldiv(::Tuple{ScalarLayout,ApplyLayout{typeof(*)}}, A, B)
a * (A \ b)
end

_broadcast_mul_ldiv(::Tuple{ScalarLayout,AbstractBasisLayout}, A, B) =
_broadcast_mul_ldiv((ScalarLayout(),UnknownLayout()), A, B)
_broadcast_mul_ldiv(::Tuple{ScalarLayout,AbstractBasisLayout}, A, B) = _broadcast_mul_ldiv((ScalarLayout(),UnknownLayout()), A, B)
_broadcast_mul_ldiv(_, A, B) = copy(Ldiv{typeof(MemoryLayout(A)),UnknownLayout}(A,B))

copy(L::Ldiv{<:AbstractBasisLayout,BroadcastLayout{typeof(*)}}) = _broadcast_mul_ldiv(map(MemoryLayout,arguments(L.B)), L.A, L.B)
copy(L::Ldiv{<:MappedBasisLayouts,BroadcastLayout{typeof(*)}}) = _broadcast_mul_ldiv(map(MemoryLayout,arguments(L.B)), L.A, L.B)



# multiplication operators, reexpand in basis A
@inline function _broadcast_mul_adj(::Tuple{Any,AbstractBasisLayout}, Ac, B)
a,b = arguments(B)
@assert a isa AbstractQuasiVector # Only works for vec .* mat
A = Ac'
ab = (A * (A \ a)) .* b # broadcasted should be overloaded
MemoryLayout(ab) isa BroadcastLayout && return Ac*transform_ldiv(A, ab)
Ac*ab
end

@inline function _broadcast_mul_adj(::Tuple{Any,ApplyLayout{typeof(*)}}, Ac, B)
a,b = arguments(B)
@assert a isa AbstractQuasiVector # Only works for vec .* mat
args = arguments(*, b)
*(Ac*(a .* first(args)), tail(args)...)
end


function _broadcast_mul_adj(::Tuple{ScalarLayout,Any}, Ac, B)
a,b = arguments(B)
a * (Ac*b)
end

function _broadcast_mul_adj(::Tuple{ScalarLayout,ApplyLayout{typeof(*)}}, Ac, B)
a,b = arguments(B)
a * (Ac*b)
end

_broadcast_mul_adj(::Tuple{ScalarLayout,AbstractBasisLayout}, A, B) = _broadcast_mul_adj((ScalarLayout(),UnknownLayout()), A, B)
_broadcast_mul_adj(_, A, B) = copy(Mul{typeof(MemoryLayout(A)),UnknownLayout}(A,B))

copy(L::Mul{<:AdjointBasisLayout,BroadcastLayout{typeof(*)}}) = _broadcast_mul_adj(map(MemoryLayout,arguments(L.B)), L.A, L.B)


"""
Expand Down

0 comments on commit 9dc5f38

Please sign in to comment.