Skip to content

Commit 061fe55

Browse files
geoffroylecontedpo
authored andcommitted
output genericexstats
1 parent b44a706 commit 061fe55

File tree

4 files changed

+50
-18
lines changed

4 files changed

+50
-18
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ LinearOperators = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125"
99
NLPModels = "a4795742-8479-5a88-8948-cc11e1c8c1a6"
1010
NLPModelsModifiers = "e01155f1-5c6f-4375-a9d8-616dd036575f"
1111
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
12+
SolverCore = "ff4d7338-4cf1-434d-91df-b86cb86fb843"
1213
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1314
SparseMatricesCOO = "fa32481b-f100-4b48-8dc8-c62f61b13870"
1415

@@ -17,6 +18,7 @@ LinearOperators = "2.2.2"
1718
NLPModels = "0.17, 0.18"
1819
NLPModelsModifiers = "0.4, 0.5"
1920
Requires = "0.3, 0.4, 0.5, 1.0"
21+
SolverCore = "0.2.2"
2022
SparseMatricesCOO = "0.1"
2123
julia = "^1.0.0"
2224

src/QuadraticModels.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module QuadraticModels
44
using LinearAlgebra, SparseArrays
55

66
# our packages
7-
using LinearOperators, NLPModels, NLPModelsModifiers, SparseMatricesCOO
7+
using LinearOperators, NLPModels, NLPModelsModifiers, SolverCore, SparseMatricesCOO
88

99
# auxiliary packages
1010
using Requires

src/presolve/presolve.jl

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ function presolve(
2020
qm::QuadraticModel{T, S, M1, M2};
2121
kwargs...,
2222
) where {T <: Real, S, M1 <: SparseMatrixCOO, M2 <: SparseMatrixCOO}
23+
start_time = time()
24+
elapsed_time = 0.0
2325
psqm = deepcopy(qm)
2426
psdata = psqm.data
2527
lvar, uvar = psqm.meta.lvar, psqm.meta.uvar
@@ -58,23 +60,50 @@ function presolve(
5860
if !(nnzj == length(psdata.A.rows) == length(psdata.A.cols))
5961
error("The length of Arows, Acols and Avals must be the same")
6062
end
61-
psmeta = NLPModelMeta{T, S}(
62-
nvarps,
63-
lvar = lvar,
64-
uvar = uvar,
65-
ncon = ncon,
66-
lcon = lcon,
67-
ucon = ucon,
68-
nnzj = nnzj,
69-
nnzh = nnzh,
70-
lin = 1:ncon,
71-
islp = (ncon == 0);
72-
minimize = qm.meta.minimize,
73-
kwargs...,
74-
)
75-
ps = PresolvedQuadraticModel(psmeta, Counters(), psdata, xrm)
7663

77-
return ps
64+
if nvarps == 0
65+
feasible = all(qm.meta.lcon .<= qm.data.A * xrm .<= qm.meta.ucon)
66+
s = qm.data.c .+ qm.data.Q * xrm
67+
i_l = findall(s .> zero(T))
68+
s_l = sparsevec(i_l, s[i_l])
69+
i_u = findall(s .< zero(T))
70+
s_u = sparsevec(i_u, .-s[i_u])
71+
return GenericExecutionStats(
72+
feasible ? :acceptable : :infeasible,
73+
ps,
74+
solution = xrm,
75+
objective = obj(qm, xrm),
76+
multipliers = zeros(T, qm.meta.nvar),
77+
multipliers_L = s_l,
78+
multipliers_U = s_u,
79+
iter = 0,
80+
elapsed_time = time() - start_time,
81+
solver_specific = Dict(:presolvedQM => nothing),
82+
)
83+
else
84+
psmeta = NLPModelMeta{T, S}(
85+
nvarps,
86+
lvar = lvar,
87+
uvar = uvar,
88+
ncon = ncon,
89+
lcon = lcon,
90+
ucon = ucon,
91+
nnzj = nnzj,
92+
nnzh = nnzh,
93+
lin = 1:ncon,
94+
islp = (ncon == 0);
95+
minimize = qm.meta.minimize,
96+
kwargs...,
97+
)
98+
ps = PresolvedQuadraticModel(psmeta, Counters(), psdata, xrm)
99+
return GenericExecutionStats(
100+
:unknown,
101+
ps,
102+
iter = 0,
103+
elapsed_time = time() - start_time,
104+
solver_specific = Dict(:presolvedQM => ps),
105+
)
106+
end
78107
end
79108

80109
"""

test/test_presolve.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
name = "QM1",
2626
)
2727

28-
psqp = presolve(qp)
28+
statsps = presolve(qp)
29+
psqp = statsps.solver_specific[:presolvedQM]
2930

3031
c_true = [-4.0; 1.0]
3132
c0_true = 4.0

0 commit comments

Comments
 (0)