27#include <antares/expressions/visitors/EvaluationContext.h>
28#include <antares/optimisation/linear-problem-api/ILinearProblemData.h>
29#include "antares/expressions/visitors/NodeVisitor.h"
36namespace Antares::Expressions::Visitors
60 return evaluateBinaryOperation(right, std::plus<>());
65 return evaluateBinaryOperation(right, std::minus<>());
70 return evaluateBinaryOperation(right, std::multiplies<>());
75 static constexpr double DEFAULT_THRESHOLD = 1e-16;
77 explicit SafeDivides(
double threshold = DEFAULT_THRESHOLD):
82 double operator()(
double lhs,
double rhs)
const
84 if (std::abs(rhs) <= threshold_)
97 return evaluateBinaryOperation(right,
SafeDivides{});
100 EvaluationResult operator-()
const
102 return evaluateUnaryOperation(std::negate<>());
105 [[nodiscard]] std::variant<double, std::vector<double>> value()
const
113 using std::runtime_error::runtime_error;
116 [[nodiscard]]
double valueAsDouble()
const
118 if (!std::holds_alternative<double>(value_))
122 return std::get<double>(value_);
125 [[nodiscard]] std::vector<double> valuesAsVector()
const
127 if (!std::holds_alternative<std::vector<double>>(value_))
129 throw EvalResultType(
"Expected a vector but found a double.");
131 return std::get<std::vector<double>>(value_);
135 std::variant<double, std::vector<double>> value_;
136 explicit EvaluationResult(
const std::variant<
double, std::vector<double>>& value);
138 template<
typename Op>
139 EvaluationResult evaluateBinaryOperation(
const EvaluationResult& right, Op op)
const;
140 template<
typename Op>
141 EvaluationResult evaluateUnaryOperation(Op op)
const;
144template<
typename BinaryOp>
145double computeBinaryOperation(
double lhs,
double rhs, BinaryOp op)
150template<
typename BinaryOp>
151std::vector<double> computeBinaryOperation(
const std::vector<double>& lhs,
double rhs, BinaryOp op)
154 for (
double& value: result)
156 value = op(value, rhs);
161template<
typename BinaryOp>
162std::vector<double> computeBinaryOperation(
double lhs,
const std::vector<double>& rhs, BinaryOp op)
164 return computeBinaryOperation(rhs, lhs, op);
170 using std::runtime_error::runtime_error;
173template<
typename BinaryOp>
174std::vector<double> computeBinaryOperation(
const std::vector<double>& lhs,
175 const std::vector<double>& rhs,
178 if (lhs.size() != rhs.size())
180 std::ostringstream errorMsg;
181 errorMsg <<
"Failed to compute binary operation: vectors have different sizes ("
182 << lhs.size() <<
" and " << rhs.size() <<
").";
186 std::vector<double> result(lhs.size());
187 for (
size_t i = 0; i < lhs.size(); ++i)
189 result[i] = op(lhs[i], rhs[i]);
195EvaluationResult EvaluationResult::evaluateBinaryOperation(
const EvaluationResult& right,
198 return EvaluationResult(
199 std::visit([&op](
const auto& l,
const auto& r) -> std::variant<
double, std::vector<double>>
200 {
return computeBinaryOperation(l, r, op); },
205template<
typename UnaryOp>
206std::vector<double> computeUnaryOperation(
const std::vector<double>& values, UnaryOp op)
209 for (
double& v: result)
216template<
typename UnaryOp>
217double computeUnaryOperation(
double value, UnaryOp op)
223EvaluationResult EvaluationResult::evaluateUnaryOperation(Op op)
const
225 return EvaluationResult(
226 std::visit([&op](
const auto& v) -> std::variant<
double, std::vector<double>>
227 {
return computeUnaryOperation(v, op); },
245 std::string name()
const override;
Represents a component parameter node in a syntax tree.
Definition ComponentNode.h:80
Represents a component variable node in a syntax tree.
Definition ComponentNode.h:66
Represents a division node in a syntax tree.
Definition DivisionNode.h:31
Represents an equality comparison node in a syntax tree.
Definition EqualNode.h:31
Represents a greater than or equal comparison node in a syntax tree.
Definition GreaterThanOrEqualNode.h:31
Represents a less than or equal comparison node in a syntax tree.
Definition LessThanOrEqualNode.h:31
Represents a literal node in a syntax tree, storing a double value.
Definition LiteralNode.h:11
Represents a multiplication node in a syntax tree.
Definition MultiplicationNode.h:31
Represents a negation node in a syntax tree.
Definition NegationNode.h:31
Represents a parameter node in a syntax tree, storing a string value.
Definition ParameterNode.h:19
Represents a port field node in a syntax tree.
Definition PortFieldNode.h:33
Represents a port field node where the expression is a sum.
Definition PortFieldSumNode.h:33
Represents a subtraction node in a syntax tree.
Definition SubtractionNode.h:31
Represents a variable node in a syntax tree, storing a string value.
Definition VariableNode.h:20
Definition EvalVisitor.h:40
Definition EvalVisitor.h:46
Represents a visitor for evaluating expressions within a given context.
Definition EvalVisitor.h:235
EvalVisitor(EvaluationContext context, Optimisation::LinearProblemApi::FillContext fillContext)
Constructs an evaluation visitor with the specified context.
Definition EvalVisitor.cpp:31
Represents the context for evaluating expressions.
Definition EvaluationContext.h:35
Definition EvalVisitor.h:111
Definition EvalVisitor.h:52
Definition NodeVisitor.h:87
Definition EvalVisitor.h:168
Definition ILinearProblemData.h:10
Namespace for the classes related to the linear problem API.
Definition EvaluationContext.h:9
Definition EvalVisitor.h:74