Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 40 additions & 16 deletions src/fillalgebra.jl
Original file line number Diff line number Diff line change
Expand Up @@ -157,41 +157,65 @@ end
function mul!(y::AbstractVector, A::AbstractFillMatrix, b::AbstractFillVector, alpha::Number, beta::Number)
check_matmul_sizes(y, A, b)

Abα = Ref(getindex_value(A) * getindex_value(b) * alpha * length(b))

if iszero(beta)
y .= Abα
if iszero(alpha)
if iszero(beta)
y .= Ref(zero(eltype(y)))
else
y .*= beta
end
else
y .= Abα .+ y .* beta
Abα = Ref(getindex_value(A) * getindex_value(b) * alpha * length(b))
if iszero(beta)
y .= Abα
else
y .= Abα .+ y .* beta
end
end
y
end

function mul!(y::StridedVector, A::StridedMatrix, b::AbstractFillVector, alpha::Number, beta::Number)
check_matmul_sizes(y, A, b)

bα = Ref(getindex_value(b) * alpha)

if iszero(beta)
y .= Ref(zero(eltype(y)))
if iszero(alpha) || iszero(length(b))
y .= Ref(zero(eltype(y)))
else
bα = Ref(getindex_value(b) * alpha)
y .= zero.(view(A, :, 1) .* bα)
end
else
rmul!(y, beta)
y .*= beta
end
for Acol in eachcol(A)
@. y += Acol * bα
if iszero(alpha)
return y
end
bα = Ref(getindex_value(b) * alpha)
if !iszero(bα[])
for Acol in eachcol(A)
@. y += Acol * bα
end
end
y
end

function mul!(y::StridedVector, A::AbstractFillMatrix, b::StridedVector, alpha::Number, beta::Number)
check_matmul_sizes(y, A, b)

Abα = Ref(getindex_value(A) * sum(b) * alpha)

if iszero(beta)
y .= Abα
if iszero(alpha)
if iszero(beta)
y .= Ref(zero(eltype(y)))
else
y .*= beta
end
else
y .= Abα .+ y .* beta
Abα = Ref(getindex_value(A) * sum(b) * alpha)

if iszero(beta)
y .= Abα
else
y .= Abα .+ y .* beta
end
end
y
end
Expand Down
Loading