OSMatlabSolverMex.cpp
Go to the documentation of this file.
1 
2 #include <iostream>
3 #include <string>
4 #include "mex.h"
5 #include "matrix.h"
6 
7 
8 
9 // OS includes
10 #include "OSDataStructures.h"
11 //#include "OSParameters.h"
12 #include "OSMatlabSolver.h"
13 
14 
15 
16 /* If you are using a compiler that equates NaN to be zero, you must
17  * compile this example using the flag -DNAN_EQUALS_ZERO. For example:
18  *
19  * mex -DNAN_EQUALS_ZERO fulltosparse.c
20  *
21  * This will correctly define the IsNonZero macro for your C compiler.
22  */
23 
24 #if defined(NAN_EQUALS_ZERO)
25 #define IsNonZero(d) ((d)!=0.0 || mxIsNaN(d))
26 #else
27 #define IsNonZero(d) ((d)!=0.0)
28 #endif
29 
30 using namespace std;
31 using std::cout;
32 using std::endl;
33 
34 
35 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {
36 
37 
38 
49  int i;
50  double *pr;
51  OSMatlab *matlabModel = new OSMatlab();
52  string sTest = "";
53  char *buf;
54  SparseMatrix* getConstraintMatrix( const mxArray *prhs);
55  //
56  // Check for proper number of input and output arguments
57  mexPrintf("BEGIN PROCESSING DATA\n");
58  if (nrhs != 15) {
59  mexErrMsgTxt("Fifteen input arguments are required.");
60  }
61 
62 
63  //
64  // get number of variables and number of constraints
65  matlabModel->numVar = (int) mxGetScalar( prhs[ 0]) ;
66  //printf("variable numVar = %i\n", matlabModel->numVar );
67  matlabModel->numCon = (int) mxGetScalar( prhs[ 1]);
68  //
69  // get the constraint matrix
70  // check the data type
71  if (!(mxIsDouble(prhs[2 ]))){
72  mexErrMsgTxt("Constraint matrix A must be of type double.");
73  }
74  // check the dimension
75  if ( (mxGetN(prhs[ 2]) != matlabModel->numVar) || (mxGetM(prhs[2]) != matlabModel->numCon) ){
76  mexErrMsgTxt(" Constraint matrix A must have number of rows equal to number of constraints and columns equal number of variables \n");
77  }
78  matlabModel->sparseMat = getConstraintMatrix( prhs[2]) ;
79  // get the rest of the model
80  //
81  // both bl and bu should equal the number of rows
82  //
83  if( !mxIsEmpty( prhs[ 3]) ){
84  if (mxGetN(prhs[3]) != matlabModel->numCon ){
85  mexErrMsgTxt(" Vector BL size must equal the number of rows\n");
86  }
87  matlabModel->bl = mxGetPr( prhs[ 3]);
88  // convert Matlab -infinity to OS -infinity
89  for(i = 0; i < matlabModel->numCon; i++){
90  if( mxIsInf( -(matlabModel->bl[i]) ) ) matlabModel->bl[ i] = -OSDBL_MAX;
91  }
92  }
93  //
94  //
95  if( !mxIsEmpty( prhs[ 4]) ){
96  if (mxGetN(prhs[4]) != matlabModel->numCon ){
97  mexErrMsgTxt(" Vector BU size must equal the number of rows\n");
98  }
99  matlabModel->bu = mxGetPr( prhs[ 4]);
100  // convert Matlab infinity to OS infinity
101  for(i = 0; i < matlabModel->numCon; i++){
102  if( mxIsInf( matlabModel->bu[i]) ) matlabModel->bu[ i] = OSDBL_MAX;
103  }
104  }
105  //
106  //
107  if (mxGetN(prhs[5]) != matlabModel->numVar ){
108  mexErrMsgTxt(" Vector OBJ size must equal the number of variables\n");
109  }
110  matlabModel->obj = mxGetPr( prhs[ 5]);
111  //
112  //
113  if( !mxIsEmpty( prhs[ 6]) ){
114  if (mxGetN(prhs[6]) != matlabModel->numVar ){
115  mexErrMsgTxt(" Vector VL size must equal the number of variables\n");
116  }
117  matlabModel->vl = mxGetPr( prhs[ 6]);
118  // convert Matlab -infinity to OS -infinity
119  for(i = 0; i < matlabModel->numVar; i++){
120  //printf("variable lb = %f\n", matlabModel->vl[i] );
121  if( mxIsInf( -(matlabModel->vl[i]) ) ) matlabModel->vl[ i] = -OSDBL_MAX;
122  }
123  }
124  //
125  //
126  if( !mxIsEmpty( prhs[ 7]) ){
127  if (mxGetN(prhs[7]) != matlabModel->numVar ){
128  mexErrMsgTxt(" Vector VU size must equal the number of variables\n");
129  }
130  matlabModel->vu = mxGetPr( prhs[ 7]);
131  // convert Matlab infinity to OS infinity
132  for(i = 0; i < matlabModel->numVar; i++){
133  //printf("variable ub = %f\n", matlabModel->vu[i] );
134  if( mxIsInf( matlabModel->vu[i]) ) matlabModel->vu[ i] = OSDBL_MAX;
135  }
136  }
137  //
138  //
139  if ( (mxGetScalar( prhs[ 8]) != 0) && (mxGetScalar( prhs[ 8]) != 1)){
140  mexErrMsgTxt(" The objective type must be either 1 (max) or 0 (min)\n");
141  }
142  mxGetScalar( prhs[ 8]) > 0 ? matlabModel->objType = 1 : matlabModel->objType = 0;
143  //printf("Objective Function Type = %d\n", matlabModel->objType);
144  //
145  // get the variable types, this is character data
146  if(!mxIsChar( prhs[ 9])){
147  mexErrMsgTxt(" Vector VarType must be a character array\n");
148  }
149  if (mxGetN(prhs[ 9]) != matlabModel->numVar ){
150  mexErrMsgTxt(" Vector VarType size must equal the number of variables\n");
151  }
152  buf = mxArrayToString( prhs[ 9]);
153  matlabModel->varType = buf;
154 
155  //
156  // get the quadratic terms
157 
158  int j;
159  int k = 0;
160  if( !mxIsEmpty( prhs[ 10]) ){
161  if( mxGetM( prhs[ 10]) != 4) mexErrMsgTxt(" Vector Q Must have 4 rows\n");
162  int numQTerms = mxGetN( prhs[ 10]);
163  //printf("NUMBER OF Q TERMS = %d \n", numQTerms);
164  matlabModel->numQTerms = numQTerms;
165  matlabModel->qRows = new int[ numQTerms];
166  matlabModel->qIndex1 = new int[ numQTerms];
167  matlabModel->qIndex2 = new int[ numQTerms];
168  matlabModel->qVal = new double[ numQTerms];
169  pr= mxGetPr( prhs[ 10]);
170  for(i = 0; i < numQTerms; i++){
171  for(j = 0; j <= 3; j++){
172  //printf(" Q COMP = %f\n", pr[ k]) ;
173  switch( j){
174  case 0:
175  matlabModel->qRows[ i] = (int) pr[ k];
176  break;
177  case 1:
178  matlabModel->qIndex1[ i] = (int) pr[ k];
179  break;
180  case 2:
181  matlabModel->qIndex2[ i] = (int) pr[ k];
182  break;
183  case 3:
184  matlabModel->qVal[ i] = pr[ k];
185  break;
186  }
187  k++;
188  }
189  }
190  }
191  if( !mxIsEmpty( prhs[ 11]) ){
192  matlabModel->instanceName = mxArrayToString( prhs[ 11]);
193  }
194  //
195  buf = mxArrayToString( prhs[ 12]);
196  //const char *password = "";
197  //if( strcmp(buf, password) != 0) mexErrMsgTxt(" Incorrect Password\n");
198  //
199  // get the name of the solver
200  matlabModel->sSolverName = mxArrayToString( prhs[ 13]);
201  printf("WE ARE USING SOLVER %s\n", &matlabModel->sSolverName[0]);
202  //
203  // get the name of the solver service
204  matlabModel->sAgentAddress = mxArrayToString( prhs[ 14]);
205  printf("WE ARE USING AGENT %s\n", &matlabModel->sAgentAddress[0]);
206  //
207  // create the OSInstance
208  mexPrintf("CREATE THE INSTANCE \n");
209 
210  matlabModel->createOSInstance();
211  mexPrintf("CALL THE REMOTE SERVER \n");
212  sTest = matlabModel->solve();
213  std::string osil = matlabModel->osil;
214  char *ch = &osil[0];
215  printf("HERE IS THE INSTANCE %s\n", ch);
216  mexPrintf("DONE WITH THE REMOTE CALL \n");
217  mexPrintf("HERE IS THE SOLUTION \n");
218  mexPrintf(&sTest[0] );
219  // *str[100];
220  //plhs[0]= mxCreateCharMatrixFromStrings( 1, (const char **)str);
221  //plhs = 'DOES THIS WORK';
222  // garbage collection
223  char *str[ 1];
224  //str[ 0] = mxArrayToString( prhs[ 9]);
225  str[ 0] = &sTest[0] ;
226  plhs[0]= mxCreateCharMatrixFromStrings( 1, (const char **)str);
227  //delete matlabModel;
228  return ;
229 }
230 SparseMatrix* getConstraintMatrix( const mxArray *prhs){
231  SparseMatrix *sparseMat = NULL;
232 
233  sparseMat = new SparseMatrix();
234  /* Declare variable */
235  mxArray *plhs;
236  //mwSize m,n;
237  // mwSize nzmax;
238  //mwIndex *irs, *jcs, j, k;
239  //size_t *irs, *jcs, j, k;
240  int m,n;
241  int nzmax;
242  int *irs, *jcs, j, k;
243  int cmplx;
244  double *pr, *pi, *si, *sr;
245  /* Get the size and pointers to input data */
246  m = mxGetM( prhs);
247  n = mxGetN( prhs);
248  pr = mxGetPr( prhs);
249  pi = mxGetPi( prhs);
250  cmplx = (pi==NULL ? 0 : 1);
251  nzmax = n*m;
252  plhs = mxCreateSparse(m, n, nzmax, (mxComplexity)cmplx);
253  sr = mxGetPr( plhs);
254  si = mxGetPi( plhs);
255  irs = (int*)mxGetIr( plhs);
256  jcs = (int*)mxGetJc( plhs);
257  /* Copy nonzeros */
258  k = 0;
259  for (j=0; (j<n); j++) {
260  int i;
261  jcs[j] = k;
262  for (i=0; (i<m ); i++) {
263  if (IsNonZero(pr[i]) || (cmplx && IsNonZero(pi[i]))) {
264  sr[k] = pr[i];
265  if (cmplx){
266  si[k]=pi[i];
267  }
268  irs[k] = i;
269  k++;
270  }
271  }
272  pr += m;
273  pi += m;
274  }
275  jcs[ n] = k;
276  int km;
277  for(j = 0; j < n; j++){
278  //printf("Column start = %d\n", jcs[ j]);
279  for(km = jcs[ j]; km < jcs[ j+1]; km++ ){
280  // printf("row index= %d\n", irs[ km]);
281  // printf("nonzero value = %f\n", sr[ km]);
282  }
283  }
284  // now fill in a sparse matrix data structure
285  sparseMat->bDeleteArrays = false;
286  sparseMat->isColumnMajor = true;
287  sparseMat->startSize = n + 1;
288  sparseMat->valueSize = jcs[ n];
289  sparseMat->starts = jcs;
290  sparseMat->indexes = irs;
291  sparseMat->values = sr;
292  return sparseMat;
293 }
#define IsNonZero(d)
bool isColumnMajor
isColumnMajor holds whether the coefMatrix (AMatrix) holding linear program data is stored by column...
Definition: OSGeneral.h:236
bool objType
objType indicates whether or not we have a max (1) or a min (0)
double * qVal
qVal is a pointer to the coefficient value of each of the quadratic terms.
double * vl
vl is a pointer to the lower bounds on the varialbes
void createOSInstance()
Create an OSInstance.
SparseMatrix * sparseMat
sparseMat is a pointer to an OS Sprase Matrix data structure
double * vu
vu is a pointer to the upper bounds on the variables
int numCon
numCon is the number of constraints in the problem
std::string sAgentAddress
is the address of the solver service
int * qIndex2
qIndex2 is a pointer to the index of the second variable in each of the quadratic terms ...
static const CouNumber pi
Definition: exprCos.cpp:23
int startSize
startSize is the dimension of the starts array
Definition: OSGeneral.h:241
static char * j
Definition: OSdtoa.cpp:3622
double * bl
bl is a pointer to the lower bounds on the constraints
int * indexes
indexes holds an integer array of rowIdx (or colIdx) elements in coefMatrix (AMatrix).
Definition: OSGeneral.h:258
return
Definition: OSdtoa.cpp:1794
std::string sSolverName
sSolverName is the name of the solver
int valueSize
valueSize is the dimension of the indexes and values arrays
Definition: OSGeneral.h:246
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
a sparse matrix data structure
Definition: OSGeneral.h:223
int numQTerms
numQTerms is the number of quadratic terms
void fint fint * k
const double OSDBL_MAX
Definition: OSParameters.h:93
std::string solve()
Solve the problem instance.
static int
Definition: OSdtoa.cpp:2173
double * values
values holds a double array of value elements in coefMatrix (AMatrix), which contains nonzero element...
Definition: OSGeneral.h:264
int * qIndex1
qIndex1 is a pointer to the index of the first variable in each of the quadratic terms ...
int numVar
numVar is the number of variables in the problem
int * qRows
qRows is a pointer to the row index of each quadratic term
std::string instanceName
instanceName is the name of the problem instance
SparseMatrix * getConstraintMatrix(const mxArray *prhs)
int * starts
starts holds an integer array of start elements in coefMatrix (AMatrix), which points to the start of...
Definition: OSGeneral.h:252
char * varType
varType is a pointer to the variable type eg C, B, I
std::string osil
is the osil instance that gets created from the MATLAB data structures
The OSMatlab Class.
bool bDeleteArrays
bDeleteArrays is true if we delete the arrays in garbage collection set to true by default ...
Definition: OSGeneral.h:230
void fint * m
double * bu
bu is a pointer to the upper bounds on the constraints
void fint * n
double * obj
obj is a pointer to the objective function coefficients