int main() { char buffer[MSK_MAX_STR_LEN]; double oprfo[NUMOPRO],oprgo[NUMOPRO],oprho[NUMOPRO], oprfc[NUMOPRC],oprgc[NUMOPRC],oprhc[NUMOPRC], c[NUMVAR],aval[NUMANZ], blc[NUMCON],buc[NUMCON],blx[NUMVAR],bux[NUMVAR]; int numopro,numoprc, numcon=NUMCON,numvar=NUMVAR, opro[NUMOPRO],oprjo[NUMOPRO], oprc[NUMOPRC],opric[NUMOPRC],oprjc[NUMOPRC], aptrb[NUMVAR],aptre[NUMVAR],asub[NUMANZ]; MSKboundkeye bkc[NUMCON],bkx[NUMVAR]; MSKenv_t env; MSKrescodee r; MSKtask_t task; schand_t sch; /* Specify nonlinear terms in the objective. */ numopro = NUMOPRO; opro[0] = MSK_OPR_LOG; /* Defined in scopt.h */ oprjo[0] = 2; oprfo[0] = -1.0; oprgo[0] = 1.0; /* This value is never used. */ oprho[0] = 0.0; /* Specify nonlinear terms in the constraints. */ numoprc = NUMOPRC; oprc[0] = MSK_OPR_POW; opric[0] = 0; oprjc[0] = 0; oprfc[0] = 1.0; oprgc[0] = 2.0; oprhc[0] = 0.0; oprc[1] = MSK_OPR_POW; opric[1] = 0; oprjc[1] = 1; oprfc[1] = 1.0; oprgc[1] = 2.0; oprhc[1] = 0.0; /* Specify c */ c[0] = 1.0; c[1] = 0.0; c[2] = 0.0; /* Specify a. */ aptrb[0] = 0; aptrb[1] = 1; aptrb[2] = 2; aptre[0] = 1; aptre[1] = 2; aptre[2] = 3; asub[0] = 1; asub[1] = 1; asub[2] = 1; aval[0] = 1.0; aval[1] = 2.0; aval[2] = -1.0; /* Specify bounds for constraints. */ bkc[0] = MSK_BK_UP; bkc[1] = MSK_BK_FX; blc[0] = -MSK_INFINITY; blc[1] = 0.0; buc[0] = 1.0; buc[1] = 0.0; /* Specify bounds for variables. */ bkx[0] = MSK_BK_FR; bkx[1] = MSK_BK_FR; bkx[2] = MSK_BK_LO; blx[0] = -MSK_INFINITY; blx[1] = -MSK_INFINITY; blx[2] = 0.0; bux[0] = MSK_INFINITY; bux[1] = MSK_INFINITY; bux[2] = MSK_INFINITY; /* Create the mosek environment. */ r = MSK_makeenv(&env,NULL); if ( r==MSK_RES_OK ) { /* Make the optimization task. */ r = MSK_makeemptytask(env,&task); if ( r==MSK_RES_OK ) MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); if ( r==MSK_RES_OK ) { /* Setup the linear part of the problem. */ r = MSK_inputdata(task, numcon,numvar, numcon,numvar, c,0.0, aptrb,aptre, asub,aval, bkc,blc,buc, bkx,blx,bux); } if ( r== MSK_RES_OK ) { /* Set-up of nonlinear expressions. */ r = MSK_scbegin(task, numopro,opro,oprjo,oprfo,oprgo,oprho, numoprc,oprc,opric,oprjc,oprfc,oprgc,oprhc, &sch); if ( r==MSK_RES_OK ) { printf("Start optimizing\n"); r = MSK_optimize(task); printf("Done optimizing\n"); MSK_solutionsummary(task,MSK_STREAM_MSG); } /* The nonlinear expressions are no longer needed. */ MSK_scend(task,&sch); } MSK_deletetask(&task); } MSK_deleteenv(&env); printf("Return code: %d\n",r); if ( r!=MSK_RES_OK ) { MSK_getcodedesc(r,buffer,NULL); printf("Description: %s\n",buffer); } return r; } /* main */
int main(int argc,char **argv) { MSKenv_t env; MSKtask_t task; MSKintt NUMCON = 2; MSKintt NUMVAR = 2; double c[] = {1.0, 1.0}; MSKintt ptrb[] = {0, 2}; MSKintt ptre[] = {2, 3}; MSKidxt asub[] = {0, 1, 0, 1}; double aval[] = {1.0, 1.0, 2.0, 1.0}; MSKboundkeye bkc[] = {MSK_BK_UP, MSK_BK_UP}; double blc[] = {-MSK_INFINITY, -MSK_INFINITY}; double buc[] = {2.0, 6.0}; MSKboundkeye bkx[] = {MSK_BK_LO, MSK_BK_LO}; double blx[] = {0.0, 0.0}; double bux[] = {+MSK_INFINITY, +MSK_INFINITY}; MSKrescodee r = MSK_RES_OK; MSKidxt i,nz; double w1[] = {2.0,6.0}; double w2[] = {1.0,0.0}; MSKidxt sub[] = {0,1}; MSKidxt *basis; if (r == MSK_RES_OK) r = MSK_makeenv(&env,NULL,NULL,NULL,NULL); if ( r==MSK_RES_OK ) MSK_linkfunctoenvstream(env,MSK_STREAM_LOG,NULL,printstr); if ( r==MSK_RES_OK ) r = MSK_initenv(env); if ( r==MSK_RES_OK ) r = MSK_makeemptytask(env,&task); if ( r==MSK_RES_OK ) MSK_linkfunctotaskstream(task,MSK_STREAM_LOG,NULL,printstr); if ( r == MSK_RES_OK) r = MSK_inputdata(task, NUMCON,NUMVAR, NUMCON,NUMVAR, c, 0.0, ptrb, ptre, asub, aval, bkc, blc, buc, bkx, blx, bux); if (r == MSK_RES_OK) r = MSK_putobjsense(task,MSK_OBJECTIVE_SENSE_MAXIMIZE); if (r == MSK_RES_OK) r = MSK_optimize(task); if (r == MSK_RES_OK) basis = MSK_calloctask(task,NUMCON,sizeof(MSKidxt)); if (r == MSK_RES_OK) r = MSK_initbasissolve(task,basis); /* List basis variables corresponding to columns of B */ for (i=0;i<NUMCON && r == MSK_RES_OK;++i) { printf("basis[%d] = %d\n",i,basis[i]); if (basis[sub[i]] < NUMCON) printf ("Basis variable no %d is xc%d.\n",i, basis[i]); else printf ("Basis variable no %d is x%d.\n",i,basis[i] - NUMCON); } nz = 2; /* solve Bx = w1 */ /* sub contains index of non-zeros in w1. On return w1 contains the solution x and sub the index of the non-zeros in x. */ if (r == MSK_RES_OK) r = MSK_solvewithbasis(task,0,&nz,sub,w1); if (r == MSK_RES_OK) { printf("\nSolution to Bx = w1:\n\n"); /* Print solution and b. */ for (i=0;i<nz;++i) { if (basis[sub[i]] < NUMCON) printf ("xc%d = %e\n",basis[sub[i]] , w1[sub[i]] ); else printf ("x%d = %e\n",basis[sub[i]] - NUMCON , w1[sub[i]] ); } } /* Solve B^Tx = c */ nz = 2; sub[0] = 0; sub[1] = 1; if (r == MSK_RES_OK) r = MSK_solvewithbasis(task,1,&nz,sub,w2); if (r == MSK_RES_OK) { printf("\nSolution to B^Tx = w2:\n\n"); /* Print solution and y. */ for (i=0;i<nz;++i) { if (basis[sub[i]] < NUMCON) printf ("xc%d = %e\n",basis[sub[i]] , w2[sub[i]] ); else printf ("x%d = %e\n",basis[sub[i]] - NUMCON , w2[sub[i]] ); } } printf("Return code: %d (0 means no error occurred.)\n",r); return ( r ); }/* main */
int mosek_qp_optimize(double** G, double* delta, double* alpha, long k, double C, double *dual_obj) { long i,j,t; double *c; MSKlidxt *aptrb; MSKlidxt *aptre; MSKidxt *asub; double *aval; MSKboundkeye bkc[1]; double blc[1]; double buc[1]; MSKboundkeye *bkx; double *blx; double *bux; MSKidxt *qsubi,*qsubj; double *qval; MSKenv_t env; MSKtask_t task; MSKrescodee r; /*double dual_obj;*/ c = (double*) malloc(sizeof(double)*k); assert(c!=NULL); aptrb = (MSKlidxt*) malloc(sizeof(MSKlidxt)*k); assert(aptrb!=NULL); aptre = (MSKlidxt*) malloc(sizeof(MSKlidxt)*k); assert(aptre!=NULL); asub = (MSKidxt*) malloc(sizeof(MSKidxt)*k); assert(asub!=NULL); aval = (double*) malloc(sizeof(double)*k); assert(aval!=NULL); bkx = (MSKboundkeye*) malloc(sizeof(MSKboundkeye)*k); assert(bkx!=NULL); blx = (double*) malloc(sizeof(double)*k); assert(blx!=NULL); bux = (double*) malloc(sizeof(double)*k); assert(bux!=NULL); qsubi = (MSKidxt*) malloc(sizeof(MSKidxt)*(k*(k+1)/2)); assert(qsubi!=NULL); qsubj = (MSKidxt*) malloc(sizeof(MSKidxt)*(k*(k+1)/2)); assert(qsubj!=NULL); qval = (double*) malloc(sizeof(double)*(k*(k+1)/2)); assert(qval!=NULL); /* DEBUG */ /* for (i=0;i<k;i++) { printf("delta: %.4f\n", delta[i]); } printf("G:\n"); for (i=0;i<k;i++) { for (j=0;j<k;j++) { printf("%.4f ", G[i][j]); } printf("\n"); } fflush(stdout); */ /* DEBUG */ for (i=0;i<k;i++) { c[i] = -delta[i]; aptrb[i] = i; aptre[i] = i+1; asub[i] = 0; aval[i] = 1.0; bkx[i] = MSK_BK_LO; blx[i] = 0.0; bux[i] = MSK_INFINITY; } bkc[0] = MSK_BK_UP; blc[0] = -MSK_INFINITY; buc[0] = C; /* bkc[0] = MSK_BK_FX; blc[0] = C; buc[0] = C; */ /* create mosek environment */ r = MSK_makeenv(&env, NULL, NULL, NULL, NULL); /* check return code */ if (r==MSK_RES_OK) { /* directs output to printstr function */ MSK_linkfunctoenvstream(env, MSK_STREAM_LOG, NULL, printstr); } /* initialize the environment */ r = MSK_initenv(env); if (r==MSK_RES_OK) { /* create the optimization task */ r = MSK_maketask(env,1,k,&task); if (r==MSK_RES_OK) { r = MSK_linkfunctotaskstream(task, MSK_STREAM_LOG,NULL,printstr); if (r==MSK_RES_OK) { r = MSK_inputdata(task, 1,k, 1,k, c,0.0, aptrb,aptre, asub,aval, bkc,blc,buc, bkx,blx,bux); } if (r==MSK_RES_OK) { /* coefficients for the Gram matrix */ t = 0; for (i=0;i<k;i++) { for (j=0;j<=i;j++) { qsubi[t] = i; qsubj[t] = j; qval[t] = G[i][j]; t++; } } r = MSK_putqobj(task, k*(k+1)/2, qsubi,qsubj,qval); } /* DEBUG */ /* printf("t: %ld\n", t); for (i=0;i<t;i++) { printf("qsubi: %d, qsubj: %d, qval: %.4f\n", qsubi[i], qsubj[i], qval[i]); } fflush(stdout); */ /* DEBUG */ /* set relative tolerance gap (DEFAULT = 1E-8)*/ //MSK_putdouparam(task, MSK_DPAR_INTPNT_TOL_REL_GAP, 1E-10); MSK_putdouparam(task, MSK_DPAR_INTPNT_TOL_REL_GAP, 1E-14); if (r==MSK_RES_OK) { r = MSK_optimize(task); } if (r==MSK_RES_OK) { MSK_getsolutionslice(task, MSK_SOL_ITR, MSK_SOL_ITEM_XX, 0, k, alpha); /* print out alphas */ /* for (i=0;i<k;i++) { printf("alpha[%ld]: %.8f\n", i, alpha[i]); fflush(stdout); } */ /* output the objective value */ MSK_getprimalobj(task, MSK_SOL_ITR, dual_obj); //printf("ITER DUAL_OBJ %.8g\n", -(*dual_obj)); fflush(stdout); } MSK_deletetask(&task); } MSK_deleteenv(&env); } /* free the memory */ free(c); free(aptrb); free(aptre); free(asub); free(aval); free(bkx); free(blx); free(bux); free(qsubi); free(qsubj); free(qval); if(r == MSK_RES_OK) return(0); else return(r); }