diff --git a/src/expressions/CMakeLists.txt b/src/expressions/CMakeLists.txt index f57e6e0aa8..cbfc850f00 100644 --- a/src/expressions/CMakeLists.txt +++ b/src/expressions/CMakeLists.txt @@ -12,7 +12,6 @@ set(SRC_Expressions visitors/CloneVisitor.cpp visitors/CompareVisitor.cpp visitors/EvalVisitor.cpp - visitors/EvaluationContext.cpp visitors/LinearityVisitor.cpp visitors/TimeIndexVisitor.cpp visitors/PrintVisitor.cpp @@ -52,7 +51,6 @@ set(SRC_Expressions include/antares/expressions/visitors/CloneVisitor.h include/antares/expressions/visitors/CompareVisitor.h include/antares/expressions/visitors/EvalVisitor.h - include/antares/expressions/visitors/EvaluationContext.h include/antares/expressions/visitors/LinearStatus.h include/antares/expressions/visitors/LinearityVisitor.h include/antares/expressions/visitors/NodeVisitor.h diff --git a/src/expressions/include/antares/expressions/visitors/EvalVisitor.h b/src/expressions/include/antares/expressions/visitors/EvalVisitor.h index 9dcf3d377c..7bb0bc71c0 100644 --- a/src/expressions/include/antares/expressions/visitors/EvalVisitor.h +++ b/src/expressions/include/antares/expressions/visitors/EvalVisitor.h @@ -20,7 +20,6 @@ */ #pragma once -#include #include "antares/expressions/visitors/NodeVisitor.h" namespace Antares::Expressions::Visitors @@ -45,20 +44,13 @@ class EvalVisitor: public NodeVisitor { public: /** - * @brief Default constructor, creates an evaluation visitor with no context. + * @brief Default constructor */ - EvalVisitor() = default; // No context (variables / parameters) + EvalVisitor() = default; - /** - * @brief Constructs an evaluation visitor with the specified context. - * - * @param context The evaluation context. - */ - explicit EvalVisitor(EvaluationContext context); std::string name() const override; private: - const EvaluationContext context_; double visit(const Nodes::SumNode* node) override; double visit(const Nodes::SubtractionNode* node) override; double visit(const Nodes::MultiplicationNode* node) override; diff --git a/src/expressions/include/antares/expressions/visitors/EvaluationContext.h b/src/expressions/include/antares/expressions/visitors/EvaluationContext.h deleted file mode 100644 index ad12ca4517..0000000000 --- a/src/expressions/include/antares/expressions/visitors/EvaluationContext.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include -#include - -namespace Antares::Expressions::Visitors -{ -/** - * @brief Represents the context for evaluating expressions. - * - * Stores and provides access to parameter and variable values. - */ -class EvaluationContext -{ -public: - /** - * @brief Default constructor, creates an evaluation context without parameter and variable - * values. - */ - EvaluationContext() = default; - /** - * @brief Constructs an evaluation context with the specified parameter and variable - * values. - * - * @param parameters parameter values. - * @param variables variable values. - */ - explicit EvaluationContext(std::map parameters, - std::map variables); - - /** - * @brief Retrieves the value of a variable. - * - * @param name The name of the variable. - * @return The value of the variable. - * @throws std::out_of_range If the variable is not found. - */ - double getVariableValue(const std::string& key) const; - - /** - * @brief Retrieves the value of a parameter. - * - * @param name The name of the parameter. - * @return The value of the parameter. - * @throws std::out_of_range If the parameter is not found. - */ - double getParameterValue(const std::string& key) const; - -private: - /** - * @brief A map storing parameter values. - */ - std::map parameters_; - - /** - * @brief A map storing variable values. - */ - std::map variables_; -}; - -} // namespace Antares::Expressions::Visitors diff --git a/src/expressions/visitors/EvalVisitor.cpp b/src/expressions/visitors/EvalVisitor.cpp index 29cbf430b9..f540ac60cb 100644 --- a/src/expressions/visitors/EvalVisitor.cpp +++ b/src/expressions/visitors/EvalVisitor.cpp @@ -28,10 +28,6 @@ namespace Antares::Expressions::Visitors { -EvalVisitor::EvalVisitor(EvaluationContext context): - context_(std::move(context)) -{ -} double EvalVisitor::visit(const Nodes::SumNode* node) { @@ -90,12 +86,12 @@ double EvalVisitor::visit(const Nodes::GreaterThanOrEqualNode* node) double EvalVisitor::visit(const Nodes::VariableNode* node) { - return context_.getVariableValue(node->value()); + throw EvalVisitorNotImplemented(name(), node->name()); } double EvalVisitor::visit(const Nodes::ParameterNode* node) { - return context_.getParameterValue(node->value()); + throw EvalVisitorNotImplemented(name(), node->name()); } double EvalVisitor::visit(const Nodes::LiteralNode* node) diff --git a/src/expressions/visitors/EvaluationContext.cpp b/src/expressions/visitors/EvaluationContext.cpp deleted file mode 100644 index 96870c4e39..0000000000 --- a/src/expressions/visitors/EvaluationContext.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -namespace Antares::Expressions::Visitors -{ -EvaluationContext::EvaluationContext(std::map parameters, - std::map variables): - parameters_(std::move(parameters)), - variables_(std::move(variables)) -{ -} - -double EvaluationContext::getVariableValue(const std::string& key) const -{ - return variables_.at(key); -} - -double EvaluationContext::getParameterValue(const std::string& key) const -{ - return parameters_.at(key); -} -} // namespace Antares::Expressions::Visitors diff --git a/src/solver/optim-model-filler/ComponentFiller.cpp b/src/solver/optim-model-filler/ComponentFiller.cpp index 4a2ae4dca0..283e46f7eb 100644 --- a/src/solver/optim-model-filler/ComponentFiller.cpp +++ b/src/solver/optim-model-filler/ComponentFiller.cpp @@ -33,7 +33,6 @@ namespace Antares::Optimization ComponentFiller::ComponentFiller(const Study::SystemModel::Component& component): component_(component), - evaluationContext_(component_.getParameterValues(), {}), modelVariable_(component.Variables()) { @@ -54,7 +53,7 @@ void ComponentFiller::addVariables(Optimisation::LinearProblemApi::ILinearProble return; } - Expressions::Visitors::EvalVisitor evaluator(evaluationContext_); + Expressions::Visitors::EvalVisitor evaluator{}; for (const auto& variable: component_.Variables() | std::views::values) { if (variable.isTimeDependent()) @@ -124,7 +123,7 @@ void ComponentFiller::addConstraints(Optimisation::LinearProblemApi::ILinearProb Optimisation::LinearProblemApi::ILinearProblemData& data, Optimisation::LinearProblemApi::FillContext& ctx) { - ReadLinearConstraintVisitor visitor(evaluationContext_); + ReadLinearConstraintVisitor visitor{}; for (const auto& constraint: component_.getConstraints() | std::views::values) { auto* root_node = constraint.expression().RootNode(); @@ -156,7 +155,7 @@ void ComponentFiller::addObjective(Optimisation::LinearProblemApi::ILinearProble { return; } - ReadLinearExpressionVisitor visitor(evaluationContext_); + ReadLinearExpressionVisitor visitor{}; auto linear_expression = visitor.dispatch(component_.Objective().RootNode()); if (abs(linear_expression.offset()) > 1e-10) { diff --git a/src/solver/optim-model-filler/ReadLinearConstraintVisitor.cpp b/src/solver/optim-model-filler/ReadLinearConstraintVisitor.cpp index 5643c67a8e..3fc0f9a763 100644 --- a/src/solver/optim-model-filler/ReadLinearConstraintVisitor.cpp +++ b/src/solver/optim-model-filler/ReadLinearConstraintVisitor.cpp @@ -28,12 +28,6 @@ using namespace Antares::Expressions::Nodes; namespace Antares::Optimization { -ReadLinearConstraintVisitor::ReadLinearConstraintVisitor( - Expressions::Visitors::EvaluationContext context): - linear_expression_visitor_(std::move(context)) -{ -} - std::string ReadLinearConstraintVisitor::name() const { return "ReadLinearConstraintVisitor"; diff --git a/src/solver/optim-model-filler/ReadLinearExpressionVisitor.cpp b/src/solver/optim-model-filler/ReadLinearExpressionVisitor.cpp index 2634d05fe0..91c49b4b12 100644 --- a/src/solver/optim-model-filler/ReadLinearExpressionVisitor.cpp +++ b/src/solver/optim-model-filler/ReadLinearExpressionVisitor.cpp @@ -22,7 +22,6 @@ #include #include -#include #include #include @@ -31,12 +30,6 @@ using namespace Antares::Expressions::Nodes; namespace Antares::Optimization { -ReadLinearExpressionVisitor::ReadLinearExpressionVisitor( - Expressions::Visitors::EvaluationContext context): - context_(std::move(context)) -{ -} - std::string ReadLinearExpressionVisitor::name() const { return "ReadLinearExpressionVisitor"; @@ -94,7 +87,7 @@ LinearExpression ReadLinearExpressionVisitor::visit(const VariableNode* node) LinearExpression ReadLinearExpressionVisitor::visit(const ParameterNode* node) { - return {context_.getParameterValue(node->value()), {}}; + throw std::invalid_argument("ReadLinearExpressionVisitor cannot visit ParameterNode"); } LinearExpression ReadLinearExpressionVisitor::visit(const LiteralNode* node) diff --git a/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ComponentFiller.h b/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ComponentFiller.h index 09ca350b51..c2557af13e 100644 --- a/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ComponentFiller.h +++ b/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ComponentFiller.h @@ -23,7 +23,6 @@ #include #include -#include "antares/expressions/visitors/EvaluationContext.h" #include "ReadLinearConstraintVisitor.h" @@ -79,7 +78,6 @@ class ComponentFiller: public Optimisation::LinearProblemApi::LinearProblemFille bool IsThisVariableTimeDependent(const std::string& var_id) const; const Study::SystemModel::Component& component_; - Expressions::Visitors::EvaluationContext evaluationContext_; const std::map& modelVariable_; }; } // namespace Antares::Optimization diff --git a/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ReadLinearConstraintVisitor.h b/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ReadLinearConstraintVisitor.h index 0c6342061b..608b63a2ee 100644 --- a/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ReadLinearConstraintVisitor.h +++ b/src/solver/optim-model-filler/include/antares/solver/optim-model-filler/ReadLinearConstraintVisitor.h @@ -23,7 +23,6 @@ #include -#include #include #include "ReadLinearExpressionVisitor.h" @@ -54,7 +53,6 @@ class ReadLinearConstraintVisitor: public Expressions::Visitors::NodeVisitor #include #include @@ -38,11 +37,9 @@ class ReadLinearExpressionVisitor: public Expressions::Visitors::NodeVisitor) BOOST_CHECK_EQUAL(printed, "august.2024"); } -BOOST_FIXTURE_TEST_CASE(evaluate_param, Registry) -{ - ParameterNode root("my-param"); - const double value = 221.3; - EvaluationContext context({{"my-param", value}}, {}); - - EvalVisitor evalVisitor(context); - const double eval = evalVisitor.dispatch(&root); - - BOOST_CHECK_EQUAL(value, eval); -} - -BOOST_FIXTURE_TEST_CASE(evaluate_variable, Registry) -{ - VariableNode root("my-variable"); - const double value = 221.3; - EvaluationContext context({}, {{"my-variable", value}}); - - EvalVisitor evalVisitor(context); - const double eval = evalVisitor.dispatch(&root); - - BOOST_CHECK_EQUAL(value, eval); -} +// BOOST_FIXTURE_TEST_CASE(evaluate_param, Registry) +// { +// ParameterNode root("my-param"); +// const double value = 221.3; +// EvaluationContext context({{"my-param", value}}, {}); +// +// EvalVisitor evalVisitor(context); +// const double eval = evalVisitor.dispatch(&root); +// +// BOOST_CHECK_EQUAL(value, eval); +// } +// +// BOOST_FIXTURE_TEST_CASE(evaluate_variable, Registry) +// { +// VariableNode root("my-variable"); +// const double value = 221.3; +// EvaluationContext context({}, {{"my-variable", value}}); +// +// EvalVisitor evalVisitor(context); +// const double eval = evalVisitor.dispatch(&root); +// +// BOOST_CHECK_EQUAL(value, eval); +// } BOOST_FIXTURE_TEST_CASE(multiplication_node, Registry) { diff --git a/src/tests/src/solver/optim-model-filler/test_readLinearConstraintVisitor.cpp b/src/tests/src/solver/optim-model-filler/test_readLinearConstraintVisitor.cpp index ec638b32ef..58db958f00 100644 --- a/src/tests/src/solver/optim-model-filler/test_readLinearConstraintVisitor.cpp +++ b/src/tests/src/solver/optim-model-filler/test_readLinearConstraintVisitor.cpp @@ -43,63 +43,63 @@ BOOST_AUTO_TEST_CASE(test_name) BOOST_CHECK_EQUAL(visitor.name(), "ReadLinearConstraintVisitor"); } -BOOST_FIXTURE_TEST_CASE(test_visit_equal_node, Registry) -{ - // 5 + var1 = var2 + 3 * var1 - param1(9) ==> -2 * var1 - var2 = -14 - Node* lhs = create(create(5.), create("var1")); - Node* rhs = create(create("var2"), - create(create(3.), - create("var1")), - create(create("param1"))); - Node* node = create(lhs, rhs); - EvaluationContext context({{"param1", 9.}}, {}); - ReadLinearConstraintVisitor visitor(context); - auto constraint = visitor.dispatch(node); - BOOST_CHECK_EQUAL(constraint.lb, -14.); - BOOST_CHECK_EQUAL(constraint.ub, -14.); - BOOST_CHECK_EQUAL(constraint.coef_per_var.size(), 2); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var1"], -2); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var2"], -1); -} +// BOOST_FIXTURE_TEST_CASE(test_visit_equal_node, Registry) +// { +// // 5 + var1 = var2 + 3 * var1 - param1(9) ==> -2 * var1 - var2 = -14 +// Node* lhs = create(create(5.), create("var1")); +// Node* rhs = create(create("var2"), +// create(create(3.), +// create("var1")), +// create(create("param1"))); +// Node* node = create(lhs, rhs); +// EvaluationContext context({{"param1", 9.}}, {}); +// ReadLinearConstraintVisitor visitor(context); +// auto constraint = visitor.dispatch(node); +// BOOST_CHECK_EQUAL(constraint.lb, -14.); +// BOOST_CHECK_EQUAL(constraint.ub, -14.); +// BOOST_CHECK_EQUAL(constraint.coef_per_var.size(), 2); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var1"], -2); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var2"], -1); +// } -BOOST_FIXTURE_TEST_CASE(test_visit_less_than_or_equal_node, Registry) -{ - // -9 + var3 <= var1 + 5 * var2 - param1(10) ==> - var1 - 5 * var2 + var3 <= -1 - Node* lhs = create(create(-9.), create("var3")); - Node* rhs = create(create("var1"), - create(create(5.), - create("var2")), - create(create("param1"))); - Node* node = create(lhs, rhs); - EvaluationContext context({{"param1", 10.}}, {}); - ReadLinearConstraintVisitor visitor(context); - auto constraint = visitor.dispatch(node); - BOOST_CHECK_EQUAL(constraint.lb, -std::numeric_limits::infinity()); - BOOST_CHECK_EQUAL(constraint.ub, -1.); - BOOST_CHECK_EQUAL(constraint.coef_per_var.size(), 3); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var1"], -1); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var2"], -5); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var3"], 1); -} - -BOOST_FIXTURE_TEST_CASE(test_visit_greater_than_or_equal_node, Registry) -{ - // 5 + var1 >= var2 + 3 * var1 - param1(9) ==> -2 * var1 - var2 >= -14 - Node* lhs = create(create(5.), create("var1")); - Node* rhs = create(create("var2"), - create(create(3.), - create("var1")), - create(create("param1"))); - Node* node = create(lhs, rhs); - EvaluationContext context({{"param1", 9.}}, {}); - ReadLinearConstraintVisitor visitor(context); - auto constraint = visitor.dispatch(node); - BOOST_CHECK_EQUAL(constraint.lb, -14); - BOOST_CHECK_EQUAL(constraint.ub, std::numeric_limits::infinity()); - BOOST_CHECK_EQUAL(constraint.coef_per_var.size(), 2); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var1"], -2); - BOOST_CHECK_EQUAL(constraint.coef_per_var["var2"], -1); -} +// BOOST_FIXTURE_TEST_CASE(test_visit_less_than_or_equal_node, Registry) +// { +// // -9 + var3 <= var1 + 5 * var2 - param1(10) ==> - var1 - 5 * var2 + var3 <= -1 +// Node* lhs = create(create(-9.), create("var3")); +// Node* rhs = create(create("var1"), +// create(create(5.), +// create("var2")), +// create(create("param1"))); +// Node* node = create(lhs, rhs); +// EvaluationContext context({{"param1", 10.}}, {}); +// ReadLinearConstraintVisitor visitor(context); +// auto constraint = visitor.dispatch(node); +// BOOST_CHECK_EQUAL(constraint.lb, -std::numeric_limits::infinity()); +// BOOST_CHECK_EQUAL(constraint.ub, -1.); +// BOOST_CHECK_EQUAL(constraint.coef_per_var.size(), 3); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var1"], -1); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var2"], -5); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var3"], 1); +// } +// +// BOOST_FIXTURE_TEST_CASE(test_visit_greater_than_or_equal_node, Registry) +// { +// // 5 + var1 >= var2 + 3 * var1 - param1(9) ==> -2 * var1 - var2 >= -14 +// Node* lhs = create(create(5.), create("var1")); +// Node* rhs = create(create("var2"), +// create(create(3.), +// create("var1")), +// create(create("param1"))); +// Node* node = create(lhs, rhs); +// EvaluationContext context({{"param1", 9.}}, {}); +// ReadLinearConstraintVisitor visitor(context); +// auto constraint = visitor.dispatch(node); +// BOOST_CHECK_EQUAL(constraint.lb, -14); +// BOOST_CHECK_EQUAL(constraint.ub, std::numeric_limits::infinity()); +// BOOST_CHECK_EQUAL(constraint.coef_per_var.size(), 2); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var1"], -2); +// BOOST_CHECK_EQUAL(constraint.coef_per_var["var2"], -1); +// } BOOST_FIXTURE_TEST_CASE(test_visit_illegal_node, Registry) { diff --git a/src/tests/src/solver/optim-model-filler/test_readLinearExpressionVisitor.cpp b/src/tests/src/solver/optim-model-filler/test_readLinearExpressionVisitor.cpp index ce71430158..ab67a1da33 100644 --- a/src/tests/src/solver/optim-model-filler/test_readLinearExpressionVisitor.cpp +++ b/src/tests/src/solver/optim-model-filler/test_readLinearExpressionVisitor.cpp @@ -52,30 +52,30 @@ BOOST_FIXTURE_TEST_CASE(visit_literal, Registry) BOOST_CHECK(linear_expression.coefPerVar().empty()); } -BOOST_FIXTURE_TEST_CASE(visit_literal_plus_param, Registry) -{ - // 5 + param(3) = 8 - Node* sum = create(create(5.), create("param")); - EvaluationContext evaluation_context({{"param", 3.}}, {}); - ReadLinearExpressionVisitor visitor(evaluation_context); - auto linear_expression = visitor.dispatch(sum); - BOOST_CHECK_EQUAL(linear_expression.offset(), 8.); - BOOST_CHECK(linear_expression.coefPerVar().empty()); -} - -BOOST_FIXTURE_TEST_CASE(visit_literal_plus_param_plus_var, Registry) -{ - // 60 + param(-5) + 7 * var = { 55, {var : 7} } - Node* product = create(create(7.), - create("var")); - Node* sum = create(create(60.), create("param"), product); - EvaluationContext evaluation_context({{"param", -5.}}, {}); - ReadLinearExpressionVisitor visitor(evaluation_context); - auto linear_expression = visitor.dispatch(sum); - BOOST_CHECK_EQUAL(linear_expression.offset(), 55.); - BOOST_CHECK_EQUAL(linear_expression.coefPerVar().size(), 1); - BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var"], 7.); -} +// BOOST_FIXTURE_TEST_CASE(visit_literal_plus_param, Registry) +// { +// // 5 + param(3) = 8 +// Node* sum = create(create(5.), create("param")); +// EvaluationContext evaluation_context({{"param", 3.}}, {}); +// ReadLinearExpressionVisitor visitor(evaluation_context); +// auto linear_expression = visitor.dispatch(sum); +// BOOST_CHECK_EQUAL(linear_expression.offset(), 8.); +// BOOST_CHECK(linear_expression.coefPerVar().empty()); +// } +// +// BOOST_FIXTURE_TEST_CASE(visit_literal_plus_param_plus_var, Registry) +// { +// // 60 + param(-5) + 7 * var = { 55, {var : 7} } +// Node* product = create(create(7.), +// create("var")); +// Node* sum = create(create(60.), create("param"), product); +// EvaluationContext evaluation_context({{"param", -5.}}, {}); +// ReadLinearExpressionVisitor visitor(evaluation_context); +// auto linear_expression = visitor.dispatch(sum); +// BOOST_CHECK_EQUAL(linear_expression.offset(), 55.); +// BOOST_CHECK_EQUAL(linear_expression.coefPerVar().size(), 1); +// BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var"], 7.); +// } BOOST_FIXTURE_TEST_CASE(visit_negate_literal_plus_var, Registry) { @@ -104,33 +104,33 @@ BOOST_FIXTURE_TEST_CASE(visit_literal_minus_var, Registry) BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var"], -7.); } -BOOST_FIXTURE_TEST_CASE(visit_complex_expression, Registry) -{ - // 2 * (13 + 3 * param1(-2) + 14 * var1) / 7 + param2(8) + 6 * var2 = {10 ; {var1:4, var2:6}} - - // small_sum = 13 + 3 * param1(-2) + 14 * var1 - Node* small_sum = create(create(13.), - create(create(3), - create("param1")), - create(create(14), - create("var1"))); - - // big_sum = 2 * small_sum / 7 + param2(8) + 6 * var2 - Node* big_sum = create( - create(create(create(2.), small_sum), - create(7.)), // 2 * small_sum / 7 - create("param2"), // param2 - create(create(6.), create("var2")) // 6 * var2 - ); - - EvaluationContext evaluation_context({{"param1", -2.}, {"param2", 8.}}, {}); - ReadLinearExpressionVisitor visitor(evaluation_context); - auto linear_expression = visitor.dispatch(big_sum); - BOOST_CHECK_EQUAL(linear_expression.offset(), 10.); - BOOST_CHECK_EQUAL(linear_expression.coefPerVar().size(), 2); - BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var1"], 4.); - BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var2"], 6.); -} +// BOOST_FIXTURE_TEST_CASE(visit_complex_expression, Registry) +// { +// // 2 * (13 + 3 * param1(-2) + 14 * var1) / 7 + param2(8) + 6 * var2 = {10 ; {var1:4, var2:6}} +// +// // small_sum = 13 + 3 * param1(-2) + 14 * var1 +// Node* small_sum = create(create(13.), +// create(create(3), +// create("param1")), +// create(create(14), +// create("var1"))); +// +// // big_sum = 2 * small_sum / 7 + param2(8) + 6 * var2 +// Node* big_sum = create( +// create(create(create(2.), small_sum), +// create(7.)), // 2 * small_sum / 7 +// create("param2"), // param2 +// create(create(6.), create("var2")) // 6 * var2 +// ); +// +// EvaluationContext evaluation_context({{"param1", -2.}, {"param2", 8.}}, {}); +// ReadLinearExpressionVisitor visitor(evaluation_context); +// auto linear_expression = visitor.dispatch(big_sum); +// BOOST_CHECK_EQUAL(linear_expression.offset(), 10.); +// BOOST_CHECK_EQUAL(linear_expression.coefPerVar().size(), 2); +// BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var1"], 4.); +// BOOST_CHECK_EQUAL(linear_expression.coefPerVar()["var2"], 6.); +// } BOOST_FIXTURE_TEST_CASE(comparison_nodes__exception_thrown, Registry) {