22 std::vector<double> coeffs,
23 std::vector<std::vector<double>> eqCoeffs,
24 std::vector<double> eqValue,
25 std::vector<std::vector<double>> ineqCoeffs,
26 std::vector<double> ineqValue)
30 size_t nbCol = columns.size();
31 size_t nbEqConst = eqCoeffs.size();
32 size_t nbIneqConst = ineqCoeffs.size();
35 const size_t nbRow = nbEqConst + nbIneqConst;
36 const size_t constrSize = nbCol*nbRow;
37 int *ia =
new int[1 + constrSize];
38 int *ja =
new int[1 + constrSize];
39 double *ar =
new double[1 + constrSize];
40 lp = glp_create_prob();
41 glp_set_prob_name(lp,
"MDP solver");
42 glp_set_obj_dir(lp, GLP_MIN);
43 glp_add_rows(lp, nbRow);
44 for (
size_t i = 0;
i < nbEqConst;
i++)
46 glp_set_row_name(lp,
i+1,
"");
47 glp_set_row_bnds(lp,
i+1, GLP_FX, eqValue[
i], eqValue[i]);
49 for (
size_t i = 0;
i < nbIneqConst;
i++)
51 glp_set_row_name(lp,
i+1+nbEqConst,
"");
52 glp_set_row_bnds(lp,
i+1+nbEqConst, GLP_UP, 0.0, ineqValue[
i]);
54 glp_add_cols(lp, nbCol);
55 for (
size_t i = 0;
i < nbCol;
i++)
57 glp_set_col_name(lp,
i+1,
"");
58 glp_set_col_bnds(lp,
i+1, GLP_LO, 0.0, 0.0);
62 glp_set_obj_coef(lp,
i+1, coeffs[
i]);
67 for (
size_t i = 1;
i <= nbEqConst;
i++)
69 for (
size_t j = 1; j <= nbCol; j++)
77 for (
size_t i = nbEqConst+1;
i <= nbRow;
i++)
80 for (
size_t j = 1; j <= nbCol; j++)
84 ar[
counter] = ineqCoeffs[
i-1-nbEqConst][j-1];
88 glp_load_matrix(lp, constrSize, ia, ja, ar);
94 objFunc = simplexSolve(lp, columns);
96 case LpAlgo::interiorPoint:
97 objFunc = interiorPointSolve(lp, columns);
100 throw std::runtime_error(
"Unknown LP algorithm");
116 double GlpkImplementation::simplexSolve(glp_prob *lp, std::vector<double>& columns)
118 glp_simplex(lp, NULL);
119 for (
size_t i = 0;
i < columns.size();
i++)
121 columns[
i] = glp_get_col_prim(lp,
i+1);
123 return glp_get_obj_val(lp);
127 double GlpkImplementation::interiorPointSolve(glp_prob *lp, std::vector<double>& columns)
129 glp_interior(lp, NULL);
130 for (
size_t i = 0;
i < columns.size();
i++)
132 columns[
i] = glp_ipt_col_prim(lp,
i+1);
134 return glp_ipt_obj_val(lp);
double solve(std::vector< double > &variables, std::vector< double > coeffs, std::vector< std::vector< double >> eqCoeffs, std::vector< double > eqValue, std::vector< std::vector< double >> ineqCoeffs, std::vector< double > ineqValue)