graph_manager.hpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  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-2015 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. GraphGenerator& generator;
  355. PartitioningParameters(int cn,
  356. const std::string& pmn,
  357. int cc, bool ccf,
  358. GraphGenerator& generator) :
  359. cluster_number(cn), partitioning_method_name(pmn),
  360. contraction_coef(cc), contraction_coef_flag(ccf),
  361. generator(generator)
  362. { }
  363. };
  364. template < class SchedulerHandle, class GraphBuilder >
  365. class HeapHierarchicalGraphManager :
  366. public paradevs::pdevs::GraphManager < common::DoubleTime,
  367. SchedulerHandle,
  368. PartitioningParameters >
  369. {
  370. public:
  371. HeapHierarchicalGraphManager(
  372. common::Coordinator < common::DoubleTime,
  373. SchedulerHandle >* coordinator,
  374. const PartitioningParameters& parameters) :
  375. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  376. PartitioningParameters >(
  377. coordinator, parameters)
  378. {
  379. GraphBuilder graph_builder(parameters.cluster_number,
  380. parameters.partitioning_method_name,
  381. parameters.contraction_coef,
  382. parameters.contraction_coef_flag,
  383. parameters.generator);
  384. OrientedGraphs graphs;
  385. InputEdgeList input_edges;
  386. OutputEdgeList output_edges;
  387. Connections parent_connections;
  388. graph_builder.build(graphs, input_edges, output_edges,
  389. parent_connections);
  390. // build coordinators (graphs)
  391. //boost::timer t;
  392. for (unsigned int i = 0; i < graphs.size(); ++i) {
  393. Coordinator* coordinator = 0;
  394. std::ostringstream ss;
  395. ss << "S" << i;
  396. coordinator =
  397. new Coordinator(ss.str(), paradevs::common::NoParameters(),
  398. GraphParameters(graphs[i], input_edges[i],
  399. output_edges[i]));
  400. _coordinators.push_back(coordinator);
  401. HeapHierarchicalGraphManager < SchedulerHandle,
  402. GraphBuilder >::add_child(
  403. coordinator);
  404. }
  405. // std::cout << "Root:" << std::endl;
  406. // builds internal connections (edges)
  407. for (Connections::const_iterator it = parent_connections.begin();
  408. it != parent_connections.end(); ++it) {
  409. const Connection& connection = *it;
  410. std::ostringstream ss_out;
  411. std::ostringstream ss_in;
  412. ss_out << "out_" << connection.first.second;
  413. ss_in << "in_" << connection.first.second;
  414. if (not HeapHierarchicalGraphManager <
  415. SchedulerHandle, GraphBuilder >::exist_link(
  416. _coordinators[connection.first.first - 1],
  417. ss_out.str(),
  418. _coordinators[connection.second.first - 1],
  419. ss_in.str())) {
  420. // std::cout << "link = "
  421. // << _coordinators[connection.first.first - 1]
  422. // ->get_name()
  423. // << "::" << ss_out.str() << " -> "
  424. // << _coordinators[connection.second.first - 1]
  425. // ->get_name()
  426. // << "::" << ss_in.str() << std::endl;
  427. HeapHierarchicalGraphManager <
  428. SchedulerHandle, GraphBuilder >::add_link(
  429. _coordinators[connection.first.first - 1],
  430. ss_out.str(),
  431. _coordinators[connection.second.first - 1],
  432. ss_in.str());
  433. }
  434. }
  435. //double t3 = t.elapsed();
  436. //std::cout << "tmp_constr = " << t3 << std::endl;
  437. }
  438. virtual ~HeapHierarchicalGraphManager()
  439. {
  440. for (typename Coordinators::const_iterator it = _coordinators.begin();
  441. it != _coordinators.end(); ++it) {
  442. delete *it;
  443. }
  444. }
  445. private:
  446. typedef paradevs::pdevs::Coordinator <
  447. common::DoubleTime,
  448. SchedulerType,
  449. SchedulerHandle,
  450. BuiltFlatGraphManager < SchedulerHandle >,
  451. common::NoParameters,
  452. GraphParameters > Coordinator;
  453. typedef std::vector < Coordinator* > Coordinators;
  454. Coordinators _coordinators;
  455. };
  456. template < class SchedulerHandle, class GraphBuilder >
  457. class VectorHierarchicalGraphManager :
  458. public paradevs::pdevs::GraphManager < common::DoubleTime,
  459. SchedulerHandle,
  460. PartitioningParameters >
  461. {
  462. public:
  463. VectorHierarchicalGraphManager(
  464. common::Coordinator < common::DoubleTime,
  465. SchedulerHandle >* coordinator,
  466. const PartitioningParameters& parameters) :
  467. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  468. PartitioningParameters >(
  469. coordinator, parameters)
  470. {
  471. GraphBuilder graph_builder(parameters.cluster_number,
  472. parameters.partitioning_method_name,
  473. parameters.contraction_coef,
  474. parameters.contraction_coef_flag,
  475. parameters.generator);
  476. OrientedGraphs graphs;
  477. InputEdgeList input_edges;
  478. OutputEdgeList output_edges;
  479. Connections parent_connections;
  480. graph_builder.build(graphs, input_edges, output_edges,
  481. parent_connections);
  482. // build coordinators (graphs)
  483. for (unsigned int i = 0; i < graphs.size(); ++i) {
  484. Coordinator* coordinator = 0;
  485. std::ostringstream ss;
  486. ss << "S" << i;
  487. coordinator =
  488. new Coordinator(ss.str(), paradevs::common::NoParameters(),
  489. GraphParameters(graphs[i], input_edges[i],
  490. output_edges[i]));
  491. _coordinators.push_back(coordinator);
  492. VectorHierarchicalGraphManager < SchedulerHandle,
  493. GraphBuilder >::add_child(
  494. coordinator);
  495. }
  496. // builds internal connections (edges)
  497. for (Connections::const_iterator it = parent_connections.begin();
  498. it != parent_connections.end(); ++it) {
  499. const Connection& connection = *it;
  500. std::ostringstream ss_out;
  501. std::ostringstream ss_in;
  502. ss_out << "out_" << connection.first.second;
  503. ss_in << "in_" << connection.first.second;
  504. if (not VectorHierarchicalGraphManager <
  505. SchedulerHandle, GraphBuilder >::exist_link(
  506. _coordinators[connection.first.first - 1],
  507. ss_out.str(),
  508. _coordinators[connection.second.first - 1],
  509. ss_in.str())) {
  510. VectorHierarchicalGraphManager <
  511. SchedulerHandle, GraphBuilder >::add_link(
  512. _coordinators[connection.first.first - 1],
  513. ss_out.str(),
  514. _coordinators[connection.second.first - 1],
  515. ss_in.str());
  516. }
  517. }
  518. }
  519. virtual ~VectorHierarchicalGraphManager()
  520. {
  521. for (typename Coordinators::const_iterator it = _coordinators.begin();
  522. it != _coordinators.end(); ++it) {
  523. delete *it;
  524. }
  525. }
  526. private:
  527. typedef paradevs::pdevs::Coordinator <
  528. common::DoubleTime,
  529. paradevs::common::scheduler::VectorScheduler <
  530. paradevs::common::DoubleTime >,
  531. paradevs::common::scheduler::NoSchedulerHandle,
  532. BuiltFlatGraphManager < paradevs::common::scheduler::NoSchedulerHandle >,
  533. common::NoParameters,
  534. GraphParameters > Coordinator;
  535. typedef std::vector < Coordinator* > Coordinators;
  536. Coordinators _coordinators;
  537. };
  538. template < class SchedulerHandle, class GraphBuilder >
  539. class ParallelHeapHierarchicalGraphManager :
  540. public paradevs::pdevs::GraphManager < common::DoubleTime,
  541. SchedulerHandle,
  542. PartitioningParameters >
  543. {
  544. public:
  545. ParallelHeapHierarchicalGraphManager(
  546. common::Coordinator < common::DoubleTime,
  547. SchedulerHandle >* coordinator,
  548. const PartitioningParameters& parameters) :
  549. paradevs::pdevs::GraphManager < common::DoubleTime, SchedulerHandle,
  550. PartitioningParameters >(
  551. coordinator, parameters)
  552. {
  553. GraphBuilder graph_builder(parameters.cluster_number,
  554. parameters.partitioning_method_name,
  555. parameters.contraction_coef,
  556. parameters.contraction_coef_flag,
  557. parameters.generator);
  558. OrientedGraphs graphs;
  559. InputEdgeList input_edges;
  560. OutputEdgeList output_edges;
  561. Connections parent_connections;
  562. graph_builder.build(graphs, input_edges, output_edges,
  563. parent_connections);
  564. // build coordinators (graphs)
  565. for (unsigned int i = 0; i < graphs.size(); ++i) {
  566. ParallelCoordinator* coordinator = 0;
  567. std::ostringstream ss;
  568. ss << "S" << i;
  569. coordinator =
  570. new ParallelCoordinator(ss.str(),
  571. paradevs::common::NoParameters(),
  572. GraphParameters(graphs[i],
  573. input_edges[i],
  574. output_edges[i]));
  575. _coordinators.push_back(coordinator);
  576. ParallelHeapHierarchicalGraphManager < SchedulerHandle,
  577. GraphBuilder >::add_child(
  578. coordinator);
  579. }
  580. // builds internal connections (edges)
  581. for (Connections::const_iterator it = parent_connections.begin();
  582. it != parent_connections.end(); ++it) {
  583. const Connection& connection = *it;
  584. std::ostringstream ss_out;
  585. std::ostringstream ss_in;
  586. ss_out << "out_" << connection.first.second;
  587. ss_in << "in_" << connection.first.second;
  588. if (not ParallelHeapHierarchicalGraphManager <
  589. SchedulerHandle, GraphBuilder >::exist_link(
  590. _coordinators[connection.first.first - 1],
  591. ss_out.str(),
  592. _coordinators[connection.second.first - 1],
  593. ss_in.str())) {
  594. ParallelHeapHierarchicalGraphManager <
  595. SchedulerHandle, GraphBuilder >::add_link(
  596. _coordinators[connection.first.first - 1],
  597. ss_out.str(),
  598. _coordinators[connection.second.first - 1],
  599. ss_in.str());
  600. }
  601. }
  602. }
  603. virtual ~ParallelHeapHierarchicalGraphManager()
  604. {
  605. for (typename Coordinators::const_iterator it = _coordinators.begin();
  606. it != _coordinators.end(); ++it) {
  607. delete *it;
  608. }
  609. }
  610. void init()
  611. {
  612. for (typename Coordinators::const_iterator it = _coordinators.begin();
  613. it != _coordinators.end(); ++it) {
  614. (*it)->set_sender(
  615. dynamic_cast < paradevs::pdevs::multithreading::Coordinator <
  616. common::DoubleTime,
  617. SchedulerType,
  618. SchedulerHandle,
  619. ParallelHeapHierarchicalGraphManager <
  620. SchedulerHandle,
  621. PartitioningGraphBuilder >,
  622. paradevs::common::NoParameters,
  623. PartitioningParameters >*
  624. >(ParallelHeapHierarchicalGraphManager < SchedulerHandle,
  625. GraphBuilder >::
  626. get_coordinator())->get_sender());
  627. }
  628. }
  629. void start(common::DoubleTime::type t)
  630. {
  631. for (typename Coordinators::const_iterator it = _coordinators.begin();
  632. it != _coordinators.end(); ++it) {
  633. (*it)->get_sender().send(
  634. paradevs::pdevs::multithreading::start_message <
  635. paradevs::common::DoubleTime >(t));
  636. }
  637. }
  638. void transition(const common::Models < common::DoubleTime,
  639. SchedulerHandle >& receivers,
  640. paradevs::common::DoubleTime::type t)
  641. {
  642. typename Coordinators::const_iterator it = _coordinators.begin();
  643. bool found = false;
  644. while (not found) {
  645. if (std::find(receivers.begin(), receivers.end(),
  646. *it) != receivers.end()) {
  647. (*it)->get_sender().send(
  648. paradevs::pdevs::multithreading::transition_message <
  649. paradevs::common::DoubleTime >(t));
  650. found = true;
  651. } else {
  652. ++it;
  653. }
  654. }
  655. }
  656. private:
  657. typedef paradevs::pdevs::multithreading::Coordinator <
  658. common::DoubleTime,
  659. SchedulerType,
  660. SchedulerHandle,
  661. ParallelBuiltFlatGraphManager
  662. < SchedulerHandle >,
  663. common::NoParameters,
  664. GraphParameters > ParallelCoordinator;
  665. typedef std::vector < ParallelCoordinator* > Coordinators;
  666. Coordinators _coordinators;
  667. };
  668. } } } // namespace paradevs tests boost_graph
  669. #endif