graph_manager.hpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /**
  2. * @file tests/qss/graph_manager.cpp
  3. * @author The ARTIS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * ARTIS - the multimodeling and simulation environment
  8. * This file is a part of the ARTIS environment
  9. *
  10. * Copyright (C) 2013-2019 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_QSS_GRAPH_MANAGER_HPP
  26. #define TESTS_QSS_GRAPH_MANAGER_HPP
  27. #include <tests/qss/models.hpp>
  28. #include <artis-star/kernel/pdevs/Coordinator.hpp>
  29. #include <artis-addons/qss/GraphManager.hpp>
  30. #include <artis-star/kernel/dtss/Coordinator.hpp>
  31. #include <artis-star/kernel/dtss/GraphManager.hpp>
  32. #include <artis-star/kernel/dtss/Policy.hpp>
  33. namespace artis {
  34. namespace tests {
  35. namespace qss {
  36. class ConstantGraphManager :
  37. public artis::qss::GraphManager<common::DoubleTime, Constant> {
  38. public:
  39. ConstantGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  40. const artis::qss::QSSParameters<artis::common::NoParameters> &parameters,
  41. const artis::common::NoParameters &graph_parameters)
  42. :
  43. artis::qss::GraphManager<common::DoubleTime, Constant>(coordinator,
  44. parameters, graph_parameters) {}
  45. ~ConstantGraphManager() override = default;
  46. };
  47. class OnlyOneGraphManager :
  48. public artis::qss::GraphManager<common::DoubleTime, Constant> {
  49. public:
  50. enum submodels {
  51. A
  52. };
  53. OnlyOneGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  54. const artis::qss::QSSParameters<artis::common::NoParameters> &parameters,
  55. const artis::common::NoParameters &graph_parameters)
  56. :
  57. artis::qss::GraphManager<common::DoubleTime, Constant>(coordinator,
  58. parameters, graph_parameters),
  59. S("a", parameters, graph_parameters) {
  60. add_child(A, &S);
  61. }
  62. ~OnlyOneGraphManager() override = default;
  63. private:
  64. artis::pdevs::Coordinator<common::DoubleTime,
  65. ConstantGraphManager,
  66. artis::qss::QSSParameters<artis::common::NoParameters>> S;
  67. };
  68. class ParabolaGraphManager :
  69. public artis::qss::GraphManager<common::DoubleTime, Parabola, ParabolaParameters> {
  70. public:
  71. ParabolaGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  72. const artis::qss::QSSParameters<ParabolaParameters> &parameters,
  73. const artis::common::NoParameters &graph_parameters)
  74. :
  75. artis::qss::GraphManager<common::DoubleTime, Parabola, ParabolaParameters>(
  76. coordinator, parameters, graph_parameters) {}
  77. ~ParabolaGraphManager() override = default;
  78. };
  79. class OnlyOneParabolaGraphManager :
  80. public artis::pdevs::GraphManager<common::DoubleTime,
  81. artis::qss::QSSParameters<ParabolaParameters>> {
  82. public:
  83. enum submodels {
  84. A
  85. };
  86. OnlyOneParabolaGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  87. const artis::qss::QSSParameters<ParabolaParameters> &parameters,
  88. const artis::common::NoParameters &graph_parameters)
  89. :
  90. artis::pdevs::GraphManager<common::DoubleTime, artis::qss::QSSParameters<ParabolaParameters>>(
  91. coordinator, parameters, graph_parameters),
  92. S("a", parameters, graph_parameters) {
  93. add_child(A, &S);
  94. }
  95. ~OnlyOneParabolaGraphManager() override = default;
  96. private:
  97. artis::pdevs::Coordinator<common::DoubleTime,
  98. ParabolaGraphManager,
  99. artis::qss::QSSParameters<ParabolaParameters>> S;
  100. };
  101. class PredatorGraphManager :
  102. public artis::qss::GraphManager<common::DoubleTime, Predator, PreyPredatorParameters> {
  103. public:
  104. enum inputs {
  105. IN_X =
  106. artis::qss::GraphManager<common::DoubleTime, Predator, PreyPredatorParameters>::RESET
  107. + 1
  108. };
  109. PredatorGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  110. const artis::qss::QSSParameters<PreyPredatorParameters> &parameters,
  111. const artis::common::NoParameters &graph_parameters)
  112. :
  113. artis::qss::GraphManager<common::DoubleTime, Predator, PreyPredatorParameters>(
  114. coordinator, parameters, graph_parameters) {
  115. coordinator->input_port({IN_X, "in_x"});
  116. in({coordinator, IN_X}) >> in({derivative(), derivative()->dynamics().IN_X});
  117. }
  118. ~PredatorGraphManager() override = default;
  119. };
  120. class PreyGraphManager :
  121. public artis::qss::GraphManager<common::DoubleTime, Prey, PreyPredatorParameters> {
  122. public:
  123. enum inputs {
  124. IN_Y =
  125. artis::qss::GraphManager<common::DoubleTime, Prey, PreyPredatorParameters>::RESET
  126. + 1
  127. };
  128. PreyGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  129. const artis::qss::QSSParameters<PreyPredatorParameters> &parameters,
  130. const artis::common::NoParameters &graph_parameters)
  131. :
  132. artis::qss::GraphManager<common::DoubleTime, Prey, PreyPredatorParameters>(
  133. coordinator, parameters, graph_parameters) {
  134. coordinator->input_port({IN_Y, "in_y"});
  135. in({coordinator, IN_Y}) >> in({derivative(), derivative()->dynamics().IN_Y});
  136. }
  137. ~PreyGraphManager() override = default;
  138. };
  139. struct PreyPredatorGraphManagerParameters {
  140. artis::qss::QSSParameters<PreyPredatorParameters> _predator;
  141. artis::qss::QSSParameters<PreyPredatorParameters> _prey;
  142. };
  143. class PreyPredatorGraphManager :
  144. public artis::pdevs::GraphManager<common::DoubleTime, PreyPredatorGraphManagerParameters> {
  145. public:
  146. enum submodels {
  147. PREDATOR, PREY
  148. };
  149. enum inputs {
  150. RESET_X, RESET_Y
  151. };
  152. enum outputs {
  153. OUT_X, OUT_Y
  154. };
  155. PreyPredatorGraphManager(common::Coordinator<common::DoubleTime> *coordinator,
  156. const PreyPredatorGraphManagerParameters &parameters,
  157. const artis::common::NoParameters &graph_parameters)
  158. :
  159. artis::pdevs::GraphManager<common::DoubleTime, PreyPredatorGraphManagerParameters>(
  160. coordinator, parameters, graph_parameters),
  161. _predator("predator", parameters._predator, graph_parameters),
  162. _prey("prey", parameters._prey, graph_parameters) {
  163. add_child(PREDATOR, &_predator);
  164. add_child(PREY, &_prey);
  165. coordinator->input_ports({{RESET_X, "reset_x"},
  166. {RESET_Y, "reset_y"}});
  167. coordinator->output_ports({{OUT_X, "out_x"},
  168. {OUT_Y, "out_y"}});
  169. in({coordinator, RESET_X}) >> in({&_prey, PreyGraphManager::RESET});
  170. in({coordinator, RESET_Y}) >> in({&_prey, PreyGraphManager::IN_Y});
  171. in({coordinator, RESET_X}) >> in({&_predator, PredatorGraphManager::IN_X});
  172. in({coordinator, RESET_Y}) >> in({&_predator, PredatorGraphManager::RESET});
  173. out({&_prey, PreyGraphManager::OUT}) >> out({coordinator, OUT_X});
  174. out({&_predator, PredatorGraphManager::OUT}) >> out({coordinator, OUT_Y});
  175. out({&_predator, PredatorGraphManager::OUT})
  176. >> in({&_prey, PreyGraphManager::IN_Y});
  177. out({&_prey, PreyGraphManager::OUT})
  178. >> in({&_predator, PredatorGraphManager::IN_X});
  179. }
  180. ~PreyPredatorGraphManager() override = default;
  181. private:
  182. artis::pdevs::Coordinator<common::DoubleTime,
  183. PredatorGraphManager,
  184. artis::qss::QSSParameters<PreyPredatorParameters>> _predator;
  185. artis::pdevs::Coordinator<common::DoubleTime,
  186. PreyGraphManager,
  187. artis::qss::QSSParameters<PreyPredatorParameters>> _prey;
  188. };
  189. struct PreyPredatorSmartGardenerGraphManagerParameters {
  190. PreyPredatorGraphManagerParameters _prey_predator;
  191. SmartGardenerParameters _smart_gardener;
  192. };
  193. class PreyPredatorSmartGardenerGraphManager :
  194. public artis::pdevs::GraphManager<common::DoubleTime,
  195. PreyPredatorSmartGardenerGraphManagerParameters> {
  196. public:
  197. enum submodels {
  198. PREY_PREDATOR, SMART_GARDENER
  199. };
  200. PreyPredatorSmartGardenerGraphManager(
  201. common::Coordinator<common::DoubleTime> *coordinator,
  202. const PreyPredatorSmartGardenerGraphManagerParameters &parameters,
  203. const artis::common::NoParameters &graph_parameters)
  204. :
  205. artis::pdevs::GraphManager<common::DoubleTime,
  206. PreyPredatorSmartGardenerGraphManagerParameters>(
  207. coordinator, parameters, graph_parameters),
  208. _prey_predator("prey_predator", parameters._prey_predator,
  209. graph_parameters),
  210. _smart_gardener("smart_gardener", parameters._smart_gardener) {
  211. add_child(PREY_PREDATOR, &_prey_predator);
  212. add_child(SMART_GARDENER, &_smart_gardener);
  213. out({&_prey_predator, PreyPredatorGraphManager::OUT_X})
  214. >> in({&_smart_gardener, SmartGardener::IN_X});
  215. out({&_prey_predator, PreyPredatorGraphManager::OUT_Y})
  216. >> in({&_smart_gardener, SmartGardener::IN_Y});
  217. out({&_smart_gardener, SmartGardener::OUT_X})
  218. >> in({&_prey_predator, PreyPredatorGraphManager::RESET_X});
  219. out({&_smart_gardener, SmartGardener::OUT_Y})
  220. >> in({&_prey_predator, PreyPredatorGraphManager::RESET_Y});
  221. }
  222. ~PreyPredatorSmartGardenerGraphManager() override = default;
  223. private:
  224. artis::pdevs::Coordinator<common::DoubleTime,
  225. PreyPredatorGraphManager,
  226. PreyPredatorGraphManagerParameters> _prey_predator;
  227. artis::pdevs::Simulator<common::DoubleTime, SmartGardener, SmartGardenerParameters>
  228. _smart_gardener;
  229. };
  230. class DiscretePredatorGraphManager :
  231. public artis::dtss::GraphManager<artis::common::DoubleTime, DiscretePreyPredatorParameters> {
  232. public:
  233. enum submodels {
  234. PREDATOR
  235. };
  236. enum inputs {
  237. RESET, IN_X
  238. };
  239. enum outputs {
  240. OUT
  241. };
  242. DiscretePredatorGraphManager(
  243. artis::common::Coordinator<artis::common::DoubleTime> *coordinator,
  244. const DiscretePreyPredatorParameters &parameters,
  245. const artis::common::NoParameters &graph_parameters)
  246. :
  247. artis::dtss::GraphManager<artis::common::DoubleTime, DiscretePreyPredatorParameters>(
  248. coordinator, parameters, graph_parameters
  249. ),
  250. _predator("predator", parameters) {
  251. add_child(PREDATOR, &_predator);
  252. coordinator->input_ports({{RESET, "reset"},
  253. {IN_X, "in_x"}});
  254. coordinator->output_port({OUT, "out"});
  255. out({&_predator, DiscretePredator::OUT}) >> out({coordinator, OUT});
  256. in({coordinator, RESET}) >> in({&_predator, DiscretePredator::RESET});
  257. in({coordinator, IN_X}) >> in({&_predator, DiscretePredator::IN_X});
  258. }
  259. ~DiscretePredatorGraphManager() override = default;
  260. private:
  261. artis::dtss::Simulator<artis::common::DoubleTime,
  262. DiscretePredator,
  263. DiscretePreyPredatorParameters> _predator;
  264. };
  265. struct MixedPreyPredatorGraphManagerParameters {
  266. DiscretePreyPredatorParameters _predator;
  267. artis::qss::QSSParameters<PreyPredatorParameters> _prey;
  268. };
  269. class MixedPreyPredatorGraphManager :
  270. public artis::pdevs::GraphManager<artis::common::DoubleTime,
  271. MixedPreyPredatorGraphManagerParameters> {
  272. public:
  273. enum submodels {
  274. PREDATOR, PREY
  275. };
  276. enum inputs {
  277. RESET_X, RESET_Y
  278. };
  279. enum outputs {
  280. OUT_X, OUT_Y
  281. };
  282. MixedPreyPredatorGraphManager(
  283. artis::common::Coordinator<artis::common::DoubleTime> *coordinator,
  284. const MixedPreyPredatorGraphManagerParameters &parameters,
  285. const artis::common::NoParameters &graph_parameters)
  286. :
  287. artis::pdevs::GraphManager<artis::common::DoubleTime,
  288. MixedPreyPredatorGraphManagerParameters>(
  289. coordinator, parameters, graph_parameters),
  290. _predator("predator", parameters._predator, graph_parameters),
  291. _prey("prey", parameters._prey, graph_parameters) {
  292. add_child(PREDATOR, &_predator);
  293. add_child(PREY, &_prey);
  294. coordinator->input_ports({{RESET_X, "reset_x"},
  295. {RESET_Y, "reset_y"}});
  296. coordinator->output_ports({{OUT_X, "out_x"},
  297. {OUT_Y, "out_y"}});
  298. in({coordinator, RESET_X}) >> in({&_prey, PreyGraphManager::RESET});
  299. in({coordinator, RESET_Y}) >> in({&_predator, PredatorGraphManager::RESET});
  300. out({&_prey, PreyGraphManager::OUT}) >> out({coordinator, OUT_X});
  301. out({&_predator, PredatorGraphManager::OUT}) >> out({coordinator, OUT_Y});
  302. out({&_predator, PredatorGraphManager::OUT})
  303. >> in({&_prey, PreyGraphManager::IN_Y});
  304. out({&_prey, PreyGraphManager::OUT})
  305. >> in({&_predator, PredatorGraphManager::IN_X});
  306. }
  307. ~MixedPreyPredatorGraphManager() override = default;
  308. private:
  309. artis::dtss::Coordinator<artis::common::DoubleTime,
  310. artis::dtss::LastBagPolicy,
  311. DiscretePredatorGraphManager,
  312. DiscretePreyPredatorParameters> _predator;
  313. artis::pdevs::Coordinator<artis::common::DoubleTime,
  314. PreyGraphManager,
  315. artis::qss::QSSParameters<PreyPredatorParameters>> _prey;
  316. };
  317. }
  318. }
  319. } // namespace artis tests qss
  320. #endif