Browse Source

evol rules work

Willi Zschiebsch 5 years ago
parent
commit
f70e145751

+ 11 - 2
lib/src/OptimizerEvolutionary.cpp

@@ -154,8 +154,17 @@ namespace mdd {
 				
 				if (limit.contains("rule")) {
 					//use rule to check
-					std::cout << "ERROR in GENE elements! (rule not implemented)" << std::endl;
-					check = false;
+					exprtk::symbol_table<double> symbol_table;
+					auto vec_temp = ret["value"].get<std::vector<double>>();
+					
+					symbol_table.add_vector("val", vec_temp);
+					symbol_table.add_constants();
+					exprtk::expression<double> func_expr;
+					func_expr.register_symbol_table(symbol_table);
+
+					exprtk::parser<double> parser;
+					parser.compile(limit["rule"], func_expr);
+					check = (bool)func_expr.value();
 				}
 			} while (!check);
 			return ret; 

+ 3 - 0
lib/test/CMakeLists.txt

@@ -7,4 +7,7 @@ add_executable(auslegung_test
         test_ProcessorStandard.cpp
         )
 target_link_libraries(auslegung_test gtest gtest_main ${PROJECT_NAME})
+if(WIN32)
+	target_compile_options(auslegung_test PRIVATE /bigobj)
+endif(WIN32)
 add_test(auslegung_test auslegung_test)

+ 44 - 1
lib/test/test_OptimizerEvolutionary.cpp

@@ -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);
+}