graph_manager.hpp 15 KB

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