graph_manager.hpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. /**
  2. * @file tests/mpi/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_PDEVS_MPI_GRAPH_MANAGER_HPP
  26. #define TESTS_PDEVS_MPI_GRAPH_MANAGER_HPP
  27. #include <tests/multithreading/lifegame/models.hpp>
  28. #include <tests/pdevs/graph_manager.hpp>
  29. #include <tests/pdevs/models.hpp>
  30. #include <artis-star/kernel/pdevs/mpi/Coordinator.hpp>
  31. #include <artis-star/kernel/pdevs/mpi/ModelProxy.hpp>
  32. #include <artis-star/kernel/pdevs/mpi/GraphManager.hpp>
  33. #include <artis-star/kernel/pdevs/multithreading/Coordinator.hpp>
  34. #include <artis-star/kernel/pdevs/Simulator.hpp>
  35. #include <sstream>
  36. // #include <tests/boost_graph/graph_defs.hpp>
  37. namespace artis {
  38. namespace tests {
  39. namespace mpi {
  40. class S1GraphManager : public artis::pdevs::mpi::GraphManager<common::DoubleTime> {
  41. public:
  42. enum submodels {
  43. OneA, OneB
  44. };
  45. enum outputs {
  46. OUT
  47. };
  48. S1GraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  49. const artis::common::NoParameters& parameters,
  50. const artis::common::NoParameters& graph_parameters)
  51. :
  52. artis::pdevs::mpi::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  53. a("a1", parameters), b("b1", parameters)
  54. {
  55. add_child(OneA, &a);
  56. add_child(OneB, &b);
  57. coordinator->output_port({OUT, "out"});
  58. out({&a, pdevs::A::OUT}) >> in({&b, pdevs::B::IN});
  59. out({&b, pdevs::B::OUT}) >> out({coordinator, OUT});
  60. }
  61. ~S1GraphManager() override = default;
  62. private:
  63. artis::pdevs::Simulator<common::DoubleTime, pdevs::A> a;
  64. artis::pdevs::Simulator<common::DoubleTime, pdevs::B> b;
  65. };
  66. class S2GraphManager :
  67. public artis::pdevs::mpi::GraphManager<common::DoubleTime> {
  68. public:
  69. enum submodels {
  70. OneA, OneB
  71. };
  72. enum inputs {
  73. IN
  74. };
  75. enum outputs {
  76. OUT
  77. };
  78. S2GraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  79. const artis::common::NoParameters& parameters,
  80. const artis::common::NoParameters& graph_parameters)
  81. :
  82. artis::pdevs::mpi::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  83. a("a2", parameters), b("b2", parameters)
  84. {
  85. add_child(OneA, &a);
  86. add_child(OneB, &b);
  87. coordinator->input_port({IN, "in"});
  88. coordinator->output_port({OUT, "out"});
  89. in({coordinator, IN}) >> in({&a, pdevs::A::IN});
  90. out({&a, pdevs::A::OUT}) >> in({&b, pdevs::B::IN});
  91. out({&b, pdevs::B::OUT}) >> out({coordinator, OUT});
  92. }
  93. ~S2GraphManager() override = default;
  94. private:
  95. artis::pdevs::Simulator<common::DoubleTime, pdevs::A> a;
  96. artis::pdevs::Simulator<common::DoubleTime, pdevs::B> b;
  97. };
  98. struct RootGraphManagerParameters {
  99. std::vector<int> ranks;
  100. };
  101. class RootGraphManager
  102. : public artis::pdevs::GraphManager<common::DoubleTime, artis::common::NoParameters, RootGraphManagerParameters> {
  103. public:
  104. RootGraphManager(
  105. common::Coordinator<common::DoubleTime>* coordinator,
  106. const artis::common::NoParameters& parameters,
  107. const RootGraphManagerParameters& graph_parameters)
  108. :
  109. artis::pdevs::GraphManager<common::DoubleTime, artis::common::NoParameters, RootGraphManagerParameters>(
  110. coordinator, parameters, graph_parameters)
  111. {
  112. ModelProxy* previous = nullptr;
  113. unsigned int i = 0;
  114. for (auto it = graph_parameters.ranks.begin(); it != graph_parameters.ranks.end(); ++it) {
  115. std::stringstream ss;
  116. ModelProxy* model = nullptr;
  117. ss << "S" << *it;
  118. model = new ModelProxy(ss.str(), *it, false);
  119. models.push_back(model);
  120. add_child(i, model);
  121. if (i == 0) {
  122. model->add_out_port({S1GraphManager::OUT, "out"});
  123. } else {
  124. model->add_out_port({S2GraphManager::OUT, "out"});
  125. model->add_in_port({S2GraphManager::IN, "in"});
  126. if (i == 1) {
  127. out({previous, S1GraphManager::OUT}) >> in({model, S2GraphManager::IN});
  128. } else {
  129. out({previous, S2GraphManager::OUT}) >> in({model, S2GraphManager::IN});
  130. }
  131. }
  132. previous = model;
  133. ++i;
  134. }
  135. }
  136. ~RootGraphManager() override
  137. {
  138. std::for_each(models.begin(), models.end(), std::default_delete<ModelProxy>());
  139. }
  140. private:
  141. typedef artis::pdevs::mpi::ModelProxy<common::DoubleTime> ModelProxy;
  142. typedef std::vector<ModelProxy*> ModelProxies;
  143. ModelProxies models;
  144. };
  145. /******************************************************************************/
  146. class S1LocalGraphManager : public artis::pdevs::GraphManager<common::DoubleTime> {
  147. public:
  148. enum submodels {
  149. OneA, OneB
  150. };
  151. enum outputs {
  152. OUT
  153. };
  154. S1LocalGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  155. const artis::common::NoParameters& parameters,
  156. const artis::common::NoParameters& graph_parameters)
  157. :
  158. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  159. a("a1", parameters), b("b1", parameters)
  160. {
  161. add_child(OneA, &a);
  162. add_child(OneB, &b);
  163. coordinator->output_port({OUT, "out"});
  164. out({&a, pdevs::A::OUT}) >> in({&b, pdevs::B::IN});
  165. out({&b, pdevs::B::OUT}) >> out({coordinator, OUT});
  166. }
  167. ~S1LocalGraphManager() override = default;
  168. void init() { }
  169. void start(common::DoubleTime::type /* t */) { }
  170. void transition(const common::Models<common::DoubleTime>& /* receivers */,
  171. common::DoubleTime::type /* t */) { }
  172. private:
  173. artis::pdevs::Simulator<common::DoubleTime, pdevs::A> a;
  174. artis::pdevs::Simulator<common::DoubleTime, pdevs::B> b;
  175. };
  176. class S2LocalGraphManager :
  177. public artis::pdevs::GraphManager<common::DoubleTime> {
  178. public:
  179. enum submodels {
  180. OneA, OneB
  181. };
  182. enum inputs {
  183. IN
  184. };
  185. enum outputs {
  186. OUT
  187. };
  188. S2LocalGraphManager(common::Coordinator<common::DoubleTime>* coordinator,
  189. const artis::common::NoParameters& parameters,
  190. const artis::common::NoParameters& graph_parameters)
  191. :
  192. artis::pdevs::GraphManager<common::DoubleTime>(coordinator, parameters, graph_parameters),
  193. a("a2", parameters), b("b2", parameters)
  194. {
  195. add_child(OneA, &a);
  196. add_child(OneB, &b);
  197. coordinator->input_port({IN, "in"});
  198. coordinator->output_port({OUT, "out"});
  199. in({coordinator, IN}) >> in({&a, pdevs::A::IN});
  200. out({&a, pdevs::A::OUT}) >> in({&b, pdevs::B::IN});
  201. out({&b, pdevs::B::OUT}) >> out({coordinator, OUT});
  202. }
  203. ~S2LocalGraphManager() override = default;
  204. void init() { }
  205. void start(common::DoubleTime::type /* t */) { }
  206. void transition(const common::Models<common::DoubleTime>& /* receivers */,
  207. common::DoubleTime::type /* t */) { }
  208. private:
  209. artis::pdevs::Simulator<common::DoubleTime, pdevs::A> a;
  210. artis::pdevs::Simulator<common::DoubleTime, pdevs::B> b;
  211. };
  212. class RootLocalGraphManager :
  213. public artis::pdevs::GraphManager<common::DoubleTime, artis::common::NoParameters, RootGraphManagerParameters> {
  214. public:
  215. RootLocalGraphManager(
  216. common::Coordinator<common::DoubleTime>* coordinator,
  217. const artis::common::NoParameters& parameters,
  218. const RootGraphManagerParameters& graph_parameters)
  219. :
  220. artis::pdevs::GraphManager<common::DoubleTime, artis::common::NoParameters, RootGraphManagerParameters>(
  221. coordinator, parameters, graph_parameters),
  222. first("S0", artis::common::NoParameters(), artis::common::NoParameters())
  223. {
  224. Next* previous = nullptr;
  225. unsigned int i = 1;
  226. add_child(0, &first);
  227. for (auto rank: graph_parameters.ranks) {
  228. std::stringstream ss;
  229. Next* model = nullptr;
  230. ss << "S" << rank;
  231. model = new Next(ss.str(), artis::common::NoParameters(), artis::common::NoParameters());
  232. nexts.push_back(model);
  233. add_child(i, model);
  234. if (previous) {
  235. out({previous, S2GraphManager::OUT}) >> in({model, S2GraphManager::IN});
  236. }
  237. previous = model;
  238. ++i;
  239. }
  240. out({&first, S1GraphManager::OUT}) >> in({nexts[0], S2GraphManager::IN});
  241. }
  242. ~RootLocalGraphManager() override
  243. {
  244. std::for_each(nexts.begin(), nexts.end(),
  245. std::default_delete<Next>());
  246. }
  247. private:
  248. typedef artis::pdevs::Coordinator<common::DoubleTime, S1LocalGraphManager> First;
  249. typedef artis::pdevs::Coordinator<common::DoubleTime, S2LocalGraphManager> Next;
  250. typedef std::vector<Next*> Nexts;
  251. First first;
  252. Nexts nexts;
  253. };
  254. /******************************************************************************/
  255. class RootMultithreadingGraphManager :
  256. public artis::pdevs::GraphManager<common::DoubleTime, artis::common::NoParameters, RootGraphManagerParameters> {
  257. typedef artis::pdevs::multithreading::Coordinator<
  258. common::DoubleTime,
  259. RootMultithreadingGraphManager,
  260. artis::common::NoParameters,
  261. RootGraphManagerParameters> ParentCoordinator;
  262. public:
  263. RootMultithreadingGraphManager(
  264. common::Coordinator<common::DoubleTime>* coordinator,
  265. const artis::common::NoParameters& parameters,
  266. const RootGraphManagerParameters& graph_parameters)
  267. :
  268. artis::pdevs::GraphManager<common::DoubleTime, artis::common::NoParameters, RootGraphManagerParameters>(
  269. coordinator, parameters, graph_parameters),
  270. first("S0", artis::common::NoParameters(), artis::common::NoParameters())
  271. {
  272. Next* previous = nullptr;
  273. unsigned int i = 1;
  274. add_child(0, &first);
  275. for (auto rank: graph_parameters.ranks) {
  276. std::stringstream ss;
  277. Next* model = nullptr;
  278. ss << "S" << rank;
  279. model = new Next(ss.str(), artis::common::NoParameters(), artis::common::NoParameters());
  280. nexts.push_back(model);
  281. add_child(i, model);
  282. if (previous) {
  283. out({previous, S2GraphManager::OUT}) >> in({model, S2GraphManager::IN});
  284. }
  285. previous = model;
  286. ++i;
  287. }
  288. out({&first, S1GraphManager::OUT}) >> in({nexts[0], S2GraphManager::IN});
  289. }
  290. ~RootMultithreadingGraphManager() override
  291. {
  292. std::for_each(nexts.begin(), nexts.end(), std::default_delete<Next>());
  293. }
  294. void init()
  295. {
  296. first.set_sender(dynamic_cast < ParentCoordinator* >(coordinator())->get_sender());
  297. for (Nexts::const_iterator it = nexts.begin(); it != nexts.end(); ++it) {
  298. (*it)->set_sender(dynamic_cast < ParentCoordinator* >(coordinator())->get_sender());
  299. }
  300. }
  301. void start(common::DoubleTime::type t)
  302. {
  303. first.get_sender().send(
  304. artis::pdevs::multithreading::start_message<
  305. artis::common::DoubleTime>(t));
  306. for (Nexts::const_iterator it = nexts.begin(); it != nexts.end(); ++it) {
  307. (*it)->get_sender().send(
  308. artis::pdevs::multithreading::start_message<artis::common::DoubleTime>(t));
  309. }
  310. }
  311. void transition(const common::Models<common::DoubleTime>& receivers,
  312. artis::common::DoubleTime::type t)
  313. {
  314. auto it = receivers.begin();
  315. while (it != receivers.end()) {
  316. if (not(*it)->is_atomic()) {
  317. Nexts::const_iterator itc = std::find(nexts.begin(), nexts.end(), *it);
  318. if (itc != nexts.end()) {
  319. (*itc)->get_sender().send(
  320. artis::pdevs::multithreading::transition_message<
  321. artis::common::DoubleTime>(t));
  322. } else {
  323. first.get_sender().send(
  324. artis::pdevs::multithreading::transition_message<
  325. artis::common::DoubleTime>(t));
  326. }
  327. }
  328. ++it;
  329. }
  330. }
  331. private:
  332. typedef artis::pdevs::multithreading::Coordinator<common::DoubleTime, S1LocalGraphManager> First;
  333. typedef artis::pdevs::multithreading::Coordinator<common::DoubleTime, S2LocalGraphManager> Next;
  334. typedef std::vector<Next*> Nexts;
  335. First first;
  336. Nexts nexts;
  337. };
  338. /******************************************************************************/
  339. struct GridGraphManagerParameters {
  340. unsigned int global_size;
  341. unsigned int sub_grid_size;
  342. };
  343. // class GridGraphManager :
  344. // public artis::pdevs::GraphManager<common::DoubleTime,
  345. // GridGraphManagerParameters> {
  346. // public:
  347. // GridGraphManager(
  348. // common::Coordinator<common::DoubleTime>* coordinator,
  349. // const GridGraphManagerParameters& parameters)
  350. // :
  351. // artis::pdevs::GraphManager<common::DoubleTime,
  352. // GridGraphManagerParameters>(
  353. // coordinator, parameters)
  354. // {
  355. // int index = 1;
  356. // unsigned int size = parameters.global_size / parameters.sub_grid_size;
  357. //
  358. // // models
  359. // for (unsigned int j = 0; j < size; ++j) {
  360. // for (unsigned int i = 0; i < size; ++i) {
  361. // std::stringstream ss;
  362. // ModelProxy* model = 0;
  363. //
  364. // ss << "S_" << i << "_" << j;
  365. // model = new ModelProxy(ss.str(), index++, false);
  366. // models.push_back(model);
  367. // add_child(model);
  368. // }
  369. // }
  370. //
  371. // // input ports
  372. // for (unsigned int i = 0; i < size; ++i) {
  373. // for (unsigned int j = 0; j < size; ++j) {
  374. // ModelProxy* model = models[i + j * size];
  375. //
  376. // // top and bottom
  377. // for (unsigned int x = i * parameters.sub_grid_size;
  378. // x < (i + 1) * parameters.sub_grid_size; ++x) {
  379. // // top
  380. // if (j != 0) {
  381. // std::stringstream ss;
  382. //
  383. // ss << "in_" << x << "_"
  384. // << (j * parameters.sub_grid_size - 1);
  385. //
  386. // // std::cout << "ADD INPUT PORT "
  387. // // << model->get_name() << " "
  388. // // << ss.str() << std::endl;
  389. //
  390. // model->add_in_port(ss.str());
  391. // }
  392. // // bottom
  393. // if (j != size - 1) {
  394. // std::stringstream ss;
  395. //
  396. // ss << "in_" << x << "_"
  397. // << ((j + 1) * parameters.sub_grid_size);
  398. //
  399. // // std::cout << "ADD INPUT PORT "
  400. // // << model->get_name() << " "
  401. // // << ss.str() << std::endl;
  402. //
  403. // model->add_in_port(ss.str());
  404. // }
  405. // }
  406. // // left and right
  407. // for (unsigned int y = j * parameters.sub_grid_size;
  408. // y < (j + 1) * parameters.sub_grid_size; ++y) {
  409. //
  410. // // left
  411. // if (i != 0) {
  412. // std::stringstream ss;
  413. //
  414. // ss << "in_" << (i * parameters.sub_grid_size - 1)
  415. // << "_" << y;
  416. //
  417. // // std::cout << "ADD INPUT PORT "
  418. // // << model->get_name() << " "
  419. // // << ss.str() << std::endl;
  420. //
  421. // model->add_in_port(ss.str());
  422. // }
  423. // // right
  424. // if (i != size - 1) {
  425. // std::stringstream ss;
  426. //
  427. // ss << "in_" << ((i + 1) * parameters.sub_grid_size)
  428. // << "_" << y;
  429. //
  430. // // std::cout << "ADD INPUT PORT "
  431. // // << model->get_name() << " "
  432. // // << ss.str() << std::endl;
  433. //
  434. // model->add_in_port(ss.str());
  435. // }
  436. // }
  437. // }
  438. // }
  439. //
  440. // // output ports
  441. // for (unsigned int i = 0; i < size; ++i) {
  442. // for (unsigned int j = 0; j < size; ++j) {
  443. // ModelProxy* model = models[i + j * size];
  444. //
  445. // // top and bottom
  446. // for (unsigned int x = i * parameters.sub_grid_size;
  447. // x < (i + 1) * parameters.sub_grid_size; ++x) {
  448. // // top
  449. // if (j != 0) {
  450. // std::stringstream ss;
  451. //
  452. // ss << "out_" << x << "_"
  453. // << (j * parameters.sub_grid_size);
  454. //
  455. // // std::cout << "ADD OUTPUT PORT "
  456. // // << model->get_name() << " "
  457. // // << ss.str() << std::endl;
  458. //
  459. // model->add_out_port(ss.str());
  460. // }
  461. // // bottom
  462. // if (j != size - 1) {
  463. // std::stringstream ss;
  464. //
  465. // ss << "out_" << x << "_"
  466. // << ((j + 1) * parameters.sub_grid_size - 1);
  467. //
  468. // // std::cout << "ADD OUTPUT PORT "
  469. // // << model->get_name() << " "
  470. // // << ss.str() << std::endl;
  471. //
  472. // model->add_out_port(ss.str());
  473. // }
  474. // }
  475. // // left and right
  476. // for (unsigned int y = j * parameters.sub_grid_size;
  477. // y < (j + 1) * parameters.sub_grid_size; ++y) {
  478. // // left
  479. // if (i != 0) {
  480. // std::stringstream ss;
  481. //
  482. // ss << "out_" << (i * parameters.sub_grid_size)
  483. // << "_" << y;
  484. // if (not model->exist_out_port(ss.str())) {
  485. //
  486. // // std::cout << "ADD OUTPUT PORT "
  487. // // << model->get_name() << " "
  488. // // << ss.str() << std::endl;
  489. //
  490. // model->add_out_port(ss.str());
  491. // }
  492. // }
  493. // // right
  494. // if (i != size - 1) {
  495. // std::stringstream ss;
  496. //
  497. // ss << "out_" << ((i + 1) * parameters.sub_grid_size - 1)
  498. // << "_" << y;
  499. // if (not model->exist_out_port(ss.str())) {
  500. //
  501. // // std::cout << "ADD OUTPUT PORT "
  502. // // << model->get_name() << " "
  503. // // << ss.str() << std::endl;
  504. //
  505. // model->add_out_port(ss.str());
  506. // }
  507. // }
  508. // }
  509. // }
  510. // }
  511. //
  512. // // connections
  513. // for (unsigned int i = 0; i < size; ++i) {
  514. // for (unsigned int j = 0; j < size; ++j) {
  515. // ModelProxy* model = models[i + j * size];
  516. //
  517. // // top
  518. // if (j != 0) {
  519. // for (unsigned int x = i * parameters.sub_grid_size;
  520. // x < (i + 1) * parameters.sub_grid_size; ++x) {
  521. // std::stringstream out_ss;
  522. // std::stringstream in_ss;
  523. //
  524. // out_ss << "out_" << x << "_"
  525. // << (j * parameters.sub_grid_size - 1);
  526. // in_ss << "in_" << x << "_"
  527. // << (j * parameters.sub_grid_size - 1);
  528. //
  529. // // std::cout << "LINK " << model->get_name()
  530. // // << "::" << in_ss.str()
  531. // // << " <= "
  532. // // << models[i + (j - 1) * size]->get_name()
  533. // // << "::"
  534. // // << out_ss.str()
  535. // // << std::endl;
  536. //
  537. // add_link(models[i + (j - 1) * size], out_ss.str(),
  538. // model, in_ss.str());
  539. // }
  540. // }
  541. // // bottom
  542. // if (j != size - 1) {
  543. // for (unsigned int x = i * parameters.sub_grid_size;
  544. // x < (i + 1) * parameters.sub_grid_size; ++x) {
  545. // std::stringstream out_ss;
  546. // std::stringstream in_ss;
  547. //
  548. // out_ss << "out_" << x << "_"
  549. // << ((j + 1) * parameters.sub_grid_size);
  550. // in_ss << "in_" << x << "_"
  551. // << ((j + 1) * parameters.sub_grid_size);
  552. //
  553. // // std::cout << "LINK " << model->get_name()
  554. // // << "::" << in_ss.str()
  555. // // << " <= "
  556. // // << models[i + (j + 1) * size]->get_name()
  557. // // << "::"
  558. // // << out_ss.str()
  559. // // << std::endl;
  560. //
  561. // add_link(models[i + (j + 1) * size], out_ss.str(),
  562. // model, in_ss.str());
  563. // }
  564. // }
  565. // // left
  566. // if (i != 0) {
  567. // for (unsigned int y = j * parameters.sub_grid_size;
  568. // y < (j + 1) * parameters.sub_grid_size; ++y) {
  569. // std::stringstream out_ss;
  570. // std::stringstream in_ss;
  571. //
  572. // out_ss << "out_" << (i * parameters.sub_grid_size - 1)
  573. // << "_" << y;
  574. // in_ss << "in_" << (i * parameters.sub_grid_size - 1)
  575. // << "_" << y;
  576. //
  577. // // std::cout << "LINK " << model->get_name()
  578. // // << "::" << in_ss.str()
  579. // // << " <= "
  580. // // << models[i - 1 + j * size]->get_name()
  581. // // << "::"
  582. // // << out_ss.str()
  583. // // << std::endl;
  584. //
  585. // add_link(models[i - 1 + j * size], out_ss.str(),
  586. // model, in_ss.str());
  587. // }
  588. // }
  589. // // right
  590. // if (i != size - 1) {
  591. // for (unsigned int y = j * parameters.sub_grid_size;
  592. // y < (j + 1) * parameters.sub_grid_size; ++y) {
  593. // std::stringstream out_ss;
  594. // std::stringstream in_ss;
  595. //
  596. // out_ss << "out_"
  597. // << ((i + 1) * parameters.sub_grid_size)
  598. // << "_" << y;
  599. // in_ss << "in_"
  600. // << ((i + 1) * parameters.sub_grid_size)
  601. // << "_" << y;
  602. //
  603. // // std::cout << "LINK " << model->get_name()
  604. // // << "::" << in_ss.str()
  605. // // << " <= "
  606. // // << models[i + 1 + j * size]->get_name()
  607. // // << "::"
  608. // // << out_ss.str()
  609. // // << std::endl;
  610. //
  611. // add_link(models[i + 1 + j * size], out_ss.str(),
  612. // model, in_ss.str());
  613. // }
  614. // }
  615. // }
  616. // }
  617. // }
  618. //
  619. // virtual ~GridGraphManager()
  620. // {
  621. // std::for_each(models.begin(), models.end(),
  622. // std::default_delete<ModelProxy>());
  623. // }
  624. //
  625. // private:
  626. // typedef artis::pdevs::mpi::ModelProxy<common::DoubleTime> ModelProxy;
  627. // typedef std::vector<ModelProxy*> ModelProxies;
  628. //
  629. // ModelProxies models;
  630. // };
  631. //
  632. // struct SubGridGraphManagerParameters {
  633. // unsigned int global_size;
  634. // unsigned int begin_line;
  635. // unsigned int end_line;
  636. // unsigned int begin_column;
  637. // unsigned int end_column;
  638. // };
  639. //
  640. // class SubGridGraphManager :
  641. // public artis::pdevs::mpi::GraphManager<
  642. // common::DoubleTime, SubGridGraphManagerParameters> {
  643. // public:
  644. // SubGridGraphManager(
  645. // common::Coordinator<common::DoubleTime>* coordinator,
  646. // const SubGridGraphManagerParameters& parameters)
  647. // :
  648. // artis::pdevs::mpi::GraphManager<
  649. // common::DoubleTime, SubGridGraphManagerParameters>(coordinator,
  650. // parameters)
  651. // {
  652. // unsigned int size = parameters.end_column - parameters.begin_column + 1;
  653. //
  654. // for (unsigned int y = parameters.begin_line;
  655. // y <= parameters.end_line; ++y) {
  656. // for (unsigned int x = parameters.begin_column;
  657. // x <= parameters.end_column; ++x) {
  658. // std::stringstream ss;
  659. // Simulator* simulator = 0;
  660. // artis::tests::multithreading::lifegame::CellParameters
  661. // cell_parameters(
  662. // ((x != 0) ? 1 : 0) +
  663. // ((x != parameters.global_size - 1) ? 1 : 0) +
  664. // ((y != 0) ? 1 : 0) +
  665. // ((y != parameters.global_size - 1) ? 1 : 0));
  666. //
  667. // ss << "C_" << x << "_" << y;
  668. // simulator = new Simulator(ss.str(), cell_parameters);
  669. // simulators.push_back(simulator);
  670. // add_child(simulator);
  671. // simulator->add_out_port("out");
  672. // simulator->add_in_port("in");
  673. // }
  674. // }
  675. // // internal connections
  676. // for (unsigned int x = parameters.begin_column;
  677. // x <= parameters.end_column; ++x) {
  678. // for (unsigned int y = parameters.begin_line;
  679. // y <= parameters.end_line; ++y) {
  680. // unsigned int i = x - parameters.begin_column;
  681. // unsigned int j = y - parameters.begin_line;
  682. // Simulator* simulator = simulators[i + j * size];
  683. //
  684. // if (i != 0) {
  685. // add_link(simulators[(i - 1) + j * size], "out",
  686. // simulator, "in");
  687. //
  688. // // std::cout << "subgrid [ " << parameters.begin_column
  689. // // << " " << parameters.begin_line << " ] => "
  690. // // << ((i - 1) + j * size) << " -> "
  691. // // << (i + j * size) << std::endl;
  692. //
  693. // }
  694. // if (i != size - 1) {
  695. // add_link(simulators[(i + 1) + j * size], "out",
  696. // simulator, "in");
  697. //
  698. // // std::cout << "subgrid [ " << parameters.begin_column
  699. // // << " " << parameters.begin_line << " ] => "
  700. // // << ((i + 1) + j * size) << " -> "
  701. // // << (i + j * size) << std::endl;
  702. //
  703. // }
  704. // if (j != 0) {
  705. // add_link(simulators[i + (j - 1) * size], "out",
  706. // simulator, "in");
  707. //
  708. // // std::cout << "subgrid [ " << parameters.begin_column
  709. // // << " " << parameters.begin_line << " ] => "
  710. // // << (i + (j - 1) * size) << " -> "
  711. // // << (i + j * size) << std::endl;
  712. //
  713. // }
  714. // if (j != size - 1) {
  715. // add_link(simulators[i + (j + 1) * size], "out",
  716. // simulator, "in");
  717. //
  718. // // std::cout << "subgrid [ " << parameters.begin_column
  719. // // << " " << parameters.begin_line << " ] => "
  720. // // << (i + (j + 1) * size) << " -> "
  721. // // << (i + j * size) << std::endl;
  722. //
  723. // }
  724. // }
  725. // }
  726. // // input ports
  727. // {
  728. // // top and bottom
  729. // for (unsigned int x = parameters.begin_column;
  730. // x <= parameters.end_column; ++x) {
  731. // unsigned int i = x - parameters.begin_column;
  732. //
  733. // // top
  734. // if (parameters.begin_line != 0) {
  735. // std::stringstream ss;
  736. //
  737. // ss << "in_" << x << "_" << (parameters.begin_line - 1);
  738. // coordinator->add_in_port(ss.str());
  739. // add_link(coordinator, ss.str(), simulators[i], "in");
  740. // }
  741. // // bottom
  742. // if (parameters.end_line != parameters.global_size - 1) {
  743. // std::stringstream ss;
  744. //
  745. // ss << "in_" << x << "_" << (parameters.end_line + 1);
  746. // coordinator->add_in_port(ss.str());
  747. // add_link(coordinator, ss.str(),
  748. // simulators[i + size * (size - 1)], "in");
  749. // }
  750. // }
  751. // // left and right
  752. // for (unsigned int y = parameters.begin_line;
  753. // y <= parameters.end_line; ++y) {
  754. // unsigned int j = y - parameters.begin_line;
  755. //
  756. // // left
  757. // if (parameters.begin_column != 0) {
  758. // std::stringstream ss;
  759. //
  760. // ss << "in_" << (parameters.begin_column - 1) << "_" << y;
  761. // coordinator->add_in_port(ss.str());
  762. // add_link(coordinator, ss.str(), simulators[j * size], "in");
  763. // }
  764. // // right
  765. // if (parameters.end_column != parameters.global_size - 1) {
  766. // std::stringstream ss;
  767. //
  768. // ss << "in_" << (parameters.end_column + 1) << "_" << y;
  769. // coordinator->add_in_port(ss.str());
  770. // add_link(coordinator, ss.str(),
  771. // simulators[size - 1 + j * size], "in");
  772. //
  773. // // std::cout << "subgrid [ " << parameters.begin_column
  774. // // << " " << parameters.begin_line << " ] => "
  775. // // << ss.str() << " -> "
  776. // // << (size - 1 + j * size) << std::endl;
  777. //
  778. // }
  779. // }
  780. // }
  781. // // output ports
  782. // {
  783. // // top and bottom
  784. // for (unsigned int x = parameters.begin_column;
  785. // x <= parameters.end_column; ++x) {
  786. // unsigned int i = x - parameters.begin_column;
  787. //
  788. // // top
  789. // {
  790. // std::stringstream ss;
  791. //
  792. // ss << "out_" << x << "_" << parameters.begin_line;
  793. // coordinator->add_out_port(ss.str());
  794. // add_link(simulators[i], "out", coordinator, ss.str());
  795. //
  796. // // std::cout << "subgrid [ " << parameters.begin_column
  797. // // << " " << parameters.begin_line << " ] => "
  798. // // << simulators[i]->get_name()
  799. // // << "::out => " << ss.str() << std::endl;
  800. //
  801. // }
  802. // // bottom
  803. // {
  804. // std::stringstream ss;
  805. //
  806. // ss << "out_" << x << "_" << parameters.end_line;
  807. // coordinator->add_out_port(ss.str());
  808. // add_link(simulators[i + size * (size - 1)], "out",
  809. // coordinator, ss.str());
  810. //
  811. // // std::cout << "subgrid [ " << parameters.begin_column
  812. // // << " " << parameters.begin_line << " ] => "
  813. // // << simulators[i + size * (size - 1)]->get_name()
  814. // // << "::out => " << ss.str() << std::endl;
  815. //
  816. // }
  817. // }
  818. // // left and right
  819. // for (unsigned int y = parameters.begin_line;
  820. // y <= parameters.end_line; ++y) {
  821. // unsigned int j = y - parameters.begin_line;
  822. //
  823. // // left
  824. // {
  825. // std::stringstream ss;
  826. //
  827. // ss << "out_" << parameters.begin_column << "_" << y;
  828. // if (not coordinator->exist_out_port(ss.str())) {
  829. // coordinator->add_out_port(ss.str());
  830. // add_link(simulators[j * size], "out",
  831. // coordinator, ss.str());
  832. //
  833. // // std::cout << "subgrid [ " << parameters.begin_column
  834. // // << " " << parameters.begin_line << " ] => "
  835. // // << simulators[j * size]->get_name()
  836. // // << "::out => " << ss.str() << std::endl;
  837. //
  838. // }
  839. // }
  840. // // right
  841. // {
  842. // std::stringstream ss;
  843. //
  844. // ss << "out_" << parameters.end_column << "_" << y;
  845. // if (not coordinator->exist_out_port(ss.str())) {
  846. // coordinator->add_out_port(ss.str());
  847. // add_link(simulators[size - 1 + j * size], "out",
  848. // coordinator, ss.str());
  849. // }
  850. // }
  851. // }
  852. // }
  853. // }
  854. //
  855. // void init() { }
  856. //
  857. // void start(common::DoubleTime::type /* t */) { }
  858. //
  859. // void transition(
  860. // const common::Models<common::DoubleTime>& /* receivers */,
  861. // common::DoubleTime::type /* t */) { }
  862. //
  863. // virtual ~SubGridGraphManager()
  864. // {
  865. // std::for_each(simulators.begin(), simulators.end(),
  866. // std::default_delete<Simulator>());
  867. // }
  868. //
  869. // private:
  870. // typedef artis::pdevs::Simulator<
  871. // common::DoubleTime,
  872. // multithreading::lifegame::Cell,
  873. // multithreading::lifegame::CellParameters> Simulator;
  874. //
  875. // typedef std::vector<Simulator*> Simulators;
  876. //
  877. // Simulators simulators;
  878. // };
  879. // struct MPIHierarchicalGraphManagerParameters
  880. // {
  881. // artis::tests::boost_graph::OrientedGraphs graphs;
  882. // artis::tests::boost_graph::InputEdgeList input_edges;
  883. // artis::tests::boost_graph::OutputEdgeList output_edges;
  884. // artis::tests::boost_graph::Connections parent_connections;
  885. // std::vector < int > ranks;
  886. // };
  887. // class MPIHierarchicalGraphManager :
  888. // public artis::pdevs::GraphManager <
  889. // common::DoubleTime, MPIHierarchicalGraphManagerParameters >
  890. // {
  891. // public:
  892. // MPIHierarchicalGraphManager(
  893. // common::Coordinator < common::DoubleTime >* coordinator,
  894. // const MPIHierarchicalGraphManagerParameters& parameters) :
  895. // artis::pdevs::GraphManager <
  896. // common::DoubleTime,
  897. // MPIHierarchicalGraphManagerParameters >
  898. // (coordinator, parameters)
  899. // {
  900. // // build model proxies (graphs)
  901. // for (unsigned int i = 0; i < parameters.graphs.size(); ++i) {
  902. // ModelProxy* model = 0;
  903. // std::ostringstream ss;
  904. // ss << "S" << i;
  905. // model = new ModelProxy(ss.str(), parameters.ranks[i], false);
  906. // _models.push_back(model);
  907. // add_child(model);
  908. // }
  909. // // // builds internal connections (edges)
  910. // // for (Connections::const_iterator it = parent_connections.begin();
  911. // // it != parent_connections.end(); ++it) {
  912. // // const Connection& connection = *it;
  913. // // std::ostringstream ss_out;
  914. // // std::ostringstream ss_in;
  915. // // ss_out << "out_" << connection.first.second;
  916. // // ss_in << "in_" << connection.first.second;
  917. // // if (not ParallelHeapHierarchicalGraphManager <
  918. // // GraphBuilder >::exist_link(
  919. // // _coordinators[connection.first.first - 1],
  920. // // ss_out.str(),
  921. // // _coordinators[connection.second.first - 1],
  922. // // ss_in.str())) {
  923. // // ParallelHeapHierarchicalGraphManager <
  924. // // GraphBuilder >::add_link(
  925. // // _coordinators[connection.first.first - 1],
  926. // // ss_out.str(),
  927. // // _coordinators[connection.second.first - 1],
  928. // // ss_in.str());
  929. // // }
  930. // // }
  931. // }
  932. // virtual ~MPIHierarchicalGraphManager()
  933. // {
  934. // for (typename ModelProxies::const_iterator it = _models.begin();
  935. // it != _models.end(); ++it) {
  936. // delete *it;
  937. // }
  938. // }
  939. // private:
  940. // typedef artis::pdevs::mpi::ModelProxy < common::DoubleTime > ModelProxy;
  941. // typedef std::vector < ModelProxy* > ModelProxies;
  942. // ModelProxies _models;
  943. // };
  944. }
  945. }
  946. } // namespace artis tests mpi
  947. #endif