Skip to content

Commit 5fe227f

Browse files
authored
Merge pull request #2 from blegat/performance-improvements
Improve substitution performance by fixing type instabilities
2 parents 4162fa7 + 969be8f commit 5fe227f

File tree

4 files changed

+38
-14
lines changed

4 files changed

+38
-14
lines changed

perf/runbenchmarks.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using MultivariatePolynomials
2+
using BenchmarkTools
3+
4+
let
5+
@polyvar x y
6+
p = x + y + 2x^2 + y^3
7+
8+
vars = [x, y]
9+
vals = [1.0, 2.0]
10+
11+
println(@benchmark(($p)($vals, $vars)))
12+
13+
vars_out_of_order = [vars[2], vars[1]]
14+
println(@benchmark(($p)($vals, $vars_out_of_order)))
15+
end

src/subs.jl

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1-
function evalmap(vars, x::Vector, varorder::Vector{PolyVar})
2-
vals = Any[var for var in vars]
3-
for (i, var) in enumerate(varorder)
4-
j = findfirst(vars, var)
5-
# If i == 0, that means that the variable is not present
6-
# so it is ignored
7-
if j > 0
8-
vals[j] = x[i]
1+
function evalmap{T}(vars, x::Vector{T}, varorder::Vector{PolyVar})
2+
if vars == varorder
3+
x
4+
else
5+
vals = Vector{T}(length(vars))
6+
for (i, var) in enumerate(varorder)
7+
j = findfirst(vars, var)
8+
# If i == 0, that means that the variable is not present
9+
# so it is ignored
10+
if j > 0
11+
vals[j] = x[i]
12+
end
913
end
14+
for i in 1:length(vals)
15+
@assert isdefined(vals, i) "Variable $(vars[i]) was not assigned a value"
16+
end
17+
vals
1018
end
11-
vals
1219
end
1320

1421
function monoeval(z::Vector{Int}, vals::Vector)
@@ -39,11 +46,7 @@ end
3946

4047
function (p::VecPolynomial)(x::Vector, varorder)
4148
vals = evalmap(vars(p), x, varorder)
42-
q = zero(p)
43-
for i in 1:length(p)
44-
q += p.a[i] * monoeval(p.x.Z[i], vals)
45-
end
46-
q
49+
sum(i -> p.a[i] * monoeval(p.x.Z[i], vals), 1:length(p))
4750
end
4851

4952
function (p::MatPolynomial)(x::Vector, varorder)

test/REQUIRE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
FactCheck
2+
BenchmarkTools

test/subs.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import Base.Test: @inferred
2+
13
facts("Substitution") do
24
@polyvar x[1:3]
35

@@ -23,4 +25,7 @@ facts("Substitution") do
2325
P = [1 2 3; 2 4 5; 3 5 6]
2426
p = MatPolynomial(P, x)
2527
@fact p(ones(3), x) --> 31
28+
29+
p = x[1] + x[2] + 2*x[1]^2 + 3*x[1]*x[2]^2
30+
@inferred p([1.0, 2.0], [x[1], x[2]])
2631
end

0 commit comments

Comments
 (0)