graph_manager.hpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  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 <paradevs/common/scheduler/HeapScheduler.hpp>
  28. #include <paradevs/common/scheduler/VectorScheduler.hpp>
  29. #include <paradevs/kernel/pdevs/Coordinator.hpp>
  30. #include <paradevs/kernel/pdevs/GraphManager.hpp>
  31. #include <paradevs/kernel/pdevs/Simulator.hpp>
  32. #include <paradevs/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. // std::cout << "Input edges:" << std::endl;
  197. for (Edges::const_iterator it = parameters._input_edges.begin();
  198. it != parameters._input_edges.end(); ++it) {
  199. std::ostringstream ss_in;
  200. ss_in << "in_" << it->first;
  201. if (not coordinator->exist_in_port(ss_in.str())) {
  202. coordinator->add_in_port(ss_in.str());
  203. }
  204. BuiltFlatGraphManager < SchedulerHandle>::add_link(
  205. coordinator, ss_in.str(),
  206. BuiltFlatGraphManager <
  207. SchedulerHandle >::_normal_simulators[it->second], "in");
  208. // std::cout << "link = " << coordinator->get_name()
  209. // << "::" << ss_in.str() << " -> "
  210. // << BuiltFlatGraphManager <
  211. // SchedulerHandle >::_normal_simulators[it->second]
  212. // ->get_name() << "::" << "in" << std::endl;
  213. }
  214. // output
  215. // std::cout << "Output edges:" << std::endl;
  216. for (Edges::const_iterator it = parameters._output_edges.begin();
  217. it != parameters._output_edges.end(); ++it) {
  218. std::ostringstream ss_out;
  219. ss_out << "out_" << it->first;
  220. if (not coordinator->exist_out_port(ss_out.str())) {
  221. coordinator->add_out_port(ss_out.str());
  222. }
  223. if (BuiltFlatGraphManager <
  224. SchedulerHandle >::_normal_simulators.find(it->first) !=
  225. BuiltFlatGraphManager <
  226. SchedulerHandle >::_normal_simulators.end()) {
  227. if (not BuiltFlatGraphManager < SchedulerHandle>::exist_link(
  228. BuiltFlatGraphManager <
  229. SchedulerHandle >::_normal_simulators[it->first],
  230. "out", coordinator, ss_out.str())) {
  231. BuiltFlatGraphManager < SchedulerHandle>::add_link(
  232. BuiltFlatGraphManager <
  233. SchedulerHandle >::_normal_simulators[it->first],
  234. "out", coordinator, ss_out.str());
  235. // std::cout << "link = " << BuiltFlatGraphManager <
  236. // SchedulerHandle >::_normal_simulators[it->first]
  237. // ->get_name() << "::" << "out -> "
  238. // << coordinator->get_name()
  239. // << "::" << ss_out.str()
  240. // << std::endl;
  241. }
  242. } else {
  243. if (not BuiltFlatGraphManager < SchedulerHandle>::exist_link(
  244. BuiltFlatGraphManager <
  245. SchedulerHandle >::_top_simulators[it->first],
  246. "out", coordinator, ss_out.str())) {
  247. BuiltFlatGraphManager < SchedulerHandle>::add_link(
  248. BuiltFlatGraphManager <
  249. SchedulerHandle >::_top_simulators[it->first],
  250. "out", coordinator, ss_out.str());
  251. // std::cout << "link = " << BuiltFlatGraphManager <
  252. // SchedulerHandle >::_top_simulators[it->first]
  253. // ->get_name() << "::" << "out -> "
  254. // << coordinator->get_name()
  255. // << "::" << ss_out.str()
  256. // << std::endl;
  257. }
  258. }
  259. }
  260. }
  261. virtual ~BuiltFlatGraphManager()
  262. { }
  263. };
  264. template < class SchedulerHandle >
  265. class ParallelBuiltFlatGraphManager :
  266. public FlatGraphManager < SchedulerHandle, GraphParameters >
  267. {
  268. public:
  269. ParallelBuiltFlatGraphManager(
  270. common::Coordinator < common::DoubleTime,
  271. SchedulerHandle >* coordinator,
  272. const GraphParameters& parameters) :
  273. FlatGraphManager < SchedulerHandle, GraphParameters >(
  274. coordinator, parameters)
  275. {
  276. ParallelBuiltFlatGraphManager < SchedulerHandle >::build_flat_graph(
  277. parameters._graph, parameters._input_edges);
  278. // input
  279. for (Edges::const_iterator it = parameters._input_edges.begin();
  280. it != parameters._input_edges.end(); ++it) {
  281. std::ostringstream ss_in;
  282. ss_in << "in_" << it->first;
  283. if (not coordinator->exist_in_port(ss_in.str())) {
  284. coordinator->add_in_port(ss_in.str());
  285. }
  286. ParallelBuiltFlatGraphManager < SchedulerHandle>::add_link(
  287. coordinator, ss_in.str(),
  288. ParallelBuiltFlatGraphManager <
  289. SchedulerHandle >::_normal_simulators[it->second], "in");
  290. }
  291. // output
  292. for (Edges::const_iterator it = parameters._output_edges.begin();
  293. it != parameters._output_edges.end(); ++it) {
  294. std::ostringstream ss_out;
  295. ss_out << "out_" << it->first;
  296. if (not coordinator->exist_out_port(ss_out.str())) {
  297. coordinator->add_out_port(ss_out.str());
  298. }
  299. if (not ParallelBuiltFlatGraphManager < SchedulerHandle >::exist_link(
  300. ParallelBuiltFlatGraphManager <
  301. SchedulerHandle >::_normal_simulators[it->first], "out",
  302. coordinator, ss_out.str())) {
  303. ParallelBuiltFlatGraphManager < SchedulerHandle>::add_link(
  304. ParallelBuiltFlatGraphManager <
  305. SchedulerHandle >::_normal_simulators[it->first], "out",
  306. coordinator, ss_out.str());
  307. }
  308. }
  309. }
  310. void init()
  311. { }
  312. void start(common::DoubleTime::type /* t */)
  313. { }
  314. void transition(
  315. const common::Models < common::DoubleTime,
  316. SchedulerHandle >& /* receivers */,
  317. common::DoubleTime::type /* t */)
  318. { }
  319. virtual ~ParallelBuiltFlatGraphManager()
  320. { }
  321. };
  322. template < class SchedulerHandle, class GraphBuilder >
  323. class InBuildFlatGraphManager :
  324. public FlatGraphManager < SchedulerHandle,
  325. paradevs::common::NoParameters >
  326. {
  327. public:
  328. InBuildFlatGraphManager(
  329. common::Coordinator < common::DoubleTime,
  330. SchedulerHandle >* coordinator,
  331. const paradevs::common::NoParameters& parameters) :
  332. FlatGraphManager < SchedulerHandle, paradevs::common::NoParameters >(
  333. coordinator, parameters)
  334. {
  335. GraphBuilder builder;
  336. OrientedGraphs graphs;
  337. InputEdgeList input_edges;
  338. OutputEdgeList output_edges;
  339. Connections parent_connections;
  340. builder.build(graphs, input_edges, output_edges, parent_connections);
  341. InBuildFlatGraphManager < SchedulerHandle,
  342. GraphBuilder >::build_flat_graph(
  343. graphs.front(), InputEdges());
  344. }
  345. virtual ~InBuildFlatGraphManager()
  346. { }
  347. };
  348. struct PartitioningParameters
  349. {
  350. int cluster_number;
  351. std::string partitioning_method_name;
  352. int contraction_coef;
  353. bool contraction_coef_flag;
  354. PartitioningParameters(int cn,
  355. const std::string& pmn,
  356. int cc, bool ccf) :
  357. cluster_number(cn), partitioning_method_name(pmn),
  358. contraction_coef(cc), contraction_coef_flag(ccf)
  359. { }
  360. };
  361. template < class SchedulerHandle, class GraphBuilder >
  362. class HeapHierarchicalGraphManager :
  363. public paradevs::pdevs::GraphManager < common::DoubleTime,
  364. SchedulerHandle,
  365. PartitioningParameters >
  366. {
  367. public:
  368. HeapHierarchicalGraphManager(
  369. common::Coordinator < common::DoubleTime,
  370. SchedulerHandle >* coordinator,
  371. const PartitioningParameters& parameters) :
  372. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  373. PartitioningParameters >(
  374. coordinator, parameters)
  375. {
  376. GraphBuilder graph_builder(parameters.cluster_number,
  377. parameters.partitioning_method_name,
  378. parameters.contraction_coef,
  379. parameters.contraction_coef_flag);
  380. OrientedGraphs graphs;
  381. InputEdgeList input_edges;
  382. OutputEdgeList output_edges;
  383. Connections parent_connections;
  384. graph_builder.build(graphs, input_edges, output_edges,
  385. parent_connections);
  386. // build coordinators (graphs)
  387. for (unsigned int i = 0; i < graphs.size(); ++i) {
  388. Coordinator* coordinator = 0;
  389. std::ostringstream ss;
  390. ss << "S" << i;
  391. coordinator =
  392. new Coordinator(ss.str(), paradevs::common::NoParameters(),
  393. GraphParameters(graphs[i], input_edges[i],
  394. output_edges[i]));
  395. _coordinators.push_back(coordinator);
  396. HeapHierarchicalGraphManager < SchedulerHandle,
  397. GraphBuilder >::add_child(
  398. coordinator);
  399. }
  400. // std::cout << "Root:" << std::endl;
  401. // builds internal connections (edges)
  402. for (Connections::const_iterator it = parent_connections.begin();
  403. it != parent_connections.end(); ++it) {
  404. const Connection& connection = *it;
  405. std::ostringstream ss_out;
  406. std::ostringstream ss_in;
  407. ss_out << "out_" << connection.first.second;
  408. ss_in << "in_" << connection.first.second;
  409. if (not HeapHierarchicalGraphManager <
  410. SchedulerHandle, GraphBuilder >::exist_link(
  411. _coordinators[connection.first.first - 1],
  412. ss_out.str(),
  413. _coordinators[connection.second.first - 1],
  414. ss_in.str())) {
  415. // std::cout << "link = "
  416. // << _coordinators[connection.first.first - 1]
  417. // ->get_name()
  418. // << "::" << ss_out.str() << " -> "
  419. // << _coordinators[connection.second.first - 1]
  420. // ->get_name()
  421. // << "::" << ss_in.str() << std::endl;
  422. HeapHierarchicalGraphManager <
  423. SchedulerHandle, GraphBuilder >::add_link(
  424. _coordinators[connection.first.first - 1],
  425. ss_out.str(),
  426. _coordinators[connection.second.first - 1],
  427. ss_in.str());
  428. }
  429. }
  430. }
  431. virtual ~HeapHierarchicalGraphManager()
  432. {
  433. for (typename Coordinators::const_iterator it = _coordinators.begin();
  434. it != _coordinators.end(); ++it) {
  435. delete *it;
  436. }
  437. }
  438. private:
  439. typedef paradevs::pdevs::Coordinator <
  440. common::DoubleTime,
  441. SchedulerType,
  442. SchedulerHandle,
  443. BuiltFlatGraphManager < SchedulerHandle >,
  444. common::NoParameters,
  445. GraphParameters > Coordinator;
  446. typedef std::vector < Coordinator* > Coordinators;
  447. Coordinators _coordinators;
  448. };
  449. template < class SchedulerHandle, class GraphBuilder >
  450. class VectorHierarchicalGraphManager :
  451. public paradevs::pdevs::GraphManager < common::DoubleTime,
  452. SchedulerHandle,
  453. PartitioningParameters >
  454. {
  455. public:
  456. VectorHierarchicalGraphManager(
  457. common::Coordinator < common::DoubleTime,
  458. SchedulerHandle >* coordinator,
  459. const PartitioningParameters& parameters) :
  460. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  461. PartitioningParameters >(
  462. coordinator, parameters)
  463. {
  464. GraphBuilder graph_builder(parameters.cluster_number,
  465. parameters.partitioning_method_name,
  466. parameters.contraction_coef,
  467. parameters.contraction_coef_flag);
  468. OrientedGraphs graphs;
  469. InputEdgeList input_edges;
  470. OutputEdgeList output_edges;
  471. Connections parent_connections;
  472. graph_builder.build(graphs, input_edges, output_edges,
  473. parent_connections);
  474. // build coordinators (graphs)
  475. for (unsigned int i = 0; i < graphs.size(); ++i) {
  476. Coordinator* coordinator = 0;
  477. std::ostringstream ss;
  478. ss << "S" << i;
  479. coordinator =
  480. new Coordinator(ss.str(), paradevs::common::NoParameters(),
  481. GraphParameters(graphs[i], input_edges[i],
  482. output_edges[i]));
  483. _coordinators.push_back(coordinator);
  484. VectorHierarchicalGraphManager < SchedulerHandle,
  485. GraphBuilder >::add_child(
  486. coordinator);
  487. }
  488. // builds internal connections (edges)
  489. for (Connections::const_iterator it = parent_connections.begin();
  490. it != parent_connections.end(); ++it) {
  491. const Connection& connection = *it;
  492. std::ostringstream ss_out;
  493. std::ostringstream ss_in;
  494. ss_out << "out_" << connection.first.second;
  495. ss_in << "in_" << connection.first.second;
  496. if (not VectorHierarchicalGraphManager <
  497. SchedulerHandle, GraphBuilder >::exist_link(
  498. _coordinators[connection.first.first - 1],
  499. ss_out.str(),
  500. _coordinators[connection.second.first - 1],
  501. ss_in.str())) {
  502. VectorHierarchicalGraphManager <
  503. SchedulerHandle, GraphBuilder >::add_link(
  504. _coordinators[connection.first.first - 1],
  505. ss_out.str(),
  506. _coordinators[connection.second.first - 1],
  507. ss_in.str());
  508. }
  509. }
  510. }
  511. virtual ~VectorHierarchicalGraphManager()
  512. {
  513. for (typename Coordinators::const_iterator it = _coordinators.begin();
  514. it != _coordinators.end(); ++it) {
  515. delete *it;
  516. }
  517. }
  518. private:
  519. typedef paradevs::pdevs::Coordinator <
  520. common::DoubleTime,
  521. paradevs::common::scheduler::VectorScheduler <
  522. paradevs::common::DoubleTime >,
  523. paradevs::common::scheduler::NoSchedulerHandle,
  524. BuiltFlatGraphManager < paradevs::common::scheduler::NoSchedulerHandle >,
  525. common::NoParameters,
  526. GraphParameters > Coordinator;
  527. typedef std::vector < Coordinator* > Coordinators;
  528. Coordinators _coordinators;
  529. };
  530. template < class SchedulerHandle, class GraphBuilder >
  531. class ParallelHeapHierarchicalGraphManager :
  532. public paradevs::pdevs::GraphManager < common::DoubleTime,
  533. SchedulerHandle,
  534. PartitioningParameters >
  535. {
  536. public:
  537. ParallelHeapHierarchicalGraphManager(
  538. common::Coordinator < common::DoubleTime,
  539. SchedulerHandle >* coordinator,
  540. const PartitioningParameters& parameters) :
  541. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  542. PartitioningParameters >(
  543. coordinator, parameters)
  544. {
  545. GraphBuilder graph_builder(parameters.cluster_number,
  546. parameters.partitioning_method_name,
  547. parameters.contraction_coef,
  548. parameters.contraction_coef_flag);
  549. OrientedGraphs graphs;
  550. InputEdgeList input_edges;
  551. OutputEdgeList output_edges;
  552. Connections parent_connections;
  553. graph_builder.build(graphs, input_edges, output_edges,
  554. parent_connections);
  555. // build coordinators (graphs)
  556. for (unsigned int i = 0; i < graphs.size(); ++i) {
  557. ParallelCoordinator* coordinator = 0;
  558. std::ostringstream ss;
  559. ss << "S" << i;
  560. coordinator =
  561. new ParallelCoordinator(ss.str(),
  562. paradevs::common::NoParameters(),
  563. GraphParameters(graphs[i],
  564. input_edges[i],
  565. output_edges[i]));
  566. _coordinators.push_back(coordinator);
  567. ParallelHeapHierarchicalGraphManager < SchedulerHandle,
  568. GraphBuilder >::add_child(
  569. coordinator);
  570. }
  571. // builds internal connections (edges)
  572. for (Connections::const_iterator it = parent_connections.begin();
  573. it != parent_connections.end(); ++it) {
  574. const Connection& connection = *it;
  575. std::ostringstream ss_out;
  576. std::ostringstream ss_in;
  577. ss_out << "out_" << connection.first.second;
  578. ss_in << "in_" << connection.first.second;
  579. if (not ParallelHeapHierarchicalGraphManager <
  580. SchedulerHandle, GraphBuilder >::exist_link(
  581. _coordinators[connection.first.first - 1],
  582. ss_out.str(),
  583. _coordinators[connection.second.first - 1],
  584. ss_in.str())) {
  585. ParallelHeapHierarchicalGraphManager <
  586. SchedulerHandle, GraphBuilder >::add_link(
  587. _coordinators[connection.first.first - 1],
  588. ss_out.str(),
  589. _coordinators[connection.second.first - 1],
  590. ss_in.str());
  591. }
  592. }
  593. }
  594. virtual ~ParallelHeapHierarchicalGraphManager()
  595. {
  596. for (typename Coordinators::const_iterator it = _coordinators.begin();
  597. it != _coordinators.end(); ++it) {
  598. delete *it;
  599. }
  600. }
  601. void init()
  602. {
  603. for (typename Coordinators::const_iterator it = _coordinators.begin();
  604. it != _coordinators.end(); ++it) {
  605. (*it)->set_sender(
  606. dynamic_cast < paradevs::pdevs::multithreading::Coordinator <
  607. common::DoubleTime,
  608. SchedulerType,
  609. SchedulerHandle,
  610. ParallelHeapHierarchicalGraphManager <
  611. SchedulerHandle,
  612. PartitioningGraphBuilder >,
  613. paradevs::common::NoParameters,
  614. PartitioningParameters >*
  615. >(ParallelHeapHierarchicalGraphManager < SchedulerHandle,
  616. GraphBuilder >::
  617. get_coordinator())->get_sender());
  618. }
  619. }
  620. void start(common::DoubleTime::type t)
  621. {
  622. for (typename Coordinators::const_iterator it = _coordinators.begin();
  623. it != _coordinators.end(); ++it) {
  624. (*it)->get_sender().send(
  625. paradevs::pdevs::multithreading::start_message <
  626. paradevs::common::DoubleTime >(t));
  627. }
  628. }
  629. void transition(const common::Models < common::DoubleTime,
  630. SchedulerHandle >& receivers,
  631. paradevs::common::DoubleTime::type t)
  632. {
  633. typename Coordinators::const_iterator it = _coordinators.begin();
  634. bool found = false;
  635. while (not found) {
  636. if (std::find(receivers.begin(), receivers.end(),
  637. *it) != receivers.end()) {
  638. (*it)->get_sender().send(
  639. paradevs::pdevs::multithreading::transition_message <
  640. paradevs::common::DoubleTime >(t));
  641. found = true;
  642. } else {
  643. ++it;
  644. }
  645. }
  646. }
  647. private:
  648. typedef paradevs::pdevs::multithreading::Coordinator <
  649. common::DoubleTime,
  650. SchedulerType,
  651. SchedulerHandle,
  652. ParallelBuiltFlatGraphManager
  653. < SchedulerHandle >,
  654. common::NoParameters,
  655. GraphParameters > ParallelCoordinator;
  656. typedef std::vector < ParallelCoordinator* > Coordinators;
  657. Coordinators _coordinators;
  658. };
  659. } } } // namespace paradevs tests boost_graph
  660. #endif