20 using namespace shogun;
27 CMosek::CMosek(int32_t num_con, int32_t num_var)
31 m_rescode = MSK_makeenv(&m_env, NULL, NULL, NULL, NULL);
35 if ( m_rescode == MSK_RES_OK )
37 m_rescode = MSK_linkfunctoenvstream(m_env, MSK_STREAM_LOG,
43 if ( m_rescode == MSK_RES_OK )
45 m_rescode = MSK_initenv(m_env);
49 if ( m_rescode == MSK_RES_OK )
51 m_rescode = MSK_maketask(m_env, num_con, num_var, &m_task);
56 if ( m_rescode == MSK_RES_OK )
58 m_rescode = MSK_linkfunctotaskstream(m_task, MSK_STREAM_LOG,
74 MSKrescodee CMosek::init_sosvm(int32_t M, int32_t N,
75 int32_t num_aux, int32_t num_aux_con,
82 int32_t num_var = M+N+num_aux;
83 int32_t num_con = N*N+num_aux_con;
86 m_rescode = MSK_putmaxnumvar(m_task, num_var);
89 m_rescode = MSK_putmaxnumcon(m_task, num_con);
91 m_rescode = MSK_putmaxnumanz(m_task, (M+1)*N*N);
94 m_rescode = MSK_append(m_task, MSK_ACC_VAR, num_var);
96 m_rescode = MSK_append(m_task, MSK_ACC_CON, num_con);
98 m_rescode = MSK_putcfix(m_task, 0.0);
100 for ( int32_t j = 0 ; j < num_var && m_rescode == MSK_RES_OK ; ++j )
104 m_rescode = MSK_putcj(m_task, j, 0.0);
106 m_rescode = MSK_putcj(m_task, j, 1.0);
112 m_rescode = MSK_putbound(m_task, MSK_ACC_VAR, j,
113 MSK_BK_FR, -MSK_INFINITY, +MSK_INFINITY);
119 m_rescode = MSK_putbound(m_task, MSK_ACC_VAR, j,
120 MSK_BK_LO, 0.0, +MSK_INFINITY);
129 m_rescode = wrapper_putqobj(C);
132 m_rescode = wrapper_putaveclist(m_task, A);
133 m_rescode = wrapper_putboundlist(m_task, b);
135 REQUIRE(m_rescode == MSK_RES_OK,
"MOSEK Error in CMosek::init_sosvm(). "
136 "Enable DEBUG_MOSEK for details.\n");
141 MSKrescodee CMosek::add_constraint_sosvm(
149 int32_t nnz = CMath::get_num_nonzero(dPsi.
vector, dPsi.
vlen);
157 for ( int32_t i = 0 ; i < dPsi.
vlen ; ++i )
169 asub[idx] = dPsi.
vlen + num_aux + train_idx;
172 m_rescode = MSK_putavec(m_task, MSK_ACC_CON, con_idx, nnz+1,
173 asub.vector, aval.vector);
175 if ( m_rescode == MSK_RES_OK )
177 m_rescode = MSK_putbound(m_task, MSK_ACC_CON, con_idx,
178 MSK_BK_UP, -MSK_INFINITY, bi);
184 MSKrescodee CMosek::wrapper_putaveclist(
205 bool first_nnz_found =
false;
209 first_nnz_found =
false;
218 if ( !first_nnz_found )
221 first_nnz_found =
true;
231 if ( !first_nnz_found )
232 ptrb[i] = ( i ? ptrb[i-1] : 0 );
244 MSKrescodee ret = MSK_putaveclist(task, MSK_ACC_CON, A.
num_rows, sub.vector,
245 ptrb.vector, ptre.vector,
246 asub.vector, aval.vector);
248 REQUIRE(ret == MSK_RES_OK,
"MOSEK Error in CMosek::wrapper_putaveclist(). "
249 "Enable DEBUG_MOSEK for details.\n");
268 bl[i] = -MSK_INFINITY;
271 MSKrescodee ret = MSK_putboundlist(task, MSK_ACC_CON, b.
vlen, sub.vector,
276 REQUIRE(ret == MSK_RES_OK,
"MOSEK Error in CMosek::wrapper_putboundlist(). "
277 "Enable DEBUG_MOSEK for details.\n");
291 for (
index_t i = 0 ; i < N ; ++i )
292 for (
index_t j = i ; j < M ; ++j )
293 nnz += ( Q0[j + i*M] ? 1 : 0 );
304 for (
index_t i = 0 ; i < N ; ++i )
305 for (
index_t j = i ; j < M ; ++j )
311 qoval[idx] = Q0[j + i*M];
317 return MSK_putqobj(m_task, nnz, qosubi.vector,
318 qosubj.vector, qoval.vector);
323 m_rescode = MSK_optimize(m_task);
327 MSK_solutionsummary(m_task, MSK_STREAM_LOG);
331 if ( m_rescode == MSK_RES_OK )
339 MSK_getsolutionstatus(m_task, MSK_SOL_ITR, NULL, &solsta);
343 case MSK_SOL_STA_OPTIMAL:
344 case MSK_SOL_STA_NEAR_OPTIMAL:
345 MSK_getsolutionslice(m_task,
353 #ifdef DEBUG_SOLUTION
357 case MSK_SOL_STA_DUAL_INFEAS_CER:
358 case MSK_SOL_STA_PRIM_INFEAS_CER:
359 case MSK_SOL_STA_NEAR_DUAL_INFEAS_CER:
360 case MSK_SOL_STA_NEAR_PRIM_INFEAS_CER:
362 SG_PRINT(
"Primal or dual infeasibility "
363 "certificate found\n");
366 case MSK_SOL_STA_UNKNOWN:
368 SG_PRINT(
"Undetermined solution status\n");
373 SG_PRINT(
"Other solution status\n");
381 if ( m_rescode != MSK_RES_OK )
383 char symname[MSK_MAX_STR_LEN];
384 char desc[MSK_MAX_STR_LEN];
386 MSK_getcodedesc(m_rescode, symname, desc);
388 SG_PRINT(
"An error occurred optimizing with MOSEK\n");
389 SG_PRINT(
"ERROR %s - '%s'\n", symname, desc);
395 void CMosek::delete_problem()
397 MSK_deletetask(&m_task);
398 MSK_deleteenv(&m_env);
401 void CMosek::display_problem()
403 int32_t num_var, num_con;
404 m_rescode = MSK_getnumvar(m_task, &num_var);
405 m_rescode = MSK_getnumcon(m_task, &num_con);
408 for ( int32_t i = 0 ; i < num_var ; ++i )
410 for ( int32_t j = 0 ; j < num_var ; ++j )
413 m_rescode = MSK_getqobjij(m_task, i, j, &qij);
415 SG_PRINT(
"(%d,%d)\t%.2f\n", i, j, qij);
422 m_rescode = MSK_getc(m_task, c.vector);
426 for ( int32_t i = 0 ; i < num_con ; ++i )
428 for ( int32_t j = 0 ; j < num_var ; ++j )
431 m_rescode = MSK_getaij(m_task, i, j, &aij);
433 SG_PRINT(
"(%d,%d)\t%.2f\n", i, j, aij);
438 SG_PRINT(
"\nConstraint Bounds, vector b:\n");
439 for ( int32_t i = 0 ; i < num_con ; ++i )
443 m_rescode = MSK_getbound(m_task, MSK_ACC_CON, i, &bk, &bl, &bu);
448 SG_PRINT(
"\nVariable Bounds, vectors lb and ub:\n");
449 for ( int32_t i = 0 ; i < num_var ; ++i )
453 m_rescode = MSK_getbound(m_task, MSK_ACC_VAR, i, &bk, &bl, &bu);