source: trunk/Cbc/test/CInterfaceTest.c @ 2036

Last change on this file since 2036 was 2036, checked in by mlubin, 5 years ago

Disable non-working SOS constraints
Add non-working attempt at problem modification

File size: 8.7 KB
Line 
1/* $Id$ */
2/* Copyright (C) 2014, International Business Machines
3   Corporation and others.  All Rights Reserved.
4   This code is licensed under the terms of the Eclipse Public License (EPL). */
5
6#undef NDEBUG /* force asserts to work */
7#include "Cbc_C_Interface.h"
8#include <assert.h>
9#include <math.h>
10#include <stdio.h>
11#include <string.h>
12
13
14static int callback_called = 0;
15
16void (COINLINKAGE_CB test_callback)(Cbc_Model * model,int  msgno, int ndouble,
17                            const double * dvec, int nint, const int * ivec,
18                            int nchar, char ** cvec) {
19
20    callback_called = 1;
21    printf("In callback: message %d\n", msgno);
22
23}
24
25
26void testKnapsack() {
27
28    Cbc_Model *model = Cbc_newModel();
29
30    /* Simple knapsack problem
31       Maximize  5x[1] + 3x[2] + 2x[3] + 7x[4] + 4x[5]
32       s.t.      2x[1] + 8x[2] + 4x[3] + 2x[4] + 5x[5] <= 10
33       All x binary
34       */
35   
36    CoinBigIndex start[] = {0, 1, 2, 3, 4, 5, 6};
37    int rowindex[] = {0, 0, 0, 0, 0};
38    double value[] = {2, 8, 4, 2, 5};
39    double collb[] = {0,0,0,0,0};
40    double colub[] = {1,1,1,1,1};
41    double obj[] = {5, 3, 2, 7, 4};
42    double feasible[] = {1,1,0,0,0};
43    double rowlb[] = {-INFINITY};
44    double rowub[] = {10};
45    const double *sol;
46    const char* setname = "test model";
47    char *getname = malloc(20);
48    int i;
49
50    printf("Interface reports Cbc version %s\n", Cbc_getVersion());
51
52    Cbc_loadProblem(model, 5, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
53
54    Cbc_setColName(model, 2, "var2");
55    Cbc_setRowName(model, 0, "constr0");
56
57
58    assert(Cbc_getNumCols(model) == 5);
59    assert(Cbc_getNumRows(model) == 1);
60
61    for (i = 0; i < 5; i++) {
62        Cbc_setInteger(model, i);
63        assert(Cbc_isInteger(model,i));
64    }
65
66    Cbc_setObjSense(model, -1);
67    assert(Cbc_getObjSense(model) == -1);
68
69    Cbc_setProblemName(model, setname);
70
71    Cbc_registerCallBack(model, test_callback);
72
73    Cbc_setInitialSolution(model, feasible);
74
75    Cbc_solve(model);
76
77    assert(Cbc_isProvenOptimal(model));
78    assert(!Cbc_isAbandoned(model));
79    assert(!Cbc_isProvenInfeasible(model));
80    assert(!Cbc_isContinuousUnbounded(model));
81    assert(!Cbc_isNodeLimitReached(model));
82    assert(!Cbc_isSecondsLimitReached(model));
83    assert(!Cbc_isSolutionLimitReached(model));
84    assert(fabs( Cbc_getObjValue(model)- (16.0) < 1e-6));
85    assert(fabs( Cbc_getBestPossibleObjValue(model)- (16.0) < 1e-6));
86
87    assert(callback_called == 1);
88   
89    sol = Cbc_getColSolution(model);
90   
91    assert(fabs(sol[0] - 1.0) < 1e-6);
92    assert(fabs(sol[1] - 0.0) < 1e-6);
93    assert(fabs(sol[2] - 0.0) < 1e-6);
94    assert(fabs(sol[3] - 1.0) < 1e-6);
95    assert(fabs(sol[4] - 1.0) < 1e-6);
96
97    Cbc_problemName(model, 20, getname);
98    i = strcmp(getname,setname);
99    assert( (i == 0) );
100
101    Cbc_getColName(model, 2, getname, 20);
102    i = strcmp(getname, "var2");
103    assert( (i == 0) );
104    Cbc_getRowName(model, 0, getname, 20);
105    i = strcmp(getname, "constr0");
106    assert( (i == 0) );
107    assert( Cbc_maxNameLength(model) >= 7 );
108   
109    Cbc_deleteModel(model);
110
111}
112
113void testProblemModification() {
114
115    Cbc_Model *model = Cbc_newModel();
116
117    /* Simple knapsack problem
118       Maximize  5x[1] + 3x[2] + 2x[3] + 7x[4] + 4x[5]
119       s.t.      2x[1] + 8x[2] + 4x[3] + 2x[4] + 5x[5] <= 10
120       All x binary
121       */
122   
123    CoinBigIndex start[] = {0, 1, 2, 3, 4, 5, 6};
124    int rowindex[] = {0, 0, 0, 0, 0};
125    double value[] = {2, 8, 4, 2, 5};
126    double collb[] = {0,0,0,0,0};
127    double colub[] = {1,1,1,1,1};
128    double obj[] = {5, 3, 2, 7, 4};
129    double rowlb[] = {-INFINITY};
130    double rowub[] = {10};
131    const double *sol;
132    int i;
133
134    printf("Interface reports Cbc version %s\n", Cbc_getVersion());
135
136    Cbc_loadProblem(model, 5, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
137
138    for (i = 0; i < 5; i++) {
139        Cbc_setInteger(model, i);
140        assert(Cbc_isInteger(model,i));
141    }
142
143    Cbc_setObjSense(model, -1);
144    assert(Cbc_getObjSense(model) == -1);
145
146    Cbc_solve(model);
147
148    assert(Cbc_isProvenOptimal(model));
149    assert(fabs( Cbc_getObjValue(model)- (16.0) < 1e-6));
150
151    sol = Cbc_getColSolution(model);
152   
153    assert(fabs(sol[0] - 1.0) < 1e-6);
154    assert(fabs(sol[1] - 0.0) < 1e-6);
155    assert(fabs(sol[2] - 0.0) < 1e-6);
156    assert(fabs(sol[3] - 1.0) < 1e-6);
157    assert(fabs(sol[4] - 1.0) < 1e-6);
158
159    Cbc_setColUpper(model, 0, 0.0);
160    Cbc_solve(model);
161
162    assert(Cbc_isProvenOptimal(model));
163    assert(fabs( Cbc_getObjValue(model)- (11.0) < 1e-6));
164
165    sol = Cbc_getColSolution(model);
166   
167    assert(fabs(sol[0] - 0.0) < 1e-6);
168    assert(fabs(sol[1] - 0.0) < 1e-6);
169    assert(fabs(sol[2] - 0.0) < 1e-6);
170    assert(fabs(sol[3] - 1.0) < 1e-6);
171    assert(fabs(sol[4] - 1.0) < 1e-6);
172
173
174    Cbc_setColLower(model, 1, 1.0);
175
176    assert(Cbc_isProvenOptimal(model));
177    assert(fabs( Cbc_getObjValue(model)- (10.0) < 1e-6));
178
179    sol = Cbc_getColSolution(model);
180   
181    assert(fabs(sol[0] - 0.0) < 1e-6);
182    assert(fabs(sol[1] - 1.0) < 1e-6);
183    assert(fabs(sol[2] - 0.0) < 1e-6);
184    assert(fabs(sol[3] - 1.0) < 1e-6);
185    assert(fabs(sol[4] - 0.0) < 1e-6);
186
187   
188    Cbc_deleteModel(model);
189
190}
191
192/*
193void testSOS() {
194
195    Cbc_Model *model = Cbc_newModel();
196
197    / *
198       Maximize  5x[1] + 3x[2] + 2x[3] + 7x[4] + 4x[5]
199       s.t.       x[1] +  x[2] +  x[3] +  x[4] +  x[5] == 1
200       All x binary
201       * /
202   
203    CoinBigIndex start[] = {0, 0, 0, 0, 0, 0, 0};
204    double collb[] = {0,0,0,0,0};
205    double colub[] = {1,1,1,1,1};
206    double obj[] = {5, 3, 2, 7, 4};
207    int sosrowstart[] = {0,5};
208    int soscolindex[] = {0,1,2,3,4};
209    const double *sol;
210    int i;
211
212    Cbc_loadProblem(model, 5, 0, start, NULL, NULL, collb, colub, obj, NULL, NULL);
213
214    assert(Cbc_getNumCols(model) == 5);
215    assert(Cbc_getNumRows(model) == 0);
216
217    for (i = 0; i < 5; i++) {
218        Cbc_setInteger(model, i);
219        assert(Cbc_isInteger(model,i));
220    }
221
222    Cbc_setObjSense(model, -1);
223    assert(Cbc_getObjSense(model) == -1);
224   
225    Cbc_addSOS(model,1,sosrowstart,soscolindex,obj,1);
226
227    Cbc_solve(model);
228
229    assert(Cbc_isProvenOptimal(model));
230    assert(!Cbc_isAbandoned(model));
231    assert(!Cbc_isProvenInfeasible(model));
232    assert(!Cbc_isContinuousUnbounded(model));
233    assert(!Cbc_isNodeLimitReached(model));
234    assert(!Cbc_isSecondsLimitReached(model));
235    assert(!Cbc_isSolutionLimitReached(model));
236    assert(fabs( Cbc_getObjValue(model)- (7.0) < 1e-6));
237    assert(fabs( Cbc_getBestPossibleObjValue(model)- (7.0) < 1e-6));
238
239    sol = Cbc_getColSolution(model);
240   
241    assert(fabs(sol[0] - 0.0) < 1e-6);
242    assert(fabs(sol[1] - 0.0) < 1e-6);
243    assert(fabs(sol[2] - 0.0) < 1e-6);
244    assert(fabs(sol[3] - 1.0) < 1e-6);
245    assert(fabs(sol[4] - 0.0) < 1e-6);
246
247    Cbc_deleteModel(model);
248
249}
250*/
251
252void testIntegerInfeasible() {
253
254    Cbc_Model *model = Cbc_newModel();
255
256    /* Minimize x
257     * s.t.     x <= -10
258     * x binary */
259
260    CoinBigIndex start[] = {0, 1};
261    int rowindex[] = {0};
262    double value[] = {1.0};
263    double rowlb[] = {-INFINITY};
264    double rowub[] = {-10};
265
266    double collb[] = {0.0};
267    double colub[] = {1.0};
268    double obj[] = {1.0};
269
270    Cbc_loadProblem(model, 1, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
271
272    Cbc_setInteger(model, 0);
273
274    assert(Cbc_getNumCols(model) == 1);
275    assert(Cbc_getNumRows(model) == 1);
276
277    Cbc_solve(model);
278   
279    assert(!Cbc_isProvenOptimal(model));
280    assert(Cbc_isProvenInfeasible(model));
281   
282    Cbc_deleteModel(model);
283
284}
285
286void testIntegerUnbounded() {
287
288    Cbc_Model *model = Cbc_newModel();
289
290    /* http://list.coin-or.org/pipermail/cbc/2014-March/001276.html
291     * Minimize x
292     * s.t. x + y <= 3
293     *      x - y == 0
294     *      x,y Free
295     *      x integer */
296
297    CoinBigIndex start[] = {0,2,4};
298    int rowindex[] = {0, 1, 0, 1};
299    double value[] = {1, 1, 1, -1};
300    double rowlb[] = {-INFINITY, 0.0};
301    double rowub[] = {3.0,0.0};
302    double collb[] = {-INFINITY, -INFINITY};
303    double colub[] = {INFINITY, INFINITY};
304    double obj[] = {1.0};
305
306    Cbc_loadProblem(model, 2, 2, start, rowindex, value, collb, colub, obj, rowlb, rowub);
307
308    Cbc_setInteger(model, 0);
309
310    Cbc_setParameter(model, "log", "0");
311   
312    printf("About to solve problem silently. You should see no output except \"Done\".\n");
313    Cbc_solve(model);
314    printf("Done\n");
315   
316    assert(!Cbc_isProvenOptimal(model));
317    assert(!Cbc_isProvenInfeasible(model));
318    assert(Cbc_isContinuousUnbounded(model));
319
320    Cbc_deleteModel(model);
321
322
323}
324
325
326int main() {
327
328    printf("Knapsack test\n");
329    testKnapsack();
330    /*printf("SOS test\n");
331    testSOS();*/
332    printf("Infeasible test\n");
333    testIntegerInfeasible();
334    printf("Unbounded test\n");
335    testIntegerUnbounded();
336    printf("Problem modification test\n");
337    testProblemModification();
338
339    return 0;
340}
Note: See TracBrowser for help on using the repository browser.