#include "OptimizerBase.h" namespace mdd{ OptimizerBase::opt_state OptimizerBase::updateReader() { opt_state ret; ret.module_state = _module->update(); if (ret.module_state != state::STATE_ERROR) { for (size_t i = 0; i < _output_vals.size(); ++i) { _output_vals[i] = _outputs[i]->getValue()["value"][0].get(); } ret.opt_value = _func_expr.value(); } return ret; } bool OptimizerBase::addModifier(std::string input_id, const json& limit) { if (_module != nullptr) { auto ptr = _module->getInput(input_id); if (ptr != nullptr) { _inputs.push_back(ptr); _input_limits.push_back(limit); return true; } } return false; } bool OptimizerBase::addReader(std::string output_id) { if (_module != nullptr) { auto ptr = _module->getOutput(output_id); if (ptr != nullptr) { _outputs.push_back(ptr); _output_vals.push_back(ptr->getValue()["value"][0].get()); return true; } } return false; } bool OptimizerBase::changeModifier(std::string input_id, const json& limit) { for (size_t i = 0; i < _inputs.size(); i++) { if (_inputs[i]->getID() == input_id) { _input_limits[i] = limit; } } } void OptimizerBase::removeModifier(std::string input_id) { for (auto it = _inputs.begin(); it != _inputs.end(); ++it) { if ((*it)->getID() == input_id) { _inputs.erase(it); } } } void OptimizerBase::removeReader(std::string output_id) { for (auto it = _outputs.begin(); it != _outputs.end(); ++it) { if ((*it)->getID() == output_id) { _outputs.erase(it); } } } bool OptimizerBase::setEvaluation(std::string func) { exprtk::symbol_table symbol_table; for (size_t i = 0; i < _output_vals.size(); ++i) { symbol_table.add_variable("o"+i, _output_vals[i]); } symbol_table.add_constants(); exprtk::expression expression; expression.register_symbol_table(symbol_table); exprtk::parser parser; return parser.compile(func, expression); } }