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

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

Improved documentation. Tests for callbacks and row/column names. More restructuring.

File size: 4.8 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 rowlb[] = {-INFINITY};
43    double rowub[] = {10};
44    const double *sol;
45    const char* setname = "test model";
46    char *getname = malloc(20);
47    int i;
48
49    printf("Interface reports Cbc version %s\n", Cbc_getVersion());
50
51    Cbc_loadProblem(model, 5, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
52
53    Cbc_setColName(model, 2, "var2");
54    Cbc_setRowName(model, 0, "constr0");
55
56
57    assert(Cbc_getNumCols(model) == 5);
58    assert(Cbc_getNumRows(model) == 1);
59
60    for (i = 0; i < 5; i++) {
61        Cbc_setInteger(model, i);
62        assert(Cbc_isInteger(model,i));
63    }
64
65    Cbc_setObjSense(model, -1);
66    assert(Cbc_getObjSense(model) == -1);
67
68    Cbc_setProblemName(model, setname);
69
70    Cbc_registerCallBack(model, test_callback);
71
72    Cbc_solve(model);
73
74    assert(Cbc_isProvenOptimal(model));
75    assert(!Cbc_isAbandoned(model));
76    assert(!Cbc_isProvenInfeasible(model));
77    assert(!Cbc_isContinuousUnbounded(model));
78    assert(!Cbc_isNodeLimitReached(model));
79    assert(!Cbc_isSecondsLimitReached(model));
80    assert(!Cbc_isSolutionLimitReached(model));
81    assert(fabs( Cbc_getObjValue(model)- (16.0) < 1e-6));
82    assert(fabs( Cbc_getBestPossibleObjValue(model)- (16.0) < 1e-6));
83
84    assert(callback_called == 1);
85   
86    sol = Cbc_getColSolution(model);
87   
88    assert(fabs(sol[0] - 1.0) < 1e-6);
89    assert(fabs(sol[1] - 0.0) < 1e-6);
90    assert(fabs(sol[2] - 0.0) < 1e-6);
91    assert(fabs(sol[3] - 1.0) < 1e-6);
92    assert(fabs(sol[4] - 1.0) < 1e-6);
93
94    Cbc_problemName(model, 20, getname);
95    i = strcmp(getname,setname);
96    assert( (i == 0) );
97
98    Cbc_getColName(model, 2, getname, 20);
99    i = strcmp(getname, "var2");
100    assert( (i == 0) );
101    Cbc_getRowName(model, 0, getname, 20);
102    i = strcmp(getname, "constr0");
103    assert( (i == 0) );
104    assert( Cbc_maxNameLength(model) >= 7 );
105   
106    Cbc_deleteModel(model);
107
108}
109
110void testIntegerInfeasible() {
111
112    Cbc_Model *model = Cbc_newModel();
113
114    /* Minimize x
115     * s.t.     x <= -10
116     * x binary */
117
118    CoinBigIndex start[] = {0, 1};
119    int rowindex[] = {0};
120    double value[] = {1.0};
121    double rowlb[] = {-INFINITY};
122    double rowub[] = {-10};
123
124    double collb[] = {0.0};
125    double colub[] = {1.0};
126    double obj[] = {1.0};
127
128    Cbc_loadProblem(model, 1, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
129
130    Cbc_setInteger(model, 0);
131
132    assert(Cbc_getNumCols(model) == 1);
133    assert(Cbc_getNumRows(model) == 1);
134
135    Cbc_solve(model);
136   
137    assert(!Cbc_isProvenOptimal(model));
138    assert(Cbc_isProvenInfeasible(model));
139   
140    Cbc_deleteModel(model);
141
142}
143
144void testIntegerUnbounded() {
145
146    Cbc_Model *model = Cbc_newModel();
147
148    /* http://list.coin-or.org/pipermail/cbc/2014-March/001276.html
149     * Minimize x
150     * s.t. x + y <= 3
151     *      x - y == 0
152     *      x,y Free
153     *      x integer */
154
155    CoinBigIndex start[] = {0,2,4};
156    int rowindex[] = {0, 1, 0, 1};
157    double value[] = {1, 1, 1, -1};
158    double rowlb[] = {-INFINITY, 0.0};
159    double rowub[] = {3.0,0.0};
160    double collb[] = {-INFINITY, -INFINITY};
161    double colub[] = {INFINITY, INFINITY};
162    double obj[] = {1.0};
163
164    Cbc_loadProblem(model, 2, 2, start, rowindex, value, collb, colub, obj, rowlb, rowub);
165
166    Cbc_setInteger(model, 0);
167
168    Cbc_setParameter(model, "log", "0");
169   
170    printf("About to solve problem silently. You should see no output except \"Done\".\n");
171    Cbc_solve(model);
172    printf("Done\n");
173   
174    assert(!Cbc_isProvenOptimal(model));
175    assert(!Cbc_isProvenInfeasible(model));
176    assert(Cbc_isContinuousUnbounded(model));
177
178    Cbc_deleteModel(model);
179
180
181}
182
183
184int main() {
185
186    testKnapsack();
187    testIntegerInfeasible();
188    testIntegerUnbounded();
189
190    return 0;
191}
Note: See TracBrowser for help on using the repository browser.