@@ -65,11 +65,12 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol})
6565 for k in d. subexpression_order
6666 # Only load expressions which actually are used
6767 d. subexpression_forward_values[k] = NaN
68- subex = _SubexpressionStorage (
69- d . data . expressions[k],
70- d . subexpression_linearity ,
68+ expr = d . data . expressions[k]
69+ subex, _ = _subexpression_and_linearity (
70+ expr ,
7171 moi_index_to_consecutive_index,
72- d. want_hess,
72+ Float64[],
73+ d,
7374 )
7475 d. subexpressions[k] = subex
7576 d. subexpression_linearity[k] = subex. linearity
@@ -101,43 +102,54 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol})
101102 end
102103 end
103104 max_chunk = 1
105+ shared_partials_storage_ϵ = Float64[]
104106 if d. data. objective != = nothing
107+ expr = something (d. data. objective)
108+ subexpr, linearity = _subexpression_and_linearity (
109+ expr,
110+ moi_index_to_consecutive_index,
111+ shared_partials_storage_ϵ,
112+ d,
113+ )
105114 objective = _FunctionStorage (
106- main_expressions[1 ],
107- something (d. data. objective). values,
115+ subexpr,
108116 N,
109117 coloring_storage,
110118 d. want_hess,
111119 d. subexpressions,
112120 individual_order[1 ],
113- d. subexpression_linearity,
114121 subexpression_edgelist,
115122 subexpression_variables,
116- moi_index_to_consecutive_index ,
123+ linearity ,
117124 )
118- max_expr_length = max (max_expr_length, length (objective . nodes))
125+ max_expr_length = max (max_expr_length, length (expr . nodes))
119126 max_chunk = max (max_chunk, size (objective. seed_matrix, 2 ))
120127 d. objective = objective
121128 end
122129 for (k, (_, constraint)) in enumerate (d. data. constraints)
123130 idx = d. data. objective != = nothing ? k + 1 : k
131+ expr = constraint. expression
132+ subexpr, linearity = _subexpression_and_linearity (
133+ expr,
134+ moi_index_to_consecutive_index,
135+ shared_partials_storage_ϵ,
136+ d,
137+ )
124138 push! (
125139 d. constraints,
126140 _FunctionStorage (
127- main_expressions[idx],
128- constraint. expression. values,
141+ subexpr,
129142 N,
130143 coloring_storage,
131144 d. want_hess,
132145 d. subexpressions,
133146 individual_order[idx],
134- d. subexpression_linearity,
135147 subexpression_edgelist,
136148 subexpression_variables,
137- moi_index_to_consecutive_index ,
149+ linearity ,
138150 ),
139151 )
140- max_expr_length = max (max_expr_length, length (d . constraints[ end ] . nodes))
152+ max_expr_length = max (max_expr_length, length (expr . nodes))
141153 max_chunk = max (max_chunk, size (d. constraints[end ]. seed_matrix, 2 ))
142154 end
143155 max_chunk = min (max_chunk, MAX_CHUNK)
@@ -146,7 +158,8 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol})
146158 d. input_ϵ = zeros (max_chunk * N)
147159 d. output_ϵ = zeros (max_chunk * N)
148160 #
149- d. partials_storage_ϵ = zeros (max_chunk * max_expr_length)
161+ resize! (shared_partials_storage_ϵ, max_chunk * max_expr_length)
162+ fill! (shared_partials_storage_ϵ, 0.0 )
150163 d. storage_ϵ = zeros (max_chunk * max_expr_with_sub_length)
151164 #
152165 len = max_chunk * length (d. subexpressions)
@@ -178,7 +191,7 @@ function MOI.eval_objective(d::NLPEvaluator, x)
178191 error (" No nonlinear objective." )
179192 end
180193 _reverse_mode (d, x)
181- return something (d. objective). forward_storage[1 ]
194+ return something (d. objective). expr . forward_storage[1 ]
182195end
183196
184197function MOI. eval_objective_gradient (d:: NLPEvaluator , g, x)
194207function MOI. eval_constraint (d:: NLPEvaluator , g, x)
195208 _reverse_mode (d, x)
196209 for i in 1 : length (d. constraints)
197- g[i] = d. constraints[i]. forward_storage[1 ]
210+ g[i] = d. constraints[i]. expr . forward_storage[1 ]
198211 end
199212 return
200213end
@@ -345,11 +358,7 @@ function MOI.eval_hessian_lagrangian_product(d::NLPEvaluator, h, x, v, σ, μ)
345358 subexpr_forward_values_ϵ = reinterpret (T, d. subexpression_forward_values_ϵ)
346359 for i in d. subexpression_order
347360 subexpr = d. subexpressions[i]
348- subexpr_forward_values_ϵ[i] = _forward_eval_ϵ (
349- d,
350- subexpr,
351- reinterpret (T, subexpr. partials_storage_ϵ),
352- )
361+ subexpr_forward_values_ϵ[i] = _forward_eval_ϵ (d, subexpr, T)
353362 end
354363 # we only need to do one reverse pass through the subexpressions as well
355364 subexpr_reverse_values_ϵ = reinterpret (T, d. subexpression_reverse_values_ϵ)
@@ -358,29 +367,23 @@ function MOI.eval_hessian_lagrangian_product(d::NLPEvaluator, h, x, v, σ, μ)
358367 fill! (d. storage_ϵ, 0.0 )
359368 fill! (output_ϵ, zero (T))
360369 if d. objective != = nothing
361- _forward_eval_ϵ (
362- d,
363- something (d. objective),
364- reinterpret (T, d. partials_storage_ϵ),
365- )
370+ _forward_eval_ϵ (d, something (d. objective). expr, T)
366371 _reverse_eval_ϵ (
367372 output_ϵ,
368- something (d. objective),
369- reinterpret (T, d. storage_ϵ),
370- reinterpret (T, d. partials_storage_ϵ),
373+ something (d. objective). expr,
374+ _reinterpret_unsafe (T, d. storage_ϵ),
371375 d. subexpression_reverse_values,
372376 subexpr_reverse_values_ϵ,
373377 σ,
374378 zero (T),
375379 )
376380 end
377381 for (i, con) in enumerate (d. constraints)
378- _forward_eval_ϵ (d, con, reinterpret (T, d . partials_storage_ϵ) )
382+ _forward_eval_ϵ (d, con. expr, T )
379383 _reverse_eval_ϵ (
380384 output_ϵ,
381- con,
385+ con. expr ,
382386 reinterpret (T, d. storage_ϵ),
383- reinterpret (T, d. partials_storage_ϵ),
384387 d. subexpression_reverse_values,
385388 subexpr_reverse_values_ϵ,
386389 μ[i],
@@ -394,7 +397,6 @@ function MOI.eval_hessian_lagrangian_product(d::NLPEvaluator, h, x, v, σ, μ)
394397 output_ϵ,
395398 subexpr,
396399 reinterpret (T, d. storage_ϵ),
397- reinterpret (T, subexpr. partials_storage_ϵ),
398400 d. subexpression_reverse_values,
399401 subexpr_reverse_values_ϵ,
400402 d. subexpression_reverse_values[j],
0 commit comments