Skip to content

Commit 88f52f9

Browse files
committed
wip
1 parent 8da44c8 commit 88f52f9

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

src/moi_nlp_model.jl

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ function NLPModels.jprod_nln!(
311311
increment!(nlp, :neval_jprod_nln)
312312
if nlp.quadcon.nquad > 0
313313
for i = 1:(nlp.quadcon.nquad)
314-
# Jv[i] = (Aᵢ * x + bᵢ)ᵀ * v
314+
# Jv[i] += (Aᵢ * x + bᵢ)ᵀ * v
315315
qcon = nlp.quadcon.constraints[i]
316316
Jv[i] = coo_sym_dot(qcon.A.rows, qcon.A.cols, qcon.A.vals, x, v) + dot(qcon.b, v)
317317
end
@@ -333,19 +333,17 @@ function NLPModels.jprod!(
333333
if nlp.meta.nlin > 0
334334
jprod_lin!(nlp, nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, v, Jv)
335335
end
336-
if nlp.meta.nnln > 0
337-
if nlp.quadcon.nquad > 0
338-
for i = 1:(nlp.quadcon.nquad)
339-
# Jv[i] = (Aᵢ * x + bᵢ)ᵀ * v
340-
qcon = nlp.quadcon.constraints[i]
341-
Jv[nlp.meta.nlin + i] = coo_sym_dot(qcon.A.rows, qcon.A.cols, qcon.A.vals, x, v) + dot(qcon.b, v)
342-
end
343-
end
344-
if nlp.meta.nnln > nlp.quadcon.nquad
345-
ind_nnln = (nlp.meta.nlin + nlp.quadcon.nquad + 1):(nlp.meta.ncon)
346-
MOI.eval_constraint_jacobian_product(nlp.eval, view(Jv, ind_nnln), x, v)
336+
if nlp.quadcon.nquad > 0
337+
for i = 1:(nlp.quadcon.nquad)
338+
# Jv[i] = (Aᵢ * x + bᵢ)ᵀ * v
339+
qcon = nlp.quadcon.constraints[i]
340+
Jv[nlp.meta.nlin + i] = coo_sym_dot(qcon.A.rows, qcon.A.cols, qcon.A.vals, x, v) + dot(qcon.b, v)
347341
end
348342
end
343+
if nlp.meta.nnln > nlp.quadcon.nquad
344+
ind_nnln = (nlp.meta.nlin + nlp.quadcon.nquad + 1):(nlp.meta.ncon)
345+
MOI.eval_constraint_jacobian_product(nlp.eval, view(Jv, ind_nnln), x, v)
346+
end
349347
return Jv
350348
end
351349

@@ -378,7 +376,7 @@ function NLPModels.jtprod_nln!(
378376
ind_nnln = (nlp.quadcon.nquad + 1):(nlp.meta.nnln)
379377
MOI.eval_constraint_jacobian_transpose_product(nlp.eval, Jtv, x, view(v, ind_nnln))
380378
end
381-
(nlp.meta.nnln == nlp.quadcon.nquad) && (Jtv .= 0.0)
379+
(nlp.quadcon.nquad > 0) && (Jtv .= 0.0)
382380
if nlp.quadcon.nquad > 0
383381
for i = 1:(nlp.quadcon.nquad)
384382
# Jtv += v[i] * (Aᵢ * x + bᵢ)
@@ -401,10 +399,11 @@ function NLPModels.jtprod!(
401399
ind_nnln = (nlp.quadcon.nquad + 1):(nlp.meta.nnln)
402400
MOI.eval_constraint_jacobian_transpose_product(nlp.eval, Jtv, x, view(v, ind_nnln))
403401
end
402+
(nlp.quadcon.nquad > 0 || nlp.meta.nlin > 0) && (Jtv .= 0.0)
404403
if nlp.meta.nlin > 0
405-
jtprod_lin!(nlp, nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, v, Jtv)
404+
transpose = true
405+
coo_unsym_add_mul!(transpose, nlp.lincon.jacobian.rows, nlp.lincon.jacobian.cols, nlp.lincon.jacobian.vals, v, Jtv, 1.0)
406406
end
407-
(nlp.meta.nnln == nlp.quadcon.nquad) && (Jtv .= 0.0)
408407
if nlp.quadcon.nquad > 0
409408
for i = 1:(nlp.quadcon.nquad)
410409
# Jtv += v[i] * (Aᵢ * x + bᵢ)

src/utils.jl

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,37 @@ function replace!(ex, x)
116116
end
117117
end
118118

119+
"""
120+
coo_unsym_add_mul!(transpose, rows, cols, vals, x, y, α)
121+
122+
Performs the update `y ← y + α * op(A) * x`, where `A` is an unsymmetric matrix in COO format given by `(rows, cols, vals)`.
123+
If `transpose == true`, then `op(A) = Aᵀ`; otherwise, `op(A) = A`.
124+
"""
125+
function coo_unsym_add_mul!(
126+
transpose::Bool,
127+
rows::AbstractVector{<:Integer},
128+
cols::AbstractVector{<:Integer},
129+
vals::AbstractVector,
130+
x::AbstractVector,
131+
y::AbstractVector,
132+
α::Float64,
133+
)
134+
nnz = length(vals)
135+
@inbounds for k = 1:nnz
136+
i, j, c = rows[k], cols[k], vals[k]
137+
if transpose
138+
y[j] += α * c * x[i]
139+
else
140+
y[i] += α * c * x[j]
141+
end
142+
end
143+
return y
144+
end
145+
119146
"""
120147
coo_sym_add_mul!(rows, cols, vals, x, y, α)
121148
122-
Update of the form `y ← y + αAx` where `A` is a symmetric matrix given by `(rows, cols, vals)`.
149+
Perform the update `y ← y + α * A * x` where `A` is a symmetric matrix in COO format given by `(rows, cols, vals)`.
123150
Only one triangle of `A` should be passed.
124151
"""
125152
function coo_sym_add_mul!(

0 commit comments

Comments
 (0)