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

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

Major cleaning of C interface, more to come

File size: 3.4 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
12
13void testKnapsack() {
14
15    Cbc_Model *model = Cbc_newModel();
16
17    /* Simple knapsack problem
18       Maximize  5x[1] + 3x[2] + 2x[3] + 7x[4] + 4x[5]
19       s.t.      2x[1] + 8x[2] + 4x[3] + 2x[4] + 5x[5] <= 10
20       All x binary
21       */
22   
23    CoinBigIndex start[] = {0, 1, 2, 3, 4, 5, 6};
24    int rowindex[] = {0, 0, 0, 0, 0};
25    double value[] = {2, 8, 4, 2, 5};
26    double collb[] = {0,0,0,0,0};
27    double colub[] = {1,1,1,1,1};
28    double obj[] = {5, 3, 2, 7, 4};
29    double rowlb[] = {-INFINITY};
30    double rowub[] = {10};
31    const double *sol;
32    int i;
33
34    Cbc_loadProblem(model, 5, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
35
36    assert(Cbc_getNumCols(model) == 5);
37    assert(Cbc_getNumRows(model) == 1);
38
39    for (i = 0; i < 5; i++) {
40        Cbc_setInteger(model, i);
41        assert(Cbc_isInteger(model,i));
42    }
43
44    Cbc_setObjSense(model, -1);
45    assert(Cbc_getObjSense(model) == -1);
46
47    Cbc_solve(model);
48
49    assert(Cbc_isProvenOptimal(model));
50    assert(!Cbc_isAbandoned(model));
51    assert(!Cbc_isProvenInfeasible(model));
52    assert(!Cbc_isContinuousUnbounded(model));
53    assert(!Cbc_isNodeLimitReached(model));
54    assert(!Cbc_isSecondsLimitReached(model));
55    assert(!Cbc_isSolutionLimitReached(model));
56    assert(fabs( Cbc_getObjValue(model)- (16.0) < 1e-6));
57   
58    sol = Cbc_getColSolution(model);
59   
60    assert(fabs(sol[0] - 1.0) < 1e-6);
61    assert(fabs(sol[1] - 0.0) < 1e-6);
62    assert(fabs(sol[2] - 0.0) < 1e-6);
63    assert(fabs(sol[3] - 1.0) < 1e-6);
64    assert(fabs(sol[4] - 1.0) < 1e-6);
65
66}
67
68void testIntegerInfeasible() {
69
70    Cbc_Model *model = Cbc_newModel();
71
72    /* Minimize x
73     * s.t.     x <= -10
74     * x binary */
75
76    CoinBigIndex start[] = {0, 1};
77    int rowindex[] = {0};
78    double value[] = {1.0};
79    double rowlb[] = {-INFINITY};
80    double rowub[] = {-10};
81
82    double collb[] = {0.0};
83    double colub[] = {1.0};
84    double obj[] = {1.0};
85
86    Cbc_loadProblem(model, 1, 1, start, rowindex, value, collb, colub, obj, rowlb, rowub);
87
88    Cbc_setInteger(model, 0);
89
90    assert(Cbc_getNumCols(model) == 1);
91    assert(Cbc_getNumRows(model) == 1);
92
93    Cbc_solve(model);
94   
95    assert(!Cbc_isProvenOptimal(model));
96    assert(Cbc_isProvenInfeasible(model));
97
98}
99
100void testIntegerUnbounded() {
101
102    Cbc_Model *model = Cbc_newModel();
103
104    /* http://list.coin-or.org/pipermail/cbc/2014-March/001276.html
105     * Minimize x
106     * s.t. x + y <= 3
107     *      x - y == 0
108     *      x,y Free
109     *      x integer */
110
111    CoinBigIndex start[] = {0,2,4};
112    int rowindex[] = {0, 1, 0, 1};
113    double value[] = {1, 1, 1, -1};
114    double rowlb[] = {-INFINITY, 0.0};
115    double rowub[] = {3.0,0.0};
116    double collb[] = {-INFINITY, -INFINITY};
117    double colub[] = {INFINITY, INFINITY};
118    double obj[] = {1.0};
119
120    Cbc_loadProblem(model, 2, 2, start, rowindex, value, collb, colub, obj, rowlb, rowub);
121
122    Cbc_setInteger(model, 0);
123
124    Cbc_solve(model);
125   
126    assert(!Cbc_isProvenOptimal(model));
127    assert(!Cbc_isProvenInfeasible(model));
128    assert(Cbc_isContinuousUnbounded(model));
129
130
131
132}
133
134
135int main() {
136
137    testKnapsack();
138    testIntegerInfeasible();
139    testIntegerUnbounded();
140
141    return 0;
142}
Note: See TracBrowser for help on using the repository browser.