Antares Simulator
Power System Simulator
UtilMocks.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 
22 #pragma once
23 
24 #include <antares/expressions/nodes/ExpressionsNodes.h>
25 #include <antares/expressions/visitors/EvalVisitor.h>
26 #include "antares/optimisation/linear-problem-data-impl/linearProblemData.h"
27 
28 #include "mockModelerObjects.h"
29 
31 {
32 public:
33  MockMipVariable(double value,
34  Antares::Optimisation::LinearProblemApi::MipBasisStatus status,
35  bool integer = false):
36  value_(value),
37  status_(status),
38  integer_(integer)
39  {
40  }
41 
42  double solutionValue() const override
43  {
44  return value_;
45  }
46 
47  double reducedCost() const override
48  {
49  return 4.96; // arbitrary value for testing
50  }
51 
52  Antares::Optimisation::LinearProblemApi::MipBasisStatus getMipBasisStatus() const override
53  {
54  return status_;
55  }
56 
57  bool isInteger() const override
58  {
59  return integer_;
60  }
61 
62  // IHasBounds interface
63  void setLb(double) override
64  {
65  }
66 
67  void setUb(double) override
68  {
69  }
70 
71  double getLb() const override
72  {
73  return 0.0;
74  }
75 
76  double getUb() const override
77  {
78  return 1.0;
79  }
80 
81  void setBounds(double lb, double ub) override
82  {
83  setLb(lb);
84  setUb(ub);
85  }
86 
87  // IHasName interface
88  const std::string& getName() const override
89  {
90  return name_;
91  }
92 
93 private:
94  double value_;
95  Antares::Optimisation::LinearProblemApi::MipBasisStatus status_;
96  bool integer_;
97  std::string name_ = "test_var";
98 };
99 
101 {
102 public:
103  MockMipConstraint(Antares::Optimisation::LinearProblemApi::MipBasisStatus status):
104  status_(status)
105  {
106  }
107 
108  Antares::Optimisation::LinearProblemApi::MipBasisStatus getMipBasisStatus() const override
109  {
110  return status_;
111  }
112 
113  // IMipConstraint interface
114  void setCoefficient(Antares::Optimisation::LinearProblemApi::IMipVariable*, double) override
115  {
116  }
117 
118  double getCoefficient(
120  {
121  return 1.0;
122  }
123 
124  // IHasBounds interface
125  void setLb(double) override
126  {
127  }
128 
129  void setUb(double) override
130  {
131  }
132 
133  double getLb() const override
134  {
135  return 0.0;
136  }
137 
138  double getUb() const override
139  {
140  return 1.0;
141  }
142 
143  void setBounds(double lb, double ub) override
144  {
145  setLb(lb);
146  setUb(ub);
147  }
148 
149  double dual() const override
150  {
151  return 8.23; // arbitrary value for testing
152  }
153 
154  // IHasName interface
155  const std::string& getName() const override
156  {
157  return name_;
158  }
159 
160 private:
161  Antares::Optimisation::LinearProblemApi::MipBasisStatus status_;
162  std::string name_ = "test_constraint";
163 };
164 
166 {
167 public:
168  explicit MockLinearProblem(bool isLP):
169  isLP_(isLP)
170  {
171  }
172 
173  bool isLP() const override
174  {
175  return isLP_;
176  }
177 
179  const std::string&) const override
180  {
181  static MockMipConstraint mockConstraint(
182  Antares::Optimisation::LinearProblemApi::MipBasisStatus::BASIC);
183  return &mockConstraint;
184  }
185 
186  // ILinearProblem interface (minimal implementation for testing)
188  double,
189  bool,
190  const std::string&) override
191  {
192  variables_.push_back(RandomVariable());
193  return variables_.back().get();
194  }
195 
197  addConstraint(double, double, const std::string&) override
198  {
199  constraints_.push_back(RandomConstraint());
200  return constraints_.back().get();
201  }
202 
204  double) override
205  {
206  }
207 
209  {
210  return nullptr;
211  }
212 
213  double infinity() const override
214  {
215  return std::numeric_limits<double>::infinity();
216  }
217 
219  addNumVariable(double, double, const std::string&) override
220  {
221  variableCount_++;
222  variables_.push_back(RandomVariable());
223  return variables_.back().get();
224  }
225 
227  addIntVariable(double, double, const std::string&) override
228  {
229  variableCount_++;
230  variables_.push_back(RandomVariable());
231  return variables_.back().get();
232  }
233 
234  static std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipVariable> RandomVariable()
235  {
236  std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipVariable>
237  mockMipVariable = std::make_unique<MockMipVariable>(
238  12.25,
239  Antares::Optimisation::LinearProblemApi::MipBasisStatus::AT_LOWER_BOUND,
240  false);
241  return mockMipVariable;
242  }
243 
244  static std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipConstraint>
245  RandomConstraint()
246  {
247  std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipConstraint>
248  mockMipConstraint = std::make_unique<MockMipConstraint>(
249  Antares::Optimisation::LinearProblemApi::MipBasisStatus::AT_LOWER_BOUND);
250  return mockMipConstraint;
251  }
252 
254  std::size_t t) const override
255  {
256  return variables_.at(t).get();
257  }
258 
259  [[nodiscard]]
260  const std::vector<std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipVariable>>&
261  getVariables() const override
262  {
263  return variables_;
264  }
265 
266  [[nodiscard]]
268  std::size_t) const override
269  {
270  return RandomConstraint().get();
271  }
272 
273  [[nodiscard]]
274  const std::vector<std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipConstraint>>&
275  getConstraints() const override
276  {
277  return constraints_;
278  }
279 
280  [[nodiscard]] Antares::Optimisation::LinearProblemApi::IMipVariable* lookupVariable(
281  const std::string&) const override
282  {
283  return RandomVariable().get();
284  }
285 
286  [[nodiscard]] int variableCount() const override
287  {
288  return variableCount_;
289  }
290 
291  [[nodiscard]] int constraintCount() const override
292  {
293  return constraintCount_;
294  }
295 
296  double getObjectiveCoefficient(
298  {
299  return 0.;
300  }
301 
302  void setObjectiveOffset(double) override
303  {
304  }
305 
306  double getObjectiveOffset() const override
307  {
308  return {};
309  }
310 
311  void setMinimization() override
312  {
313  }
314 
315  void setMaximization() override
316  {
317  }
318 
319  [[nodiscard]] bool isMinimization() const override
320  {
321  return true;
322  }
323 
324  [[nodiscard]] bool isMaximization() const override
325  {
326  return !isMinimization();
327  }
328 
329  [[nodiscard]] double objectiveValue() const override
330  {
331  return 0.0;
332  }
333 
334 protected:
335  bool isLP_;
336  std::vector<std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipVariable>> variables_;
337  std::vector<std::unique_ptr<Antares::Optimisation::LinearProblemApi::IMipConstraint>>
338  constraints_;
339  int variableCount_ = 0;
340  int constraintCount_ = 0;
341 };
342 
343 // Mock component and model classes for testing template functions
345 {
346 public:
347  MockVariable(bool scenDependent, bool timeDependent):
348  scenDependent_(scenDependent),
349  timeDependent_(timeDependent)
350  {
351  }
352 
353  bool IsScenarioDependent() const
354  {
355  return scenDependent_;
356  }
357 
358  bool isTimeDependent() const
359  {
360  return timeDependent_;
361  }
362 
363 private:
364  bool scenDependent_;
365  bool timeDependent_;
366 };
367 
369 {
370 public:
371  MockConstraint(const std::string& name):
372  name_(name)
373  {
374  }
375 
376  // Mock expression method
378  {
379  struct MockNode
380  {
381  // Mock node for constraint expression
382  };
383 
384  MockNode* RootNode() const
385  {
386  return nullptr;
387  }
388  };
389 
390  MockExpression expression() const
391  {
392  return MockExpression{};
393  }
394 
395 private:
396  std::string name_;
397 };
398 
400 {
401 public:
402  std::map<std::string, MockVariable> Variables() const
403  {
404  return {
405  {"var1", MockVariable(false, false)}, // Neither time nor scenario dependent
406  {"var2", MockVariable(true, false)}, // Scenario dependent only
407  {"var3", MockVariable(false, true)}, // Time dependent only
408  {"var4", MockVariable(true, true)} // Both time and scenario dependent
409  };
410  }
411 
412  std::map<std::string, MockConstraint> Constraints() const
413  {
414  return {{"constraint1", MockConstraint("constraint1")},
415  {"constraint2", MockConstraint("constraint2")}};
416  }
417 };
418 
420 {
421 public:
422  MockComponent(const std::string& id):
423  id_(id),
424  model_(std::make_shared<MockModel>())
425  {
426  }
427 
428  const std::string& Id() const
429  {
430  return id_;
431  }
432 
433  std::shared_ptr<MockModel> getModel() const
434  {
435  return model_;
436  }
437 
438 private:
439  std::string id_;
440  std::shared_ptr<MockModel> model_;
441 };
442 
444 {
447  {
448  }
449 
450  void addVariableValue(double value)
451  {
452  variables_.push_back(std::make_unique<MockMipVariable>(
453  value,
454  Antares::Optimisation::LinearProblemApi::MipBasisStatus::AT_LOWER_BOUND,
455  false));
456  variableCount_++;
457  }
458 };
459 
460 inline Antares::Optimisation::ScenarioGroupRepository makeScenarioGroupRepo(
462 {
464  repository.addScenario(
465  component.getScenarioGroupId(),
466  std::make_unique<Antares::Optimisation::LinearProblemApi::EmptyScenario>());
467  return repository;
468 }
469 
470 struct MyDummyFixture: Antares::Expressions::Registry<Antares::Expressions::Nodes::Node>
471 {
473  Antares::ModelerStudy::SystemModel::Model model = createModelWithoutParameters();
474  std::vector<Antares::ModelerStudy::SystemModel::Component> components = {
475  std::move(createComponent(model))};
476  Antares::Optimisation::ScenarioGroupRepository scenarioGroupRepository = makeScenarioGroupRepo(
477  components.front());
478 
479  MockLinearProblem linearProblem = MockLinearProblem(true);
481 
482  Antares::Optimisation::OptimEntityContainer optimEntityContainer = Antares::Optimisation::
483  OptimEntityContainer(linearProblem, &data, &scenarioGroupRepository);
484 
485  std::unique_ptr<Antares::Expressions::Visitors::EvalVisitor> defaultComponentEvalVisitor;
486 
488  {
489  optimEntityContainer.addFromSystemComponents(components);
490  for (const auto& compo: components)
491  {
492  defaultComponentEvalVisitor = std::make_unique<
493  Antares::Expressions::Visitors::EvalVisitor>(optimEntityContainer, ctx, compo);
494  }
495  }
496 
498  const std::string& id,
500  std::map<std::string, Antares::ModelerStudy::SystemModel::ParameterTypeAndValue>
501  paramsAndValues)
502  {
503  components.emplace_back(createComponent(model, id, paramsAndValues, components.size()));
504  optimEntityContainer.addFromSystemComponents(components);
505  return &components.back();
506  }
507 };
Definition: Registry.hxx:33
Represents a visitor for evaluating expressions within a given context.
Definition: EvalVisitor.h:320
Context for filling linear problem data. Contains temporal information.
Definition: ILinearProblemData.h:35
Definition: OptimEntityContainer.h:46
Definition: scenarioGroupRepo.h:12
Definition: UtilMocks.h:420
Definition: UtilMocks.h:369
Definition: UtilMocks.h:166
void setObjectiveCoefficient(Antares::Optimisation::LinearProblemApi::IMipVariable *, double) override
Set the objective coefficient for a given variable.
Definition: UtilMocks.h:203
Antares::Optimisation::LinearProblemApi::IMipSolution * solve(bool) override
Solve the problem, returns a IMipSolution.
Definition: UtilMocks.h:208
void setMinimization() override
Sets the optimization direction to minimize.
Definition: UtilMocks.h:311
Antares::Optimisation::LinearProblemApi::IMipVariable * addIntVariable(double, double, const std::string &) override
Create a integer variable.
Definition: UtilMocks.h:227
void setMaximization() override
Sets the optimization direction to maximize.
Definition: UtilMocks.h:315
Antares::Optimisation::LinearProblemApi::IMipVariable * addVariable(double, double, bool, const std::string &) override
Create a continuous or integer variable.
Definition: UtilMocks.h:187
Antares::Optimisation::LinearProblemApi::IMipConstraint * addConstraint(double, double, const std::string &) override
Add a bounded constraint to the problem.
Definition: UtilMocks.h:197
Antares::Optimisation::LinearProblemApi::IMipVariable * addNumVariable(double, double, const std::string &) override
Create a continuous variable.
Definition: UtilMocks.h:219
Definition: UtilMocks.h:101
Definition: UtilMocks.h:31
Definition: UtilMocks.h:400
Definition: UtilMocks.h:345
Definition: UtilMocks.h:380
Definition: UtilMocks.h:378
Definition: UtilMocks.h:471
Definition: UtilMocks.h:444