graph_manager.hpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /**
  2. * @file tests/qss/graph_manager.cpp
  3. * @author The ARTIS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * ARTIS - the multimodeling and simulation environment
  8. * This file is a part of the ARTIS environment
  9. *
  10. * Copyright (C) 2013-2019 ULCO http://www.univ-littoral.fr
  11. *
  12. * This program is free software: you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation, either version 3 of the License, or
  15. * (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  24. */
  25. #ifndef TESTS_QSS_GRAPH_MANAGER_HPP
  26. #define TESTS_QSS_GRAPH_MANAGER_HPP 1
  27. #include <tests/qss/models.hpp>
  28. #include <artis-star/kernel/pdevs/Coordinator.hpp>
  29. #include <artis-star/kernel/pdevs/qss/GraphManager.hpp>
  30. namespace artis {
  31. namespace tests {
  32. namespace qss {
  33. class ConstantGraphManager :
  34. public artis::pdevs::qss::GraphManager<common::DoubleTime, Constant> {
  35. public:
  36. ConstantGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  37. const artis::pdevs::qss::QSSParameters<artis::common::NoParameters>& parameters,
  38. const artis::common::NoParameters& graph_parameters)
  39. :
  40. artis::pdevs::qss::GraphManager<common::DoubleTime, Constant>(coordinator,
  41. parameters, graph_parameters) { }
  42. ~ConstantGraphManager() override = default;
  43. };
  44. class OnlyOneGraphManager :
  45. public artis::pdevs::qss::GraphManager<common::DoubleTime, Constant> {
  46. public:
  47. enum submodels {
  48. A
  49. };
  50. OnlyOneGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  51. const artis::pdevs::qss::QSSParameters<artis::common::NoParameters>& parameters,
  52. const artis::common::NoParameters& graph_parameters)
  53. :
  54. artis::pdevs::qss::GraphManager<common::DoubleTime, Constant>(coordinator,
  55. parameters, graph_parameters),
  56. S("a", parameters, graph_parameters)
  57. {
  58. add_child(A, &S);
  59. }
  60. ~OnlyOneGraphManager() override = default;
  61. private:
  62. artis::pdevs::Coordinator<common::DoubleTime, ConstantGraphManager, artis::pdevs::qss::QSSParameters<artis::common::NoParameters>> S;
  63. };
  64. class ParabolaGraphManager :
  65. public artis::pdevs::qss::GraphManager<common::DoubleTime, Parabola, ParabolaParameters> {
  66. public:
  67. ParabolaGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  68. const artis::pdevs::qss::QSSParameters<ParabolaParameters>& parameters,
  69. const artis::common::NoParameters& graph_parameters)
  70. :
  71. artis::pdevs::qss::GraphManager<common::DoubleTime, Parabola, ParabolaParameters>(
  72. coordinator, parameters, graph_parameters) { }
  73. ~ParabolaGraphManager() override = default;
  74. };
  75. class OnlyOneParabolaGraphManager :
  76. public artis::pdevs::GraphManager<common::DoubleTime, artis::pdevs::qss::QSSParameters<ParabolaParameters>> {
  77. public:
  78. enum submodels {
  79. A
  80. };
  81. OnlyOneParabolaGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  82. const artis::pdevs::qss::QSSParameters<ParabolaParameters>& parameters,
  83. const artis::common::NoParameters& graph_parameters)
  84. :
  85. artis::pdevs::GraphManager<common::DoubleTime, artis::pdevs::qss::QSSParameters<ParabolaParameters>>(
  86. coordinator, parameters, graph_parameters),
  87. S("a", parameters, graph_parameters)
  88. {
  89. add_child(A, &S);
  90. }
  91. ~OnlyOneParabolaGraphManager() override = default;
  92. private:
  93. artis::pdevs::Coordinator<common::DoubleTime, ParabolaGraphManager, artis::pdevs::qss::QSSParameters<ParabolaParameters>> S;
  94. };
  95. class PredatorGraphManager :
  96. public artis::pdevs::qss::GraphManager<common::DoubleTime, Predator, PreyPredatorParameters> {
  97. public:
  98. enum inputs {
  99. IN_X
  100. };
  101. PredatorGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  102. const artis::pdevs::qss::QSSParameters<PreyPredatorParameters>& parameters,
  103. const artis::common::NoParameters& graph_parameters)
  104. :
  105. artis::pdevs::qss::GraphManager<common::DoubleTime, Predator, PreyPredatorParameters>(
  106. coordinator, parameters, graph_parameters)
  107. {
  108. coordinator->input_port({IN_X, "in_x"});
  109. in({coordinator, IN_X}) >> in({derivative(), derivative()->dynamics().IN_X});
  110. }
  111. ~PredatorGraphManager() override = default;
  112. };
  113. class PreyGraphManager :
  114. public artis::pdevs::qss::GraphManager<common::DoubleTime, Prey, PreyPredatorParameters> {
  115. public:
  116. enum inputs {
  117. IN_Y
  118. };
  119. PreyGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  120. const artis::pdevs::qss::QSSParameters<PreyPredatorParameters>& parameters,
  121. const artis::common::NoParameters& graph_parameters)
  122. :
  123. artis::pdevs::qss::GraphManager<common::DoubleTime, Prey, PreyPredatorParameters>(
  124. coordinator, parameters, graph_parameters)
  125. {
  126. coordinator->input_port({IN_Y, "in_y"});
  127. in({coordinator, IN_Y}) >> in({derivative(), derivative()->dynamics().IN_Y});
  128. }
  129. ~PreyGraphManager() override = default;
  130. };
  131. struct PreyPredatorGraphManagerParameters {
  132. artis::pdevs::qss::QSSParameters<PreyPredatorParameters> _predator;
  133. artis::pdevs::qss::QSSParameters<PreyPredatorParameters> _prey;
  134. };
  135. class PreyPredatorGraphManager :
  136. public artis::pdevs::GraphManager<common::DoubleTime, PreyPredatorGraphManagerParameters> {
  137. public:
  138. enum submodels {
  139. PREDATOR, PREY
  140. };
  141. PreyPredatorGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  142. const PreyPredatorGraphManagerParameters& parameters,
  143. const artis::common::NoParameters& graph_parameters)
  144. :
  145. artis::pdevs::GraphManager<common::DoubleTime, PreyPredatorGraphManagerParameters>(
  146. coordinator, parameters, graph_parameters),
  147. _predator("predator", parameters._predator, graph_parameters),
  148. _prey("prey", parameters._prey, graph_parameters)
  149. {
  150. add_child(PREDATOR, &_predator);
  151. add_child(PREY, &_prey);
  152. out({&_predator, PredatorGraphManager::OUT})
  153. >> in({&_prey, PreyGraphManager::IN_Y});
  154. out({&_prey, PreyGraphManager::OUT})
  155. >> in({&_predator, PredatorGraphManager::IN_X});
  156. }
  157. ~PreyPredatorGraphManager() override = default;
  158. private:
  159. artis::pdevs::Coordinator<common::DoubleTime, PredatorGraphManager, artis::pdevs::qss::QSSParameters<PreyPredatorParameters>> _predator;
  160. artis::pdevs::Coordinator<common::DoubleTime, PreyGraphManager, artis::pdevs::qss::QSSParameters<PreyPredatorParameters>> _prey;
  161. };
  162. }
  163. }
  164. } // namespace artis tests qss
  165. #endif