Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ANT-2749] Support time dependency #2622

Open
wants to merge 73 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
2dd533f
[skip ci]
a-zakir Feb 5, 2025
92a71ee
[skip ci]
a-zakir Feb 10, 2025
472d1af
[skip ci]
a-zakir Feb 10, 2025
6b6ba55
[skip ci]
a-zakir Feb 10, 2025
033c8ac
update
a-zakir Feb 10, 2025
a9163be
update
a-zakir Feb 10, 2025
f7f2bed
resolve conflicts
a-zakir Feb 11, 2025
a8b2b3a
remove old file
a-zakir Feb 11, 2025
f857e77
update logic
a-zakir Feb 11, 2025
b8aa133
case systemParam is different from component's
a-zakir Feb 11, 2025
a7607d9
handling: Parameter is declared constant in time and scenario in libr…
a-zakir Feb 11, 2025
4dd5d13
Merge branch 'develop' into feature/ANT-2749
a-zakir Feb 11, 2025
5d1a4df
update
a-zakir Feb 11, 2025
978835f
Merge branch 'feature/ANT-2749' of https://github.com/AntaresSimulato…
a-zakir Feb 11, 2025
e5f46e2
update
a-zakir Feb 11, 2025
f525e79
update
a-zakir Feb 11, 2025
da99fd0
for ubuntu
a-zakir Feb 11, 2025
cd1eb27
format
a-zakir Feb 11, 2025
2d5e9de
update
a-zakir Feb 13, 2025
fe2ab99
update
a-zakir Feb 13, 2025
73acedb
update
a-zakir Feb 13, 2025
e5a0fd8
update
a-zakir Feb 13, 2025
b6c0ce5
update
a-zakir Feb 13, 2025
b427b41
update
a-zakir Feb 13, 2025
0c4f1bc
update
a-zakir Feb 13, 2025
48abf37
Add tests for time-series handling (#2637)
pet-mit Feb 13, 2025
294b664
update
a-zakir Feb 13, 2025
2df98fa
update
a-zakir Feb 13, 2025
a959033
update
a-zakir Feb 13, 2025
e2b288c
Feature/ant 2749 some improvement (#2638)
a-zakir Feb 14, 2025
d99c9c4
remove unused methods
a-zakir Feb 14, 2025
1216b8a
update optim api (#2642)
a-zakir Feb 14, 2025
7d940df
Merge branch 'develop' into feature/ANT-2749
pet-mit Feb 17, 2025
f31e5f8
add test 1_2
a-zakir Feb 17, 2025
1069eea
add test 1_3
a-zakir Feb 17, 2025
dd3e3a1
run new tests
a-zakir Feb 17, 2025
baa60e8
new test
a-zakir Feb 17, 2025
d82c618
add new test
a-zakir Feb 17, 2025
72e64ea
update modeler cucumber tests
a-zakir Feb 17, 2025
1efcb6f
print
a-zakir Feb 17, 2025
1a0c1b1
print
a-zakir Feb 17, 2025
3dd7e3b
upt
a-zakir Feb 17, 2025
069e56d
upt
a-zakir Feb 18, 2025
76f8cc0
add 1_5
a-zakir Feb 18, 2025
8a38873
use Sirius
a-zakir Feb 18, 2025
f062dea
add 1_7
a-zakir Feb 18, 2025
f695540
enable cucumber tests
a-zakir Feb 18, 2025
d7f4d21
update
a-zakir Feb 18, 2025
d64ae88
update
a-zakir Feb 18, 2025
769d269
update
a-zakir Feb 18, 2025
9c31d0d
update
a-zakir Feb 18, 2025
c751624
update
a-zakir Feb 18, 2025
a087843
update
a-zakir Feb 18, 2025
65ded29
add UT
a-zakir Feb 19, 2025
c48c256
add UT
a-zakir Feb 19, 2025
5a9cb6c
rename negate -> operator-
a-zakir Feb 19, 2025
d950bc8
fix test
a-zakir Feb 19, 2025
b056139
add UT
a-zakir Feb 19, 2025
c2bfe50
add UT
a-zakir Feb 19, 2025
eb1af02
update
a-zakir Feb 19, 2025
5fdd9f9
Avoid copying a large map (#2646)
flomnes Feb 19, 2025
8726a5b
Merge branch 'develop' into feature/ANT-2749
a-zakir Feb 19, 2025
4e2f9c7
update
a-zakir Feb 19, 2025
8372c19
update
a-zakir Feb 19, 2025
6137778
update
a-zakir Feb 19, 2025
1638068
update
a-zakir Feb 19, 2025
d9efc2a
format
a-zakir Feb 19, 2025
aede3e5
r
a-zakir Feb 19, 2025
eca7fda
r
a-zakir Feb 19, 2025
fd94a20
Merge branch 'develop' into feature/ANT-2749
a-zakir Feb 19, 2025
cdabd9e
r
a-zakir Feb 20, 2025
6e2de9a
r
a-zakir Feb 20, 2025
d78c8c2
Merge branch 'develop' into feature/ANT-2749
a-zakir Feb 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions src/solver/optim-model-filler/LinearExpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
* along with Antares_Simulator. If not, see <https://opensource.org/license/mpl-2-0/>.
*/

#include <algorithm>
#include <stdexcept>

#include <antares/solver/optim-model-filler/LinearExpression.h>
Expand Down Expand Up @@ -83,6 +84,13 @@ LinearExpression LinearExpression::operator+(const LinearExpression& other) cons
return {offset_ + other.offset_, add_maps(coef_per_var_, other.coef_per_var_, 1)};
}

LinearExpression& LinearExpression::operator+=(const LinearExpression& other)
{
this->offset_ += other.offset_;
this->coef_per_var_ = add_maps(coef_per_var_, other.coef_per_var_, 1);
return *this;
}

LinearExpression LinearExpression::operator-(const LinearExpression& other) const
{
return {offset_ - other.offset_, add_maps(coef_per_var_, other.coef_per_var_, -1)};
Expand Down Expand Up @@ -117,4 +125,97 @@ LinearExpression LinearExpression::negate() const
{
return {-offset_, scale_map(coef_per_var_, -1)};
}

TimeDependentLinearExpression::TimeDependentLinearExpression(
const std::map<unsigned int, LinearExpression>& linearExpressions):
linearExpressions_(linearExpressions)

{
}

TimeDependentLinearExpression TimeDependentLinearExpression::operator+(
const TimeDependentLinearExpression& other) const
{
const auto& linear_expressions = GetLinearExpressions();
const auto& other_linear_expressions = other.GetLinearExpressions();

std::map result(linear_expressions);
for (auto [key, value]: other_linear_expressions)
{
if (result.contains(key))
{
result[key] += value;
}
else
{
result[key] = value;
}
}

return TimeDependentLinearExpression(std::move(result));
}

TimeDependentLinearExpression TimeDependentLinearExpression::operator-(
const TimeDependentLinearExpression& other) const
{
checkOtherLength(other);
const auto& linear_expressions = GetLinearExpressions();
const auto& other_linear_expressions = other.GetLinearExpressions();
std::map<unsigned int, LinearExpression> result(linear_expressions.size());
for (size_t i = 0; i < linear_expressions.size(); ++i)
{
result[i] = linear_expressions[i] - other_linear_expressions[i];
}
return TimeDependentLinearExpression(std::move(result));
}

TimeDependentLinearExpression TimeDependentLinearExpression::operator*(
const TimeDependentLinearExpression& other) const
{
checkOtherLength(other);
const auto& linear_expressions = GetLinearExpressions();
const auto& other_linear_expressions = other.GetLinearExpressions();
std::map<unsigned int, LinearExpression> result(linear_expressions.size());
for (size_t i = 0; i < linear_expressions.size(); ++i)
{
result[i] = linear_expressions[i] * other_linear_expressions[i];
}
return TimeDependentLinearExpression(std::move(result));
}

TimeDependentLinearExpression TimeDependentLinearExpression::operator/(
const TimeDependentLinearExpression& other) const
{
checkOtherLength(other);
const auto& linear_expressions = GetLinearExpressions();
const auto& other_linear_expressions = other.GetLinearExpressions();
std::map<unsigned int, LinearExpression> result(linear_expressions.size());
for (size_t i = 0; i < linear_expressions.size(); ++i)
{
result[i] = linear_expressions[i] / other_linear_expressions[i];
}
return TimeDependentLinearExpression(std::move(result));
}

TimeDependentLinearExpression TimeDependentLinearExpression::negate() const
{
const auto& linear_expressions = GetLinearExpressions();
std::map<unsigned int, LinearExpression> result(linear_expressions.size());
for (size_t i = 0; i < linear_expressions.size(); ++i)
{
result[i] = linear_expressions[i].negate();
}
return TimeDependentLinearExpression(std::move(result));
}

std::map<unsigned int, LinearExpression> TimeDependentLinearExpression::GetLinearExpressions() const
{
linearExpressions_;
}

size_t TimeDependentLinearExpression::getSize() const
{
return linearExpressions_.size();
}

} // namespace Antares::Optimization
46 changes: 27 additions & 19 deletions src/solver/optim-model-filler/ReadLinearExpressionVisitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,16 @@ namespace Antares::Optimization
{

ReadLinearExpressionVisitor::ReadLinearExpressionVisitor(
Solver::Visitors::EvaluationContext context):
context_(std::move(context))
Solver::Visitors::EvaluationContext context,
const std::vector<unsigned int>& timesteps):
context_(std::move(context)),
timesteps_(timesteps)
{
}

ReadLinearExpressionVisitor::ReadLinearExpressionVisitor(
const std::vector<unsigned int>& timesteps):
timesteps_(timesteps)
{
}

Expand All @@ -42,82 +50,82 @@ std::string ReadLinearExpressionVisitor::name() const
return "ReadLinearExpressionVisitor";
}

LinearExpression ReadLinearExpressionVisitor::visit(const SumNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const SumNode* node)
{
auto operands = node->getOperands();
return std::accumulate(std::begin(operands),
std::end(operands),
LinearExpression(),
[this](LinearExpression sum, Node* operand)
TimeDependentLinearExpression(),
[this](TimeDependentLinearExpression sum, Node* operand)
{ return sum + dispatch(operand); });
}

LinearExpression ReadLinearExpressionVisitor::visit(const SubtractionNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const SubtractionNode* node)
{
return dispatch(node->left()) - dispatch(node->right());
}

LinearExpression ReadLinearExpressionVisitor::visit(const MultiplicationNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const MultiplicationNode* node)
{
return dispatch(node->left()) * dispatch(node->right());
}

LinearExpression ReadLinearExpressionVisitor::visit(const DivisionNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const DivisionNode* node)
{
return dispatch(node->left()) / dispatch(node->right());
}

LinearExpression ReadLinearExpressionVisitor::visit(const EqualNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const EqualNode* node)
{
throw std::invalid_argument("A linear expression can't contain comparison operators.");
}

LinearExpression ReadLinearExpressionVisitor::visit(const LessThanOrEqualNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const LessThanOrEqualNode* node)
{
throw std::invalid_argument("A linear expression can't contain comparison operators.");
}

LinearExpression ReadLinearExpressionVisitor::visit(const GreaterThanOrEqualNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const GreaterThanOrEqualNode* node)
{
throw std::invalid_argument("A linear expression can't contain comparison operators.");
}

LinearExpression ReadLinearExpressionVisitor::visit(const NegationNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const NegationNode* node)
{
return dispatch(node->child()).negate();
}

LinearExpression ReadLinearExpressionVisitor::visit(const VariableNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const VariableNode* node)
{
return LinearExpression(0, {{node->value(), 1}});
}

LinearExpression ReadLinearExpressionVisitor::visit(const ParameterNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const ParameterNode* node)
{
return {context_.getParameterValue(node->value()), {}};
}

LinearExpression ReadLinearExpressionVisitor::visit(const LiteralNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const LiteralNode* node)
{
return {node->value(), {}};
}

LinearExpression ReadLinearExpressionVisitor::visit(const PortFieldNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const PortFieldNode* node)
{
throw std::invalid_argument("ReadLinearExpressionVisitor cannot visit PortFieldNodes");
}

LinearExpression ReadLinearExpressionVisitor::visit(const PortFieldSumNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const PortFieldSumNode* node)
{
throw std::invalid_argument("ReadLinearExpressionVisitor cannot visit PortFieldSumNodes");
}

LinearExpression ReadLinearExpressionVisitor::visit(const ComponentVariableNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const ComponentVariableNode* node)
{
throw std::invalid_argument("ReadLinearExpressionVisitor cannot visit ComponentVariableNodes");
}

LinearExpression ReadLinearExpressionVisitor::visit(const ComponentParameterNode* node)
TimeDependentLinearExpression ReadLinearExpressionVisitor::visit(const ComponentParameterNode* node)
{
throw std::invalid_argument("ReadLinearExpressionVisitor cannot visit ComponentParameterNodes");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

#include <map>
#include <string>
#include <vector>

namespace Antares::Optimization
{
Expand Down Expand Up @@ -66,8 +67,36 @@ class LinearExpression
return coef_per_var_;
}

LinearExpression& operator+=(const LinearExpression& value);

private:
double offset_ = 0;
std::map<std::string, double> coef_per_var_;
};
// time dependent parameter
class TimeDependentLinearExpression
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is it in the same .h / .cpp as LinearExpression ?

{
public:
TimeDependentLinearExpression() = default;
TimeDependentLinearExpression(const std::map<unsigned, LinearExpression>& linearExpressions);
void checkOtherLength(const TimeDependentLinearExpression& other) const;

/// Sum two linear expressions
TimeDependentLinearExpression operator+(const TimeDependentLinearExpression& other) const;
/// Subtract two linear expressions
TimeDependentLinearExpression operator-(const TimeDependentLinearExpression& other) const;
/// Multiply two linear expressions
/// Only one can have non-zero coefficients, otherwise the result cannot be linear
TimeDependentLinearExpression operator*(const TimeDependentLinearExpression& other) const;
/// Divide two linear expressions
/// Only first expression can have non-zero coefficients, otherwise the result cannot be linear
TimeDependentLinearExpression operator/(const TimeDependentLinearExpression& other) const;
/// Multiply linear expression by -1
TimeDependentLinearExpression negate() const;
std::map<unsigned, LinearExpression> GetLinearExpressions() const;
size_t getSize() const;

private:
std::map<unsigned, LinearExpression> linearExpressions_;
};
} // namespace Antares::Optimization
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,33 @@
namespace Antares::Optimization
{

class ReadLinearExpressionVisitor: public Solver::Visitors::NodeVisitor<LinearExpression>
class ReadLinearExpressionVisitor
: public Solver::Visitors::NodeVisitor<TimeDependentLinearExpression>
{
public:
ReadLinearExpressionVisitor() = default;
explicit ReadLinearExpressionVisitor(Solver::Visitors::EvaluationContext context);
explicit ReadLinearExpressionVisitor(const std::vector<unsigned int>& timesteps);
explicit ReadLinearExpressionVisitor(Solver::Visitors::EvaluationContext context,
const std::vector<unsigned int>& timesteps);
std::string name() const override;

private:
const Solver::Visitors::EvaluationContext context_;
LinearExpression visit(const Solver::Nodes::SumNode* node) override;
LinearExpression visit(const Solver::Nodes::SubtractionNode* node) override;
LinearExpression visit(const Solver::Nodes::MultiplicationNode* node) override;
LinearExpression visit(const Solver::Nodes::DivisionNode* node) override;
LinearExpression visit(const Solver::Nodes::EqualNode* node) override;
LinearExpression visit(const Solver::Nodes::LessThanOrEqualNode* node) override;
LinearExpression visit(const Solver::Nodes::GreaterThanOrEqualNode* node) override;
LinearExpression visit(const Solver::Nodes::NegationNode* node) override;
LinearExpression visit(const Solver::Nodes::VariableNode* node) override;
LinearExpression visit(const Solver::Nodes::ParameterNode* node) override;
LinearExpression visit(const Solver::Nodes::LiteralNode* node) override;
LinearExpression visit(const Solver::Nodes::PortFieldNode* node) override;
LinearExpression visit(const Solver::Nodes::PortFieldSumNode* node) override;
LinearExpression visit(const Solver::Nodes::ComponentVariableNode* node) override;
LinearExpression visit(const Solver::Nodes::ComponentParameterNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::SumNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::SubtractionNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::MultiplicationNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::DivisionNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::EqualNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::LessThanOrEqualNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::GreaterThanOrEqualNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::NegationNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::VariableNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::ParameterNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::LiteralNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::PortFieldNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::PortFieldSumNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::ComponentVariableNode* node) override;
TimeDependentLinearExpression visit(const Solver::Nodes::ComponentParameterNode* node) override;

std::vector<unsigned int> timesteps_ = {};
};
} // namespace Antares::Optimization