@@ -20,6 +20,8 @@ function presolve(
20
20
qm:: QuadraticModel{T, S, M1, M2} ;
21
21
kwargs... ,
22
22
) where {T <: Real , S, M1 <: SparseMatrixCOO , M2 <: SparseMatrixCOO }
23
+ start_time = time ()
24
+ elapsed_time = 0.0
23
25
psqm = deepcopy (qm)
24
26
psdata = psqm. data
25
27
lvar, uvar = psqm. meta. lvar, psqm. meta. uvar
@@ -58,23 +60,50 @@ function presolve(
58
60
if ! (nnzj == length (psdata. A. rows) == length (psdata. A. cols))
59
61
error (" The length of Arows, Acols and Avals must be the same" )
60
62
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)
76
63
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
78
107
end
79
108
80
109
"""
0 commit comments