Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Further allocation reduction in power computations #361

Merged
merged 26 commits into from
Jul 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
dbdbcc1
working version with oop sqr!
PerezHz Jul 8, 2024
a34ce7b
Update Project.toml
PerezHz Jul 9, 2024
c04d9f8
Update src/TaylorSeries.jl
PerezHz Jul 9, 2024
5d3d57d
Update `zero(x)`; add in-place mul! for TaylorN
PerezHz Jul 9, 2024
a9c770b
Get rid of most allocations in pow! for Taylor1{TaylorN{T}; add power…
PerezHz Jul 9, 2024
5bcccf4
Remove extra empty line
PerezHz Jul 9, 2024
6cce90a
Add power_by_squaring methods to avoid method ambiguities (detected b…
PerezHz Jul 9, 2024
a205dcd
Remove duplicated return
PerezHz Jul 10, 2024
e44811c
Add inbounds
PerezHz Jul 10, 2024
2e4e60a
Address review by @lbenet
PerezHz Jul 11, 2024
f581b21
Add extra arg to pow!
PerezHz Jul 11, 2024
27c3d0e
Update TaylorSeries IA extension
PerezHz Jul 11, 2024
dc6a68c
Update pow! and add fix suggested by @lbenet
PerezHz Jul 11, 2024
364faf7
Middle-of-the-road approach to suggestion by @lbenet
PerezHz Jul 12, 2024
99e3061
Handle pow! cases by dispatch-by-value
PerezHz Jul 12, 2024
efa02a1
Remove unneeded deepcopy in setindex! method
PerezHz Jul 12, 2024
d9af8ca
Add `power_by_squaring(x, ::Val{3})` methods and add tests
PerezHz Jul 14, 2024
68bf845
Update comments
PerezHz Jul 14, 2024
8610e21
Bump patch version
PerezHz Jul 14, 2024
ba30e7a
Switch back from dispatch-by-value to if/else for pow!
PerezHz Jul 17, 2024
ea15252
Revert change in setindex! overload for Taylor1
PerezHz Jul 17, 2024
21c876b
Add test for nested Taylor1s setindex! method
PerezHz Jul 17, 2024
702fbac
De-bump patch version
PerezHz Jul 17, 2024
6264eae
Another approach to suggestion by @lbenet
PerezHz Jul 17, 2024
4f613d6
Fix typo
PerezHz Jul 17, 2024
ad18057
Fix another typo
PerezHz Jul 17, 2024
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
4 changes: 2 additions & 2 deletions ext/TaylorSeriesIAExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ function ^(a::Taylor1{Interval{T}}, r::S) where {T<:Real, S<:Real}
c_order = l0 == 0 ? a.order : min(a.order, trunc(Int,r*a.order))
c = Taylor1(zero(aux), c_order)
for k = 0:c_order
TS.pow!(c, aa, r, k)
TS.pow!(c, aa, c, r, k)
end

return c
Expand All @@ -66,7 +66,7 @@ function ^(a::TaylorN{Interval{T}}, r::S) where {T<:Real, S<:Real}

c = TaylorN( a0r, a.order)
for ord in 1:a.order
TS.pow!(c, aa, r, ord)
TS.pow!(c, aa, c, r, ord)
end

return c
Expand Down
40 changes: 39 additions & 1 deletion src/arithmetic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ for T in (:Taylor1, :HomogeneousPolynomial, :TaylorN)
end

for T in (:Taylor1, :TaylorN)
@eval zero(a::$T) = $T(zero.(a.coeffs))
@eval function zero(a::$T)
return $T(zero.(a.coeffs))
end
@eval function one(a::$T)
b = zero(a)
b[0] = one(b[0])
Expand Down Expand Up @@ -572,6 +574,42 @@ for T in (:Taylor1, :TaylorN)
end
end

# in-place product: `a` <- `a*b`
# this method computes the product `a*b` and saves it back into `a`
# assumes `a` and `b` are of same order
function mul!(a::TaylorN{T}, b::TaylorN{T}) where {T<:Number}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An equivalent method mul!(a::Taylor1{T}, b::Taylor1{T}) where {T<:Number}) could be useful for the extension of pow! for Taylor1{TaylorN{T}}?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would indeed by useful, I've added the corresponding method, thanks!

@inbounds for k in reverse(eachindex(a))
mul!(a, a, b[0][1], k)
for l in 1:k
mul!(a[k], a[k-l], b[l])
end
end
return nothing
end
function mul!(a::Taylor1{T}, b::Taylor1{T}) where {T<:Number}
@inbounds for k in reverse(eachindex(a))
# a[k] <- a[k]*b[0]
mul!(a, a, b[0], k)
for l in 1:k
# a[k] <- a[k] + a[k-l] * b[l]
a[k] += a[k-l] * b[l]
end
end
return nothing
end
function mul!(a::Taylor1{TaylorN{T}}, b::Taylor1{TaylorN{T}}) where {T<:NumberNotSeries}
@inbounds for k in reverse(eachindex(a))
mul!(a, a, b[0], k)
for l in 1:k
# a[k] += a[k-l] * b[l]
for m in eachindex(a[k])
mul!(a[k], a[k-l], b[l], m)
end
end
end
return nothing
end

function mul!(res::Taylor1{TaylorN{T}}, a::Taylor1{TaylorN{T}}, b::Taylor1{TaylorN{T}},
ordT::Int) where {T<:NumberNotSeries}
# Sanity
Expand Down
8 changes: 4 additions & 4 deletions src/auxiliary.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ If the length of `coeffs` is smaller than `order+1`, it resizes
function resize_coeffs1!(coeffs::Array{T,1}, order::Int) where {T<:Number}
lencoef = length(coeffs)
resize!(coeffs, order+1)
c1 = coeffs[1]
if order > lencoef-1
z = zero(coeffs[1])
@simd for ord in lencoef+1:order+1
@inbounds coeffs[ord] = z
@inbounds coeffs[ord] = zero(c1)
end
end
return nothing
Expand All @@ -39,9 +39,9 @@ function resize_coeffsHP!(coeffs::Array{T,1}, order::Int) where {T<:Number}
@assert order ≤ get_order() && lencoef ≤ num_coeffs
num_coeffs == lencoef && return nothing
resize!(coeffs, num_coeffs)
z = zero(coeffs[1])
c1 = coeffs[1]
@simd for ord in lencoef+1:num_coeffs
@inbounds coeffs[ord] = z
@inbounds coeffs[ord] = zero(c1)
end
return nothing
end
Expand Down
2 changes: 1 addition & 1 deletion src/constructors.jl
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ struct TaylorN{T<:Number} <: AbstractSeries{T}
order :: Int

function TaylorN{T}(v::Array{HomogeneousPolynomial{T},1}, order::Int) where T<:Number
coeffs = zeros(HomogeneousPolynomial{T}, order)
coeffs = isempty(v) ? zeros(HomogeneousPolynomial{T}, order) : zeros(v[1], order)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess we would need similar fixes in Taylor1 and HomogeneousPolynomial...

@inbounds for i in eachindex(v)
ord = v[i].order
if ord ≤ order
Expand Down
3 changes: 1 addition & 2 deletions src/dictmutfunct.jl
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const _dict_binary_ops = Dict(
:- => (:subst!, (:_res, :_arg1, :_arg2, :_k), :(_res = _arg1 - _arg2)),
:* => (:mul!, (:_res, :_arg1, :_arg2, :_k), :(_res = _arg1 * _arg2)),
:/ => (:div!, (:_res, :_arg1, :_arg2, :_k), :(_res = _arg1 / _arg2)),
:^ => (:pow!, (:_res, :_arg1, :_arg2, :_k), :(_res = _arg1 ^ float(_arg2))),
:^ => (:pow!, (:_res, :_arg1, :_aux, :_arg2, :_k), :(_res = _arg1 ^ float(_arg2)), :(_aux = zero(_arg1))),
);

"""
Expand Down Expand Up @@ -196,4 +196,3 @@ internal mutating functions.
Evaluating the entries generates symbols that represent
the actual calls to the internal mutating functions.
""" _dict_binary_calls

2 changes: 1 addition & 1 deletion src/evaluate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ function _evaluate!(suma::TaylorN{T}, a::HomogeneousPolynomial{T}, ind::Int,
else
for ordQ in eachindex(val)
zero!(vv, ordQ)
pow!(vv, val, vpow, ordQ)
pow!(vv, val, vv, vpow, ordQ)
end
end
for ordQ in eachindex(suma)
Expand Down
14 changes: 14 additions & 0 deletions src/functions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,13 @@ end
return nothing
end

@inline function zero!(a::TaylorN{Taylor1{T}}) where {T<:NumberNotSeries}
for k in eachindex(a)
zero!(a, k)
end
return nothing
end

@inline function one!(c::Taylor1{TaylorN{T}}, k::Int) where {T<:NumberNotSeries}
zero!(c, k)
if k == 0
Expand All @@ -316,6 +323,13 @@ end
return nothing
end

@inline function identity!(c::HomogeneousPolynomial{Taylor1{T}}, a::HomogeneousPolynomial{Taylor1{T}}, k::Int) where {T<:NumberNotSeries}
@inbounds for l in eachindex(c[k])
identity!(c[k], a[k], l)
end
return nothing
end

for T in (:Taylor1, :TaylorN)
@eval begin
@inline function identity!(c::$T{T}, a::$T{T}, k::Int) where {T<:NumberNotSeries}
Expand Down
Loading
Loading