/** * @file tests/mixed/graph_manager.hpp * @author The ARTIS Development Team * See the AUTHORS or Authors.txt file */ /* * ARTIS - the multimodeling and simulation environment * This file is a part of the ARTIS environment * * Copyright (C) 2013-2019 ULCO http://www.univ-littoral.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_MIXED_GRAPH_MANAGER_HPP #define TESTS_MIXED_GRAPH_MANAGER_HPP #include #include #include #include #include #include #include #include namespace artis { namespace tests { namespace mixed { class S1GraphManager : public pdevs::GraphManager { public: enum submodels { OneA, OneB }; enum outputs { OUT }; S1GraphManager(common::Coordinator *coordinator, const artis::common::NoParameters ¶meters, const artis::common::NoParameters &graph_parameters) : pdevs::GraphManager(coordinator, parameters, graph_parameters), a("a1", parameters), b("b1", parameters) { add_child(OneA, &a); add_child(OneB, &b); coordinator->output_port({OUT, "out"}); out({&a, A1::OUT}) >> in({&b, B1::IN}); out({&b, B1::OUT}) >> out({coordinator, OUT}); } ~S1GraphManager() override = default; private: pdevs::Simulator a; pdevs::Simulator b; }; class S2GraphManager : public dtss::GraphManager> { public: enum submodels { OneA, OneB }; enum inputs { IN }; S2GraphManager(common::Coordinator *coordinator, const artis::dtss::Parameters ¶meters, const artis::common::NoParameters &graph_parameters) : dtss::GraphManager>( coordinator, parameters, graph_parameters), a("a2", parameters), b("b2", parameters) { add_child(OneA, &a); add_child(OneB, &b); coordinator->input_port({IN, "in"}); out({&a, A2::OUT}) >> in({&b, B2::IN}); in({coordinator, IN}) >> in({&a, A2::IN}); } ~S2GraphManager() override = default; private: dtss::Simulator> a; dtss::Simulator> b; }; class RootGraphManager : public pdevs::GraphManager { public: enum submodels { OneS1, OneS2 }; RootGraphManager(common::Coordinator *coordinator, const artis::common::NoParameters ¶meters, const artis::common::NoParameters &graph_parameters) : pdevs::GraphManager(coordinator, parameters, graph_parameters), S1("S1", artis::common::NoParameters(), artis::common::NoParameters()), S2("S2", {2}, artis::common::NoParameters()) { add_child(OneS1, &S1); add_child(OneS2, &S2); out({&S1, S1GraphManager::OUT}) >> in({&S2, S2GraphManager::IN}); } ~RootGraphManager() override = default; private: artis::pdevs::Coordinator S1; artis::dtss::Coordinator< common::DoubleTime, artis::dtss::LastBagPolicy, S2GraphManager, artis::dtss::Parameters> S2; }; template class LinearGraphManager : public pdevs::GraphManager { public: LinearGraphManager(common::Coordinator *coordinator, const artis::common::NoParameters ¶meters, const artis::common::NoParameters &graph_parameters) : pdevs::GraphManager(coordinator, parameters, graph_parameters) { for (unsigned int i = 1; i <= size; ++i) { std::ostringstream ss; ss << "a" << i; _models.push_back( new pdevs::Simulator( ss.str(), artis::common::NoParameters())); } for (unsigned int i = 0; i < size; ++i) { LinearGraphManager::add_child(i, _models[i]); } for (unsigned int i = 0; i < size - 1; ++i) { out({_models[i], Beep::OUT}) >> in({_models[i + 1], B1::IN}); } } ~LinearGraphManager() override { for (unsigned int i = 0; i < size; ++i) { delete _models[i]; } } private: std::vector *> _models; }; class Linear2GraphManager : public pdevs::GraphManager { public: enum inputs { IN }; enum outputs { OUT }; Linear2GraphManager(common::Coordinator *coordinator, const artis::common::NoParameters ¶meters, const artis::common::NoParameters &graph_parameters) : pdevs::GraphManager(coordinator, parameters, graph_parameters) { for (unsigned int i = 1; i <= 100; ++i) { std::ostringstream ss; ss << "a" << i; _models.push_back( new pdevs::Simulator( ss.str(), artis::common::NoParameters())); } for (unsigned int i = 0; i < 100; ++i) { add_child(i, _models[i]); } for (unsigned int i = 0; i < 99; ++i) { out({_models[i], Beep::OUT}) >> in({_models[i + 1], B1::IN}); } coordinator->input_port({IN, "in"}); coordinator->output_port({OUT, "out"}); in({coordinator, IN}) >> in({_models[0], Beep::IN}); out({_models[99], Beep::OUT}) >> out({coordinator, OUT}); } ~Linear2GraphManager() override { for (unsigned int i = 0; i < 100; ++i) { delete _models[i]; } } private: std::vector *> _models; }; class Root2GraphManager : public pdevs::GraphManager { public: enum submodels { OneS1, OneS2 }; Root2GraphManager(common::Coordinator *coordinator, const artis::common::NoParameters ¶meters, const artis::common::NoParameters &graph_parameters ) : pdevs::GraphManager(coordinator, parameters, graph_parameters), S1("S1", artis::common::NoParameters(), artis::common::NoParameters()), S2("S2", artis::common::NoParameters(), artis::common::NoParameters()) { add_child(OneS1, &S1); add_child(OneS2, &S2); out({&S1, S1GraphManager::OUT}) >> in({&S2, S2GraphManager::IN}); } ~Root2GraphManager() override = default; private: artis::pdevs::Coordinator S1; artis::pdevs::Coordinator S2; }; class Root3GraphManager : public pdevs::GraphManager { public: enum submodels { OneS1, OneS2 }; Root3GraphManager(common::Coordinator *coordinator, const artis::common::NoParameters ¶meters, const artis::common::NoParameters &graph_parameters ) : pdevs::GraphManager(coordinator, parameters, graph_parameters), S1("S1", artis::common::NoParameters(), artis::common::NoParameters()), S2("S2", artis::common::NoParameters(), artis::common::NoParameters()) { add_child(OneS1, &S1); add_child(OneS2, &S2); out({&S1, S1GraphManager::OUT}) >> in({&S2, S2GraphManager::IN}); } ~Root3GraphManager() override = default; private: artis::pdevs::Coordinator S1; artis::pdevs::Coordinator S2; }; } } } // namespace artis tests mixed #endif