21 using namespace shogun;
24 :
CSGObject(), env(NULL), lp(NULL), lp_initialized(false)
40 env = CPXopenCPLEX (&status);
45 SG_WARNING(
"Could not open CPLEX environment.\n");
46 CPXgeterrorstring (
env, status, errmsg);
48 SG_WARNING(
"retrying in %d seconds\n", timeout);
55 status = CPXsetintparam (
env, CPX_PARAM_SCRIND, CPX_OFF);
57 SG_ERROR(
"Failure to turn off screen indicator, error %d.\n", status);
60 status = CPXsetintparam (
env, CPX_PARAM_DATACHECK, CPX_ON);
62 SG_ERROR(
"Failure to turn on data checking, error %d.\n", status);
65 lp = CPXcreateprob (
env, &status,
"shogun");
68 SG_ERROR(
"Failed to create optimization problem.\n");
70 CPXchgobjsen (
env,
lp, CPX_MIN);
73 status = CPXsetintparam (
env, CPX_PARAM_QPMETHOD, 0);
75 status = CPXsetintparam (
env, CPX_PARAM_LPMETHOD, 0);
77 SG_ERROR(
"Failure to select dual lp/qp optimization, error %d.\n", status);
84 return (
lp != NULL) && (
env != NULL);
89 int32_t* idx_bound, int32_t num_bound, int32_t* w_zero, int32_t num_zero,
90 float64_t* vee, int32_t num_dim,
bool use_bias)
92 const int cmatsize=10*1024*1024;
94 int32_t num_variables=num_dim + num_bound+num_zero;
104 int* cmatbeg=
SG_MALLOC(
int, num_variables);
105 int* cmatcnt=
SG_MALLOC(
int, num_variables);
107 double* cmatval=
SG_MALLOC(
double, cmatsize);
109 for (int32_t i=0; i<num_variables; i++)
126 for (int32_t i=0; i<num_variables; i++)
138 else if (i<num_dim+num_zero)
142 cmatind[offs]=w_zero[i-num_dim];
149 int32_t idx=idx_bound[i-num_dim-num_zero];
163 for (int32_t j=0; j<vlen; j++)
175 cmatind[offs]=num_dim-1;
186 cmatind[offs]=num_dim-1;
199 result = CPXcopylp(
env,
lp, num_variables, num_dim, CPX_MIN,
200 obj, vee, sense, cmatbeg, cmatcnt, cmatind, cmatval, lb, ub, NULL) == 0;
217 int* qmatbeg=
SG_MALLOC(
int, num_variables);
218 int* qmatcnt=
SG_MALLOC(
int, num_variables);
219 int* qmatind=
SG_MALLOC(
int, num_variables);
220 double* qmatval=
SG_MALLOC(
double, num_variables);
224 for (int32_t i=0; i<num_variables; i++)
245 result = CPXcopyquad(
env,
lp, qmatbeg, qmatcnt, qmatind, qmatval) == 0;
264 int32_t status = CPXsetintparam (
env, CPX_PARAM_LPMETHOD, 1);
266 SG_ERROR(
"Failure to select dual lp optimization, error %d.\n", status);
272 for (int32_t i=0; i<num_cols; i++)
279 status = CPXnewcols(
env,
lp, num_cols, obj, lb, ub, NULL, NULL);
283 CPXgeterrorstring (
env, status, errmsg);
298 double amatval[len+1];
306 for (int32_t i=0; i<len; i++)
314 int32_t status = CPXaddrows (
env,
lp, 0, 1, len, rhs, sense, amatbeg, amatind, amatval, NULL, NULL);
317 SG_ERROR(
"Failed to add the new row.\n");
332 int32_t num_dims=1+2*num_feat+num_vec;
333 int32_t num_constraints=num_vec;
341 int64_t amatsize=((int64_t) num_vec)+nnz+nnz+num_vec;
346 double* amatval=
SG_MALLOC(
double, amatsize);
348 for (int32_t i=0; i<num_dims; i++)
364 else if (i<2*num_feat+1)
378 for (int32_t i=0; i<num_constraints; i++)
381 char* sense=
SG_MALLOC(
char, num_constraints);
382 memset(sense,
'L',
sizeof(
char)*num_constraints);
391 for (int32_t i=0; i<num_vec; i++)
404 for (int32_t i=0; i<num_svec; i++)
420 for (int32_t i=0; i<num_svec; i++)
422 amatbeg[num_svec+i+1]=offs;
436 x->clean_tsparse(sfeat, num_svec);
439 for (int32_t k=0; k<num_vec; k++)
441 amatbeg[1+2*num_feat+k]=offs;
442 amatcnt[1+2*num_feat+k]=1;
448 int32_t status = CPXsetintparam (
env, CPX_PARAM_LPMETHOD, 1);
450 SG_ERROR(
"Failure to select barrier optimization, error %d.\n", status);
451 CPXsetintparam (
env, CPX_PARAM_SCRIND, CPX_ON);
453 bool result = CPXcopylp(
env,
lp, num_dims, num_constraints, CPX_MIN,
454 f, b, sense, amatbeg, amatcnt, amatind, amatval, lb, ub, NULL) == 0;
475 int32_t status = CPXfreeprob(
env, &
lp);
480 SG_WARNING(
"CPXfreeprob failed, error code %d.\n", status);
487 int32_t status = CPXcloseCPLEX (&
env);
493 SG_WARNING(
"Could not close CPLEX environment.\n");
494 CPXgeterrorstring (
env, status, errmsg);
504 float64_t*
H, int32_t rows, int32_t cols,
int* &qmatbeg,
int* &qmatcnt,
505 int* &qmatind,
double* &qmatval)
512 if (!(qmatbeg && qmatcnt && qmatind))
520 for (int32_t i=0; i<cols; i++)
524 for (int32_t j=0; j<rows; j++)
540 double* qmatval=NULL;
544 if (constraints_mat==0)
551 memset(sense,
'L',
sizeof(
char)*rows);
553 memset(constraints_mat, 0,
sizeof(
float64_t)*cols);
557 result = CPXcopylp(
env,
lp, cols, rows, CPX_MIN,
558 objective, rhs, sense, qmatbeg, qmatcnt, qmatind, qmatval, lb, ub, NULL) == 0;
564 memset(sense,
'L',
sizeof(
char)*rows);
566 result = CPXcopylp(
env,
lp, cols, rows, CPX_MIN,
567 objective, rhs, sense, qmatbeg, qmatcnt, qmatind, qmatval, lb, ub, NULL) == 0;
586 double* qmatval=NULL;
589 result = CPXcopyquad(
env,
lp, qmatbeg, qmatcnt, qmatind, qmatval) == 0;
608 status = CPXqpopt (
env,
lp);
610 status = CPXlpopt (
env,
lp);
615 status = CPXsolution (
env,
lp, &solnstat, &objval, sol, lambda, NULL, NULL);