void* problem_convert_to_osi(Problem *p) { int i; double rowLb, rowUb; OsiSolverInterface *solver = new OsiClpSolverInterface(); CoinBuild cb; solver->setIntParam(OsiNameDiscipline, 2); solver->messageHandler()->setLogLevel(0); solver->setHintParam(OsiDoReducePrint,true,OsiHintTry); for(i = 0; i < p->numCols; i++) { solver->addCol(0, NULL, NULL, p->colLb[i], p->colUb[i], p->objCoef[i]); solver->setColName(i, p->colName[i]); if(p->colType[i] == CONTINUOUS) solver->setContinuous(i); else solver->setInteger(i); } for(i = 0; i < p->numRows; i++) { switch(p->rowSense[i]) { case 'E': rowLb = p->rhs[i]; rowUb = p->rhs[i]; break; case 'L': rowLb = -p->infty; rowUb = p->rhs[i]; break; case 'G': rowLb = p->rhs[i]; rowUb = p->infty; break; default: fprintf(stderr, "Error: invalid type of constraint!\n"); exit(EXIT_FAILURE); } cb.addRow(p->rowNElements[i], p->idxsByRow[i], p->coefsByRow[i], rowLb, rowUb); } solver->addRows(cb); for(i = 0; i < p->numRows; i++) solver->setRowName(i, p->rowName[i]); return solver; }
OsiSolverInterface* cpropagation_preprocess(CPropagation *cp, int nindexes[]) { if(cp->varsToFix == 0) { /* printf("There are no variables to remove from the problem!\n"); */ return NULL; /* returns a pointer to original solver */ } const double *colLb = problem_vars_lower_bound(cp->problem), *colUb = problem_vars_upper_bound(cp->problem); const double *objCoef = problem_vars_obj_coefs(cp->problem); const char *ctype = problem_vars_type(cp->problem); double sumFixedObj = 0.0; /* stores the sum of objective coefficients of all variables fixed to 1 */ OsiSolverInterface *preProcSolver = new OsiClpSolverInterface(); preProcSolver->setIntParam(OsiNameDiscipline, 2); preProcSolver->messageHandler()->setLogLevel(0); preProcSolver->setHintParam(OsiDoReducePrint,true,OsiHintTry); //preProcSolver->setObjName(cp->solver->getObjName()); for(int i = 0, j = 0; i < problem_num_cols(cp->problem); i++) { nindexes[i] = -1; if(cp->isToFix[i] == UNFIXED) { preProcSolver->addCol(0, NULL, NULL, colLb[i], colUb[i], objCoef[i]); preProcSolver->setColName(j, problem_var_name(cp->problem, i)); if(problem_var_type(cp->problem, i) == CONTINUOUS) preProcSolver->setContinuous(j); else preProcSolver->setInteger(j); nindexes[i] = j++; } else if(cp->isToFix[i] == ACTIVATE) sumFixedObj += objCoef[i]; } if(fabs(sumFixedObj) > EPS) { /* adding a variable with cost equals to the sum of all coefficients of variables fixed to 1 */ preProcSolver->addCol(0, NULL, NULL, 1.0, 1.0, sumFixedObj); preProcSolver->setColName(preProcSolver->getNumCols()-1, "sumFixedObj"); preProcSolver->setInteger(preProcSolver->getNumCols()-1); } for(int idxRow = 0; idxRow < problem_num_rows(cp->problem); idxRow++) { const int nElements = problem_row_size(cp->problem, idxRow); const int *idxs = problem_row_idxs(cp->problem, idxRow); const double *coefs = problem_row_coefs(cp->problem, idxRow); vector< int > vidx; vidx.reserve(problem_num_cols(cp->problem)); vector< double > vcoef; vcoef.reserve(problem_num_cols(cp->problem)); double activeCoefs = 0.0; for(int i = 0; i < nElements; i++) { if(cp->isToFix[idxs[i]] == UNFIXED) { assert(nindexes[idxs[i]] >= 0 && nindexes[idxs[i]] < problem_num_cols(cp->problem)); vidx.push_back(nindexes[idxs[i]]); vcoef.push_back(coefs[i]); } else if(cp->isToFix[idxs[i]] == ACTIVATE) activeCoefs += coefs[i]; } if(!vidx.empty()) { double rlb, rub; const char sense = problem_row_sense(cp->problem, idxRow); if(sense == 'E') { rlb = problem_row_rhs(cp->problem, idxRow) - activeCoefs; rub = problem_row_rhs(cp->problem, idxRow) - activeCoefs; } else if(sense == 'L') { rlb = preProcSolver->getInfinity(); rub = problem_row_rhs(cp->problem, idxRow) - activeCoefs; } else if(sense == 'G') { rlb = problem_row_rhs(cp->problem, idxRow) - activeCoefs; rub = preProcSolver->getInfinity(); } else { fprintf(stderr, "Error: invalid type of constraint!\n"); exit(EXIT_FAILURE); } preProcSolver->addRow((int)vcoef.size(), &vidx[0], &vcoef[0], rlb, rub); preProcSolver->setRowName(idxRow, problem_row_name(cp->problem, idxRow)); } } return preProcSolver; }