graph_manager.hpp 11 KB

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