Skip to content

Commit be4d293

Browse files
authored
Merge pull request #486 from ChrisRackauckas-Claude/perf-improvements-20260107-184721
Performance improvements: type stability and reduced allocations
2 parents 98ae3ab + a51e5a4 commit be4d293

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

src/elimination.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function det_minor_expansion_inner(
1111
if length(discarded[1]) == n
1212
return 1
1313
end
14-
if discarded in keys(cache)
14+
if haskey(cache, discarded)
1515
return cache[discarded]
1616
end
1717
result = 0
@@ -25,7 +25,7 @@ function det_minor_expansion_inner(
2525
sign *
2626
m[row, col] *
2727
det_minor_expansion_inner(m, (dis_rows, dis_cols), cache)
28-
sign = -1 * sign
28+
sign = -sign
2929
end
3030
end
3131
if length(discarded[1]) > 1

src/wronskian.jl

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,37 @@ end
2222

2323
function monomial_compress(io_equation, params::Array{<:MPolyRingElem, 1})
2424
params_xs = isempty(params) ? empty(params) : gens(parent(first(params)))
25+
# Pre-compute param string names for faster lookup
26+
param_names = Set(var_to_str(p, xs = params_xs) for p in params)
2527
other_vars = [
26-
v for v in gens(parent(io_equation)) if
27-
!(var_to_str(v) in map(p -> var_to_str(p, xs = params_xs), params))
28+
v for v in gens(parent(io_equation)) if !(var_to_str(v) in param_names)
2829
]
2930
coeffdict = extract_coefficients(io_equation, other_vars)
3031
expvect = collect(keys(coeffdict))
3132
coeffs = collect(values(coeffdict))
3233
termlist = map(x -> prod(other_vars .^ x), expvect)
3334

34-
echelon_form = Array{Any, 1}()
35+
# Use typed arrays instead of Array{Any, 1}
36+
P = eltype(coeffs)
37+
T = eltype(termlist)
38+
echelon_form = Vector{Tuple{P, T}}()
39+
sizehint!(echelon_form, length(coeffs))
3540
for (c, p) in zip(coeffs, termlist)
3641
for i in 1:length(echelon_form)
3742
basis_c = echelon_form[i][1]
38-
coef = coeff(c, leading_monomial(basis_c)) // leading_coefficient(basis_c)
43+
lm = leading_monomial(basis_c)
44+
coef = coeff(c, lm) // leading_coefficient(basis_c)
3945
if coef != 0
4046
c = c - coef * basis_c
41-
echelon_form[i][2] += coef * p
47+
echelon_form[i] = (echelon_form[i][1], echelon_form[i][2] + coef * p)
4248
end
4349
end
4450
if c != 0
45-
push!(echelon_form, [c, p])
51+
push!(echelon_form, (c, p))
4652
end
4753
end
4854

4955
result = ([a[1] for a in echelon_form], [a[2] for a in echelon_form])
50-
#s = 0
51-
#for (a, b) in zip(result[1], result[2])
52-
# s += parent_ring_change(a, parent(io_equation)) * parent_ring_change(b, parent(io_equation))
53-
#end
54-
#println("====================")
55-
#println(s - io_equation)
56-
5756
return result
5857
end
5958

@@ -139,14 +138,14 @@ function massive_eval(polys, eval_dict)
139138
point = [get(eval_dict, v, zero(R)) for v in gens(parent(first(polys)))]
140139
n = length(point)
141140

142-
monomials = Set()
141+
monomials = Set{Vector{Int}}()
143142
for p in polys
144143
for exp in exponent_vectors(p)
145144
push!(monomials, exp)
146145
end
147146
end
148147

149-
cache = Dict()
148+
cache = Dict{Vector{Int}, typeof(one(R))}()
150149
cache[[0 for i in 1:n]] = one(R)
151150
cached_monoms = ExpVectTrie(n)
152151
push!(cached_monoms, [0 for _ in 1:n])
@@ -158,7 +157,7 @@ function massive_eval(polys, eval_dict)
158157
end
159158

160159
for exp in sort!(collect(monomials), by = sum)
161-
if !(exp in keys(cache))
160+
if !haskey(cache, exp)
162161
monom_val = one(R)
163162
computed = [0 for i in 1:n]
164163
while sum(exp) > 0

0 commit comments

Comments
 (0)