From 3182a07ee230aa26d86c239c7a68aa6f55e9c855 Mon Sep 17 00:00:00 2001 From: Sungho Shin Date: Fri, 12 Apr 2024 09:44:08 -0500 Subject: [PATCH] fix for empty hessian/jacobian --- lib/MadNLPGPU/src/interface.jl | 26 +++++++++++++++++--------- lib/MadNLPTests/src/MadNLPTests.jl | 23 ++++++++++++++++++++++- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/lib/MadNLPGPU/src/interface.jl b/lib/MadNLPGPU/src/interface.jl index 73d12d43..d97e9cd6 100644 --- a/lib/MadNLPGPU/src/interface.jl +++ b/lib/MadNLPGPU/src/interface.jl @@ -143,13 +143,15 @@ function MadNLP.mul!( MadNLP.mul!(wx, kkt.hess_com , xx, alpha, beta) MadNLP.mul!(wx, kkt.hess_com', xx, alpha, one(T)) MadNLP.mul!(wx, kkt.jt_csc, xz, alpha, beta) - diag_operation(CUDABackend())( - wx, kkt.hess_com.nzVal, xx, alpha, - kkt.ext.diag_map_to, - kkt.ext.diag_map_fr; - ndrange = length(kkt.ext.diag_map_to) - ) - synchronize(CUDABackend()) + if !isempty(kkt.ext.diag_map_to) + diag_operation(CUDABackend())( + wx, kkt.hess_com.nzVal, xx, alpha, + kkt.ext.diag_map_to, + kkt.ext.diag_map_fr; + ndrange = length(kkt.ext.diag_map_to) + ) + synchronize(CUDABackend()) + end MadNLP.mul!(wz, kkt.jt_csc', xx, alpha, one(T)) MadNLP.axpy!(-alpha, xz, ws) @@ -190,7 +192,11 @@ function get_diagonal_mapping(colptr, rowval) inds1 = findall(map((x,y)-> ((x <= nnz) && (x != y)), @view(colptr[1:end-1]), @view(colptr[2:end]))) ptrs = colptr[inds1] rows = rowval[ptrs] - inds2 = findall(inds1 .== rows) + inds2 = if isempty(rows) + similar(rowval,0) + else + findall(inds1 .== rows) + end return rows[inds2], ptrs[inds2] end @@ -311,7 +317,9 @@ end function MadNLP.force_lower_triangular!(I::CuVector{T},J) where T - _force_lower_triangular!(CUDABackend())(I,J; ndrange=length(I)) + if !isempty(I) + _force_lower_triangular!(CUDABackend())(I,J; ndrange=length(I)) + end end @kernel function _set_colptr_kernel!(colptr, @Const(sym2), @Const(ptr2), @Const(guide)) diff --git a/lib/MadNLPTests/src/MadNLPTests.jl b/lib/MadNLPTests/src/MadNLPTests.jl index 5062cd24..157fc3cf 100644 --- a/lib/MadNLPTests/src/MadNLPTests.jl +++ b/lib/MadNLPTests/src/MadNLPTests.jl @@ -111,7 +111,7 @@ end function test_madnlp(name,optimizer_constructor::Function,exclude; Arr = Array) @testset "$name" begin - for f in [infeasible,unbounded,lootsma,eigmina] + for f in [infeasible,unbounded,lootsma,eigmina,lp] !(string(f) in exclude) && f(optimizer_constructor; Arr = Arr) end end @@ -331,6 +331,27 @@ function eigmina(optimizer_constructor::Function; Arr = Array) end end +function lp(optimizer_constructor::Function; Arr = Array) + @testset "lp" begin + + model = Model() + @variable(model, x >= 0) + @variable(model, 0 <= y <= 3) + @objective(model, Min, 12x + 20y) + @constraint(model, c1, 6x + 8y >= 100) + @constraint(model, c2, 7x + 12y >= 120) + + nlp = SparseWrapperModel( + Arr, + NLPModelsJuMP.MathOptNLPModel(m) + ) + optimizer = optimizer_constructor() + result = MadNLP.madnlp(nlp; optimizer.options...) + + @test result.status == MadNLP.SOLVE_SUCCEEDED + end +end + include("Instances/dummy_qp.jl") include("Instances/hs15.jl") include("Instances/nls.jl")