test_OptimizerEvolutionary.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. OptimizerEvolutionary optimizer(f1, 3);
  13. inputs = f1->getInputIDs();
  14. json limit;
  15. limit["min"] = { -10 };
  16. limit["max"] = { 10 };
  17. limit["step"] = { 1 };
  18. optimizer.addModifier(inputs[0], limit);
  19. optimizer.addModifier(inputs[1], limit);
  20. optimizer.addReader(f1->getOutputIDs()[0]);
  21. optimizer.setEvaluation("out0");
  22. json res = optimizer.update();
  23. //std::cout << res.dump() << std::endl;
  24. EXPECT_EQ(res[0]["value"][0].get<int>()* res[1]["value"][0].get<int>(),-100);
  25. }
  26. TEST(OptimizerEvolutionary, OptimizeSimpleFormulaWithSimpleRestriction) {
  27. //optimize f(x)=a*b
  28. std::vector<std::string> inputs;
  29. std::shared_ptr<ModuleMath> f1 = std::make_shared<ModuleMath>(MathOperation::MULTIPLY);
  30. OptimizerEvolutionary optimizer(f1, 3);
  31. inputs = f1->getInputIDs();
  32. json limit;
  33. limit["min"] = { -10 };
  34. limit["max"] = { 10 };
  35. limit["step"] = { 1 };
  36. limit["rule"] = "val[0] != -10";
  37. optimizer.addModifier(inputs[0], limit);
  38. optimizer.addModifier(inputs[1], limit);
  39. optimizer.addReader(f1->getOutputIDs()[0]);
  40. optimizer.setEvaluation("out0");
  41. json res = optimizer.update();
  42. std::cout << res.dump() << std::endl;
  43. EXPECT_EQ(res[0]["value"][0].get<int>() * res[1]["value"][0].get<int>(), -90);
  44. }
  45. TEST(OptimizerEvolutionary, exprtk) {
  46. json a;
  47. a["value"] = { 1,2,3 };
  48. exprtk::symbol_table<double> symbol_table;
  49. auto v = a["value"].get<std::vector<double>>();
  50. std::cout << v[0] << "|" << v[1] << "|" << v[2] << std::endl;
  51. symbol_table.add_vector("in" + std::to_string(0), v);
  52. symbol_table.add_constants();
  53. exprtk::expression<double> _func_expr;
  54. _func_expr.register_symbol_table(symbol_table);
  55. exprtk::parser<double> parser;
  56. //"in0[1]==in0[1]"=>1
  57. //"in0[1]!=in0[1]"=>0
  58. //std::cout << _func_expr.value() << std::endl;
  59. //std::cout << res.dump() << std::endl;
  60. parser.compile("in0[1]==in0[1]", _func_expr);
  61. EXPECT_EQ(_func_expr.value(), 1);
  62. parser.compile("in0[1]!=in0[1]", _func_expr);
  63. EXPECT_EQ(_func_expr.value(), 0);
  64. }