test_OptimizerEvolutionary.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <gtest/gtest.h>
  2. #include <json.hpp>
  3. //#define private public
  4. #include "OptimizerEvolutionary.h"
  5. #include <ModuleMath.h>
  6. #include <ModuleSwitch.h>
  7. using namespace mdd;
  8. TEST(OptimizerEvolutionary, OptimizeSimpleFormula) {
  9. //optimize f(x)=a*b
  10. std::vector<std::string> inputs;
  11. std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
  12. inputs = f1->getInputIDs();
  13. limits limit;
  14. limit.min = { -10 };
  15. limit.max = { 10 };
  16. limit.step = { 1 };
  17. f1->getInput(inputs[0])->setLimits() = limit;
  18. f1->getInput(inputs[1])->setLimits() = limit;
  19. f1->getInput(inputs[0])->setOptimizability(true);
  20. f1->getInput(inputs[1])->setOptimizability(true);
  21. OptimizerEvolutionary optimizer(f1, 3);
  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::vector<std::string> inputs;
  30. std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
  31. inputs = f1->getInputIDs();
  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. OptimizerEvolutionary optimizer(f1, 3);
  42. optimizer.setEvaluation("out0");
  43. auto res = optimizer.update();
  44. //std::cout << res.dump() << std::endl;
  45. EXPECT_EQ(res[0][0] * res[1][0], -90);
  46. }
  47. TEST(OptimizerEvolutionary, exprtk) {
  48. json a;
  49. a["value"] = { 1,2,3 };
  50. exprtk::symbol_table<double> symbol_table;
  51. auto v = a["value"].get<std::vector<double>>();
  52. //std::cout << v[0] << "|" << v[1] << "|" << v[2] << std::endl;
  53. symbol_table.add_vector("in" + std::to_string(0), v);
  54. symbol_table.add_constants();
  55. exprtk::expression<double> _func_expr;
  56. _func_expr.register_symbol_table(symbol_table);
  57. exprtk::parser<double> parser;
  58. //"in0[1]==in0[1]"=>1
  59. //"in0[1]!=in0[1]"=>0
  60. //std::cout << _func_expr.value() << std::endl;
  61. //std::cout << res.dump() << std::endl;
  62. parser.compile("in0[1]==in0[1]", _func_expr);
  63. EXPECT_EQ(_func_expr.value(), 1);
  64. parser.compile("in0[1]!=in0[1]", _func_expr);
  65. EXPECT_EQ(_func_expr.value(), 0);
  66. }