test_OptimizerEvolutionary.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <gtest/gtest.h>
  2. #include <json.hpp>
  3. //#define private public
  4. #include <Registration.h>
  5. /*
  6. using namespace mdd;
  7. TEST(OptimizerEvolutionary, OptimizeSimpleFormula) {
  8. //optimize f(x)=a*b
  9. std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
  10. auto inputs = f1->getInputIDs();
  11. auto outputs = f1->getOutputIDs();
  12. limits limit;
  13. limit.min = { -10 };
  14. limit.max = { 10 };
  15. limit.step = { 1 };
  16. f1->getInput(inputs[0])->setLimits() = limit;
  17. f1->getInput(inputs[1])->setLimits() = limit;
  18. f1->getInput(inputs[0])->setOptimizability(true);
  19. f1->getInput(inputs[1])->setOptimizability(true);
  20. f1->getOutput(outputs[0])->setOptimizability(true);
  21. OptimizerEvolutionary optimizer(f1, 5);
  22. optimizer.setEvaluation("out0");
  23. auto res = optimizer.update();
  24. //std::cout << res.dump() << std::endl;
  25. EXPECT_EQ(res[0][0]* res[1][0],-100);
  26. }
  27. TEST(OptimizerEvolutionary, OptimizeSimpleFormulaWithSimpleRestriction) {
  28. //optimize f(x)=a*b
  29. std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
  30. auto inputs = f1->getInputIDs();
  31. auto outputs = f1->getOutputIDs();
  32. limits limit;
  33. limit.min = { -10 };
  34. limit.max = { 10 };
  35. limit.step = { 1 };
  36. limit.rule = "val[0] != -10";
  37. f1->getInput(inputs[0])->setLimits() = limit;
  38. f1->getInput(inputs[1])->setLimits() = limit;
  39. f1->getInput(inputs[0])->setOptimizability(true);
  40. f1->getInput(inputs[1])->setOptimizability(true);
  41. f1->getOutput(outputs[0])->setOptimizability(true);
  42. OptimizerEvolutionary optimizer(f1, 3);
  43. optimizer.setEvaluation("out0");
  44. auto res = optimizer.update();
  45. //std::cout << res.dump() << std::endl;
  46. EXPECT_EQ(res[0][0] * res[1][0], -90);
  47. }
  48. TEST(OptimizerEvolutionary, exprtk) {
  49. json a;
  50. a["value"] = { 1,2,3 };
  51. exprtk::symbol_table<double> symbol_table;
  52. auto v = a["value"].get<std::vector<double>>();
  53. //std::cout << v[0] << "|" << v[1] << "|" << v[2] << std::endl;
  54. symbol_table.add_vector("in" + std::to_string(0), v);
  55. symbol_table.add_constants();
  56. exprtk::expression<double> _func_expr;
  57. _func_expr.register_symbol_table(symbol_table);
  58. exprtk::parser<double> parser;
  59. //"in0[1]==in0[1]"=>1
  60. //"in0[1]!=in0[1]"=>0
  61. //std::cout << _func_expr.value() << std::endl;
  62. //std::cout << res.dump() << std::endl;
  63. parser.compile("in0[1]==in0[1]", _func_expr);
  64. EXPECT_EQ(_func_expr.value(), 1);
  65. parser.compile("in0[1]!=in0[1]", _func_expr);
  66. EXPECT_EQ(_func_expr.value(), 0);
  67. }*/