Skip to content

Commit 6420fc2

Browse files
authored
[docs] add sparsity section to performance tips (#4015)
1 parent 05e0869 commit 6420fc2

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

docs/src/tutorials/getting_started/performance_tips.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,33 @@ variable_by_name(model, "x") === nothing
164164
# For more information on the difference between string names, symbolic
165165
# names, and bindings, see
166166
# [String names, symbolic names, and bindings](@ref variable_names_and_bindings).
167+
168+
# ## Sparsity
169+
170+
# JuMP executes the code that you write without trying to be clever about
171+
# multiplication by `0.0`. For example, consider this model:
172+
173+
d = 100_000
174+
a = zeros(d);
175+
a[3] = 1.0
176+
model = Model();
177+
@variable(model, x[1:d]);
178+
complicated_expression(x, i) = x[i]^2
179+
@expression(model, sum(a[i] * complicated_expression(x, i) for i in 1:d))
180+
181+
# Although the final expression consists of a single element, the sum is over
182+
# 100,000 elements, all but one of which are then multiplied by `0.0`. The
183+
# `@expression` line is equivalent to:
184+
185+
expr = zero(QuadExpr)
186+
for i in 1:d
187+
tmp = complicated_expression(x, i)
188+
global expr = add_to_expression!(expr, a[i], tmp)
189+
end
190+
191+
# Notice how we compute `complicated_expression` in every iteration, even though
192+
# most results will be discarded. You can improve the performance of model
193+
# construction by pre-computing the set of non-zero indices:
194+
195+
indices = [i for i in 1:d if !iszero(a[i])]
196+
@expression(model, sum(a[i] * complicated_expression(x, i) for i in indices))

0 commit comments

Comments
 (0)