/** * @file tests/mpi/cluster/graph_manager.cpp * @author The PARADEVS Development Team * See the AUTHORS or Authors.txt file */ /* * PARADEVS - the multimodeling and simulation environment * This file is a part of the PARADEVS environment * * Copyright (C) 2013-2015 ULCO http://www.univ-litoral.fr * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TESTS_PDEVS_MPI_CLUSTER_GRAPH_MANAGER_HPP #define TESTS_PDEVS_MPI_CLUSTER_GRAPH_MANAGER_HPP 1 #include #include #include #include #include #include #include namespace paradevs { namespace tests { namespace mpi { namespace cluster { struct SubGraphManagerParameters { std::vector < int > indexes; std::vector < std::pair < int, int > > internals; std::vector < std::pair < int, int > > inputs; std::vector < std::pair < int, int > > outputs; }; class SubGraphManager : public paradevs::pdevs::mpi::GraphManager < common::DoubleTime, SubGraphManagerParameters > { public: SubGraphManager(common::Coordinator < common::DoubleTime >* coordinator, const SubGraphManagerParameters& parameters) : paradevs::pdevs::mpi::GraphManager < common::DoubleTime, SubGraphManagerParameters >(coordinator, parameters) { for (std::vector < int >::const_iterator it = parameters.indexes.begin(); it != parameters.indexes.end(); ++it) { std::stringstream ss; ss << "m_" << *it; Simulator* m = new Simulator(ss.str(), paradevs::common::NoParameters()); models[*it] = m; add_child(m); m->add_in_port("in"); m->add_out_port("out"); } for (std::vector < std::pair < int, int > >::const_iterator it = parameters.inputs.begin(); it != parameters.inputs.end(); ++it) { std::stringstream ss; ss << "in_" << it->first; if (not coordinator->exist_in_port(ss.str())) { coordinator->add_in_port(ss.str()); } if (not exist_link(coordinator, ss.str(), models[it->second], "in")) { add_link(coordinator, ss.str(), models[it->second], "in"); } } for (std::vector < std::pair < int, int > >::const_iterator it = parameters.outputs.begin(); it != parameters.outputs.end(); ++it) { std::stringstream ss; ss << "out_" << it->first; if (not coordinator->exist_out_port(ss.str())) { coordinator->add_out_port(ss.str()); } if (not exist_link(models[it->first], "out", coordinator, ss.str())) { add_link(models[it->first], "out", coordinator, ss.str()); } } for (std::vector < std::pair < int, int > >::const_iterator it = parameters.internals.begin(); it != parameters.internals.end(); ++it) { if (not exist_link(models[it->first], "out", models[it->second], "in")) { add_link(models[it->first], "out", models[it->second], "in"); } } } void init() { } void start(common::DoubleTime::type /* t */) { } void transition(const common::Models < common::DoubleTime >& /* receivers */, common::DoubleTime::type /* t */) { } virtual ~SubGraphManager() { for (Simulators::iterator it = models.begin(); it != models.end(); ++it) { delete it->second; } } private: typedef paradevs::pdevs::Simulator < common::DoubleTime, ThreeStateModel > Simulator; typedef std::map < int, Simulator* > Simulators; Simulators models; }; struct LevelGraphManagerParameters { int index; std::vector < std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > > > parents; }; class LevelGraphManager : public paradevs::pdevs::GraphManager < common::DoubleTime, LevelGraphManagerParameters > { public: LevelGraphManager( common::Coordinator < common::DoubleTime >* coordinator, const LevelGraphManagerParameters& parameters) : paradevs::pdevs::GraphManager < common::DoubleTime, LevelGraphManagerParameters >( coordinator, parameters), model("m", parameters.index, false) { add_child(&model); for (std::vector < std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > > >::const_iterator it = parameters.parents.begin(); it != parameters.parents.end(); ++it) { for (std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > >::const_iterator it2 = it->begin(); it2 != it->end(); ++it2) { std::stringstream out_ss; std::stringstream in_ss; if (it2->first.first == parameters.index) { out_ss << "out_" << it2->first.second; if (not model.exist_out_port(out_ss.str())) { model.add_out_port(out_ss.str()); } if (not exist_link(&model, out_ss.str(), coordinator, out_ss.str())) { add_link(&model, out_ss.str(), coordinator, out_ss.str()); } } if (it2->second.first == parameters.index) { in_ss << "in_" << it2->second.second; if (not model.exist_in_port(in_ss.str())) { model.add_in_port(in_ss.str()); } if (not exist_link(coordinator, in_ss.str(), &model, in_ss.str())) { add_link(coordinator, in_ss.str(), &model, in_ss.str()); } } } } } void init() { } void start(common::DoubleTime::type /* t */) { } void transition( const common::Models < common::DoubleTime >& /* receivers */, common::DoubleTime::type /* t */) { } virtual ~LevelGraphManager() { } private: typedef paradevs::pdevs::mpi::ModelProxy < common::DoubleTime > ModelProxy; ModelProxy model; }; struct RootGraphManagerParameters { std::vector < std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > > > parents; }; class RootGraphManager : public paradevs::pdevs::GraphManager < common::DoubleTime, RootGraphManagerParameters > { public: RootGraphManager( common::Coordinator < common::DoubleTime >* coordinator, const RootGraphManagerParameters& parameters) : paradevs::pdevs::GraphManager < common::DoubleTime, RootGraphManagerParameters >( coordinator, parameters) { int index = 0; for (std::vector < std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > > >::const_iterator it = parameters.parents.begin(); it != parameters.parents.end(); ++it) { std::stringstream ss; Coordinator* model = 0; LevelGraphManagerParameters p; p.index = index; p.parents = parameters.parents; ss << "S_" << index; model = new Coordinator(ss.str(), common::NoParameters(), p); models.push_back(model); add_child(model); ++index; } for (std::vector < std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > > >::const_iterator it = parameters.parents.begin(); it != parameters.parents.end(); ++it) { for (std::vector < std::pair < std::pair < int, int >, std::pair < int, int > > >::const_iterator it2 = it->begin(); it2 != it->end(); ++it2) { std::stringstream out_ss; std::stringstream in_ss; out_ss << "out_" << it2->first.second; if (not models[it2->first.first]->exist_out_port(out_ss.str())) { models[it2->first.first]->add_out_port(out_ss.str()); } in_ss << "in_" << it2->first.second; if (not models[it2->second.first]->exist_in_port(in_ss.str())) { models[it2->second.first]->add_in_port(in_ss.str()); } if (not exist_link(models[it2->first.first], out_ss.str(), models[it2->second.first], in_ss.str())) { add_link(models[it2->first.first], out_ss.str(), models[it2->second.first], in_ss.str()); } } } } void init() { for (Coordinators::iterator it = models.begin(); it != models.end(); ++it) { (*it)->set_sender( dynamic_cast < paradevs::pdevs::multithreading::Coordinator < common::DoubleTime, paradevs::tests::mpi::cluster::RootGraphManager, paradevs::common::NoParameters, paradevs::tests::mpi::cluster::RootGraphManagerParameters >* >(get_coordinator())->get_sender()); } } void start(common::DoubleTime::type t) { for (Coordinators::iterator it = models.begin(); it != models.end(); ++it) { (*it)->get_sender().send( paradevs::pdevs::multithreading::start_message < common::DoubleTime >(t)); } } void transition(const common::Models < common::DoubleTime >& receivers, common::DoubleTime::type t) { for (Coordinators::iterator it = models.begin(); it != models.end(); ++it) { (*it)->get_sender().send( paradevs::pdevs::multithreading::transition_message < common::DoubleTime >(t)); } } virtual ~RootGraphManager() { std::for_each(models.begin(), models.end(), std::default_delete < Coordinator >()); } private: typedef paradevs::pdevs::multithreading::Coordinator < common::DoubleTime, LevelGraphManager, common::NoParameters, LevelGraphManagerParameters > Coordinator; typedef std::vector < Coordinator* > Coordinators; Coordinators models; }; } } } } // namespace paradevs tests mpi cluster #endif