Advertisement
Guest User

Untitled

a guest
Oct 19th, 2012
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.22 KB | None | 0 0
  1. /* Wrapper for Mosek QP solver */
  2. /* 6 November 2007 */
  3.  
  4. #include <stdio.h>
  5. #include <assert.h>
  6. #include "mosek.h"
  7.  
  8. static void MSKAPI printstr(void *handle, char str[]) {
  9.   //printf("%s", str);
  10. } /* printstr */
  11.  
  12. int mosek_qp_optimize(double** G, double* delta, double* alpha, long k, double C, double *dual_obj, double rho) {
  13.   long i,j,t;
  14.   double *c;
  15.   MSKlidxt *aptrb;
  16.   MSKlidxt *aptre;
  17.   MSKidxt *asub;
  18.   double *aval;
  19.   MSKboundkeye bkc[1];
  20.   double blc[1];
  21.   double buc[1];
  22.   MSKboundkeye *bkx;
  23.   double *blx;
  24.   double *bux;
  25.   MSKidxt *qsubi,*qsubj;
  26.   double *qval;
  27.  
  28.   MSKenv_t env;
  29.   MSKtask_t task;
  30.   MSKrescodee r;
  31.   /*double dual_obj;*/
  32.  
  33.   c = (double*) malloc(sizeof(double)*k);
  34.   assert(c!=NULL);
  35.   aptrb = (MSKlidxt*) malloc(sizeof(MSKlidxt)*k);
  36.   assert(aptrb!=NULL);
  37.   aptre = (MSKlidxt*) malloc(sizeof(MSKlidxt)*k);
  38.   assert(aptre!=NULL);
  39.   asub = (MSKidxt*) malloc(sizeof(MSKidxt)*k);
  40.   assert(asub!=NULL);
  41.   aval = (double*) malloc(sizeof(double)*k);
  42.   assert(aval!=NULL);
  43.   bkx = (MSKboundkeye*) malloc(sizeof(MSKboundkeye)*k);
  44.   assert(bkx!=NULL);
  45.   blx = (double*) malloc(sizeof(double)*k);
  46.   assert(blx!=NULL);
  47.   bux = (double*) malloc(sizeof(double)*k);
  48.   assert(bux!=NULL);
  49.   qsubi = (MSKidxt*) malloc(sizeof(MSKidxt)*(k*(k+1)/2));
  50.   assert(qsubi!=NULL);  
  51.   qsubj = (MSKidxt*) malloc(sizeof(MSKidxt)*(k*(k+1)/2));
  52.   assert(qsubj!=NULL);  
  53.   qval = (double*) malloc(sizeof(double)*(k*(k+1)/2));
  54.   assert(qval!=NULL);  
  55.  
  56.  
  57.   /* DEBUG */
  58.   /*
  59.   for (i=0;i<k;i++) {
  60.     printf("delta: %.4f\n", delta[i]);
  61.   }
  62.   printf("G:\n");
  63.   for (i=0;i<k;i++) {
  64.     for (j=0;j<k;j++) {
  65.       printf("%.4f ", G[i][j]);
  66.     }
  67.     printf("\n");
  68.   }
  69.   fflush(stdout);
  70.   */
  71.   /* DEBUG */
  72.  
  73.  
  74.   for (i=0;i<k;i++) {
  75.     c[i] = -delta[i];
  76.     aptrb[i] = i;
  77.     aptre[i] = i+1;
  78.     asub[i] = 0;
  79.     aval[i] = 1.0;
  80.     bkx[i] = MSK_BK_LO;
  81.     blx[i] = 0.0;
  82.     bux[i] = MSK_INFINITY;
  83.   }
  84.   /*
  85.   bkc[0] = MSK_BK_UP;
  86.   blc[0] = -MSK_INFINITY;
  87.   buc[0] = C;
  88.   */
  89.   bkc[0] = MSK_BK_FX;
  90.   blc[0] = C;
  91.   buc[0] = C;  
  92.  
  93.   /* create mosek environment */
  94.   r = MSK_makeenv(&env, NULL, NULL, NULL, NULL);
  95.  
  96.   /* check return code */
  97.   if (r==MSK_RES_OK) {
  98.     /* directs output to printstr function */
  99.     MSK_linkfunctoenvstream(env, MSK_STREAM_LOG, NULL, printstr);
  100.   }
  101.  
  102.   /* initialize the environment */
  103.   r = MSK_initenv(env);
  104.  
  105.   if (r==MSK_RES_OK) {
  106.     /* create the optimization task */
  107.     r = MSK_maketask(env,1,k,&task);
  108.    
  109.     if (r==MSK_RES_OK) {
  110.       r = MSK_linkfunctotaskstream(task, MSK_STREAM_LOG,NULL,printstr);
  111.      
  112.       if (r==MSK_RES_OK) {
  113.     r = MSK_inputdata(task,
  114.               1,k,
  115.               1,k,
  116.               c,0.0,
  117.               aptrb,aptre,
  118.               asub,aval,
  119.               bkc,blc,buc,
  120.               bkx,blx,bux);
  121.                          
  122.       }
  123.      
  124.       if (r==MSK_RES_OK) {
  125.     /* coefficients for the Gram matrix */
  126.     t = 0;
  127.     for (i=0;i<k;i++) {
  128.       for (j=0;j<=i;j++) {
  129.         qsubi[t] = i;
  130.         qsubj[t] = j;
  131.         qval[t] = G[i][j]/(1+rho);
  132.         t++;
  133.       }
  134.     }
  135.        
  136.     r = MSK_putqobj(task, k*(k+1)/2, qsubi,qsubj,qval);
  137.       }
  138.      
  139.  
  140.       /* DEBUG */
  141.       /*
  142.       printf("t: %ld\n", t);
  143.       for (i=0;i<t;i++) {
  144.     printf("qsubi: %d, qsubj: %d, qval: %.4f\n", qsubi[i], qsubj[i], qval[i]);
  145.       }
  146.       fflush(stdout);
  147.       */
  148.       /* DEBUG */
  149.  
  150.       /* set relative tolerance gap (DEFAULT = 1E-8)*/
  151.       //MSK_putdouparam(task, MSK_DPAR_INTPNT_TOL_REL_GAP, 1E-10);
  152.       MSK_putdouparam(task, MSK_DPAR_INTPNT_TOL_REL_GAP, 1E-14);
  153.  
  154.       if (r==MSK_RES_OK) {
  155.     r = MSK_optimize(task);
  156.       }
  157.      
  158.       if (r==MSK_RES_OK) {
  159.     MSK_getsolutionslice(task,
  160.                  MSK_SOL_ITR,
  161.                  MSK_SOL_ITEM_XX,
  162.                  0,
  163.                  k,
  164.                  alpha);
  165.         /* print out alphas */
  166.     /*
  167.     for (i=0;i<k;i++) {
  168.       printf("alpha[%ld]: %.8f\n", i, alpha[i]); fflush(stdout);
  169.     }
  170.     */
  171.     /* output the objective value */
  172.     MSK_getprimalobj(task, MSK_SOL_ITR, dual_obj);
  173.     //printf("ITER DUAL_OBJ %.8g\n", -(*dual_obj)); fflush(stdout);
  174.       }
  175.       MSK_deletetask(&task);
  176.     }
  177.     MSK_deleteenv(&env);
  178.   }
  179.  
  180.  
  181.   /* free the memory */
  182.   free(c);
  183.   free(aptrb);
  184.   free(aptre);
  185.   free(asub);
  186.   free(aval);
  187.   free(bkx);
  188.   free(blx);
  189.   free(bux);
  190.   free(qsubi);  
  191.   free(qsubj);  
  192.   free(qval);  
  193.  
  194.   return(r);  
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement