graph_manager.hpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /**
  2. * @file tests/mpi/graph_manager.cpp
  3. * @author The PARADEVS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * PARADEVS - the multimodeling and simulation environment
  8. * This file is a part of the PARADEVS environment
  9. *
  10. * Copyright (C) 2013-2015 ULCO http://www.univ-litoral.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_MPI_GRAPH_MANAGER_HPP
  26. #define TESTS_PDEVS_MPI_GRAPH_MANAGER_HPP 1
  27. #include <tests/pdevs/models.hpp>
  28. #include <tests/pdevs/graph_manager.hpp>
  29. #include <paradevs/kernel/pdevs/mpi/Coordinator.hpp>
  30. #include <paradevs/kernel/pdevs/mpi/ModelProxy.hpp>
  31. #include <paradevs/kernel/pdevs/mpi/GraphManager.hpp>
  32. #include <paradevs/kernel/pdevs/Simulator.hpp>
  33. namespace paradevs { namespace tests { namespace mpi {
  34. class S1GraphManager :
  35. public paradevs::pdevs::mpi::GraphManager < common::DoubleTime >
  36. {
  37. public:
  38. S1GraphManager(common::Coordinator < common::DoubleTime >* coordinator,
  39. const paradevs::common::NoParameters& parameters) :
  40. paradevs::pdevs::mpi::GraphManager < common::DoubleTime >(coordinator,
  41. parameters),
  42. a("a1", common::NoParameters()),
  43. b("b1", common::NoParameters())
  44. {
  45. add_child(&a);
  46. add_child(&b);
  47. a.add_out_port("out");
  48. b.add_in_port("in");
  49. b.add_out_port("out");
  50. coordinator->add_out_port("out");
  51. add_link(&a, "out", &b, "in");
  52. add_link(&b, "out", coordinator, "out");
  53. }
  54. void init()
  55. { }
  56. void start(common::DoubleTime::type /* t */)
  57. { }
  58. void transition(
  59. const common::Models < common::DoubleTime >& /* receivers */,
  60. common::DoubleTime::type /* t */)
  61. { }
  62. virtual ~S1GraphManager()
  63. { }
  64. private:
  65. paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A > a;
  66. paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B > b;
  67. };
  68. class S2GraphManager :
  69. public paradevs::pdevs::mpi::GraphManager < common::DoubleTime >
  70. {
  71. public:
  72. S2GraphManager(common::Coordinator < common::DoubleTime >* coordinator,
  73. const paradevs::common::NoParameters& parameters) :
  74. paradevs::pdevs::mpi::GraphManager < common::DoubleTime >(coordinator,
  75. parameters),
  76. a("a2", common::NoParameters()),
  77. b("b2", common::NoParameters())
  78. {
  79. add_child(&a);
  80. add_child(&b);
  81. a.add_in_port("in");
  82. a.add_out_port("out");
  83. b.add_in_port("in");
  84. coordinator->add_in_port("in");
  85. add_link(&a, "out", &b, "in");
  86. add_link(coordinator, "in", &a, "in");
  87. }
  88. void init()
  89. { }
  90. void start(common::DoubleTime::type /* t */)
  91. { }
  92. void transition(
  93. const common::Models < common::DoubleTime >& /* receivers */,
  94. common::DoubleTime::type /* t */)
  95. { }
  96. virtual ~S2GraphManager()
  97. { }
  98. private:
  99. paradevs::pdevs::Simulator < common::DoubleTime, pdevs::A > a;
  100. paradevs::pdevs::Simulator < common::DoubleTime, pdevs::B > b;
  101. };
  102. struct RootGraphManagerParameters
  103. {
  104. int S1_rank;
  105. int S2_rank;
  106. };
  107. class RootGraphManager :
  108. public paradevs::pdevs::GraphManager < common::DoubleTime,
  109. RootGraphManagerParameters >
  110. {
  111. public:
  112. RootGraphManager(
  113. common::Coordinator < common::DoubleTime >* coordinator,
  114. const RootGraphManagerParameters& parameters) :
  115. paradevs::pdevs::GraphManager < common::DoubleTime,
  116. RootGraphManagerParameters >(
  117. coordinator, parameters),
  118. S1("a", parameters.S1_rank, false),
  119. S2("b", parameters.S2_rank, false)
  120. {
  121. add_child(&S1);
  122. add_child(&S2);
  123. add_link(&S1, "out", &S2, "in");
  124. }
  125. virtual ~RootGraphManager()
  126. { }
  127. private:
  128. paradevs::pdevs::mpi::ModelProxy < common::DoubleTime > S1;
  129. paradevs::pdevs::mpi::ModelProxy < common::DoubleTime > S2;
  130. };
  131. // class S3GraphManager :
  132. // public paradevs::pdevs::GraphManager < common::DoubleTime >
  133. // {
  134. // public:
  135. // S3GraphManager(common::Coordinator < common::DoubleTime >* coordinator,
  136. // const paradevs::common::NoParameters& parameters) :
  137. // paradevs::pdevs::GraphManager < common::DoubleTime >(coordinator,
  138. // parameters)
  139. // {
  140. // coordinator->add_out_port("out");
  141. // for (unsigned int i = 0; i < 10; ++i) {
  142. // std::ostringstream ss;
  143. // simulator_type* s = new simulator_type(ss.str(),
  144. // common::NoParameters());
  145. // ss << "a" << (i + 1);
  146. // _simulators.push_back(s);
  147. // add_child(s);
  148. // s->add_out_port("out");
  149. // }
  150. // }
  151. // void init()
  152. // { }
  153. // void start(common::DoubleTime::type /* t */)
  154. // { }
  155. // void transition(
  156. // const common::Models < common::DoubleTime >& /* receivers */,
  157. // common::DoubleTime::type /* t */)
  158. // { }
  159. // virtual ~S3GraphManager()
  160. // {
  161. // for (typename std::vector < simulator_type* >::const_iterator it =
  162. // _simulators.begin(); it != _simulators.end(); ++it) {
  163. // delete *it;
  164. // }
  165. // }
  166. // private:
  167. // typedef paradevs::pdevs::Simulator < common::DoubleTime,
  168. // pdevs::A > simulator_type;
  169. // std::vector < simulator_type* > _simulators;
  170. // };
  171. // class Root2GraphManager :
  172. // public paradevs::pdevs::GraphManager < common::DoubleTime >
  173. // {
  174. // public:
  175. // Root2GraphManager(
  176. // common::Coordinator < common::DoubleTime >* coordinator,
  177. // const paradevs::common::NoParameters& parameters) :
  178. // paradevs::pdevs::GraphManager < common::DoubleTime >(
  179. // coordinator, parameters),
  180. // S1("S1", paradevs::common::NoParameters(),
  181. // paradevs::common::NoParameters()),
  182. // S2("S2", paradevs::common::NoParameters(),
  183. // paradevs::common::NoParameters())
  184. // {
  185. // add_child(&S1);
  186. // add_child(&S2);
  187. // }
  188. // void init()
  189. // {
  190. // S1.set_sender(
  191. // dynamic_cast < paradevs::pdevs::mpi::Coordinator <
  192. // common::DoubleTime,
  193. // paradevs::tests::mpi::Root2GraphManager >*
  194. // >(get_coordinator())->get_sender());
  195. // S2.set_sender(
  196. // dynamic_cast < paradevs::pdevs::mpi::Coordinator <
  197. // common::DoubleTime,
  198. // paradevs::tests::mpi::Root2GraphManager >*
  199. // >(get_coordinator())->get_sender());
  200. // }
  201. // void start(common::DoubleTime::type t)
  202. // {
  203. // S1.get_sender().send(
  204. // paradevs::pdevs::mpi::start_message <
  205. // common::DoubleTime >(t));
  206. // S2.get_sender().send(
  207. // paradevs::pdevs::mpi::start_message <
  208. // common::DoubleTime >(t));
  209. // }
  210. // void transition(const common::Models < common::DoubleTime >& receivers,
  211. // common::DoubleTime::type t)
  212. // {
  213. // if (std::find(receivers.begin(), receivers.end(),
  214. // &S1) != receivers.end()) {
  215. // S1.get_sender().send(
  216. // paradevs::pdevs::mpi::transition_message <
  217. // common::DoubleTime >(t));
  218. // }
  219. // if (std::find(receivers.begin(), receivers.end(),
  220. // &S2) != receivers.end()) {
  221. // S2.get_sender().send(
  222. // paradevs::pdevs::mpi::transition_message <
  223. // common::DoubleTime >(t));
  224. // }
  225. // }
  226. // virtual ~Root2GraphManager()
  227. // { }
  228. // private:
  229. // paradevs::pdevs::mpi::Coordinator <
  230. // common::DoubleTime,
  231. // S3GraphManager > S1;
  232. // paradevs::pdevs::mpi::Coordinator <
  233. // common::DoubleTime,
  234. // S3GraphManager > S2;
  235. // };
  236. // class Root3GraphManager :
  237. // public paradevs::pdevs::GraphManager < common::DoubleTime >
  238. // {
  239. // public:
  240. // Root3GraphManager(
  241. // common::Coordinator < common::DoubleTime >* coordinator,
  242. // const paradevs::common::NoParameters& parameters) :
  243. // paradevs::pdevs::GraphManager < common::DoubleTime >(
  244. // coordinator, parameters),
  245. // S1("S1", paradevs::common::NoParameters(),
  246. // paradevs::common::NoParameters()),
  247. // S2("S2", paradevs::common::NoParameters(),
  248. // paradevs::common::NoParameters())
  249. // {
  250. // add_child(&S1);
  251. // add_child(&S2);
  252. // }
  253. // virtual ~Root3GraphManager()
  254. // { }
  255. // private:
  256. // paradevs::pdevs::Coordinator <
  257. // common::DoubleTime,
  258. // S3GraphManager > S1;
  259. // paradevs::pdevs::Coordinator <
  260. // common::DoubleTime,
  261. // S3GraphManager > S2;
  262. // };
  263. } } } // namespace paradevs tests mpi
  264. #endif