@@ -2265,6 +2265,68 @@ function test_transpose()
2265
2265
return
2266
2266
end
2267
2267
2268
+ # ## src/problems.jl
2269
+
2270
+ function test_Problem_at_atom_lamba_min ()
2271
+ function lamb_min (A:: Convex.AbstractExpr )
2272
+ t = Variable ()
2273
+ n = size (A, 1 )
2274
+ @assert n == size (A, 2 )
2275
+ return maximize (t, [A - t * LinearAlgebra. I (n) ⪰ 0 ])
2276
+ end
2277
+ A = Variable (2 , 2 )
2278
+ p = maximize (lamb_min (A) + 1 )
2279
+ @test vexity (p) == Convex. ConcaveVexity ()
2280
+ context = Convex. Context (p, MOI. Utilities. Model{Float64})
2281
+ F = MOI. VectorAffineFunction{Float64}
2282
+ S = MOI. PositiveSemidefiniteConeSquare
2283
+ @test (F, S) in MOI. get (context. model, MOI. ListOfConstraintTypesPresent ())
2284
+ @test MOI. get (context. model, MOI. NumberOfConstraints {F,S} ()) == 1
2285
+ # Check DCP error
2286
+ p = minimize (lamb_min (A) + 1 )
2287
+ @test vexity (p) == Convex. NotDcp ()
2288
+ # Check satisfy
2289
+ p = satisfy ([lamb_min (A) >= 1 ])
2290
+ @test vexity (p) == Convex. ConstVexity ()
2291
+ return
2292
+ end
2293
+
2294
+ function test_Problem_caching ()
2295
+ function t_atom ()
2296
+ t = Variable ()
2297
+ return minimize (t, [t >= 0 ])
2298
+ end
2299
+ p = minimize (t_atom () + t_atom ())
2300
+ context = Convex. Context (p, MOI. Utilities. Model{Float64})
2301
+ @test MOI. get (context. model, MOI. NumberOfVariables ()) == 2
2302
+ t = t_atom ()
2303
+ p = minimize (t + t)
2304
+ context = Convex. Context (p, MOI. Utilities. Model{Float64})
2305
+ @test MOI. get (context. model, MOI. NumberOfVariables ()) == 1
2306
+ return
2307
+ end
2308
+
2309
+ function test_Problem_array ()
2310
+ function op_huber (c)
2311
+ M = 1.0
2312
+ s = Variable (size (c))
2313
+ n = Variable (size (c))
2314
+ return minimize (square (s) + 2 * M * abs (n), c == s + n)
2315
+ end
2316
+ x = Variable (2 )
2317
+ @test size (op_huber (x)) == (2 , 1 )
2318
+ context_op_huber =
2319
+ Convex. Context (minimize (sum (op_huber (x))), MOI. Utilities. Model{Float64})
2320
+ context_builtin =
2321
+ Convex. Context (minimize (sum (huber (x))), MOI. Utilities. Model{Float64})
2322
+ # This test checks that the two printed models are identical. This relies on
2323
+ # the conic_form! of HuberAtom being identical to the implementation in
2324
+ # op_huber. Feel free to change this test if HuberAtom changes.
2325
+ @test sprint (print, context_op_huber. model) ==
2326
+ sprint (print, context_builtin. model)
2327
+ return
2328
+ end
2329
+
2268
2330
end # TestAtoms
2269
2331
2270
2332
TestAtoms. runtests ()
0 commit comments