Antares Simulator
Power System Simulator
Loading...
Searching...
No Matches
LinearStatus.h
1/*
2** Copyright 2007-2024, 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
23namespace Antares::Expressions::Visitors
24{
28enum class LinearStatus : char
29{
30 CONSTANT = 0,
31 LINEAR = 1,
32 NON_LINEAR = 2
33};
34
43constexpr char pair(LinearStatus a, LinearStatus b)
44{
45 return static_cast<char>(a) << 4 | static_cast<char>(b);
46}
47
56constexpr LinearStatus operator*(LinearStatus a, LinearStatus b)
57{
58 switch (pair(a, b))
59 {
60 case pair(LinearStatus::CONSTANT, LinearStatus::CONSTANT):
61 return LinearStatus::CONSTANT;
62 case pair(LinearStatus::CONSTANT, LinearStatus::LINEAR):
63 return LinearStatus::LINEAR;
64 case pair(LinearStatus::CONSTANT, LinearStatus::NON_LINEAR):
65 return LinearStatus::NON_LINEAR;
66
67 case pair(LinearStatus::LINEAR, LinearStatus::CONSTANT):
68 return LinearStatus::LINEAR;
69 case pair(LinearStatus::LINEAR, LinearStatus::LINEAR):
70 case pair(LinearStatus::LINEAR, LinearStatus::NON_LINEAR):
71 return LinearStatus::NON_LINEAR;
72
73 case pair(LinearStatus::NON_LINEAR, LinearStatus::CONSTANT):
74 case pair(LinearStatus::NON_LINEAR, LinearStatus::LINEAR):
75 case pair(LinearStatus::NON_LINEAR, LinearStatus::NON_LINEAR):
76 return LinearStatus::NON_LINEAR;
77
78 default:
79 return LinearStatus::NON_LINEAR;
80 }
81}
82
91constexpr LinearStatus operator/(LinearStatus a, LinearStatus b)
92{
93 switch (pair(a, b))
94 {
95 case pair(LinearStatus::CONSTANT, LinearStatus::CONSTANT):
96 return LinearStatus::CONSTANT;
97 case pair(LinearStatus::CONSTANT, LinearStatus::LINEAR):
98 return LinearStatus::NON_LINEAR;
99 case pair(LinearStatus::CONSTANT, LinearStatus::NON_LINEAR):
100 return LinearStatus::NON_LINEAR;
101
102 case pair(LinearStatus::LINEAR, LinearStatus::CONSTANT):
103 return LinearStatus::LINEAR;
104 case pair(LinearStatus::LINEAR, LinearStatus::LINEAR):
105 case pair(LinearStatus::LINEAR, LinearStatus::NON_LINEAR):
106 return LinearStatus::NON_LINEAR;
107
108 case pair(LinearStatus::NON_LINEAR, LinearStatus::CONSTANT):
109 case pair(LinearStatus::NON_LINEAR, LinearStatus::LINEAR):
110 case pair(LinearStatus::NON_LINEAR, LinearStatus::NON_LINEAR):
111 return LinearStatus::NON_LINEAR;
112
113 default:
114 return LinearStatus::NON_LINEAR;
115 }
116}
117
126constexpr LinearStatus operator+(LinearStatus a, LinearStatus b)
127{
128 switch (pair(a, b))
129 {
130 case pair(LinearStatus::CONSTANT, LinearStatus::CONSTANT):
131 return LinearStatus::CONSTANT;
132 case pair(LinearStatus::CONSTANT, LinearStatus::LINEAR):
133 return LinearStatus::LINEAR;
134 case pair(LinearStatus::CONSTANT, LinearStatus::NON_LINEAR):
135 return LinearStatus::NON_LINEAR;
136
137 case pair(LinearStatus::LINEAR, LinearStatus::CONSTANT):
138 return LinearStatus::LINEAR;
139 case pair(LinearStatus::LINEAR, LinearStatus::LINEAR):
140 return LinearStatus::LINEAR;
141 case pair(LinearStatus::LINEAR, LinearStatus::NON_LINEAR):
142 return LinearStatus::NON_LINEAR;
143
144 case pair(LinearStatus::NON_LINEAR, LinearStatus::CONSTANT):
145 case pair(LinearStatus::NON_LINEAR, LinearStatus::LINEAR):
146 case pair(LinearStatus::NON_LINEAR, LinearStatus::NON_LINEAR):
147 return LinearStatus::NON_LINEAR;
148
149 default:
150 return LinearStatus::NON_LINEAR;
151 }
152}
153
162constexpr LinearStatus operator-(LinearStatus a, LinearStatus b)
163{
164 return operator+(a, b);
165}
166
174constexpr LinearStatus operator-(LinearStatus a)
175{
176 return a;
177}
178} // namespace Antares::Expressions::Visitors