Skip to content

Commit 4dbe827

Browse files
committed
Remove allocations of jac_nln_structure in SlackModel
1 parent 7aed2f6 commit 4dbe827

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

src/slack-model.jl

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,32 @@ function NLPModels.jac_lin_structure!(
296296
return rows, cols
297297
end
298298

299+
"""
300+
relative_columns_indices!(cols, nlp, nj, n, jlow, model_jlow)
301+
302+
The input `jlow` should be relative indices within `nlp.model.meta.nln`.
303+
Add to `cols[nj .+ (1:length(jlow))]` the indices of `n + jind` with `jind` indices of `jlow` relative to `setdiff(nlp.model.meta.nln, nlp.model.meta.jfix)`.
304+
305+
This is the 0-allocation version of:
306+
```
307+
ind = setdiff(nlp.model.meta.nln, nlp.model.meta.jfix)
308+
jlow_nln = get_slack_ind(nlp.model.meta.jlow, ind)
309+
cols[(nj + 1):(nj + lj)] .= (n .+ jlow_nln)
310+
```
311+
"""
312+
function relative_columns_indices!(cols::AbstractVector{<:Integer}, nlp::SlackModels, nj::Integer, n::Integer, jlow::AbstractVector{<:Integer}, model_jlow::AbstractVector{<:Integer})
313+
k = 0 # number of jfix encountered
314+
j = 0 # number of elements added
315+
for i in nlp.model.meta.nln
316+
if i in nlp.model.meta.jfix
317+
k += 1
318+
elseif i in model_jlow
319+
j += 1
320+
cols[nj + j] = n + jlow[j] - k
321+
end
322+
end # |j| = lj and |k| = length(nlp.model.meta.jfix)
323+
end
324+
299325
function NLPModels.jac_nln_structure!(
300326
nlp::SlackModels,
301327
rows::AbstractVector{<:Integer},
@@ -307,22 +333,18 @@ function NLPModels.jac_nln_structure!(
307333
if nln_nnzj > 0
308334
@views jac_nln_structure!(nlp.model, rows[1:nln_nnzj], cols[1:nln_nnzj])
309335
end
310-
ind = setdiff(nlp.model.meta.nln, nlp.model.meta.jfix)
311336
jlow, jupp, jrng = nlp.jlow_nln, nlp.jupp_nln, nlp.jrng_nln
312337
nslacklin = length(nlp.jlow_lin) + length(nlp.jupp_lin) + length(nlp.jrng_lin)
313338
n += nslacklin
314339
nj, lj = nln_nnzj, length(jlow)
315340
rows[(nj + 1):(nj + lj)] .= jlow
316-
jlow_nln = get_slack_ind(nlp.model.meta.jlow, ind)
317-
cols[(nj + 1):(nj + lj)] .= (n .+ jlow_nln)
341+
relative_columns_indices!(cols, nlp, nj, n, jlow, nlp.model.meta.jlow)
318342
nj, lj = nj + lj, length(jupp)
319343
rows[(nj + 1):(nj + lj)] .= jupp
320-
jupp_nln = get_slack_ind(nlp.model.meta.jupp, ind)
321-
cols[(nj + 1):(nj + lj)] .= (n .+ jupp_nln)
344+
relative_columns_indices!(cols, nlp, nj, n, jupp, nlp.model.meta.jupp)
322345
nj, lj = nj + lj, length(jrng)
323346
rows[(nj + 1):(nj + lj)] .= jrng
324-
jrng_nln = get_slack_ind(nlp.model.meta.jrng, ind)
325-
cols[(nj + 1):(nj + lj)] .= (n .+ jrng_nln)
347+
relative_columns_indices!(cols, nlp, nj, n, jrng, nlp.model.meta.jrng)
326348

327349
nslacknln = length(nlp.jlow_nln) + length(nlp.jupp_nln) + length(nlp.jrng_nln)
328350
cols[(nln_nnzj + 1):end] .= (n + 1):(n + nslacknln)

0 commit comments

Comments
 (0)