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

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

More C interface work. Move C interface to libCbcSolver so that we can use CbcMain0 and CbcMain1.

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