graph_manager.hpp 14 KB

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