|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
using namespace mdd;
|
|
|
TEST(OptimizerEvolutionary, OptimizeSimpleFormula) {
|
|
|
- //optimize f(x)=x^2
|
|
|
+ //optimize f(x)=a*b
|
|
|
std::vector<std::string> inputs;
|
|
|
std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
|
|
|
OptimizerEvolutionary optimizer(f1, 3);
|
|
@@ -25,3 +25,46 @@ TEST(OptimizerEvolutionary, OptimizeSimpleFormula) {
|
|
|
//std::cout << res.dump() << std::endl;
|
|
|
EXPECT_EQ(res[0]["value"][0].get<int>()* res[1]["value"][0].get<int>(),-100);
|
|
|
}
|
|
|
+
|
|
|
+TEST(OptimizerEvolutionary, OptimizeSimpleFormulaWithSimpleRestriction) {
|
|
|
+ //optimize f(x)=a*b
|
|
|
+ std::vector<std::string> inputs;
|
|
|
+ std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
|
|
|
+ OptimizerEvolutionary optimizer(f1, 3);
|
|
|
+ inputs = f1->getInputIDs();
|
|
|
+ json limit;
|
|
|
+ limit["min"] = { -10 };
|
|
|
+ limit["max"] = { 10 };
|
|
|
+ limit["step"] = { 1 };
|
|
|
+ limit["rule"] = "val[0] != -10";
|
|
|
+ optimizer.addModifier(inputs[0], limit);
|
|
|
+ optimizer.addModifier(inputs[1], limit);
|
|
|
+ optimizer.addReader(f1->getOutputIDs()[0]);
|
|
|
+ optimizer.setEvaluation("out0");
|
|
|
+ json res = optimizer.update();
|
|
|
+ std::cout << res.dump() << std::endl;
|
|
|
+ EXPECT_EQ(res[0]["value"][0].get<int>() * res[1]["value"][0].get<int>(), -90);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(OptimizerEvolutionary, exprtk) {
|
|
|
+ json a;
|
|
|
+ a["value"] = { 1,2,3 };
|
|
|
+ exprtk::symbol_table<double> symbol_table;
|
|
|
+ auto v = a["value"].get<std::vector<double>>();
|
|
|
+ std::cout << v[0] << "|" << v[1] << "|" << v[2] << std::endl;
|
|
|
+ symbol_table.add_vector("in" + std::to_string(0), v);
|
|
|
+ symbol_table.add_constants();
|
|
|
+ exprtk::expression<double> _func_expr;
|
|
|
+ _func_expr.register_symbol_table(symbol_table);
|
|
|
+
|
|
|
+ exprtk::parser<double> parser;
|
|
|
+ //"in0[1]==in0[1]"=>1
|
|
|
+ //"in0[1]!=in0[1]"=>0
|
|
|
+
|
|
|
+ //std::cout << _func_expr.value() << std::endl;
|
|
|
+ //std::cout << res.dump() << std::endl;
|
|
|
+ parser.compile("in0[1]==in0[1]", _func_expr);
|
|
|
+ EXPECT_EQ(_func_expr.value(), 1);
|
|
|
+ parser.compile("in0[1]!=in0[1]", _func_expr);
|
|
|
+ EXPECT_EQ(_func_expr.value(), 0);
|
|
|
+}
|