graph_manager.hpp 14 KB

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