graph_manager.hpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /**
  2. * @file tests/pdevs/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_PDEVS_GRAPH_MANAGER_HPP
  26. #define TESTS_PDEVS_GRAPH_MANAGER_HPP
  27. #include <tests/pdevs/models.hpp>
  28. #include <artis-star/kernel/pdevs/Coordinator.hpp>
  29. #include <artis-star/kernel/pdevs/GraphManager.hpp>
  30. #include <artis-star/kernel/pdevs/Simulator.hpp>
  31. namespace artis {
  32. namespace tests {
  33. namespace pdevs {
  34. class S1GraphManager : public artis::pdevs::GraphManager<common::DoubleTime> {
  35. public:
  36. enum submodels {
  37. OneA, OneB
  38. };
  39. enum outputs {
  40. OUT
  41. };
  42. S1GraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  43. const artis::common::NoParameters &parameters,
  44. const artis::common::NoParameters &graph_parameters)
  45. :
  46. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  47. a("a1", parameters), b("b1", parameters) {
  48. add_child(OneA, &a);
  49. add_child(OneB, &b);
  50. coordinator->output_port({OUT, "out"});
  51. out({&a, A::OUT}) >> in({&b, B::IN});
  52. out({&b, B::OUT}) >> out({coordinator, OUT});
  53. }
  54. ~S1GraphManager() override = default;
  55. private:
  56. artis::pdevs::Simulator<common::DoubleTime, A> a;
  57. artis::pdevs::Simulator<common::DoubleTime, B> b;
  58. };
  59. class S2GraphManager : public artis::pdevs::GraphManager<common::DoubleTime> {
  60. public:
  61. enum submodels {
  62. OneA, OneB
  63. };
  64. enum inputs {
  65. IN
  66. };
  67. S2GraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  68. const artis::common::NoParameters &parameters,
  69. const artis::common::NoParameters &graph_parameters)
  70. :
  71. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  72. a("a2", parameters), b("b2", parameters) {
  73. add_child(OneA, &a);
  74. add_child(OneB, &b);
  75. coordinator->input_port({IN, "in"});
  76. in({coordinator, IN}) >> in({&a, A::IN});
  77. out({&a, A::OUT}) >> in({&b, B::IN});
  78. }
  79. ~S2GraphManager() override = default;
  80. private:
  81. artis::pdevs::Simulator<common::DoubleTime, A> a;
  82. artis::pdevs::Simulator<common::DoubleTime, B> b;
  83. };
  84. class RootGraphManager :
  85. public artis::pdevs::GraphManager<common::DoubleTime> {
  86. public:
  87. enum submodels {
  88. OneS1, OneS2
  89. };
  90. RootGraphManager(
  91. common::Coordinator<common::DoubleTime> *coordinator,
  92. const artis::common::NoParameters &parameters,
  93. const artis::common::NoParameters &graph_parameters)
  94. :
  95. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  96. S1("S1", parameters, graph_parameters),
  97. S2("S2", parameters, graph_parameters) {
  98. add_child(OneS1, &S1);
  99. add_child(OneS2, &S2);
  100. out({&S1, S1GraphManager::OUT}) >> in({&S2, S2GraphManager::IN});
  101. }
  102. ~RootGraphManager() override = default;
  103. private:
  104. artis::pdevs::Coordinator<common::DoubleTime, S1GraphManager> S1;
  105. artis::pdevs::Coordinator<common::DoubleTime, S2GraphManager> S2;
  106. };
  107. template<typename M>
  108. class OnlyOneGraphManager :
  109. public artis::pdevs::GraphManager<common::DoubleTime> {
  110. public:
  111. enum submodels {
  112. OneM
  113. };
  114. OnlyOneGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  115. const artis::common::NoParameters &parameters,
  116. const artis::common::NoParameters &graph_parameters)
  117. :
  118. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  119. model("a", parameters) {
  120. add_child(OneM, &model);
  121. }
  122. ~OnlyOneGraphManager() override = default;
  123. private:
  124. artis::pdevs::Simulator<common::DoubleTime, M> model;
  125. };
  126. class FlatGraphManager :
  127. public artis::pdevs::GraphManager<common::DoubleTime> {
  128. public:
  129. enum submodels {
  130. FirstA, SecondA,
  131. FirstB, SecondB
  132. };
  133. FlatGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  134. const artis::common::NoParameters &parameters,
  135. const artis::common::NoParameters &graph_parameters)
  136. :
  137. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  138. a1("a1", parameters), b1("b1", parameters),
  139. a2("a2", parameters), b2("b2", parameters) {
  140. add_child(FirstA, &a1);
  141. add_child(FirstB, &b1);
  142. add_child(SecondA, &a2);
  143. add_child(SecondB, &b2);
  144. out({&a1, A::OUT}) >> in({&b1, B::IN});
  145. out({&b1, B::OUT}) >> in({&a2, A::IN});
  146. out({&a2, A::OUT}) >> in({&b2, B::IN});
  147. }
  148. ~FlatGraphManager() override = default;
  149. private:
  150. artis::pdevs::Simulator<common::DoubleTime, A> a1;
  151. artis::pdevs::Simulator<common::DoubleTime, B> b1;
  152. artis::pdevs::Simulator<common::DoubleTime, A> a2;
  153. artis::pdevs::Simulator<common::DoubleTime, B> b2;
  154. };
  155. }
  156. }
  157. } // namespace artis tests pdevs
  158. #endif