Changeset 2036 for trunk


Ignore:
Timestamp:
May 25, 2014 9:07:36 PM (5 years ago)
Author:
mlubin
Message:

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

Location:
trunk/Cbc
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cbc/src/Cbc_C_Interface.cpp

    r2033 r2036  
    3232{ \
    3333    return m->model_->prop(); \
     34}
     35
     36#define CbcSetSolverProperty(T,prop) \
     37COINLIBAPI void COINLINKAGE \
     38Cbc_ ## prop (Cbc_Model *m, int index, T val) \
     39{ \
     40    m->model_->solver()->prop(index,val); \
    3441}
    3542
     
    700707
    701708CbcGetProperty(const double*, getRowLower)
     709CbcSetSolverProperty(double, setRowLower)
    702710CbcGetProperty(const double*, getRowUpper)
     711CbcSetSolverProperty(double, setRowUpper)
    703712CbcGetProperty(const double*, getObjCoefficients)
     713CbcSetSolverProperty(double, setObjCoeff)
    704714CbcGetProperty(const double*, getColLower)
     715CbcSetSolverProperty(double, setColLower)
    705716CbcGetProperty(const double*, getColUpper)
     717CbcSetSolverProperty(double, setColUpper)
    706718
    707719CbcGetProperty(double, getObjValue)
     
    824836}
    825837/** Add SOS constraints to the model using row-order matrix */
     838/*
    826839COINLIBAPI void  COINLINKAGE
    827840Cbc_addSOS(Cbc_Model * model, int numRows, const int * rowStarts,
     
    890903    if (VERBOSE > 2) {
    891904        printf("%s calling addObjects()\n", prefix);
    892         /*
    893             printf("%s numObjects = %i, objects = %X\n",prefix,numObjects,objects);
    894             for (row=0; row<numObjects; row++)
    895               printf("%s  objects[%i] = %X\n",prefix,row,objects[row]);
    896         */
     905       
     906        //    printf("%s numObjects = %i, objects = %X\n",prefix,numObjects,objects);
     907        //    for (row=0; row<numObjects; row++)
     908        //      printf("%s  objects[%i] = %X\n",prefix,row,objects[row]);
     909       
    897910    }
    898911    fflush(stdout);
     
    905918    if (VERBOSE > 0) printf("%sreturn\n", prefix);
    906919    return;
    907 }
     920}*/
    908921
    909922/** Print the solution */
  • trunk/Cbc/src/Cbc_C_Interface.h

    r2033 r2036  
    173173    Cbc_getRowLower(Cbc_Model * model)
    174174    ;
     175    /** Set the lower bound of a single constraint */
     176    COINLIBAPI void COINLINKAGE
     177    Cbc_setRowLower(Cbc_Model * model, int index, double value)
     178    ;
    175179    /** Constraint upper bounds */
    176180    COINLIBAPI const double* COINLINKAGE
    177181    Cbc_getRowUpper(Cbc_Model * model)
    178182    ;
     183    /** Set the upper bound of a single constraint */
     184    COINLIBAPI void COINLINKAGE
     185    Cbc_setRowUpper(Cbc_Model * model, int index, double value)
     186    ;
    179187    /** Objective vector */
    180188    COINLIBAPI const double * COINLINKAGE
    181189    Cbc_getObjCoefficients(Cbc_Model * model)
    182190    ;
     191    /** Set the objective coefficient of a single variable */
     192    COINLIBAPI void COINLINKAGE
     193    Cbc_setObjCoeff(Cbc_Model * model, int index, double value)
     194    ;
    183195    /** Variable lower bounds */
    184196    COINLIBAPI const double * COINLINKAGE
    185197    Cbc_getColLower(Cbc_Model * model)
    186198    ;
     199    /** Set the lower bound of a single variable */
     200    COINLIBAPI void COINLINKAGE
     201    Cbc_setColLower(Cbc_Model * model, int index, double value)
     202    ;
    187203    /** Variable upper bounds */
    188204    COINLIBAPI const double * COINLINKAGE
    189205    Cbc_getColUpper(Cbc_Model * model)
     206    ;
     207    /** Set the upper bound of a single variable */
     208    COINLIBAPI void COINLINKAGE
     209    Cbc_setColUpper(Cbc_Model * model, int index, double value)
    190210    ;
    191211    /** Determine whether the ith variable is integer restricted */
     
    201221    Cbc_setInteger(Cbc_Model * model, int iColumn)
    202222    ;
    203     /** Add SOS constraints to the model using row-order matrix */
    204     COINLIBAPI void  COINLINKAGE
     223    /* Add SOS constraints to the model using row-order matrix
     224     * Unable to confirm that this function is working. */
     225    /*COINLIBAPI void  COINLINKAGE
    205226    Cbc_addSOS(Cbc_Model * model, int numRows, const int * rowStarts,
    206227               const int * colIndices, const double * weights, const int type)
    207     ;
     228    ;*/
    208229    /** Print the model */
    209230    COINLIBAPI void COINLINKAGE
  • trunk/Cbc/test/CInterfaceTest.c

    r2033 r2036  
    111111}
    112112
    113 void testSOS() {
    114 
    115     Cbc_Model *model = Cbc_newModel();
    116 
    117     /*
    118        Minimize  5x[1] + 3x[2] + 2x[3] + 7x[4] + 4x[5]
    119        s.t.       x[1] +  x[2] +  x[3] +  x[4] +  x[5] == 1
     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
    120120       All x binary
    121121       */
    122122   
    123     CoinBigIndex start[] = {0, 0, 0, 0, 0, 0, 0};
    124     /*int rowindex[] = {};*/
    125     /*double value[] = {};*/
     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};
    126126    double collb[] = {0,0,0,0,0};
    127127    double colub[] = {1,1,1,1,1};
    128128    double obj[] = {5, 3, 2, 7, 4};
    129     /*double rowlb[] = {};*/
    130     /*double rowub[] = {};*/
     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};
    131207    int sosrowstart[] = {0,5};
    132208    int soscolindex[] = {0,1,2,3,4};
     
    144220    }
    145221
    146     assert(Cbc_getObjSense(model) == 1);
     222    Cbc_setObjSense(model, -1);
     223    assert(Cbc_getObjSense(model) == -1);
    147224   
    148225    Cbc_addSOS(model,1,sosrowstart,soscolindex,obj,1);
     
    157234    assert(!Cbc_isSecondsLimitReached(model));
    158235    assert(!Cbc_isSolutionLimitReached(model));
    159     assert(fabs( Cbc_getObjValue(model)- (2.0) < 1e-6));
    160     assert(fabs( Cbc_getBestPossibleObjValue(model)- (2.0) < 1e-6));
     236    assert(fabs( Cbc_getObjValue(model)- (7.0) < 1e-6));
     237    assert(fabs( Cbc_getBestPossibleObjValue(model)- (7.0) < 1e-6));
    161238
    162239    sol = Cbc_getColSolution(model);
     
    164241    assert(fabs(sol[0] - 0.0) < 1e-6);
    165242    assert(fabs(sol[1] - 0.0) < 1e-6);
    166     assert(fabs(sol[2] - 1.0) < 1e-6);
    167     assert(fabs(sol[3] - 0.0) < 1e-6);
     243    assert(fabs(sol[2] - 0.0) < 1e-6);
     244    assert(fabs(sol[3] - 1.0) < 1e-6);
    168245    assert(fabs(sol[4] - 0.0) < 1e-6);
    169246
     
    171248
    172249}
     250*/
    173251
    174252void testIntegerInfeasible() {
     
    250328    printf("Knapsack test\n");
    251329    testKnapsack();
    252     printf("SOS test\n");
    253     testSOS();
     330    /*printf("SOS test\n");
     331    testSOS();*/
    254332    printf("Infeasible test\n");
    255333    testIntegerInfeasible();
    256334    printf("Unbounded test\n");
    257335    testIntegerUnbounded();
     336    printf("Problem modification test\n");
     337    testProblemModification();
    258338
    259339    return 0;
Note: See TracChangeset for help on using the changeset viewer.