Made a bit more readable with Ivan
parent
e00c84227f
commit
2d9d3af8e8
|
@ -61,7 +61,7 @@ struct QPSParser::MPSGrammar: base_grammar {
|
||||||
void(
|
void(
|
||||||
bf::vector<Chars, Chars, Chars, Chars, Chars, Chars, Chars, double> const &)> addBound;
|
bf::vector<Chars, Chars, Chars, Chars, Chars, Chars, Chars, double> const &)> addBound;
|
||||||
boost::function<
|
boost::function<
|
||||||
void(bf::vector<Chars, Chars, Chars, Chars, Chars, Chars, Chars> const &)> addBoundFr;
|
void(bf::vector<Chars, Chars, Chars, Chars, Chars, Chars, Chars> const &)> addFreeBound;
|
||||||
MPSGrammar(QPSVisitor * rqp) :
|
MPSGrammar(QPSVisitor * rqp) :
|
||||||
base_grammar(start), rqp_(rqp), setName(
|
base_grammar(start), rqp_(rqp), setName(
|
||||||
boost::bind(&QPSVisitor::setName, rqp, ::_1)), addRow(
|
boost::bind(&QPSVisitor::setName, rqp, ::_1)), addRow(
|
||||||
|
@ -73,8 +73,8 @@ struct QPSParser::MPSGrammar: base_grammar {
|
||||||
boost::bind(&QPSVisitor::addColumn, rqp, ::_1)), colDouble(
|
boost::bind(&QPSVisitor::addColumn, rqp, ::_1)), colDouble(
|
||||||
boost::bind(&QPSVisitor::addColumnDouble, rqp, ::_1)), addQuadTerm(
|
boost::bind(&QPSVisitor::addColumnDouble, rqp, ::_1)), addQuadTerm(
|
||||||
boost::bind(&QPSVisitor::addQuadTerm, rqp, ::_1)), addBound(
|
boost::bind(&QPSVisitor::addQuadTerm, rqp, ::_1)), addBound(
|
||||||
boost::bind(&QPSVisitor::addBound, rqp, ::_1)), addBoundFr(
|
boost::bind(&QPSVisitor::addBound, rqp, ::_1)), addFreeBound(
|
||||||
boost::bind(&QPSVisitor::addBoundFr, rqp, ::_1)) {
|
boost::bind(&QPSVisitor::addFreeBound, rqp, ::_1)) {
|
||||||
using namespace boost::spirit;
|
using namespace boost::spirit;
|
||||||
using namespace boost::spirit::qi;
|
using namespace boost::spirit::qi;
|
||||||
character = lexeme[alnum | '_' | '-' | '.'];
|
character = lexeme[alnum | '_' | '-' | '.'];
|
||||||
|
@ -100,7 +100,7 @@ struct QPSParser::MPSGrammar: base_grammar {
|
||||||
bound = lexeme[(*blank >> word >> +blank >> word >> +blank >> word >> +blank
|
bound = lexeme[(*blank >> word >> +blank >> word >> +blank >> word >> +blank
|
||||||
>> double_)[addBound] >> *blank];
|
>> double_)[addBound] >> *blank];
|
||||||
bound_fr = lexeme[*blank >> word >> +blank >> word >> +blank >> word
|
bound_fr = lexeme[*blank >> word >> +blank >> word >> +blank >> word
|
||||||
>> *blank][addBoundFr];
|
>> *blank][addFreeBound];
|
||||||
rows = lexeme[lit("ROWS") >> *blank >> eol >> +(row >> eol)];
|
rows = lexeme[lit("ROWS") >> *blank >> eol >> +(row >> eol)];
|
||||||
rhs = lexeme[lit("RHS") >> *blank >> eol
|
rhs = lexeme[lit("RHS") >> *blank >> eol
|
||||||
>> +((rhs_double | rhs_single) >> eol)];
|
>> +((rhs_double | rhs_single) >> eol)];
|
||||||
|
|
|
@ -211,7 +211,7 @@ void QPSVisitor::addBound(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QPSVisitor::addBoundFr(
|
void QPSVisitor::addFreeBound(
|
||||||
boost::fusion::vector<vector<char>, vector<char>,
|
boost::fusion::vector<vector<char>, vector<char>,
|
||||||
vector<char>, vector<char>, vector<char>,
|
vector<char>, vector<char>, vector<char>,
|
||||||
vector<char>, vector<char>> const &vars) {
|
vector<char>, vector<char>> const &vars) {
|
||||||
|
@ -241,12 +241,15 @@ void QPSVisitor::addQuadTerm(
|
||||||
}
|
}
|
||||||
|
|
||||||
QP QPSVisitor::makeQP() {
|
QP QPSVisitor::makeQP() {
|
||||||
|
// Create the keys from the variable names
|
||||||
vector < Key > keys;
|
vector < Key > keys;
|
||||||
vector < Matrix > Gs;
|
|
||||||
vector < Vector > gs;
|
|
||||||
for (auto kv : varname_to_key) {
|
for (auto kv : varname_to_key) {
|
||||||
keys.push_back(kv.second);
|
keys.push_back(kv.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill the G matrices and g vectors from
|
||||||
|
vector < Matrix > Gs;
|
||||||
|
vector < Vector > gs;
|
||||||
sort(keys.begin(), keys.end());
|
sort(keys.begin(), keys.end());
|
||||||
for (unsigned int i = 0; i < keys.size(); ++i) {
|
for (unsigned int i = 0; i < keys.size(); ++i) {
|
||||||
for (unsigned int j = i; j < keys.size(); ++j) {
|
for (unsigned int j = i; j < keys.size(); ++j) {
|
||||||
|
@ -266,12 +269,14 @@ QP QPSVisitor::makeQP() {
|
||||||
gs.emplace_back(Z_1x1);
|
gs.emplace_back(Z_1x1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size_t dual_key_num = keys.size() + 1;
|
|
||||||
|
// Construct the quadratic program
|
||||||
QP madeQP;
|
QP madeQP;
|
||||||
auto obj = HessianFactor(keys, Gs, gs, 2 * f);
|
auto obj = HessianFactor(keys, Gs, gs, 2 * f);
|
||||||
|
|
||||||
madeQP.cost.push_back(obj);
|
madeQP.cost.push_back(obj);
|
||||||
|
|
||||||
|
// Add equality and inequality constraints into the QP
|
||||||
|
size_t dual_key_num = keys.size() + 1;
|
||||||
for (auto kv : E) {
|
for (auto kv : E) {
|
||||||
map < Key, Matrix11 > keyMatrixMapPos;
|
map < Key, Matrix11 > keyMatrixMapPos;
|
||||||
map < Key, Matrix11 > keyMatrixMapNeg;
|
map < Key, Matrix11 > keyMatrixMapNeg;
|
||||||
|
|
|
@ -104,7 +104,7 @@ public:
|
||||||
std::vector<char>, std::vector<char>, std::vector<char>,
|
std::vector<char>, std::vector<char>, std::vector<char>,
|
||||||
std::vector<char>, std::vector<char>, double> const & vars);
|
std::vector<char>, std::vector<char>, double> const & vars);
|
||||||
|
|
||||||
void addBoundFr(
|
void addFreeBound(
|
||||||
boost::fusion::vector<std::vector<char>, std::vector<char>,
|
boost::fusion::vector<std::vector<char>, std::vector<char>,
|
||||||
std::vector<char>, std::vector<char>, std::vector<char>,
|
std::vector<char>, std::vector<char>, std::vector<char>,
|
||||||
std::vector<char>, std::vector<char>> const & vars);
|
std::vector<char>, std::vector<char>> const & vars);
|
||||||
|
|
Loading…
Reference in New Issue