@@ -220,3 +220,175 @@ function setup_test(
220220 )
221221 return
222222end
223+
224+ """
225+ test_cpsat_BinPacking(model::MOI.ModelLike, config::Config)
226+
227+ Add a VectorOfVariables-in-BinPacking constraint.
228+ """
229+ function test_cpsat_BinPacking (
230+ model:: MOI.ModelLike ,
231+ config:: Config{T} ,
232+ ) where {T}
233+ @requires MOI. supports_constraint (
234+ model,
235+ MOI. VectorOfVariables,
236+ MOI. BinPacking{T},
237+ )
238+ @requires MOI. supports_add_constrained_variable (model, MOI. Integer)
239+ @requires _supports (config, MOI. optimize!)
240+ x = [MOI. add_constrained_variable (model, MOI. Integer ())[1 ] for _ in 1 : 3 ]
241+ MOI. add_constraint (
242+ model,
243+ MOI. VectorOfVariables (x),
244+ MOI. BinPacking (T (2 ), T[1 , 2 ]),
245+ )
246+ MOI. optimize! (model)
247+ x_val = round .(Int, MOI. get .(model, MOI. VariablePrimal (), x))
248+ @test 1 * x_val[1 ] + 2 * x_val[2 ] <= T (2 )
249+ return
250+ end
251+
252+ function setup_test (
253+ :: typeof (test_cpsat_BinPacking),
254+ model:: MOIU.MockOptimizer ,
255+ :: Config{T} ,
256+ ) where {T}
257+ MOIU. set_mock_optimize! (
258+ model,
259+ (mock:: MOIU.MockOptimizer ) -> MOIU. mock_optimize! (
260+ mock,
261+ MOI. OPTIMAL,
262+ (MOI. FEASIBLE_POINT, T[2 , 0 ]),
263+ ),
264+ )
265+ return
266+ end
267+
268+ """
269+ test_cpsat_Cumulative(model::MOI.ModelLike, config::Config)
270+
271+ Add a VectorOfVariables-in-Cumulative constraint.
272+ """
273+ function test_cpsat_Cumulative (
274+ model:: MOI.ModelLike ,
275+ config:: Config{T} ,
276+ ) where {T}
277+ @requires MOI. supports_constraint (
278+ model,
279+ MOI. VectorOfVariables,
280+ MOI. Cumulative,
281+ )
282+ @requires MOI. supports_add_constrained_variable (model, MOI. Integer)
283+ @requires _supports (config, MOI. optimize!)
284+ s = [MOI. add_constrained_variable (model, MOI. Integer ())[1 ] for _ in 1 : 3 ]
285+ d = [MOI. add_constrained_variable (model, MOI. Integer ())[1 ] for _ in 1 : 3 ]
286+ r = [MOI. add_constrained_variable (model, MOI. Integer ())[1 ] for _ in 1 : 3 ]
287+ b, _ = MOI. add_constrained_variable (model, MOI. Integer ())
288+ MOI. add_constraint (
289+ model,
290+ MOI. VectorOfVariables ([s; d; r; b]),
291+ MOI. Cumulative (10 ),
292+ )
293+ MOI. optimize! (model)
294+ s_val = round .(Int, MOI. get .(model, MOI. VariablePrimal (), s))
295+ d_val = round .(Int, MOI. get .(model, MOI. VariablePrimal (), d))
296+ r_val = round .(Int, MOI. get .(model, MOI. VariablePrimal (), r))
297+ b_val = round (Int, MOI. get (model, MOI. VariablePrimal (), b))
298+ times = zeros (maximum (s_val) + maximum (d_val))
299+ for i in 1 : 3
300+ for j in 0 : (d_val[i]- 1 )
301+ t = s_val[i] + j
302+ times[t] += r_val[i]
303+ end
304+ end
305+ @test all (times .<= b_val)
306+ return
307+ end
308+
309+ function setup_test (
310+ :: typeof (test_cpsat_Cumulative),
311+ model:: MOIU.MockOptimizer ,
312+ :: Config{T} ,
313+ ) where {T}
314+ MOIU. set_mock_optimize! (
315+ model,
316+ (mock:: MOIU.MockOptimizer ) -> MOIU. mock_optimize! (
317+ mock,
318+ MOI. OPTIMAL,
319+ (MOI. FEASIBLE_POINT, T[0 , 1 , 2 , 2 , 2 , 2 , 3 , 2 , 1 , 5 ]),
320+ ),
321+ )
322+ return
323+ end
324+
325+ """
326+ test_cpsat_Table(model::MOI.ModelLike, config::Config)
327+
328+ Add a VectorOfVariables-in-Table constraint.
329+ """
330+ function test_cpsat_Table (model:: MOI.ModelLike , config:: Config{T} ) where {T}
331+ @requires MOI. supports_constraint (
332+ model,
333+ MOI. VectorOfVariables,
334+ MOI. Table{T},
335+ )
336+ @requires MOI. supports_add_constrained_variable (model, MOI. Integer)
337+ @requires _supports (config, MOI. optimize!)
338+ x = [MOI. add_constrained_variable (model, MOI. Integer ())[1 ] for _ in 1 : 3 ]
339+ table = T[1 1 0 ; 0 1 1 ]
340+ MOI. add_constraint (model, MOI. VectorOfVariables (x), MOI. Table (table))
341+ MOI. optimize! (model)
342+ x_val = round .(Int, MOI. get .(model, MOI. VariablePrimal (), x))
343+ @test x_val == [1 , 1 , 0 ] || x_val == [0 , 1 , 1 ]
344+ return
345+ end
346+
347+ function setup_test (
348+ :: typeof (test_cpsat_Table),
349+ model:: MOIU.MockOptimizer ,
350+ :: Config{T} ,
351+ ) where {T}
352+ MOIU. set_mock_optimize! (
353+ model,
354+ (mock:: MOIU.MockOptimizer ) -> MOIU. mock_optimize! (
355+ mock,
356+ MOI. OPTIMAL,
357+ (MOI. FEASIBLE_POINT, T[1 , 1 , 0 ]),
358+ ),
359+ )
360+ return
361+ end
362+
363+ """
364+ test_cpsat_Circuit(model::MOI.ModelLike, config::Config)
365+
366+ Add a VectorOfVariables-in-Circuit constraint.
367+ """
368+ function test_cpsat_Circuit (model:: MOI.ModelLike , config:: Config{T} ) where {T}
369+ @requires MOI. supports_constraint (model, MOI. VectorOfVariables, MOI. Circuit)
370+ @requires MOI. supports_add_constrained_variable (model, MOI. Integer)
371+ @requires _supports (config, MOI. optimize!)
372+ x = [MOI. add_constrained_variable (model, MOI. Integer ())[1 ] for _ in 1 : 3 ]
373+ MOI. add_constraint (model, MOI. VectorOfVariables (x), MOI. Circuit (3 ))
374+ MOI. optimize! (model)
375+ x_val = round .(Int, MOI. get .(model, MOI. VariablePrimal (), x))
376+ @test x_val == [3 , 1 , 2 ] || x_val == [2 , 3 , 1 ]
377+ return
378+ end
379+
380+ function setup_test (
381+ :: typeof (test_cpsat_Circuit),
382+ model:: MOIU.MockOptimizer ,
383+ :: Config{T} ,
384+ ) where {T}
385+ MOIU. set_mock_optimize! (
386+ model,
387+ (mock:: MOIU.MockOptimizer ) -> MOIU. mock_optimize! (
388+ mock,
389+ MOI. OPTIMAL,
390+ (MOI. FEASIBLE_POINT, T[3 , 1 , 2 ]),
391+ ),
392+ )
393+ return
394+ end
0 commit comments