@@ -65,11 +65,12 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol})
65
65
for k in d. subexpression_order
66
66
# Only load expressions which actually are used
67
67
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 ,
71
71
moi_index_to_consecutive_index,
72
- d. want_hess,
72
+ Float64[],
73
+ d,
73
74
)
74
75
d. subexpressions[k] = subex
75
76
d. subexpression_linearity[k] = subex. linearity
@@ -101,43 +102,54 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol})
101
102
end
102
103
end
103
104
max_chunk = 1
105
+ shared_partials_storage_ϵ = Float64[]
104
106
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
+ )
105
114
objective = _FunctionStorage (
106
- main_expressions[1 ],
107
- something (d. data. objective). values,
115
+ subexpr,
108
116
N,
109
117
coloring_storage,
110
118
d. want_hess,
111
119
d. subexpressions,
112
120
individual_order[1 ],
113
- d. subexpression_linearity,
114
121
subexpression_edgelist,
115
122
subexpression_variables,
116
- moi_index_to_consecutive_index ,
123
+ linearity ,
117
124
)
118
- max_expr_length = max (max_expr_length, length (objective . nodes))
125
+ max_expr_length = max (max_expr_length, length (expr . nodes))
119
126
max_chunk = max (max_chunk, size (objective. seed_matrix, 2 ))
120
127
d. objective = objective
121
128
end
122
129
for (k, (_, constraint)) in enumerate (d. data. constraints)
123
130
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
+ )
124
138
push! (
125
139
d. constraints,
126
140
_FunctionStorage (
127
- main_expressions[idx],
128
- constraint. expression. values,
141
+ subexpr,
129
142
N,
130
143
coloring_storage,
131
144
d. want_hess,
132
145
d. subexpressions,
133
146
individual_order[idx],
134
- d. subexpression_linearity,
135
147
subexpression_edgelist,
136
148
subexpression_variables,
137
- moi_index_to_consecutive_index ,
149
+ linearity ,
138
150
),
139
151
)
140
- max_expr_length = max (max_expr_length, length (d . constraints[ end ] . nodes))
152
+ max_expr_length = max (max_expr_length, length (expr . nodes))
141
153
max_chunk = max (max_chunk, size (d. constraints[end ]. seed_matrix, 2 ))
142
154
end
143
155
max_chunk = min (max_chunk, MAX_CHUNK)
@@ -146,7 +158,8 @@ function MOI.initialize(d::NLPEvaluator, requested_features::Vector{Symbol})
146
158
d. input_ϵ = zeros (max_chunk * N)
147
159
d. output_ϵ = zeros (max_chunk * N)
148
160
#
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 )
150
163
d. storage_ϵ = zeros (max_chunk * max_expr_with_sub_length)
151
164
#
152
165
len = max_chunk * length (d. subexpressions)
@@ -178,7 +191,7 @@ function MOI.eval_objective(d::NLPEvaluator, x)
178
191
error (" No nonlinear objective." )
179
192
end
180
193
_reverse_mode (d, x)
181
- return something (d. objective). forward_storage[1 ]
194
+ return something (d. objective). expr . forward_storage[1 ]
182
195
end
183
196
184
197
function MOI. eval_objective_gradient (d:: NLPEvaluator , g, x)
194
207
function MOI. eval_constraint (d:: NLPEvaluator , g, x)
195
208
_reverse_mode (d, x)
196
209
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 ]
198
211
end
199
212
return
200
213
end
@@ -345,11 +358,7 @@ function MOI.eval_hessian_lagrangian_product(d::NLPEvaluator, h, x, v, σ, μ)
345
358
subexpr_forward_values_ϵ = reinterpret (T, d. subexpression_forward_values_ϵ)
346
359
for i in d. subexpression_order
347
360
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)
353
362
end
354
363
# we only need to do one reverse pass through the subexpressions as well
355
364
subexpr_reverse_values_ϵ = reinterpret (T, d. subexpression_reverse_values_ϵ)
@@ -358,29 +367,23 @@ function MOI.eval_hessian_lagrangian_product(d::NLPEvaluator, h, x, v, σ, μ)
358
367
fill! (d. storage_ϵ, 0.0 )
359
368
fill! (output_ϵ, zero (T))
360
369
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)
366
371
_reverse_eval_ϵ (
367
372
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_ϵ),
371
375
d. subexpression_reverse_values,
372
376
subexpr_reverse_values_ϵ,
373
377
σ,
374
378
zero (T),
375
379
)
376
380
end
377
381
for (i, con) in enumerate (d. constraints)
378
- _forward_eval_ϵ (d, con, reinterpret (T, d . partials_storage_ϵ) )
382
+ _forward_eval_ϵ (d, con. expr, T )
379
383
_reverse_eval_ϵ (
380
384
output_ϵ,
381
- con,
385
+ con. expr ,
382
386
reinterpret (T, d. storage_ϵ),
383
- reinterpret (T, d. partials_storage_ϵ),
384
387
d. subexpression_reverse_values,
385
388
subexpr_reverse_values_ϵ,
386
389
μ[i],
@@ -394,7 +397,6 @@ function MOI.eval_hessian_lagrangian_product(d::NLPEvaluator, h, x, v, σ, μ)
394
397
output_ϵ,
395
398
subexpr,
396
399
reinterpret (T, d. storage_ϵ),
397
- reinterpret (T, subexpr. partials_storage_ϵ),
398
400
d. subexpression_reverse_values,
399
401
subexpr_reverse_values_ϵ,
400
402
d. subexpression_reverse_values[j],
0 commit comments