|
@@ -65,6 +65,7 @@ namespace mdd{
|
|
//std::cout << "get: " << i << ": " << _output_vals[i] << std::endl;
|
|
//std::cout << "get: " << i << ": " << _output_vals[i] << std::endl;
|
|
}
|
|
}
|
|
ret.opt_value = _func_expr.value();
|
|
ret.opt_value = _func_expr.value();
|
|
|
|
+ ret.fullfill_restriction = (bool)_func_restirct_expr.value();
|
|
//std::cout << "get: " << "opt" << ": " << ret.opt_value << std::endl;
|
|
//std::cout << "get: " << "opt" << ": " << ret.opt_value << std::endl;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -90,9 +91,13 @@ namespace mdd{
|
|
json jevalue;
|
|
json jevalue;
|
|
jevalue["value"] = "";
|
|
jevalue["value"] = "";
|
|
|
|
|
|
|
|
+ json jrestrict;
|
|
|
|
+ jrestrict["value"] = "true";
|
|
|
|
+
|
|
json jsub;
|
|
json jsub;
|
|
jsub["state"] = jstate;
|
|
jsub["state"] = jstate;
|
|
jsub["evaluate"] = jevalue;
|
|
jsub["evaluate"] = jevalue;
|
|
|
|
+ jsub["restriction"] = jrestrict;
|
|
_base_config["optimizer"] = jsub;
|
|
_base_config["optimizer"] = jsub;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -133,6 +138,22 @@ namespace mdd{
|
|
exprtk::parser<double> parser;
|
|
exprtk::parser<double> parser;
|
|
return parser.compile(func, _func_expr);
|
|
return parser.compile(func, _func_expr);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ bool OptimizerBase::setRestriction(std::string func)
|
|
|
|
+ {
|
|
|
|
+ updateLayout();
|
|
|
|
+ exprtk::symbol_table<double> symbol_table;
|
|
|
|
+ for (size_t i = 0; i < _output_vals.size(); ++i)
|
|
|
|
+ {
|
|
|
|
+ symbol_table.add_variable("out" + std::to_string(i), _output_vals[i]);
|
|
|
|
+ }
|
|
|
|
+ symbol_table.add_constants();
|
|
|
|
+
|
|
|
|
+ _func_restirct_expr.register_symbol_table(symbol_table);
|
|
|
|
+
|
|
|
|
+ exprtk::parser<double> parser;
|
|
|
|
+ return parser.compile(func, _func_restirct_expr);
|
|
|
|
+ }
|
|
|
|
|
|
bool OptimizerBase::configure(const json& config) {
|
|
bool OptimizerBase::configure(const json& config) {
|
|
json jconfig = config;
|
|
json jconfig = config;
|
|
@@ -168,6 +189,12 @@ namespace mdd{
|
|
_base_config["optimizer"]["evaluate"]["value"] = (*jstate_it)["value"].get<std::string>();
|
|
_base_config["optimizer"]["evaluate"]["value"] = (*jstate_it)["value"].get<std::string>();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ jstate_it = jit->find("restriction");
|
|
|
|
+ if (jstate_it != jit->end()) {
|
|
|
|
+ updateLayout();
|
|
|
|
+ setRestriction((*jstate_it)["value"].get<std::string>());
|
|
|
|
+ _base_config["optimizer"]["restriction"]["value"] = (*jstate_it)["value"].get<std::string>();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
jit = jconfig.find("configure");
|
|
jit = jconfig.find("configure");
|
|
if (jit != jconfig.end())
|
|
if (jit != jconfig.end())
|
|
@@ -245,13 +272,32 @@ namespace mdd{
|
|
_callback(jcall);
|
|
_callback(jcall);
|
|
}
|
|
}
|
|
|
|
|
|
- void OptimizerBase::callback_evaluate_opt(const Permutation& per) {
|
|
|
|
|
|
+ void OptimizerBase::callback_evaluate_opt(const Permutation& per, bool sql) {
|
|
json ret;
|
|
json ret;
|
|
ret["step"] = step;
|
|
ret["step"] = step;
|
|
-
|
|
|
|
- json jind = Permutation_to_JSON(per);
|
|
|
|
- jind["processor"] = _module->dump();
|
|
|
|
- changePermutation(jind);
|
|
|
|
|
|
+ json jind;
|
|
|
|
+ if (sql)
|
|
|
|
+ {
|
|
|
|
+ jind = Permutation_to_JSON(per);
|
|
|
|
+ jind["processor"] = _module->dump();
|
|
|
|
+ std::vector< std::vector<double>> outs;
|
|
|
|
+ for (size_t i = 0; i < _output_vals.size(); ++i)
|
|
|
|
+ {
|
|
|
|
+ outs.push_back(_outputs[i]->getValue());
|
|
|
|
+ //std::cout << "get: " << i << ": " << _output_vals[i] << std::endl;
|
|
|
|
+ if (_outputs[i]->getValue()[0] != per.fitness)
|
|
|
|
+ {
|
|
|
|
+ int test = 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ jind["outputs"] = outs;
|
|
|
|
+ changePermutation(jind);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ jind = findPermutationJSON(per.dna);
|
|
|
|
+ }
|
|
|
|
+
|
|
ret["permutation"] = jind;
|
|
ret["permutation"] = jind;
|
|
json jcall;
|
|
json jcall;
|
|
jcall["operation"] = "change";
|
|
jcall["operation"] = "change";
|
|
@@ -384,6 +430,7 @@ namespace mdd{
|
|
json ret;
|
|
json ret;
|
|
ret["dna"] = per.dna;
|
|
ret["dna"] = per.dna;
|
|
ret["fitness"] = per.fitness;
|
|
ret["fitness"] = per.fitness;
|
|
|
|
+ ret["accepted"] = per.accepted;
|
|
ret["status"] = per.status;
|
|
ret["status"] = per.status;
|
|
ret["time"] = per.time;
|
|
ret["time"] = per.time;
|
|
return ret;
|
|
return ret;
|
|
@@ -409,12 +456,21 @@ namespace mdd{
|
|
|
|
|
|
jval = json::parse(jelem["fitness"].get<std::string>());
|
|
jval = json::parse(jelem["fitness"].get<std::string>());
|
|
per.fitness = jval.get<double>();
|
|
per.fitness = jval.get<double>();
|
|
- auto it = jelem.find("status");
|
|
|
|
|
|
+
|
|
|
|
+ auto it = jelem.find("accepted");
|
|
|
|
+ if (it != jelem.end())
|
|
|
|
+ {
|
|
|
|
+ jval = json::parse(it->get<std::string>());
|
|
|
|
+ per.accepted = jval.get<bool>();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ it = jelem.find("status");
|
|
if (it != jelem.end())
|
|
if (it != jelem.end())
|
|
{
|
|
{
|
|
jval = json::parse(it->get<std::string>());
|
|
jval = json::parse(it->get<std::string>());
|
|
per.status = jval.get<state>();
|
|
per.status = jval.get<state>();
|
|
}
|
|
}
|
|
|
|
+
|
|
it = jelem.find("time");
|
|
it = jelem.find("time");
|
|
if (it != jelem.end())
|
|
if (it != jelem.end())
|
|
{
|
|
{
|
|
@@ -440,6 +496,8 @@ namespace mdd{
|
|
sql = "CREATE TABLE PERMUTATIONS(" \
|
|
sql = "CREATE TABLE PERMUTATIONS(" \
|
|
"dna TEXT NOT NULL PRIMARY KEY," \
|
|
"dna TEXT NOT NULL PRIMARY KEY," \
|
|
"fitness FLOAT," \
|
|
"fitness FLOAT," \
|
|
|
|
+ "accepted TEXT," \
|
|
|
|
+ "outputs TEXT," \
|
|
"time FLOAT," \
|
|
"time FLOAT," \
|
|
"status TEXT," \
|
|
"status TEXT," \
|
|
"processor TEXT" \
|
|
"processor TEXT" \
|
|
@@ -545,7 +603,8 @@ namespace mdd{
|
|
else {
|
|
else {
|
|
sval += jper["dna"].dump();
|
|
sval += jper["dna"].dump();
|
|
}
|
|
}
|
|
- sval += "', " + jper["fitness"].dump() + ", " + jper["time"].dump() + ", " + jper["status"].dump();
|
|
|
|
|
|
+ sval += "', " + jper["fitness"].dump() + ", " + jper["accepted"].dump();
|
|
|
|
+ sval += ", " + jper["time"].dump() + ", " + jper["status"].dump();
|
|
auto it = jper.find("processor");
|
|
auto it = jper.find("processor");
|
|
if (it != jper.end())
|
|
if (it != jper.end())
|
|
{
|
|
{
|
|
@@ -561,9 +620,24 @@ namespace mdd{
|
|
{
|
|
{
|
|
sval += ", NULL";
|
|
sval += ", NULL";
|
|
}
|
|
}
|
|
|
|
+ it = jper.find("outputs");
|
|
|
|
+ if (it != jper.end())
|
|
|
|
+ {
|
|
|
|
+ if (it->is_string())
|
|
|
|
+ {
|
|
|
|
+ sval += ", '" + it->get<std::string>() + "'";
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ sval += ", '" + it->dump() + "'";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ sval += ", NULL";
|
|
|
|
+ }
|
|
|
|
|
|
std::string sql;
|
|
std::string sql;
|
|
- sql = "INSERT INTO PERMUTATIONS (dna, fitness, time, status, processor) "\
|
|
|
|
|
|
+ sql = "INSERT INTO PERMUTATIONS (dna, fitness, accepted, time, status, processor, outputs) "\
|
|
"VALUES (" + sval + "); ";
|
|
"VALUES (" + sval + "); ";
|
|
|
|
|
|
return exec_sql(sql);
|
|
return exec_sql(sql);
|
|
@@ -578,12 +652,18 @@ namespace mdd{
|
|
|
|
|
|
bool OptimizerBase::changePermutation(const json& jper) {
|
|
bool OptimizerBase::changePermutation(const json& jper) {
|
|
//std::to_string((char)(per.status))
|
|
//std::to_string((char)(per.status))
|
|
- std::string sval = "fitness = " + jper["fitness"].dump() + ", time = " + jper["time"].dump() + ", status = " + jper["status"].dump();
|
|
|
|
|
|
+ std::string sval = "fitness = " + jper["fitness"].dump() + ", accepted = '" +jper["accepted"].dump()+"'";
|
|
|
|
+ sval += ", time = " + jper["time"].dump() + ", status = " + jper["status"].dump();
|
|
auto it = jper.find("processor");
|
|
auto it = jper.find("processor");
|
|
if (it != jper.end())
|
|
if (it != jper.end())
|
|
{
|
|
{
|
|
sval += ", processor = '" + it->dump() + "' ";
|
|
sval += ", processor = '" + it->dump() + "' ";
|
|
}
|
|
}
|
|
|
|
+ it = jper.find("outputs");
|
|
|
|
+ if (it != jper.end())
|
|
|
|
+ {
|
|
|
|
+ sval += ", outputs = '" + it->dump() + "' ";
|
|
|
|
+ }
|
|
std::string sql;
|
|
std::string sql;
|
|
sql = "UPDATE PERMUTATIONS "\
|
|
sql = "UPDATE PERMUTATIONS "\
|
|
"SET " + sval + " "+
|
|
"SET " + sval + " "+
|
|
@@ -596,7 +676,7 @@ namespace mdd{
|
|
json jdna;
|
|
json jdna;
|
|
jdna = dna;
|
|
jdna = dna;
|
|
std::string sql = "SELECT * FROM PERMUTATIONS "\
|
|
std::string sql = "SELECT * FROM PERMUTATIONS "\
|
|
- "WHERE dna = '" + jdna.dump() + "' AND status = " + std::to_string((char)(state::CHANGED)) + "; ";
|
|
|
|
|
|
+ "WHERE dna = '" + jdna.dump() + "' AND NOT time = 0 AND NOT status = " + std::to_string((char)(state::STATE_ERROR)) + "; ";
|
|
json ret;
|
|
json ret;
|
|
ret = exec_sql_with_callback(sql);
|
|
ret = exec_sql_with_callback(sql);
|
|
if (ret != nullptr)
|
|
if (ret != nullptr)
|
|
@@ -606,10 +686,18 @@ namespace mdd{
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ json OptimizerBase::findPermutationJSON(std::vector<std::vector<double>> dna) {
|
|
|
|
+ json jdna;
|
|
|
|
+ jdna = dna;
|
|
|
|
+ std::string sql = "SELECT * FROM PERMUTATIONS "\
|
|
|
|
+ "WHERE dna = '" + jdna.dump() + "'; ";
|
|
|
|
+ return exec_sql_with_callback(sql);
|
|
|
|
+ }
|
|
|
|
+
|
|
std::shared_ptr<OptimizerBase::Permutation> OptimizerBase::getPermutation(int step, std::vector<std::vector<double>> dna) {
|
|
std::shared_ptr<OptimizerBase::Permutation> OptimizerBase::getPermutation(int step, std::vector<std::vector<double>> dna) {
|
|
json jdna;
|
|
json jdna;
|
|
jdna = dna;
|
|
jdna = dna;
|
|
- std::string sql = "SELECT p.dna, p.fitness, p.time, p.status FROM PERMUTATIONS AS p "\
|
|
|
|
|
|
+ std::string sql = "SELECT * FROM PERMUTATIONS AS p "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna "\
|
|
"WHERE s.step = " + std::to_string(step) + " AND s.dna = '" + jdna.dump() + "';";
|
|
"WHERE s.step = " + std::to_string(step) + " AND s.dna = '" + jdna.dump() + "';";
|
|
json ret = exec_sql_with_callback(sql);
|
|
json ret = exec_sql_with_callback(sql);
|
|
@@ -622,7 +710,7 @@ namespace mdd{
|
|
|
|
|
|
json OptimizerBase::getPermutations() {
|
|
json OptimizerBase::getPermutations() {
|
|
std::string sql;
|
|
std::string sql;
|
|
- sql = "SELECT s.step, p.dna, p.fitness, p.time, p.status, p.processor FROM PERMUTATIONS AS p "\
|
|
|
|
|
|
+ sql = "SELECT s.step, p.dna, p.fitness, p.accepted, p.time, p.status, p.outputs, p.processor FROM PERMUTATIONS AS p "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna; ";
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna; ";
|
|
json ret = exec_sql_with_callback(sql);
|
|
json ret = exec_sql_with_callback(sql);
|
|
|
|
|
|
@@ -631,13 +719,13 @@ namespace mdd{
|
|
|
|
|
|
std::vector<OptimizerBase::Permutation> OptimizerBase::findBest(int step) {
|
|
std::vector<OptimizerBase::Permutation> OptimizerBase::findBest(int step) {
|
|
std::string sql = "SELECT * FROM PERMUTATIONS "\
|
|
std::string sql = "SELECT * FROM PERMUTATIONS "\
|
|
- "WHERE dna = ("\
|
|
|
|
|
|
+ "WHERE dna IN ("\
|
|
"SELECT p.dna FROM PERMUTATIONS AS p "\
|
|
"SELECT p.dna FROM PERMUTATIONS AS p "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna "\
|
|
- "WHERE s.step = " + std::to_string(step) +" AND ROUND(p.fitness,3) = ( "\
|
|
|
|
- "SELECT MIN(ROUND(p.fitness,3)) FROM PERMUTATIONS AS p "\
|
|
|
|
|
|
+ "WHERE s.step = " + std::to_string(step) +" AND p.accepted = 'true'" +" AND ROUND(p.fitness," + std::to_string(_precision) + ") = ( "\
|
|
|
|
+ "SELECT MIN(ROUND(p.fitness,"+ std::to_string(_precision) +")) FROM PERMUTATIONS AS p "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna "\
|
|
"LEFT JOIN STEPS AS s ON s.dna = p.dna "\
|
|
- "WHERE s.step = " + std::to_string(step)+"));";
|
|
|
|
|
|
+ "WHERE s.step = " + std::to_string(step)+" AND p.accepted = 'true'));";
|
|
json ret = exec_sql_with_callback(sql);
|
|
json ret = exec_sql_with_callback(sql);
|
|
std::vector<Permutation> vec;
|
|
std::vector<Permutation> vec;
|
|
if (ret.is_array())
|
|
if (ret.is_array())
|