graph_manager.hpp 43 KB

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