Problem * create_problem() { MSKrescodee r; const MSKint32t numvar = 2; const MSKint32t numcon = 1; MSKboundkeye bkx[] = {MSK_BK_FR, MSK_BK_FR}; double blx[] = {-MSK_INFINITY, -MSK_INFINITY}; double bux[] = {+MSK_INFINITY, +MSK_INFINITY}; double c[] = {0.0, 1.0}; /* will be used for cones */ MSKint32t i, j; MSKint32t csub[2]; MSKenv_t env = NULL; MSKtask_t task = NULL; r = MSK_makeenv(&env,NULL); r = MSK_maketask(env,numcon,numvar,&task); r = MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); r = MSK_appendcons(task,numcon); r = MSK_appendvars(task,numvar); for(j=0; j<numvar && r == MSK_RES_OK; ++j) { r = MSK_putcj(task,j,c[j]); r = MSK_putvarbound(task, j, /* Index of variable.*/ bkx[j], /* Bound key.*/ blx[j], /* Numerical value of lower bound.*/ bux[j]); /* Numerical value of upper bound.*/ } csub[0] = 0; csub[1] = 1; r = MSK_appendcone(task, MSK_CT_QUAD, 0.0, /* For future use only, can be set to 0.0 */ 2, csub); r = MSK_putobjsense(task, MSK_OBJECTIVE_SENSE_MINIMIZE); Problem * p = new Problem; p->env_ = env; p->task_= task; return p; }
int main(int argc,char *argv[]) { MSKrescodee r; const MSKint32t numvar = 6, numcon = 1; MSKboundkeye bkc[] = { MSK_BK_FX }; double blc[] = { 1.0 }; double buc[] = { 1.0 }; MSKboundkeye bkx[] = {MSK_BK_LO, MSK_BK_LO, MSK_BK_LO, MSK_BK_FR, MSK_BK_FR, MSK_BK_FR}; double blx[] = {0.0, 0.0, 0.0, -MSK_INFINITY, -MSK_INFINITY, -MSK_INFINITY}; double bux[] = {+MSK_INFINITY, +MSK_INFINITY, +MSK_INFINITY, +MSK_INFINITY, +MSK_INFINITY, +MSK_INFINITY}; double c[] = {0.0, 0.0, 0.0, 1.0, 1.0, 1.0}; MSKint32t aptrb[] = {0, 1, 2, 3, 3, 3}, aptre[] = {1, 2, 3, 3, 3, 3}, asub[] = {0, 0, 0, 0}; double aval[] = {1.0, 1.0, 2.0}; MSKint32t i,j,csub[3]; MSKenv_t env = NULL; MSKtask_t task = NULL; /* Create the mosek environment. */ r = MSK_makeenv(&env,NULL); if ( r==MSK_RES_OK ) { /* Create the optimization task. */ r = MSK_maketask(env,numcon,numvar,&task); if ( r==MSK_RES_OK ) { MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); /* Append 'numcon' empty constraints. The constraints will initially have no bounds. */ if ( r == MSK_RES_OK ) r = MSK_appendcons(task,numcon); /* Append 'numvar' variables. The variables will initially be fixed at zero (x=0). */ if ( r == MSK_RES_OK ) r = MSK_appendvars(task,numvar); for(j=0; j<numvar && r == MSK_RES_OK; ++j) { /* Set the linear term c_j in the objective.*/ if(r == MSK_RES_OK) r = MSK_putcj(task,j,c[j]); /* Set the bounds on variable j. blx[j] <= x_j <= bux[j] */ if(r == MSK_RES_OK) r = MSK_putvarbound(task, j, /* Index of variable.*/ bkx[j], /* Bound key.*/ blx[j], /* Numerical value of lower bound.*/ bux[j]); /* Numerical value of upper bound.*/ /* Input column j of A */ if(r == MSK_RES_OK) r = MSK_putacol(task, j, /* Variable (column) index.*/ aptre[j]-aptrb[j], /* Number of non-zeros in column j.*/ asub+aptrb[j], /* Pointer to row indexes of column j.*/ aval+aptrb[j]); /* Pointer to Values of column j.*/ } /* Set the bounds on constraints. for i=1, ...,numcon : blc[i] <= constraint i <= buc[i] */ for(i=0; i<numcon && r==MSK_RES_OK; ++i) r = MSK_putconbound(task, i, /* Index of constraint.*/ bkc[i], /* Bound key.*/ blc[i], /* Numerical value of lower bound.*/ buc[i]); /* Numerical value of upper bound.*/ if ( r==MSK_RES_OK ) { /* Append the first cone. */ csub[0] = 3; csub[1] = 0; csub[2] = 1; r = MSK_appendcone(task, MSK_CT_QUAD, 0.0, /* For future use only, can be set to 0.0 */ 3, csub); } if ( r==MSK_RES_OK ) { /* Append the second cone. */ csub[0] = 4; csub[1] = 5; csub[2] = 2; r = MSK_appendcone(task, MSK_CT_RQUAD, 0.0, 3, csub); } if ( r==MSK_RES_OK ) { MSKrescodee trmcode; /* Run optimizer */ r = MSK_optimizetrm(task,&trmcode); /* Print a summary containing information about the solution for debugging purposes*/ MSK_solutionsummary (task,MSK_STREAM_MSG); if ( r==MSK_RES_OK ) { MSKsolstae solsta; MSK_getsolsta (task,MSK_SOL_ITR,&solsta); switch(solsta) { case MSK_SOL_STA_OPTIMAL: case MSK_SOL_STA_NEAR_OPTIMAL: { double *xx = NULL; xx = calloc(numvar,sizeof(double)); if ( xx ) { MSK_getxx (task, MSK_SOL_ITR, /* Request the interior solution. */ xx); printf("Optimal primal solution\n"); for(j=0; j<numvar; ++j) printf("x[%d]: %e\n",j,xx[j]); } else { r = MSK_RES_ERR_SPACE; } free(xx); } break; case MSK_SOL_STA_DUAL_INFEAS_CER: case MSK_SOL_STA_PRIM_INFEAS_CER: case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER: case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER: printf("Primal or dual infeasibility certificate found.\n"); break; case MSK_SOL_STA_UNKNOWN: printf("The status of the solution could not be determined.\n"); break; default: printf("Other solution status."); break; } } else { printf("Error while optimizing.\n"); } } if (r != MSK_RES_OK) { /* In case of an error print error code and description. */ char symname[MSK_MAX_STR_LEN]; char desc[MSK_MAX_STR_LEN]; printf("An error occurred while optimizing.\n"); MSK_getcodedesc (r, symname, desc); printf("Error %s - '%s'\n",symname,desc); } } /* Delete the task and the associated data. */ MSK_deletetask(&task); } /* Delete the environment and the associated data. */ MSK_deleteenv(&env); return ( r ); } /* main */
int main(int argc,char *argv[]) { const MSKint32t numvar = 2, numcon = 2; double c[] = { 1.0, 0.64 }; MSKboundkeye bkc[] = { MSK_BK_UP, MSK_BK_LO }; double blc[] = { -MSK_INFINITY,-4.0 }; double buc[] = { 250.0, MSK_INFINITY }; MSKboundkeye bkx[] = { MSK_BK_LO, MSK_BK_LO }; double blx[] = { 0.0, 0.0 }; double bux[] = { MSK_INFINITY, MSK_INFINITY }; MSKint32t aptrb[] = { 0, 2 }, aptre[] = { 2, 4 }, asub[] = { 0, 1, 0, 1 }; double aval[] = { 50.0, 3.0, 31.0, -2.0 }; MSKint32t i,j; MSKenv_t env = NULL; MSKtask_t task = NULL; MSKrescodee r; /* Create the mosek environment. */ r = MSK_makeenv(&env,NULL); /* Check if return code is ok. */ if ( r==MSK_RES_OK ) { /* Create the optimization task. */ r = MSK_maketask(env,0,0,&task); if ( r==MSK_RES_OK ) r = MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); /* Append 'numcon' empty constraints. The constraints will initially have no bounds. */ if ( r == MSK_RES_OK ) r = MSK_appendcons(task,numcon); /* Append 'numvar' variables. The variables will initially be fixed at zero (x=0). */ if ( r == MSK_RES_OK ) r = MSK_appendvars(task,numvar); /* Optionally add a constant term to the objective. */ if ( r ==MSK_RES_OK ) r = MSK_putcfix(task,0.0); for(j=0; j<numvar && r == MSK_RES_OK; ++j) { /* Set the linear term c_j in the objective.*/ if(r == MSK_RES_OK) r = MSK_putcj(task,j,c[j]); /* Set the bounds on variable j. blx[j] <= x_j <= bux[j] */ if(r == MSK_RES_OK) r = MSK_putvarbound(task, j, /* Index of variable.*/ bkx[j], /* Bound key.*/ blx[j], /* Numerical value of lower bound.*/ bux[j]); /* Numerical value of upper bound.*/ /* Input column j of A */ if(r == MSK_RES_OK) r = MSK_putacol(task, j, /* Variable (column) index.*/ aptre[j]-aptrb[j], /* Number of non-zeros in column j.*/ asub+aptrb[j], /* Pointer to row indexes of column j.*/ aval+aptrb[j]); /* Pointer to Values of column j.*/ } /* Set the bounds on constraints. for i=1, ...,numcon : blc[i] <= constraint i <= buc[i] */ for(i=0; i<numcon && r==MSK_RES_OK; ++i) r = MSK_putconbound(task, i, /* Index of constraint.*/ bkc[i], /* Bound key.*/ blc[i], /* Numerical value of lower bound.*/ buc[i]); /* Numerical value of upper bound.*/ /* Specify integer variables. */ for(j=0; j<numvar && r == MSK_RES_OK; ++j) r = MSK_putvartype(task,j,MSK_VAR_TYPE_INT); if ( r==MSK_RES_OK ) r = MSK_putobjsense(task, MSK_OBJECTIVE_SENSE_MAXIMIZE); if ( r==MSK_RES_OK ) { MSKrescodee trmcode; /* Run optimizer */ r = MSK_optimizetrm(task,&trmcode); /* Print a summary containing information about the solution for debugging purposes*/ MSK_solutionsummary (task,MSK_STREAM_MSG); if ( r==MSK_RES_OK ) { MSKint32t j; MSKsolstae solsta; double *xx = NULL; MSK_getsolsta (task,MSK_SOL_ITG,&solsta); xx = calloc(numvar,sizeof(double)); if ( xx ) { switch(solsta) { case MSK_SOL_STA_INTEGER_OPTIMAL: case MSK_SOL_STA_NEAR_INTEGER_OPTIMAL : MSK_getxx(task, MSK_SOL_ITG, /* Request the integer solution. */ xx); printf("Optimal solution.\n"); for(j=0; j<numvar; ++j) printf("x[%d]: %e\n",j,xx[j]); break; case MSK_SOL_STA_PRIM_FEAS: /* A feasible but not necessarily optimal solution was located. */ MSK_getxx(task,MSK_SOL_ITG,xx); printf("Feasible solution.\n"); for(j=0; j<numvar; ++j) printf("x[%d]: %e\n",j,xx[j]); break; case MSK_SOL_STA_UNKNOWN: { MSKprostae prosta; MSK_getprosta(task,MSK_SOL_ITG,&prosta); switch (prosta) { case MSK_PRO_STA_PRIM_INFEAS_OR_UNBOUNDED: printf("Problem status Infeasible or unbounded\n"); break; case MSK_PRO_STA_PRIM_INFEAS: printf("Problem status Infeasible.\n"); break; case MSK_PRO_STA_UNKNOWN: printf("Problem status unknown.\n"); break; default: printf("Other problem status."); break; } } break; default: printf("Other solution status."); break; } } else { r = MSK_RES_ERR_SPACE; } free(xx); } } if (r != MSK_RES_OK) { /* In case of an error print error code and description. */ char symname[MSK_MAX_STR_LEN]; char desc[MSK_MAX_STR_LEN]; printf("An error occurred while optimizing.\n"); MSK_getcodedesc (r, symname, desc); printf("Error %s - '%s'\n",symname,desc); } MSK_deletetask(&task); } MSK_deleteenv(&env); printf("Return code: %d.\n",r); return ( r ); } /* main */
int main(int argc,char *argv[]) { const MSKint32t numvar = 3, numcon = 3; MSKint32t i,j; double c[] = {1.5, 2.5, 3.0}; MSKint32t ptrb[] = {0, 3, 6}, ptre[] = {3, 6, 9}, asub[] = { 0, 1, 2, 0, 1, 2, 0, 1, 2}; double aval[] = { 2.0, 3.0, 2.0, 4.0, 2.0, 3.0, 3.0, 3.0, 2.0}; MSKboundkeye bkc[] = {MSK_BK_UP, MSK_BK_UP, MSK_BK_UP }; double blc[] = {-MSK_INFINITY, -MSK_INFINITY, -MSK_INFINITY}; double buc[] = {100000, 50000, 60000}; MSKboundkeye bkx[] = {MSK_BK_LO, MSK_BK_LO, MSK_BK_LO}; double blx[] = {0.0, 0.0, 0.0,}; double bux[] = {+MSK_INFINITY, +MSK_INFINITY,+MSK_INFINITY}; double *xx=NULL; MSKenv_t env; MSKtask_t task; MSKint32t varidx,conidx; MSKrescodee r; /* Create the mosek environment. */ r = MSK_makeenv(&env,NULL); if ( r==MSK_RES_OK ) { /* Create the optimization task. */ r = MSK_maketask(env,numcon,numvar,&task); /* Directs the log task stream to the 'printstr' function. */ MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); /* Append the constraints. */ if (r == MSK_RES_OK) r = MSK_appendcons(task,numcon); /* Append the variables. */ if (r == MSK_RES_OK) r = MSK_appendvars(task,numvar); /* Put C. */ if (r == MSK_RES_OK) r = MSK_putcfix(task, 0.0); if (r == MSK_RES_OK) for(j=0; j<numvar; ++j) r = MSK_putcj(task,j,c[j]); /* Put constraint bounds. */ if (r == MSK_RES_OK) for(i=0; i<numcon; ++i) r = MSK_putconbound(task,i,bkc[i],blc[i],buc[i]); /* Put variable bounds. */ if (r == MSK_RES_OK) for(j=0; j<numvar; ++j) r = MSK_putvarbound(task,j,bkx[j],blx[j],bux[j]); /* Put A. */ if (r == MSK_RES_OK) if ( numcon>0 ) for(j=0; j<numvar; ++j) r = MSK_putacol(task, j, ptre[j]-ptrb[j], asub+ptrb[j], aval+ptrb[j]); if (r == MSK_RES_OK) r = MSK_putobjsense(task, MSK_OBJECTIVE_SENSE_MAXIMIZE); if (r == MSK_RES_OK) r = MSK_optimizetrm(task,NULL); if (r == MSK_RES_OK) { xx = calloc(numvar,sizeof(double)); if ( !xx ) r = MSK_RES_ERR_SPACE; } if (r == MSK_RES_OK) r = MSK_getxx(task, MSK_SOL_BAS, /* Basic solution. */ xx); /* Make a change to the A matrix */ if (r == MSK_RES_OK) r = MSK_putaij(task, 0, 0, 3.0); if (r == MSK_RES_OK) r = MSK_optimizetrm(task,NULL); /* Get index of new variable, this should be 3 */ if (r == MSK_RES_OK) r = MSK_getnumvar(task,&varidx); /* Append a new variable x_3 to the problem */ if (r == MSK_RES_OK) r = MSK_appendvars(task,1); /* Set bounds on new variable */ if (r == MSK_RES_OK) r = MSK_putvarbound(task, varidx, MSK_BK_LO, 0, +MSK_INFINITY); /* Change objective */ if (r == MSK_RES_OK) r = MSK_putcj(task,varidx,1.0); /* Put new values in the A matrix */ if (r == MSK_RES_OK) { MSKint32t acolsub[] = {0, 2}; double acolval[] = {4.0, 1.0}; r = MSK_putacol(task, varidx, /* column index */ 2, /* num nz in column*/ acolsub, acolval); } /* Change optimizer to free simplex and reoptimize */ if (r == MSK_RES_OK) r = MSK_putintparam(task,MSK_IPAR_OPTIMIZER,MSK_OPTIMIZER_FREE_SIMPLEX); if (r == MSK_RES_OK) r = MSK_optimizetrm(task,NULL); /* Get index of new constraint*/ if (r == MSK_RES_OK) r = MSK_getnumcon(task,&conidx); /* Append a new constraint */ if (r == MSK_RES_OK) r = MSK_appendcons(task,1); /* Set bounds on new constraint */ if (r == MSK_RES_OK) r = MSK_putconbound(task, conidx, MSK_BK_UP, -MSK_INFINITY, 30000); /* Put new values in the A matrix */ if (r == MSK_RES_OK) { MSKidxt arowsub[] = {0, 1, 2, 3 }; double arowval[] = {1.0, 2.0, 1.0, 1.0}; r = MSK_putarow(task, conidx, /* row index */ 4, /* num nz in row*/ arowsub, arowval); } if (r == MSK_RES_OK) r = MSK_optimizetrm(task,NULL); if ( xx ) free(xx); MSK_deletetask(&task); } MSK_deleteenv(&env); printf("Return code: %d (0 means no error occured.)\n",r); return ( r ); } /* main */
template <typename _Scalar> typename MosekOpt<_Scalar>::ReturnType MosekOpt<_Scalar>:: update( bool verbose ) { if ( _task != NULL ) { std::cerr << "[" << __func__ << "]: " << "update can only be called once! returning." << std::endl; return MSK_RES_ERR_UNKNOWN; } /* Create the optimization task. */ if ( MSK_RES_OK == _r ) { _r = MSK_maketask( _env, this->getConstraintCount(), this->getVarCount(), &_task ); if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "could not create task with " << this->getVarCount() << " vars, and " << this->getConstraintCount() << " constraints" << std::endl; } // redirect output if ( MSK_RES_OK == _r ) { _r = MSK_linkfunctotaskstream( _task, MSK_STREAM_LOG, NULL, mosekPrintStr ); if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "could not create rewire output to mosekPrintStr(), continuing though..." << std::endl; } // Append _numCon empty constraints. The constraints will initially have no bounds. if ( MSK_RES_OK == _r ) { if ( verbose ) std::cout << "my: MSK_appendcons(_task,"<< this->getConstraintCount() <<");" << std::endl; _r = MSK_appendcons( _task, this->getConstraintCount() ); if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "could not append " << this->getConstraintCount() << " constraints" << std::endl; } // Append _numVar variables. The variables will initially be fixed at zero (x=0). if ( MSK_RES_OK == _r ) { if ( verbose ) std::cout << "my: MSK_appendvars(_task," << this->getVarCount() <<");" << std::endl; _r = MSK_appendvars( _task, this->getVarCount() ); if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "could not append " << this->getVarCount() << " variables" << std::endl; } // Optionally add a constant term to the objective. if ( MSK_RES_OK == _r ) { if ( verbose ) std::cout << "my: MSK_putcfix(_task," << this->getObjectiveBias() << ");" << std::endl; _r = MSK_putcfix( _task, this->getObjectiveBias() ); if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "could not add constant " << this->getObjectiveBias() << " to objective function" << std::endl; } // set Variables for ( size_t j = 0; (j < this->getVarCount()) && (MSK_RES_OK == _r); ++j ) { // set Variable j's Bounds // blx[j] <= x_j <= bux[j] if ( MSK_RES_OK == _r ) { _r = MSK_putvarbound( _task, j, /* Index of variable.*/ MosekOpt<Scalar>::getBoundTypeCustom( this->getVarBoundType(j) ), /* Bound key.*/ this->getVarLowerBound(j), /* Numerical value of lower bound.*/ this->getVarUpperBound(j) ); /* Numerical value of upper bound.*/ if ( verbose ) std::cout << "my: MSK_putvarbound(_task," << j << "," << this->getVarBoundType(j) << "," << this->getVarLowerBound(j) << "," << this->getVarUpperBound(j) << ");" << std::endl; } // set Variable j's Type if ( MSK_RES_OK == _r ) { _r = MSK_putvartype( _task, j, MosekOpt<Scalar>::getVarTypeCustom(this->getVarType(j)) ); } // set Variable j's linear coefficient in the objective function if ( MSK_RES_OK == _r ) { if ( verbose ) std::cout << "my: putcj(_task," << j << "," << this->getLinObjectives()[j] << ")" << std::endl; _r = MSK_putcj( _task, j, this->getLinObjectives()[j] ); } } // set Quadratic Objectives if ( MSK_RES_OK == _r ) { const int numNonZeros = this->getQuadraticObjectives().size(); MSKint32t *qsubi = new MSKint32t[numNonZeros], *qsubj = new MSKint32t[numNonZeros]; double *qval = new double[numNonZeros]; for ( size_t qi = 0; qi != this->getQuadraticObjectives().size(); ++qi ) { qsubi[qi] = this->getQuadraticObjectives()[qi].row(); qsubj[qi] = this->getQuadraticObjectives()[qi].col(); qval [qi] = this->getQuadraticObjectives()[qi].value(); } if ( verbose ) std::cout<<"my: putqobj( _task, " << numNonZeros << ",\n"; for ( size_t vi = 0; vi != numNonZeros; ++vi ) { if ( verbose ) std::cout << qsubi[vi] << "," << qsubj[vi] << ", " << qval[vi] << std::endl; } if ( verbose ) std::cout << ");" << std::endl; _r = MSK_putqobj( _task, numNonZeros, qsubi, qsubj, qval ); if ( qsubi ) { delete[] qsubi; qsubi = NULL; } if ( qsubj ) { delete[] qsubj; qsubj = NULL; } if ( qval ) { delete[] qval ; qval = NULL; } if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "Setting Quadratic Objectives caused error code " << (int)_r << std::endl; } // ...Quadratic objective // set Linear Constraints { typename ParentType::SparseMatrix A( this->getLinConstraintsMatrix() ); // ( this->getConstraintCount(), this->getVarCount() ); // A.setFromTriplets( this->getLinConstraints().begin(), this->getLinConstraints().end() ); std::vector<double> aval; // Linear constraints coeff matrix (sparse) std::vector<int> asub; // Linear constraints coeff matrix indices std::vector<int> aptrb, aptre; for ( int row = 0; (row < A.outerSize()) && (MSK_RES_OK == _r); ++row ) { // set Constraint Bounds for row if ( MSK_RES_OK == _r ) { if ( verbose ) std::cout << "my: MSK_putconbound( _task, " << row << ", " << MosekOpt<Scalar>::getBoundTypeCustom( this->getConstraintBoundType(row) ) << ", " << this->getConstraintLowerBound( row ) << ", " << this->getConstraintUpperBound( row ) << ")" << std::endl; fflush( stdout ); _r = MSK_putconbound( _task, row, /* Index of constraint.*/ MosekOpt<Scalar>::getBoundTypeCustom(this->getConstraintBoundType(row)), /* Bound key.*/ this->getConstraintLowerBound(row), /* Numerical value of lower bound.*/ this->getConstraintUpperBound(row) ); /* Numerical value of upper bound.*/ } // set Linear Constraint row if ( MSK_RES_OK == _r ) { // new line starts at index == current size aptrb.push_back( aval.size() ); // add coeffs from new line for ( typename ParentType::SparseMatrix::InnerIterator it(A,row); it; ++it ) { if ( row != it.row() ) std::cerr << "[" << __func__ << "]: " << "this shouldn't happen" << std::endl; // coeff value aval.push_back( it.value() ); // TODO: A should be a matrix, not a vector... // coeff subscript asub.push_back( it.col() ); } // new line ends at index == new size aptre.push_back( aval.size() ); if ( verbose ) { std::cout << "my: MSK_putarow( _task, " << row << ", " << aptre[row] - aptrb[row] << ", " << *(asub.data() + aptrb[row]) << ", " << *(aval.data() + aptrb[row]) << ");" << std::endl; fflush( stdout ); } _r = MSK_putarow( _task, row, /* Row index.*/ aptre[row] - aptrb[row], /* Number of non-zeros in row i.*/ asub.data() + aptrb[row], /* Pointer to column indexes of row i.*/ aval.data() + aptrb[row]); /* Pointer to values of row i.*/ } } // ... for A.rows // report error if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "Setting Lin constraints caused error code " << (int)_r << std::endl; } // ...set Linear Constraints // set Quadratic constraints if ( verbose ) std::cout << "[" << __func__ << "]: " << "adding q constraints" << std::endl; for ( size_t constr_id = 0; (constr_id != this->getQuadraticConstraints().size()) && (MSK_RES_OK == _r); ++constr_id ) { const int numNonZeros = this->getQuadraticConstraints(constr_id).size(); MSKint32t *qsubi = new MSKint32t[numNonZeros], *qsubj = new MSKint32t[numNonZeros]; double *qval = new double[numNonZeros]; for ( size_t qi = 0; qi != this->getQuadraticConstraints(constr_id).size(); ++qi ) { qsubi[qi] = this->getQuadraticConstraints(constr_id)[qi].row(); qsubj[qi] = this->getQuadraticConstraints(constr_id)[qi].col(); qval [qi] = this->getQuadraticConstraints(constr_id)[qi].value(); } if ( verbose ) std::cout<<"my: MSK_putqonk( _task, " << constr_id << ", " << numNonZeros << ",\n"; for(size_t vi=0;vi!=numNonZeros;++vi) { if ( verbose ) std::cout << qsubi[vi] << "," << qsubj[vi] << ", " << qval[vi] << std::endl; } if ( verbose ) std::cout << "); " << std::endl; _r = MSK_putqconk(_task, constr_id, numNonZeros, qsubi, qsubj, qval); if ( qsubi ) { delete[] qsubi; qsubi = NULL; } if ( qsubj ) { delete[] qsubj; qsubj = NULL; } if ( qval ) { delete[] qval ; qval = NULL; } if ( MSK_RES_OK != _r ) std::cerr << "[" << __func__ << "]: " << "Setting Quad constraints caused error code " << (int)_r << std::endl; } // ...set Quadratic Constraints // save to file { if ( _r == MSK_RES_OK ) { _r = MSK_putintparam( _task, MSK_IPAR_WRITE_DATA_FORMAT, MSK_DATA_FORMAT_LP ); if ( _r == MSK_RES_OK ) { _r = MSK_writedata( _task, "mosek.lp" ); if ( _r != MSK_RES_OK ) { std::cerr << "[" << __func__ << "]: " << "Writedata did not work" << (int)_r << std::endl; } } } } if ( _r == MSK_RES_OK ) { this->_x.setZero(); this->_updated = true; } // return error code return _r; } // ...MosekOpt::update()
int do_thing() { const MSKint32t numvar = 4, numcon = 3; double c[] = {3.0, 1.0, 5.0, 1.0}; /* Below is the sparse representation of the A matrix stored by column. */ MSKint32t aptrb[] = {0, 2, 5, 7}, aptre[] = {2, 5, 7, 9}, asub[] = { 0, 1, 0, 1, 2, 0, 1, 1, 2}; double aval[] = { 3.0, 2.0, 1.0, 1.0, 2.0, 2.0, 3.0, 1.0, 3.0}; /* Bounds on constraints. */ MSKboundkeye bkc[] = {MSK_BK_FX, MSK_BK_LO, MSK_BK_UP }; double blc[] = {30.0, 15.0, -MSK_INFINITY}; double buc[] = {30.0, +MSK_INFINITY, 25.0 }; /* Bounds on variables. */ MSKboundkeye bkx[] = {MSK_BK_LO, MSK_BK_RA, MSK_BK_LO, MSK_BK_LO }; double blx[] = {0.0, 0.0, 0.0, 0.0 }; double bux[] = {+MSK_INFINITY, 10.0, +MSK_INFINITY, +MSK_INFINITY }; MSKenv_t env = NULL; MSKtask_t task = NULL; MSKrescodee r; MSKint32t i,j; /* Create the mosek environment. */ r = MSK_makeenv(&env,NULL); if ( r==MSK_RES_OK ) { /* Create the optimization task. */ r = MSK_maketask(env,numcon,numvar,&task); /* Directs the log task stream to the 'printstr' function. */ if ( r==MSK_RES_OK ) r = MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); /* Append 'numcon' empty constraints. The constraints will initially have no bounds. */ if ( r == MSK_RES_OK ) r = MSK_appendcons(task,numcon); /* Append 'numvar' variables. The variables will initially be fixed at zero (x=0). */ if ( r == MSK_RES_OK ) r = MSK_appendvars(task,numvar); for(j=0; j<numvar && r == MSK_RES_OK; ++j) { /* Set the linear term c_j in the objective.*/ if(r == MSK_RES_OK) r = MSK_putcj(task,j,c[j]); /* Set the bounds on variable j. blx[j] <= x_j <= bux[j] */ if(r == MSK_RES_OK) r = MSK_putvarbound(task, j, /* Index of variable.*/ bkx[j], /* Bound key.*/ blx[j], /* Numerical value of lower bound.*/ bux[j]); /* Numerical value of upper bound.*/ /* Input column j of A */ if(r == MSK_RES_OK) r = MSK_putacol(task, j, /* Variable (column) index.*/ aptre[j]-aptrb[j], /* Number of non-zeros in column j.*/ asub+aptrb[j], /* Pointer to row indexes of column j.*/ aval+aptrb[j]); /* Pointer to Values of column j.*/ } /* Set the bounds on constraints. for i=1, ...,numcon : blc[i] <= constraint i <= buc[i] */ for(i=0; i<numcon && r==MSK_RES_OK; ++i) r = MSK_putconbound(task, i, /* Index of constraint.*/ bkc[i], /* Bound key.*/ blc[i], /* Numerical value of lower bound.*/ buc[i]); /* Numerical value of upper bound.*/ /* Maximize objective function. */ if (r == MSK_RES_OK) r = MSK_putobjsense(task, MSK_OBJECTIVE_SENSE_MAXIMIZE); if ( r==MSK_RES_OK ) { MSKrescodee trmcode; /* Run optimizer */ r = MSK_optimizetrm(task,&trmcode); /* Print a summary containing information about the solution for debugging purposes. */ MSK_solutionsummary (task,MSK_STREAM_LOG); if ( r==MSK_RES_OK ) { MSKsolstae solsta; if ( r==MSK_RES_OK ) r = MSK_getsolsta (task, MSK_SOL_BAS, &solsta); switch(solsta) { case MSK_SOL_STA_OPTIMAL: case MSK_SOL_STA_NEAR_OPTIMAL: { double *xx = (double*) calloc(numvar,sizeof(double)); if ( xx ) { MSK_getxx(task, MSK_SOL_BAS, /* Request the basic solution. */ xx); printf("Optimal primal solution\n"); for(j=0; j<numvar; ++j) printf("x[%d]: %e\n",j,xx[j]); free(xx); } else r = MSK_RES_ERR_SPACE; break; } case MSK_SOL_STA_DUAL_INFEAS_CER: case MSK_SOL_STA_PRIM_INFEAS_CER: case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER: case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER: printf("Primal or dual infeasibility certificate found.\n"); break; case MSK_SOL_STA_UNKNOWN: { char symname[MSK_MAX_STR_LEN]; char desc[MSK_MAX_STR_LEN]; /* If the solutions status is unknown, print the termination code indicating why the optimizer terminated prematurely. */ MSK_getcodedesc(trmcode, symname, desc); printf("The solution status is unknown.\n"); printf("The optimizer terminitated with code: %s\n",symname); break; } default: printf("Other solution status.\n"); break; } } } if (r != MSK_RES_OK) { /* In case of an error print error code and description. */ char symname[MSK_MAX_STR_LEN]; char desc[MSK_MAX_STR_LEN]; printf("An error occurred while optimizing.\n"); MSK_getcodedesc (r, symname, desc); printf("Error %s - '%s'\n",symname,desc); } /* Delete the task and the associated data. */ MSK_deletetask(&task); } /* Delete the environment and the associated data. */ MSK_deleteenv(&env); return r; }