graph_manager.hpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  1. /**
  2. * @file tests/boost_graph/graph_manager.hpp
  3. * @author The PARADEVS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * PARADEVS - the multimodeling and simulation environment
  8. * This file is a part of the PARADEVS environment
  9. *
  10. * Copyright (C) 2013 ULCO http://www.univ-litoral.fr
  11. *
  12. * This program is free software: you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation, either version 3 of the License, or
  15. * (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  24. */
  25. #ifndef __TESTS_BOOST_GRAPH_GRAPH_MANAGER_HPP
  26. #define __TESTS_BOOST_GRAPH_GRAPH_MANAGER_HPP 1
  27. #include <common/scheduler/HeapScheduler.hpp>
  28. #include <common/scheduler/VectorScheduler.hpp>
  29. #include <kernel/pdevs/Coordinator.hpp>
  30. #include <kernel/pdevs/GraphManager.hpp>
  31. #include <kernel/pdevs/Simulator.hpp>
  32. #include <kernel/pdevs/multithreading/Coordinator.hpp>
  33. #include <tests/boost_graph/models.hpp>
  34. #include <tests/boost_graph/graph_partitioning.hpp>
  35. namespace paradevs { namespace tests { namespace boost_graph {
  36. struct SchedulerHandle;
  37. typedef typename paradevs::common::scheduler::HeapScheduler <
  38. common::DoubleTime, SchedulerHandle >::type SchedulerType;
  39. struct SchedulerHandle
  40. {
  41. SchedulerHandle()
  42. { }
  43. SchedulerHandle(const SchedulerType::handle_type& handle)
  44. : _handle(handle)
  45. { }
  46. const SchedulerHandle& handle() const
  47. { return *this; }
  48. void handle(const SchedulerHandle& handle)
  49. { _handle = handle._handle; }
  50. SchedulerType::handle_type _handle;
  51. };
  52. struct GraphParameters
  53. {
  54. OrientedGraph _graph;
  55. InputEdges _input_edges;
  56. OutputEdges _output_edges;
  57. GraphParameters(const OrientedGraph& graph,
  58. const InputEdges& input_edges,
  59. const OutputEdges& output_edges) :
  60. _graph(graph), _input_edges(input_edges), _output_edges(output_edges)
  61. { }
  62. };
  63. template < class SchedulerHandle, class Parameters >
  64. class FlatGraphManager :
  65. public paradevs::pdevs::GraphManager < common::DoubleTime,
  66. SchedulerHandle,
  67. Parameters >
  68. {
  69. public:
  70. FlatGraphManager(common::Coordinator < common::DoubleTime,
  71. SchedulerHandle >* coordinator,
  72. const Parameters& parameters) :
  73. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  74. Parameters >(
  75. coordinator, parameters)
  76. { }
  77. virtual ~FlatGraphManager()
  78. {
  79. for (typename TopSimulators::const_iterator it =
  80. _top_simulators.begin(); it != _top_simulators.end();
  81. ++it) {
  82. delete it->second;
  83. }
  84. for (typename NormalSimulators::const_iterator it =
  85. _normal_simulators.begin(); it != _normal_simulators.end();
  86. ++it) {
  87. delete it->second;
  88. }
  89. }
  90. void build_flat_graph(const OrientedGraph& g, const InputEdges& inputs)
  91. {
  92. OrientedGraph::vertex_iterator vertexIt, vertexEnd;
  93. boost::tie(vertexIt, vertexEnd) = boost::vertices(g);
  94. for (; vertexIt != vertexEnd; ++vertexIt) {
  95. std::ostringstream ss;
  96. ss << "a" << g[*vertexIt]._index;
  97. switch (g[*vertexIt]._type) {
  98. case TOP_PIXEL:
  99. _top_simulators[g[*vertexIt]._index] =
  100. new pdevs::Simulator <
  101. common::DoubleTime, TopPixel < SchedulerHandle >,
  102. SchedulerHandle,
  103. TopPixelParameters >(ss.str(), TopPixelParameters());
  104. _top_simulators[g[*vertexIt]._index]->add_out_port("out");
  105. FlatGraphManager < SchedulerHandle, Parameters >::add_child(
  106. _top_simulators[g[*vertexIt]._index]);
  107. break;
  108. case NORMAL_PIXEL:
  109. unsigned int n = 0;
  110. OrientedGraph::vertex_iterator vertexIt2, vertexEnd2;
  111. boost::tie(vertexIt2, vertexEnd2) = boost::vertices(g);
  112. for (; vertexIt2 != vertexEnd2; ++vertexIt2) {
  113. OrientedGraph::adjacency_iterator neighbourIt, neighbourEnd;
  114. boost::tie(neighbourIt, neighbourEnd) =
  115. boost::adjacent_vertices(*vertexIt2, g);
  116. for (; neighbourIt != neighbourEnd; ++neighbourIt) {
  117. if (g[*neighbourIt]._index == g[*vertexIt]._index) {
  118. ++n;
  119. }
  120. }
  121. }
  122. for (InputEdges::const_iterator it = inputs.begin();
  123. it != inputs.end(); ++it) {
  124. if (g[*vertexIt]._index == it->second) {
  125. ++n;
  126. }
  127. }
  128. _normal_simulators[g[*vertexIt]._index] =
  129. new pdevs::Simulator <
  130. common::DoubleTime, NormalPixel < SchedulerHandle >,
  131. SchedulerHandle, NormalPixelParameters >(
  132. ss.str(), NormalPixelParameters(n));
  133. _normal_simulators[g[*vertexIt]._index]->add_in_port("in");
  134. _normal_simulators[g[*vertexIt]._index]->add_out_port("out");
  135. FlatGraphManager < SchedulerHandle, Parameters >::add_child(
  136. _normal_simulators[g[*vertexIt]._index]);
  137. break;
  138. };
  139. }
  140. boost::tie(vertexIt, vertexEnd) = boost::vertices(g);
  141. for (; vertexIt != vertexEnd; ++vertexIt)
  142. {
  143. OrientedGraph::adjacency_iterator neighbourIt, neighbourEnd;
  144. boost::tie(neighbourIt, neighbourEnd) =
  145. boost::adjacent_vertices(*vertexIt, g);
  146. for (; neighbourIt != neighbourEnd; ++neighbourIt) {
  147. paradevs::common::Model < common::DoubleTime,
  148. SchedulerHandle >* a = 0;
  149. paradevs::common::Model < common::DoubleTime,
  150. SchedulerHandle >* b = 0;
  151. if (g[*vertexIt]._type == TOP_PIXEL) {
  152. a = _top_simulators[g[*vertexIt]._index];
  153. } else {
  154. a = _normal_simulators[g[*vertexIt]._index];
  155. }
  156. if (g[*neighbourIt]._type == TOP_PIXEL) {
  157. b = _top_simulators[g[*neighbourIt]._index];
  158. } else {
  159. b = _normal_simulators[g[*neighbourIt]._index];
  160. }
  161. FlatGraphManager < SchedulerHandle,
  162. Parameters >::add_link(a, "out",
  163. b, "in");
  164. }
  165. }
  166. }
  167. protected:
  168. typedef std::map < int, pdevs::Simulator <
  169. common::DoubleTime,
  170. TopPixel < SchedulerHandle >,
  171. SchedulerHandle,
  172. TopPixelParameters >* > TopSimulators;
  173. typedef std::map < int, pdevs::Simulator <
  174. common::DoubleTime,
  175. NormalPixel < SchedulerHandle >,
  176. SchedulerHandle,
  177. NormalPixelParameters >* > NormalSimulators;
  178. TopSimulators _top_simulators;
  179. NormalSimulators _normal_simulators;
  180. };
  181. template < class SchedulerHandle >
  182. class BuiltFlatGraphManager :
  183. public FlatGraphManager < SchedulerHandle, GraphParameters >
  184. {
  185. public:
  186. BuiltFlatGraphManager(
  187. common::Coordinator < common::DoubleTime,
  188. SchedulerHandle >* coordinator,
  189. const GraphParameters& parameters) :
  190. FlatGraphManager < SchedulerHandle, GraphParameters >(
  191. coordinator, parameters)
  192. {
  193. BuiltFlatGraphManager < SchedulerHandle >::build_flat_graph(
  194. parameters._graph, parameters._input_edges);
  195. // input
  196. for (Edges::const_iterator it = parameters._input_edges.begin();
  197. it != parameters._input_edges.end(); ++it) {
  198. std::ostringstream ss_in;
  199. ss_in << "in_" << it->first;
  200. if (not coordinator->exist_in_port(ss_in.str())) {
  201. coordinator->add_in_port(ss_in.str());
  202. }
  203. BuiltFlatGraphManager < SchedulerHandle>::add_link(
  204. coordinator, ss_in.str(),
  205. BuiltFlatGraphManager <
  206. SchedulerHandle >::_normal_simulators[it->second], "in");
  207. }
  208. // output
  209. for (Edges::const_iterator it = parameters._output_edges.begin();
  210. it != parameters._output_edges.end(); ++it) {
  211. std::ostringstream ss_out;
  212. ss_out << "out_" << it->first;
  213. if (not coordinator->exist_out_port(ss_out.str())) {
  214. coordinator->add_out_port(ss_out.str());
  215. }
  216. if (not BuiltFlatGraphManager < SchedulerHandle>::exist_link(
  217. BuiltFlatGraphManager <
  218. SchedulerHandle >::_normal_simulators[it->first], "out",
  219. coordinator, ss_out.str())) {
  220. BuiltFlatGraphManager < SchedulerHandle>::add_link(
  221. BuiltFlatGraphManager <
  222. SchedulerHandle >::_normal_simulators[it->first], "out",
  223. coordinator, ss_out.str());
  224. }
  225. }
  226. }
  227. virtual ~BuiltFlatGraphManager()
  228. { }
  229. };
  230. template < class SchedulerHandle >
  231. class ParallelBuiltFlatGraphManager :
  232. public FlatGraphManager < SchedulerHandle, GraphParameters >
  233. {
  234. public:
  235. ParallelBuiltFlatGraphManager(
  236. common::Coordinator < common::DoubleTime,
  237. SchedulerHandle >* coordinator,
  238. const GraphParameters& parameters) :
  239. FlatGraphManager < SchedulerHandle, GraphParameters >(
  240. coordinator, parameters)
  241. {
  242. ParallelBuiltFlatGraphManager < SchedulerHandle >::build_flat_graph(
  243. parameters._graph, parameters._input_edges);
  244. // input
  245. for (Edges::const_iterator it = parameters._input_edges.begin();
  246. it != parameters._input_edges.end(); ++it) {
  247. std::ostringstream ss_in;
  248. ss_in << "in_" << it->first;
  249. if (not coordinator->exist_in_port(ss_in.str())) {
  250. coordinator->add_in_port(ss_in.str());
  251. }
  252. ParallelBuiltFlatGraphManager < SchedulerHandle>::add_link(
  253. coordinator, ss_in.str(),
  254. ParallelBuiltFlatGraphManager <
  255. SchedulerHandle >::_normal_simulators[it->second], "in");
  256. }
  257. // output
  258. for (Edges::const_iterator it = parameters._output_edges.begin();
  259. it != parameters._output_edges.end(); ++it) {
  260. std::ostringstream ss_out;
  261. ss_out << "out_" << it->first;
  262. if (not coordinator->exist_out_port(ss_out.str())) {
  263. coordinator->add_out_port(ss_out.str());
  264. }
  265. if (not ParallelBuiltFlatGraphManager < SchedulerHandle>::exist_link(
  266. ParallelBuiltFlatGraphManager <
  267. SchedulerHandle >::_normal_simulators[it->first], "out",
  268. coordinator, ss_out.str())) {
  269. ParallelBuiltFlatGraphManager < SchedulerHandle>::add_link(
  270. ParallelBuiltFlatGraphManager <
  271. SchedulerHandle >::_normal_simulators[it->first], "out",
  272. coordinator, ss_out.str());
  273. }
  274. }
  275. }
  276. void init()
  277. { }
  278. void start(common::DoubleTime::type /* t */)
  279. { }
  280. void transition(
  281. const common::Models < common::DoubleTime,
  282. SchedulerHandle >& /* receivers */,
  283. common::DoubleTime::type /* t */)
  284. { }
  285. virtual ~ParallelBuiltFlatGraphManager()
  286. { }
  287. };
  288. template < class SchedulerHandle, class GraphBuilder >
  289. class InBuildFlatGraphManager :
  290. public FlatGraphManager < SchedulerHandle,
  291. paradevs::common::NoParameters >
  292. {
  293. public:
  294. InBuildFlatGraphManager(
  295. common::Coordinator < common::DoubleTime,
  296. SchedulerHandle >* coordinator,
  297. const paradevs::common::NoParameters& parameters) :
  298. FlatGraphManager < SchedulerHandle, paradevs::common::NoParameters >(
  299. coordinator, parameters)
  300. {
  301. GraphBuilder builder;
  302. OrientedGraphs graphs;
  303. InputEdgeList input_edges;
  304. OutputEdgeList output_edges;
  305. Connections parent_connections;
  306. builder.build(graphs, input_edges, output_edges, parent_connections);
  307. InBuildFlatGraphManager < SchedulerHandle,
  308. GraphBuilder >::build_flat_graph(
  309. graphs.front(), InputEdges());
  310. }
  311. virtual ~InBuildFlatGraphManager()
  312. { }
  313. };
  314. struct PartitioningParameters
  315. {
  316. int cluster_number;
  317. std::string partitioning_method_name;
  318. int contraction_coef;
  319. bool contraction_coef_flag;
  320. PartitioningParameters(int cn,
  321. const std::string& pmn,
  322. int cc, bool ccf) :
  323. cluster_number(cn), partitioning_method_name(pmn),
  324. contraction_coef(cc), contraction_coef_flag(ccf)
  325. { }
  326. };
  327. template < class SchedulerHandle, class GraphBuilder >
  328. class HeapHierarchicalGraphManager :
  329. public paradevs::pdevs::GraphManager < common::DoubleTime,
  330. SchedulerHandle,
  331. PartitioningParameters >
  332. {
  333. public:
  334. HeapHierarchicalGraphManager(
  335. common::Coordinator < common::DoubleTime,
  336. SchedulerHandle >* coordinator,
  337. const PartitioningParameters& parameters) :
  338. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  339. PartitioningParameters >(
  340. coordinator, parameters)
  341. {
  342. GraphBuilder graph_builder(parameters.cluster_number,
  343. parameters.partitioning_method_name,
  344. parameters.contraction_coef,
  345. parameters.contraction_coef_flag);
  346. OrientedGraphs graphs;
  347. InputEdgeList input_edges;
  348. OutputEdgeList output_edges;
  349. Connections parent_connections;
  350. graph_builder.build(graphs, input_edges, output_edges,
  351. parent_connections);
  352. // for (unsigned int i = 0; i < graphs.size(); ++i) {
  353. // std::cout << "graph[" << i << "]:" << std::endl;
  354. // const OrientedGraph& og = graphs[i];
  355. // OrientedGraph::vertex_iterator it_og, end_og;
  356. // tie(it_og, end_og) = vertices(og);
  357. // for (; it_og != end_og; ++it_og) {
  358. // OrientedGraph::adjacency_iterator neighbour_it, neighbour_end;
  359. // std::cout << og[*it_og]._index << " is connected with ";
  360. // tie(neighbour_it, neighbour_end) = adjacent_vertices(*it_og,
  361. // og);
  362. // for (; neighbour_it != neighbour_end; ++neighbour_it)
  363. // std::cout << og[*neighbour_it]._index << " ";
  364. // std::cout << " and weight = " << og[*it_og]._weight
  365. // << std::endl;
  366. // }
  367. // std::cout << "===" << std::endl;
  368. // }
  369. // build coordinators (graphs)
  370. for (unsigned int i = 0; i < graphs.size(); ++i) {
  371. Coordinator* coordinator = 0;
  372. std::ostringstream ss;
  373. ss << "S" << (i + 1);
  374. coordinator =
  375. new Coordinator(ss.str(), paradevs::common::NoParameters(),
  376. GraphParameters(graphs[i], input_edges[i],
  377. output_edges[i]));
  378. _coordinators.push_back(coordinator);
  379. HeapHierarchicalGraphManager < SchedulerHandle,
  380. GraphBuilder >::add_child(
  381. coordinator);
  382. }
  383. // builds internal connections (edges)
  384. for (Connections::const_iterator it = parent_connections.begin();
  385. it != parent_connections.end(); ++it) {
  386. const Connection& connection = *it;
  387. std::ostringstream ss_out;
  388. std::ostringstream ss_in;
  389. ss_out << "out_" << connection.first.second;
  390. ss_in << "in_" << connection.first.second;
  391. if (not HeapHierarchicalGraphManager <
  392. SchedulerHandle, GraphBuilder >::exist_link(
  393. _coordinators[connection.first.first - 1],
  394. ss_out.str(),
  395. _coordinators[connection.second.first - 1],
  396. ss_in.str())) {
  397. HeapHierarchicalGraphManager <
  398. SchedulerHandle, GraphBuilder >::add_link(
  399. _coordinators[connection.first.first - 1],
  400. ss_out.str(),
  401. _coordinators[connection.second.first - 1],
  402. ss_in.str());
  403. }
  404. }
  405. }
  406. virtual ~HeapHierarchicalGraphManager()
  407. {
  408. for (typename Coordinators::const_iterator it = _coordinators.begin();
  409. it != _coordinators.end(); ++it) {
  410. delete *it;
  411. }
  412. }
  413. private:
  414. typedef paradevs::pdevs::Coordinator <
  415. common::DoubleTime,
  416. SchedulerType,
  417. SchedulerHandle,
  418. BuiltFlatGraphManager < SchedulerHandle >,
  419. common::NoParameters,
  420. GraphParameters > Coordinator;
  421. typedef std::vector < Coordinator* > Coordinators;
  422. Coordinators _coordinators;
  423. };
  424. template < class SchedulerHandle, class GraphBuilder >
  425. class VectorHierarchicalGraphManager :
  426. public paradevs::pdevs::GraphManager < common::DoubleTime,
  427. SchedulerHandle,
  428. PartitioningParameters >
  429. {
  430. public:
  431. VectorHierarchicalGraphManager(
  432. common::Coordinator < common::DoubleTime,
  433. SchedulerHandle >* coordinator,
  434. const PartitioningParameters& parameters) :
  435. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  436. PartitioningParameters >(
  437. coordinator, parameters)
  438. {
  439. GraphBuilder graph_builder(parameters.cluster_number,
  440. parameters.partitioning_method_name,
  441. parameters.contraction_coef,
  442. parameters.contraction_coef_flag);
  443. OrientedGraphs graphs;
  444. InputEdgeList input_edges;
  445. OutputEdgeList output_edges;
  446. Connections parent_connections;
  447. graph_builder.build(graphs, input_edges, output_edges,
  448. parent_connections);
  449. // build coordinators (graphs)
  450. for (unsigned int i = 0; i < graphs.size(); ++i) {
  451. Coordinator* coordinator = 0;
  452. std::ostringstream ss;
  453. ss << "S" << (i + 1);
  454. coordinator =
  455. new Coordinator(ss.str(), paradevs::common::NoParameters(),
  456. GraphParameters(graphs[i], input_edges[i],
  457. output_edges[i]));
  458. _coordinators.push_back(coordinator);
  459. VectorHierarchicalGraphManager < SchedulerHandle,
  460. GraphBuilder >::add_child(
  461. coordinator);
  462. }
  463. // builds internal connections (edges)
  464. for (Connections::const_iterator it = parent_connections.begin();
  465. it != parent_connections.end(); ++it) {
  466. const Connection& connection = *it;
  467. std::ostringstream ss_out;
  468. std::ostringstream ss_in;
  469. ss_out << "out_" << connection.first.second;
  470. ss_in << "in_" << connection.first.second;
  471. if (not VectorHierarchicalGraphManager <
  472. SchedulerHandle, GraphBuilder >::exist_link(
  473. _coordinators[connection.first.first - 1],
  474. ss_out.str(),
  475. _coordinators[connection.second.first - 1],
  476. ss_in.str())) {
  477. VectorHierarchicalGraphManager <
  478. SchedulerHandle, GraphBuilder >::add_link(
  479. _coordinators[connection.first.first - 1],
  480. ss_out.str(),
  481. _coordinators[connection.second.first - 1],
  482. ss_in.str());
  483. }
  484. }
  485. }
  486. virtual ~VectorHierarchicalGraphManager()
  487. {
  488. for (typename Coordinators::const_iterator it = _coordinators.begin();
  489. it != _coordinators.end(); ++it) {
  490. delete *it;
  491. }
  492. }
  493. private:
  494. typedef paradevs::pdevs::Coordinator <
  495. common::DoubleTime,
  496. paradevs::common::scheduler::VectorScheduler <
  497. paradevs::common::DoubleTime >,
  498. paradevs::common::scheduler::NoSchedulerHandle,
  499. BuiltFlatGraphManager < paradevs::common::scheduler::NoSchedulerHandle >,
  500. common::NoParameters,
  501. GraphParameters > Coordinator;
  502. typedef std::vector < Coordinator* > Coordinators;
  503. Coordinators _coordinators;
  504. };
  505. template < class SchedulerHandle, class GraphBuilder >
  506. class ParallelHeapHierarchicalGraphManager :
  507. public paradevs::pdevs::GraphManager < common::DoubleTime,
  508. SchedulerHandle,
  509. PartitioningParameters >
  510. {
  511. public:
  512. ParallelHeapHierarchicalGraphManager(
  513. common::Coordinator < common::DoubleTime,
  514. SchedulerHandle >* coordinator,
  515. const PartitioningParameters& parameters) :
  516. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  517. PartitioningParameters >(
  518. coordinator, parameters)
  519. {
  520. GraphBuilder graph_builder(parameters.cluster_number,
  521. parameters.partitioning_method_name,
  522. parameters.contraction_coef,
  523. parameters.contraction_coef_flag);
  524. OrientedGraphs graphs;
  525. InputEdgeList input_edges;
  526. OutputEdgeList output_edges;
  527. Connections parent_connections;
  528. graph_builder.build(graphs, input_edges, output_edges,
  529. parent_connections);
  530. // build coordinators (graphs)
  531. for (unsigned int i = 0; i < graphs.size(); ++i) {
  532. ParallelCoordinator* coordinator = 0;
  533. std::ostringstream ss;
  534. ss << "S" << (i + 1);
  535. coordinator =
  536. new ParallelCoordinator(ss.str(),
  537. paradevs::common::NoParameters(),
  538. GraphParameters(graphs[i],
  539. input_edges[i],
  540. output_edges[i]));
  541. _coordinators.push_back(coordinator);
  542. ParallelHeapHierarchicalGraphManager < SchedulerHandle,
  543. GraphBuilder >::add_child(
  544. coordinator);
  545. }
  546. // builds internal connections (edges)
  547. for (Connections::const_iterator it = parent_connections.begin();
  548. it != parent_connections.end(); ++it) {
  549. const Connection& connection = *it;
  550. std::ostringstream ss_out;
  551. std::ostringstream ss_in;
  552. ss_out << "out_" << connection.first.second;
  553. ss_in << "in_" << connection.first.second;
  554. if (not ParallelHeapHierarchicalGraphManager <
  555. SchedulerHandle, GraphBuilder >::exist_link(
  556. _coordinators[connection.first.first - 1],
  557. ss_out.str(),
  558. _coordinators[connection.second.first - 1],
  559. ss_in.str())) {
  560. ParallelHeapHierarchicalGraphManager <
  561. SchedulerHandle, GraphBuilder >::add_link(
  562. _coordinators[connection.first.first - 1],
  563. ss_out.str(),
  564. _coordinators[connection.second.first - 1],
  565. ss_in.str());
  566. }
  567. }
  568. }
  569. virtual ~ParallelHeapHierarchicalGraphManager()
  570. {
  571. for (typename Coordinators::const_iterator it = _coordinators.begin();
  572. it != _coordinators.end(); ++it) {
  573. delete *it;
  574. }
  575. }
  576. void init()
  577. {
  578. for (typename Coordinators::const_iterator it = _coordinators.begin();
  579. it != _coordinators.end(); ++it) {
  580. (*it)->set_sender(
  581. dynamic_cast < paradevs::pdevs::multithreading::Coordinator <
  582. common::DoubleTime,
  583. SchedulerType,
  584. SchedulerHandle,
  585. ParallelHeapHierarchicalGraphManager <
  586. SchedulerHandle,
  587. PartitioningGraphBuilder >,
  588. paradevs::common::NoParameters,
  589. PartitioningParameters >*
  590. >(ParallelHeapHierarchicalGraphManager < SchedulerHandle,
  591. GraphBuilder >::
  592. get_coordinator())->get_sender());
  593. }
  594. }
  595. void start(common::DoubleTime::type t)
  596. {
  597. for (typename Coordinators::const_iterator it = _coordinators.begin();
  598. it != _coordinators.end(); ++it) {
  599. (*it)->get_sender().send(
  600. paradevs::pdevs::multithreading::start_message <
  601. paradevs::common::DoubleTime >(t));
  602. }
  603. }
  604. void transition(const common::Models < common::DoubleTime,
  605. SchedulerHandle >& receivers,
  606. paradevs::common::DoubleTime::type t)
  607. {
  608. typename Coordinators::const_iterator it = _coordinators.begin();
  609. bool found = false;
  610. while (not found) {
  611. if (std::find(receivers.begin(), receivers.end(),
  612. *it) != receivers.end()) {
  613. (*it)->get_sender().send(
  614. paradevs::pdevs::multithreading::transition_message <
  615. paradevs::common::DoubleTime >(t));
  616. found = true;
  617. } else {
  618. ++it;
  619. }
  620. }
  621. }
  622. private:
  623. typedef paradevs::pdevs::multithreading::Coordinator <
  624. common::DoubleTime,
  625. SchedulerType,
  626. SchedulerHandle,
  627. ParallelBuiltFlatGraphManager
  628. < SchedulerHandle >,
  629. common::NoParameters,
  630. GraphParameters > ParallelCoordinator;
  631. typedef std::vector < ParallelCoordinator* > Coordinators;
  632. Coordinators _coordinators;
  633. };
  634. } } } // namespace paradevs tests boost_graph
  635. #endif