Antares Simulator
Power System Simulator
LinearStatus.h
1 /*
2 ** Copyright 2007-2025, RTE (https://www.rte-france.com)
3 ** See AUTHORS.txt
4 ** SPDX-License-Identifier: MPL-2.0
5 ** This file is part of Antares-Simulator,
6 ** Adequacy and Performance assessment for interconnected energy networks.
7 **
8 ** Antares_Simulator is free software: you can redistribute it and/or modify
9 ** it under the terms of the Mozilla Public Licence 2.0 as published by
10 ** the Mozilla Foundation, either version 2 of the License, or
11 ** (at your option) any later version.
12 **
13 ** Antares_Simulator is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ** Mozilla Public Licence 2.0 for more details.
17 **
18 ** You should have received a copy of the Mozilla Public Licence 2.0
19 ** along with Antares_Simulator. If not, see <https://opensource.org/license/mpl-2-0/>.
20 */
21 #pragma once
22 #include <vector>
23 
24 namespace Antares::Expressions::Visitors
25 {
29 enum class LinearStatus : char
30 {
31  CONSTANT = 0,
32  LINEAR = 1,
33  NON_LINEAR = 2
34 };
35 
44 constexpr char pair(LinearStatus a, LinearStatus b)
45 {
46  return static_cast<char>(a) << 4 | static_cast<char>(b);
47 }
48 
57 constexpr LinearStatus operator*(LinearStatus a, LinearStatus b)
58 {
59  switch (pair(a, b))
60  {
61  case pair(LinearStatus::CONSTANT, LinearStatus::CONSTANT):
62  return LinearStatus::CONSTANT;
63  case pair(LinearStatus::CONSTANT, LinearStatus::LINEAR):
64  return LinearStatus::LINEAR;
65  case pair(LinearStatus::CONSTANT, LinearStatus::NON_LINEAR):
66  return LinearStatus::NON_LINEAR;
67 
68  case pair(LinearStatus::LINEAR, LinearStatus::CONSTANT):
69  return LinearStatus::LINEAR;
70  case pair(LinearStatus::LINEAR, LinearStatus::LINEAR):
71  case pair(LinearStatus::LINEAR, LinearStatus::NON_LINEAR):
72  return LinearStatus::NON_LINEAR;
73 
74  case pair(LinearStatus::NON_LINEAR, LinearStatus::CONSTANT):
75  case pair(LinearStatus::NON_LINEAR, LinearStatus::LINEAR):
76  case pair(LinearStatus::NON_LINEAR, LinearStatus::NON_LINEAR):
77  return LinearStatus::NON_LINEAR;
78 
79  default:
80  return LinearStatus::NON_LINEAR;
81  }
82 }
83 
92 constexpr LinearStatus operator/(LinearStatus a, LinearStatus b)
93 {
94  switch (pair(a, b))
95  {
96  case pair(LinearStatus::CONSTANT, LinearStatus::CONSTANT):
97  return LinearStatus::CONSTANT;
98  case pair(LinearStatus::CONSTANT, LinearStatus::LINEAR):
99  return LinearStatus::NON_LINEAR;
100  case pair(LinearStatus::CONSTANT, LinearStatus::NON_LINEAR):
101  return LinearStatus::NON_LINEAR;
102 
103  case pair(LinearStatus::LINEAR, LinearStatus::CONSTANT):
104  return LinearStatus::LINEAR;
105  case pair(LinearStatus::LINEAR, LinearStatus::LINEAR):
106  case pair(LinearStatus::LINEAR, LinearStatus::NON_LINEAR):
107  return LinearStatus::NON_LINEAR;
108 
109  case pair(LinearStatus::NON_LINEAR, LinearStatus::CONSTANT):
110  case pair(LinearStatus::NON_LINEAR, LinearStatus::LINEAR):
111  case pair(LinearStatus::NON_LINEAR, LinearStatus::NON_LINEAR):
112  return LinearStatus::NON_LINEAR;
113 
114  default:
115  return LinearStatus::NON_LINEAR;
116  }
117 }
118 
127 constexpr LinearStatus operator+(LinearStatus a, LinearStatus b)
128 {
129  switch (pair(a, b))
130  {
131  case pair(LinearStatus::CONSTANT, LinearStatus::CONSTANT):
132  return LinearStatus::CONSTANT;
133  case pair(LinearStatus::CONSTANT, LinearStatus::LINEAR):
134  return LinearStatus::LINEAR;
135  case pair(LinearStatus::CONSTANT, LinearStatus::NON_LINEAR):
136  return LinearStatus::NON_LINEAR;
137 
138  case pair(LinearStatus::LINEAR, LinearStatus::CONSTANT):
139  return LinearStatus::LINEAR;
140  case pair(LinearStatus::LINEAR, LinearStatus::LINEAR):
141  return LinearStatus::LINEAR;
142  case pair(LinearStatus::LINEAR, LinearStatus::NON_LINEAR):
143  return LinearStatus::NON_LINEAR;
144 
145  case pair(LinearStatus::NON_LINEAR, LinearStatus::CONSTANT):
146  case pair(LinearStatus::NON_LINEAR, LinearStatus::LINEAR):
147  case pair(LinearStatus::NON_LINEAR, LinearStatus::NON_LINEAR):
148  return LinearStatus::NON_LINEAR;
149 
150  default:
151  return LinearStatus::NON_LINEAR;
152  }
153 }
154 
163 constexpr LinearStatus operator-(LinearStatus a, LinearStatus b)
164 {
165  return operator+(a, b);
166 }
167 
175 constexpr LinearStatus operator-(LinearStatus a)
176 {
177  return a;
178 }
179 
180 constexpr bool operator<(LinearStatus a, LinearStatus b)
181 {
182  return static_cast<char>(a) < static_cast<char>(b);
183 }
184 
185 template<class Operation>
186 LinearStatus applyOperation(const std::vector<LinearStatus>& in, Operation op)
187 {
188  return op(in);
189 }
190 } // namespace Antares::Expressions::Visitors