graph_manager.hpp 38 KB

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