From a0d9443af147e949c1e6a01ac24749d12593ec5b Mon Sep 17 00:00:00 2001 From: Harpreet Date: Sat, 3 Sep 2016 00:36:51 +0530 Subject: cbcintlinprog added --- sci_gateway/cpp/cbcintlinprog_matrixcpp.cpp | 226 ++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 sci_gateway/cpp/cbcintlinprog_matrixcpp.cpp (limited to 'sci_gateway/cpp/cbcintlinprog_matrixcpp.cpp') diff --git a/sci_gateway/cpp/cbcintlinprog_matrixcpp.cpp b/sci_gateway/cpp/cbcintlinprog_matrixcpp.cpp new file mode 100644 index 0000000..d4e6f41 --- /dev/null +++ b/sci_gateway/cpp/cbcintlinprog_matrixcpp.cpp @@ -0,0 +1,226 @@ +// MILP with CBC library, Matrix +// Code Authors: Akshay Miterani and Pranav Deshpande + +#include + +// For Branch and bound +#include "OsiSolverInterface.hpp" +#include "CbcModel.hpp" +#include "CbcCutGenerator.hpp" +#include "CbcHeuristicLocal.hpp" +#include "OsiClpSolverInterface.hpp" +extern "C"{ +#include +#include "sciprint.h" + +int matrix_cppintlinprog(){ + + //Objective function + double* obj; + //Constraint matrix coefficients + double* conMatrix; + //intcon Matrix + double* intcon; + //Constraints upper bound + double* conlb; + //Constraints lower bound + double* conub; + //Lower bounds for variables + double* lb; + //Upper bounds for variables + double* ub; + //options for maximum iterations and writing mps + double* options; + //Flag for Mps + double flagMps; + //mps file path + char * mpsFile; + //Error structure in Scilab + SciErr sciErr; + //Number of rows and columns in objective function + int nVars=0, nCons=0,temp1=0,temp2=0; + int numintcons=0; + double valobjsense; + + CheckInputArgument(pvApiCtx , 11 , 11); //Checking the input arguments + CheckOutputArgument(pvApiCtx , 8, 8); //Checking the output arguments + + ////////// Manage the input argument ////////// + + //Number of Variables + if(getIntFromScilab(1,&nVars)) + { + return 1; + } + + //Number of Constraints + if (getIntFromScilab(2,&nCons)) + { + return 1; + } + + //Objective function from Scilab + temp1 = nVars; + temp2 = nCons; + if (getFixedSizeDoubleMatrixFromScilab(3,1,temp1,&obj)) + { + return 1; + } + + //intcon matrix + if (getDoubleMatrixFromScilab(4,&numintcons,&temp2,&intcon)) + { + return 1; + } + + if (nCons!=0) + { + //conMatrix matrix from scilab + temp1 = nCons; + temp2 = nVars; + + if (getFixedSizeDoubleMatrixFromScilab(5,temp1,temp2,&conMatrix)) + { + return 1; + } + + //conLB matrix from scilab + temp1 = nCons; + temp2 = 1; + if (getFixedSizeDoubleMatrixFromScilab(6,temp1,temp2,&conlb)) + { + return 1; + } + + //conUB matrix from scilab + if (getFixedSizeDoubleMatrixFromScilab(7,temp1,temp2,&conub)) + { + return 1; + } + + } + + //lb matrix from scilab + temp1 = 1; + temp2 = nVars; + if (getFixedSizeDoubleMatrixFromScilab(8,temp1,temp2,&lb)) + { + return 1; + } + + + //ub matrix from scilab + if (getFixedSizeDoubleMatrixFromScilab(9,temp1,temp2,&ub)) + { + return 1; + } + + //Object Sense + if(getDoubleFromScilab(10,&valobjsense)) + { + return 1; + } + + //get options from scilab + if(getFixedSizeDoubleMatrixFromScilab(11 , 1 , 4 , &options)) + { + return 1; + } + + //------------Temporary Version to make coin packed matrix------ + OsiClpSolverInterface solver1; + + CoinPackedMatrix *matrix = new CoinPackedMatrix(false , 0 , 0); + matrix->setDimensions(0 , nVars); + for(int i=0 ; iappendRow(row); + } + + + solver1.loadProblem(*matrix, lb, ub, obj, conlb, conub); + + for(int i=0;isetHintParam(OsiDoReducePrint, true, OsiHintTry); + + if((int)options[0]!=0) + model.setIntegerTolerance(options[0]); + if((int)options[1]!=0) + model.setMaximumNodes((int)options[1]); + if((int)options[2]!=0) + model.setMaximumSeconds(options[2]); + if((int)options[3]!=0) + model.setAllowableGap(options[3]); + + model.branchAndBound(); + + const double *val = model.getColSolution(); + + //Output the solution to Scilab + + //get solution for x + double* xValue = model.getColSolution(); + + //get objective value + double objValue = model.getObjValue(); + + //Output status + double status_=-1; + if(model.isProvenOptimal()){ + status_=0; + } + else if(model.isProvenInfeasible()){ + status_=1; + } + else if(model.isSolutionLimitReached()){ + status_=2; + } + else if(model. isNodeLimitReached()){ + status_=3; + } + else if(model.isAbandoned()){ + status_=4; + } + else if(model.isSecondsLimitReached()){ + status_=5; + } + else if(model.isContinuousUnbounded()){ + status_=6; + } + else if(model.isProvenDualInfeasible()){ + status_=7; + } + + double nodeCount=model.getNodeCount(); + double nfps=model.numberIntegers(); + double U=model.getObjValue(); + double L=model.getBestPossibleObjValue(); + double iterCount=model.getIterationCount(); + + returnDoubleMatrixToScilab(1 , nVars, 1 , xValue); + returnDoubleMatrixToScilab(2 , 1 , 1 , &objValue); + returnDoubleMatrixToScilab(3 , 1 , 1 , &status_); + returnDoubleMatrixToScilab(4 , 1 , 1 , &nodeCount); + returnDoubleMatrixToScilab(5 , 1 , 1 , &nfps); + returnDoubleMatrixToScilab(6 , 1 , 1 , &L); + returnDoubleMatrixToScilab(7 , 1 , 1 , &U); + returnDoubleMatrixToScilab(8 , 1 , 1 , &iterCount); + + //------------------------------------------------------------- + + return 0; +} +} -- cgit