13
13
14
14
mutable struct Model
15
15
workspace:: Ptr{OSQP.Workspace}
16
+ lcache:: Vector{Float64} # to facilitate converting l to use OSQP_INFTY
17
+ ucache:: Vector{Float64} # to facilitate converting u to use OSQP_INFTY
16
18
17
19
"""
18
20
Module()
19
21
20
22
Initialize OSQP module
21
23
"""
22
24
function Model ()
23
- # TODO : Change me to more elegant way
24
- # a = Array{Ptr{OSQP.Workspace}}(1)[1]
25
- a = C_NULL
26
-
27
- # Create new model
28
- model = new (a)
29
-
30
- # Add finalizer
25
+ model = new (C_NULL , Float64[], Float64[])
31
26
@compat finalizer (OSQP. clean!, model)
32
-
33
27
return model
34
28
35
29
end
@@ -123,6 +117,10 @@ function setup!(model::OSQP.Model;
123
117
u = min .(u, OSQP_INFTY)
124
118
l = max .(l, - OSQP_INFTY)
125
119
120
+ # Resize caches
121
+ resize! (model. lcache, m)
122
+ resize! (model. ucache, m)
123
+
126
124
# Create managed matrices to avoid segfaults (See SCS.jl)
127
125
managedP = OSQP. ManagedCcsc (P)
128
126
managedA = OSQP. ManagedCcsc (A)
@@ -150,10 +148,8 @@ function setup!(model::OSQP.Model;
150
148
151
149
# Perform setup
152
150
@compat_gc_preserve managedP Pdata managedA Adata q l u begin
153
- model. workspace = ccall ((:osqp_setup , OSQP. osqp),
154
- Ptr{OSQP. Workspace}, (Ptr{OSQP. Data},
155
- Ptr{OSQP. Settings}),
156
- Ref (data), Ref (stgs))
151
+ model. workspace = ccall ((:osqp_setup , OSQP. osqp), Ptr{OSQP. Workspace},
152
+ (Ptr{OSQP. Data}, Ptr{OSQP. Settings}), Ref (data), Ref (stgs))
157
153
end
158
154
159
155
if model. workspace == C_NULL
@@ -231,8 +227,8 @@ function update_l!(model::OSQP.Model, l::Vector{Float64})
231
227
if length (l) != m
232
228
error (" l must have length m = $(m) " )
233
229
end
234
- l .= max .(l, - OSQP_INFTY) # Convert values to OSQP_INFTY
235
- exitflag = ccall ((:osqp_update_lower_bound , OSQP. osqp), Cc_int, (Ptr{OSQP. Workspace}, Ptr{Cdouble}), model. workspace, l )
230
+ model . lcache .= max .(l, - OSQP_INFTY)
231
+ exitflag = ccall ((:osqp_update_lower_bound , OSQP. osqp), Cc_int, (Ptr{OSQP. Workspace}, Ptr{Cdouble}), model. workspace, model . lcache )
236
232
if exitflag != 0 error (" Error updating l" ) end
237
233
end
238
234
@@ -241,8 +237,8 @@ function update_u!(model::OSQP.Model, u::Vector{Float64})
241
237
if length (u) != m
242
238
error (" u must have length m = $(m) " )
243
239
end
244
- u .= min .(u, OSQP_INFTY) # Convert values to OSQP_INFTY
245
- exitflag = ccall ((:osqp_update_upper_bound , OSQP. osqp), Cc_int, (Ptr{OSQP. Workspace}, Ptr{Cdouble}), model. workspace, u )
240
+ model . ucache .= min .(u, OSQP_INFTY)
241
+ exitflag = ccall ((:osqp_update_upper_bound , OSQP. osqp), Cc_int, (Ptr{OSQP. Workspace}, Ptr{Cdouble}), model. workspace, model . ucache )
246
242
if exitflag != 0 error (" Error updating u" ) end
247
243
end
248
244
@@ -254,7 +250,10 @@ function update_bounds!(model::OSQP.Model, l::Vector{Float64}, u::Vector{Float64
254
250
if length (u) != m
255
251
error (" u must have length m = $(m) " )
256
252
end
257
- exitflag = ccall ((:osqp_update_bounds , OSQP. osqp), Cc_int, (Ptr{OSQP. Workspace}, Ptr{Cdouble}, Ptr{Cdouble}), model. workspace, l, u)
253
+ model. lcache .= max .(l, - OSQP_INFTY)
254
+ model. ucache .= min .(u, OSQP_INFTY)
255
+ exitflag = ccall ((:osqp_update_bounds , OSQP. osqp), Cc_int, (Ptr{OSQP. Workspace}, Ptr{Cdouble}, Ptr{Cdouble}),
256
+ model. workspace, model. lcache, model. ucache)
258
257
if exitflag != 0 error (" Error updating bounds l and u" ) end
259
258
end
260
259
0 commit comments