Changeset 350


Ignore:
Timestamp:
Nov 12, 2009 12:49:42 PM (10 years ago)
Author:
bjarni
Message:

Add support for semi-continuous variables and rename BranchDir? to PriorBranch?

Location:
trunk/CoinMP/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/CoinMP/src/CoinCbc.cpp

    r348 r350  
    2424#include "CbcEventHandler.hpp"
    2525#include "CbcBranchActual.hpp"   // CbcSOS
     26#include "CbcBranchLotSize.hpp"  // CbcLotsize
    2627
    2728#include "CglProbing.hpp"
     
    656657
    657658
     659int CbcAddPriorObjects(HCBC hCbc, PPROBLEM pProblem)
     660{
     661        int *priorVar;
     662        int *priorCbc;
     663        int i,k;
     664        PCBC pCbc = (PCBC)hCbc;
     665
     666        if ((pProblem->PriorCount == 0) || (pProblem->numInts == 0)) {
     667                return CBC_CALL_FAILED;
     668        }
     669        priorVar = (int *)malloc(pProblem->ColCount * sizeof(int));
     670        if (!priorVar) {
     671                return CBC_CALL_FAILED;
     672        }
     673        //reset the priorVar
     674        for (i = 0; i < pProblem->ColCount; i++) {
     675                priorVar[i] = 1000;
     676        }
     677        for (i = 0; i < pProblem->PriorCount; i++) {
     678                if ((pProblem->PriorIndex[i] < 0) ||
     679                        (pProblem->PriorIndex[i] >= pProblem->ColCount)) {
     680                        free(priorVar);
     681                        return CBC_CALL_FAILED;
     682                }
     683                priorVar[pProblem->PriorIndex[i]] = pProblem->PriorValues[i];
     684        }
     685        //Create an array to give to cbc
     686        priorCbc = (int *)malloc(pProblem->numInts * sizeof(int));
     687        if (!priorCbc) {
     688                free(priorVar);
     689                return CBC_CALL_FAILED;
     690        }
     691        k = 0;
     692        for (i = 0; i < pProblem->ColCount; i++) {
     693                if (pProblem->IsInt[i]) {
     694                        priorCbc[k++] = priorVar[i];
     695                }
     696        }
     697        pCbc->cbc->passInPriorities(priorCbc, false);
     698        free(priorCbc);
     699        free(priorVar);
     700        return CBC_CALL_SUCCESS;
     701}
     702
     703
    658704int CbcAddSosObjects(HCBC hCbc, PPROBLEM pProblem)
    659705{
     
    677723}
    678724
    679 int CbcAddPriorObjects(HCBC hCbc, PPROBLEM pProblem)
    680 {
    681         int *priorVar;
    682         int *priorCbc;
    683         int i,k;
    684         PCBC pCbc = (PCBC)hCbc;
    685 
    686         if ((pProblem->PriorCount == 0) || (pProblem->numInts == 0)) {
     725
     726int CbcAddSemiContObjects(HCBC hCbc, PPROBLEM pProblem)
     727{
     728        double points[4];
     729        int i, semicol;
     730        PCBC pCbc = (PCBC)hCbc;
     731
     732        if (pProblem->SemiCount == 0) {
    687733                return CBC_CALL_FAILED;
    688734        }
    689         priorVar = (int *)malloc(pProblem->ColCount * sizeof(int));
    690         if (!priorVar) {
    691                 return CBC_CALL_FAILED;
    692         }
    693         //reset the priorVar
    694         for (i = 0; i < pProblem->ColCount; i++) {
    695                 priorVar[i] = 1000;
    696         }
    697         for (i = 0; i < pProblem->PriorCount; i++) {
    698                 if ((pProblem->PriorIndex[i] < 0) ||
    699                         (pProblem->PriorIndex[i] >= pProblem->ColCount)) {
    700                         free(priorVar);
    701                         return CBC_CALL_FAILED;
    702                 }
    703                 priorVar[pProblem->PriorIndex[i]] = pProblem->PriorValues[i];
    704         }
    705         //Create an array to give to cbc
    706         priorCbc = (int *)malloc(pProblem->numInts * sizeof(int));
    707         if (!priorCbc) {
    708                 free(priorVar);
    709                 return CBC_CALL_FAILED;
    710         }
    711         k = 0;
    712         for (i = 0; i < pProblem->ColCount; i++) {
    713                 if (pProblem->IsInt[i]) {
    714                         priorCbc[k++] = priorVar[i];
    715                 }
    716         }
    717         pCbc->cbc->passInPriorities(priorCbc, false);
    718         free(priorCbc);
    719         free(priorVar);
    720         return CBC_CALL_SUCCESS;
    721 }
    722 
     735        points[0] = 0.0;
     736        points[1] = 0.0;
     737        for (i = 0; i < pProblem->SemiCount; i++ ) {
     738                semicol = pProblem->SemiIndex[i];
     739                points[2] = pProblem->LowerBounds[semicol];
     740                points[3] = pProblem->UpperBounds[semicol];
     741                CbcObject *semiObject = new CbcLotsize(pCbc->cbc, semicol, 2, points, true);
     742                pCbc->cbc->addObjects(1, &semiObject);
     743                delete semiObject;
     744        }
     745        return CBC_CALL_SUCCESS;
     746}
    723747
    724748
     
    730754        PCBC pCbc = (PCBC)hCbc;
    731755
     756        if (pProblem->SemiCount > 0) {
     757                memcpy(pProblem->SemiLower, pProblem->LowerBounds, pProblem->ColCount * sizeof(double));
     758                for (i = 0; i < pProblem->SemiCount; i++) {
     759                        col = pProblem->SemiIndex[i];
     760                        pProblem->LowerBounds[col] = 0.0;
     761                }
     762        }
    732763        pCbc->clp->setOptimizationDirection(pProblem->ObjectSense);
    733764        pCbc->clp->loadProblem(pProblem->ColCount, pProblem->RowCount,
     
    735766                                                        pProblem->LowerBounds, pProblem->UpperBounds, pProblem->ObjectCoeffs,
    736767                                                        pProblem->RowLower, pProblem->RowUpper);
     768        if (pProblem->SemiCount > 0) {
     769                memcpy(pProblem->LowerBounds, pProblem->SemiLower, pProblem->ColCount * sizeof(double));
     770        }
    737771        CbcCopyNamesList(hCbc, pProblem);
    738772        if (pProblem->SolveAsMIP) {
     
    741775                }
    742776                result = CbcSetColumnIntegers(hCbc, pProblem);
     777                result = CbcAddPriorObjects(hCbc, pProblem);
    743778                result = CbcAddSosObjects(hCbc, pProblem);
    744                 result = CbcAddPriorObjects(hCbc, pProblem);
     779                result = CbcAddSemiContObjects(hCbc, pProblem);
    745780        }
    746781        return CBC_CALL_SUCCESS;
  • trunk/CoinMP/src/CoinMP.cpp

    r348 r350  
    337337
    338338SOLVAPI int SOLVCALL CoinLoadPriority(HPROB hProb, int PriorCount, int* PriorIndex,
    339                                                                           int* PriorValues, int* BranchDir)
     339                                                                          int* PriorValues, int* PriorBranch)
    340340{
    341341        PCOIN pCoin = (PCOIN)hProb;
    342342        PPROBLEM pProblem = pCoin->pProblem;
    343343
     344        if (PriorCount == 0) {
     345                return SOLV_CALL_FAILED;
     346        }
    344347        pProblem->PriorCount = PriorCount;
    345348        if (PriorIndex)  pProblem->PriorIndex  = (int* )malloc(PriorCount * sizeof(int));
    346349        if (PriorValues) pProblem->PriorValues = (int* )malloc(PriorCount * sizeof(int));
    347         if (BranchDir)   pProblem->BranchDir  = (int* )malloc(PriorCount * sizeof(int));
     350        if (PriorBranch) pProblem->PriorBranch = (int* )malloc(PriorCount * sizeof(int));
    348351        if (pProblem->PriorIndex)  memcpy(pProblem->PriorIndex,  PriorIndex,  PriorCount * sizeof(int));
    349352        if (pProblem->PriorValues) memcpy(pProblem->PriorValues, PriorValues, PriorCount * sizeof(int));
    350         if (pProblem->BranchDir)   memcpy(pProblem->BranchDir,   BranchDir,   PriorCount * sizeof(int));
    351 
    352         return SOLV_CALL_SUCCESS;
    353 }
    354 
    355 
    356 SOLVAPI int SOLVCALL CoinLoadSemiCont(HPROB hProb, int SemiCount, int* SemiIndex)
    357 {
    358         return SOLV_CALL_FAILED;
     353        if (pProblem->PriorBranch) memcpy(pProblem->PriorBranch, PriorBranch, PriorCount * sizeof(int));
     354
     355        return SOLV_CALL_SUCCESS;
    359356}
    360357
     
    384381        if (pProblem->SosIndex) memcpy(pProblem->SosIndex, SosIndex, SosNZCount   * sizeof(int));
    385382        if (pProblem->SosRef)   memcpy(pProblem->SosRef,   SosRef,   SosNZCount   * sizeof(double));
     383
     384        pProblem->SolveAsMIP = 1;
     385        return SOLV_CALL_SUCCESS;
     386}
     387
     388
     389
     390SOLVAPI int SOLVCALL CoinLoadSemiCont(HPROB hProb, int SemiCount, int* SemiIndex)
     391{
     392        PCOIN pCoin = (PCOIN)hProb;
     393        PPROBLEM pProblem = pCoin->pProblem;
     394
     395        if (SemiCount == 0) {
     396                return SOLV_CALL_FAILED;
     397        }
     398        if (!SemiIndex) {
     399                return SOLV_CALL_FAILED;
     400        }
     401        pProblem->SemiCount = SemiCount;
     402        pProblem->SemiIndex = (int* )malloc(pProblem->SemiCount * sizeof(int));
     403        pProblem->SemiLower = (double *)malloc(pProblem->ColCount * sizeof(double));
     404        if (!pProblem->SemiIndex || !pProblem->SemiLower) {
     405                return SOLV_CALL_FAILED;
     406        }
     407        memcpy(pProblem->SemiIndex, SemiIndex, pProblem->SemiCount * sizeof(int));
    386408
    387409        pProblem->SolveAsMIP = 1;
  • trunk/CoinMP/src/CoinMP.h

    r341 r350  
    168168
    169169SOLVAPI int    SOLVCALL CoinLoadPriority(HPROB hProb, int PriorCount, int* PriorIndex,
    170                                                                                   int* PriorValues, int* BranchDir);
    171 
    172 SOLVAPI int    SOLVCALL CoinLoadSemiCont(HPROB hProb, int SemiCount, int* SemiIndex);
     170                                                                                  int* PriorValues, int* PriorBranch);
    173171
    174172SOLVAPI int    SOLVCALL CoinLoadSos(HPROB hProb, int SosCount, int SosNZCount,
    175173                                                   int* SosType, int* SosPrior, int* SosBegin,   
    176174                                                   int* SosIndex, double* SosRef);
     175
     176SOLVAPI int    SOLVCALL CoinLoadSemiCont(HPROB hProb, int SemiCount, int* SemiIndex);
    177177
    178178SOLVAPI int    SOLVCALL CoinLoadQuadratic(HPROB hProb, int* QuadBegin, int* QuadCount,
     
    296296
    297297int    (SOLVCALL *CoinLoadPriority)(HPROB hProb, int PriorCount, int* PriorIndex,
    298                                                                                                 int* PriorValues, int* BranchDir);
     298                                                                                                int* PriorValues, int* PriorBranch);
    299299
    300300int    (SOLVCALL *CoinLoadSemiCont)(HPROB hProb, int SemiCount, int* SemiIndex);
  • trunk/CoinMP/src/CoinProblem.c

    r343 r350  
    4545        pProblem->InitValues   = NULL;
    4646
    47         pProblem->RowLower = NULL;
    48         pProblem->RowUpper = NULL;
     47        pProblem->RowLower     = NULL;
     48        pProblem->RowUpper     = NULL;
    4949
    5050        pProblem->ColType      = NULL;
    5151
    52         pProblem->SolveAsMIP = 0;
    53         pProblem->IntCount = 0;
    54         pProblem->BinCount = 0;
    55         pProblem->numInts = 0;
    56         pProblem->IsInt = NULL;
    57 
    58         pProblem->PriorCount = 0;
    59         pProblem->PriorIndex = NULL;
    60         pProblem->PriorValues = NULL;
    61         pProblem->BranchDir = NULL;
     52        pProblem->SolveAsMIP   = 0;
     53        pProblem->IntCount     = 0;
     54        pProblem->BinCount     = 0;
     55        pProblem->numInts      = 0;
     56        pProblem->IsInt        = NULL;
     57
     58        pProblem->PriorCount   = 0;
     59        pProblem->PriorIndex   = NULL;
     60        pProblem->PriorValues  = NULL;
     61        pProblem->PriorBranch = NULL;
    6262
    6363        pProblem->SosCount     = 0;
     
    120120        if (pProblem->ColType)      free(pProblem->ColType);
    121121
    122         if (pProblem->PriorIndex) free(pProblem->PriorIndex);
    123         if (pProblem->PriorValues) free(pProblem->PriorValues);
    124         if (pProblem->BranchDir) free(pProblem->BranchDir);
     122        if (pProblem->PriorIndex)   free(pProblem->PriorIndex);
     123        if (pProblem->PriorValues)  free(pProblem->PriorValues);
     124        if (pProblem->PriorBranch)  free(pProblem->PriorBranch);
    125125
    126126        if (pProblem->SemiIndex)        free(pProblem->SemiIndex);
  • trunk/CoinMP/src/CoinProblem.h

    r343 r350  
    5353                                int* PriorIndex;
    5454                                int* PriorValues;
    55                                 int* BranchDir;
     55                                int* PriorBranch;
    5656
    5757                                int SosCount;
Note: See TracChangeset for help on using the changeset viewer.