浏览代码

Added Cadmium v2; fixing Cadmium v1 (WIP)

Román Cárdenas 3 年之前
父节点
当前提交
f830832995

+ 3 - 0
.gitmodules

@@ -15,3 +15,6 @@
 [submodule "simulators/xdevs-c++"]
 [submodule "simulators/xdevs-c++"]
 	path = simulators/xdevs-c++
 	path = simulators/xdevs-c++
 	url = https://github.com/iscar-ucm/xdevs.git
 	url = https://github.com/iscar-ucm/xdevs.git
+[submodule "simulators/cadmium_v2"]
+	path = simulators/cadmium_v2
+	url = https://github.com/SimulationEverywhere/cadmium_v2.git

+ 0 - 1
devstone/adevs/CMakeLists.txt

@@ -6,7 +6,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
 if(NOT CMAKE_BUILD_TYPE)
 if(NOT CMAKE_BUILD_TYPE)
   set(CMAKE_BUILD_TYPE Release)
   set(CMAKE_BUILD_TYPE Release)
 endif()
 endif()
-set(CMAKE_CXX_FLAGS "-Wall -Wextra")
 set(CMAKE_CXX_FLAGS_DEBUG "-g")
 set(CMAKE_CXX_FLAGS_DEBUG "-g")
 set(CMAKE_CXX_FLAGS_RELEASE "-O3")
 set(CMAKE_CXX_FLAGS_RELEASE "-O3")
 
 

+ 9 - 4
devstone/cadmium/CMakeLists.txt

@@ -1,18 +1,23 @@
 cmake_minimum_required(VERSION 3.10)
 cmake_minimum_required(VERSION 3.10)
 project(devstone-cadmium)
 project(devstone-cadmium)
-
 set (CMAKE_CXX_STANDARD 17)
 set (CMAKE_CXX_STANDARD 17)
 set (CMAKE_CXX_COMPILER "g++")
 set (CMAKE_CXX_COMPILER "g++")
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
 
 
-set(Boost_USE_STATIC_LIBS        ON)
-set(Boost_USE_MULTITHREADED     OFF)
-
+if(NOT CMAKE_BUILD_TYPE)
+    set(CMAKE_BUILD_TYPE Release)
+endif()
+set(CMAKE_CXX_FLAGS_DEBUG "-g")
+set(CMAKE_CXX_FLAGS_RELEASE "-O3")
 
 
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../simulators/cadmium/include)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../simulators/cadmium/include)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
 
 
 find_package(Boost COMPONENTS program_options thread unit_test_framework REQUIRED)
 find_package(Boost COMPONENTS program_options thread unit_test_framework REQUIRED)
 
 
+set(Boost_USE_STATIC_LIBS        ON)
+set(Boost_USE_MULTITHREADED     OFF)
+
 include_directories(${Boost_INCLUDE_DIRS})
 include_directories(${Boost_INCLUDE_DIRS})
 
 
 ## Cadmium dynamic
 ## Cadmium dynamic

+ 35 - 72
devstone/cadmium/src/cadmium-devstone-atomic.hpp

@@ -1,28 +1,3 @@
-/**
- * Copyright (c) 2017, Damian Vicino
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
 #ifndef CADMIUM_DEVSTONE_ATOMIC_HPP
 #ifndef CADMIUM_DEVSTONE_ATOMIC_HPP
 #define CADMIUM_DEVSTONE_ATOMIC_HPP
 #define CADMIUM_DEVSTONE_ATOMIC_HPP
 
 
@@ -30,18 +5,21 @@
 #include<cadmium/modeling/message_bag.hpp>
 #include<cadmium/modeling/message_bag.hpp>
 #include<limits>
 #include<limits>
 
 
-#include "../../dhry/dhry_1.c"
-
-
 /**
 /**
- * @brief PDEVStone Atomic Model.
- *
- * PDEVStone (InternalTime, ExternalTime, Period):
- * This model executes:
- * - a Dhrystone for InternalCycles on each Internal transition,
- * - a Dhrystone for ExternalCycles on each External transition,
- * - the time advance after each external transition is Period.
-*/
+ * @brief DEVStone atomic model state.
+ * @tparam TIME data type used to represent the time.
+ */
+template<typename TIME>
+struct devstone_state {
+    TIME sigma;
+    unsigned int n_internals, n_externals, n_events;
+    devstone_state(): sigma(std::numeric_limits<TIME>::infinity()), n_internals(), n_externals(), n_events() {}
+
+    friend std::ostream &operator << (std::ostream &os, const devstone_state<TIME> &s) {
+        os << s.n_internals << " ; " << s.n_externals << " ; " << s.n_events;
+        return os;
+    }
+};
 
 
 //  an integer input and output port for the model
 //  an integer input and output port for the model
 struct devstone_atomic_defs{
 struct devstone_atomic_defs{
@@ -50,55 +28,40 @@ struct devstone_atomic_defs{
     struct out : public cadmium::out_port<int> {};
     struct out : public cadmium::out_port<int> {};
 };
 };
 
 
-
 template<typename TIME>
 template<typename TIME>
-class devstone_atomic {
+struct devstone_atomic {
     using defs=devstone_atomic_defs;
     using defs=devstone_atomic_defs;
-public:
-    // default constructor
-    constexpr devstone_atomic() noexcept {
+    using input_ports=std::tuple<typename defs::in>;
+    using output_ports=std::tuple<typename defs::out>;
+    using outbag_t=typename cadmium::make_message_bags<output_ports>::type;
+    using state_type=devstone_state<TIME>;
+
+    state_type state = devstone_state<TIME>();
+    int internal_cycles, external_cycles;
+    outbag_t outbag;
+
+    constexpr devstone_atomic() noexcept: internal_cycles(), external_cycles() {
         //preparing the output bag, since we return always same message
         //preparing the output bag, since we return always same message
         cadmium::get_messages<typename defs::out>(outbag).emplace_back(1);
         cadmium::get_messages<typename defs::out>(outbag).emplace_back(1);
     }
     }
 
 
-    constexpr devstone_atomic(int ext_cycles, int int_cycles, TIME time_advance) noexcept
-        : period(time_advance), external_cycles(ext_cycles), internal_cycles(int_cycles){
+    constexpr devstone_atomic(int int_cycles, int ext_cycles) noexcept: internal_cycles(int_cycles), external_cycles(ext_cycles) {
         //preparing the output bag, since we return always same message
         //preparing the output bag, since we return always same message
         cadmium::get_messages<typename defs::out>(outbag).emplace_back(1);
         cadmium::get_messages<typename defs::out>(outbag).emplace_back(1);
     }
     }
 
 
-    // state definition
-    using queued_processes=int; //for readability
-    using state_type=queued_processes;
-    state_type state = 0;
-
-    // ports definition
-    using input_ports=std::tuple<typename defs::in>;
-    using output_ports=std::tuple<typename defs::out>;
-
-protected:
-    /*
-     * This model executes:
-     * - a Dhrystone for InternalCycles on each Internal transition,
-     * - a Dhrystone for ExternalCycles on each External transition,
-     * - the time advance after each external transition is Period.
-     * The following 3 variables need to be overriden by the inheriting model constructor.
-     */
-    TIME period=std::numeric_limits<float>::infinity();
-    int external_cycles=-1;
-    int internal_cycles=-1;
-    using outbag_t=typename cadmium::make_message_bags<output_ports>::type;
-    outbag_t outbag;
-
 public:
 public:
     void internal_transition() {
     void internal_transition() {
-        DhryStone().dhrystoneRun(internal_cycles);
-        state--;
+        // DhryStone().dhrystoneRun(internal_cycles);  // TODO enable Dhrystone cycles
+        state.sigma = std::numeric_limits<TIME>::infinity();
+        state.n_internals += 1;
     }
     }
 
 
     void external_transition(TIME e, typename cadmium::make_message_bags<input_ports>::type mbs) {
     void external_transition(TIME e, typename cadmium::make_message_bags<input_ports>::type mbs) {
-        DhryStone().dhrystoneRun(external_cycles);
-        state+= cadmium::get_messages<typename defs::in>(mbs).size();
+        // DhryStone().dhrystoneRun(external_cycles);  // TODO enable Dhrystone cycles
+        state.sigma = TIME();
+        state.n_externals += 1;
+        state.n_events += cadmium::get_messages<typename defs::in>(mbs).size();
     }
     }
 
 
     void confluence_transition(TIME e, typename cadmium::make_message_bags<input_ports>::type mbs) {
     void confluence_transition(TIME e, typename cadmium::make_message_bags<input_ports>::type mbs) {
@@ -106,12 +69,12 @@ public:
         external_transition(e, mbs);
         external_transition(e, mbs);
     }
     }
 
 
-    outbag_t output() const {
+    [[nodiscard]] outbag_t output() const {
         return outbag;
         return outbag;
     }
     }
 
 
     TIME time_advance() const {
     TIME time_advance() const {
-        return (state!=0?period:std::numeric_limits<TIME>::infinity());
+        return state.sigma;
     }
     }
 };
 };
 
 

+ 4 - 5
devstone/cadmium/src/cadmium-dynamic-devstone.cpp

@@ -26,7 +26,6 @@
 #include <iostream>
 #include <iostream>
 #include <chrono>
 #include <chrono>
 #include <algorithm>
 #include <algorithm>
-#include <fstream>
 
 
 #include <boost/program_options.hpp>
 #include <boost/program_options.hpp>
 
 
@@ -94,13 +93,13 @@ int main(int argc, char* argv[]){
     auto processed_parameters = hclock::now();
     auto processed_parameters = hclock::now();
 
 
     std::shared_ptr<cadmium::dynamic::modeling::coupled<Time>> TOP_coupled;
     std::shared_ptr<cadmium::dynamic::modeling::coupled<Time>> TOP_coupled;
-    if (kind.compare("LI") == 0){
+    if (kind == "LI"){
         TOP_coupled = create_LI_model(width,depth, ext_cycles, int_cycles, time_advance);
         TOP_coupled = create_LI_model(width,depth, ext_cycles, int_cycles, time_advance);
-    } else if (kind.compare("HI") == 0) {
+    } else if (kind == "HI") {
         TOP_coupled = create_HI_model(width, depth, ext_cycles, int_cycles, time_advance);
         TOP_coupled = create_HI_model(width, depth, ext_cycles, int_cycles, time_advance);
-    } else if (kind.compare("HO") == 0) {
+    } else if (kind == "HO") {
         TOP_coupled = create_HO_model(width,depth, ext_cycles, int_cycles, time_advance);
         TOP_coupled = create_HO_model(width,depth, ext_cycles, int_cycles, time_advance);
-    } else if (kind.compare("HOmod") == 0) {
+    } else if (kind == "HOmod") {
         TOP_coupled = create_HOmod_model(width,depth, ext_cycles, int_cycles, time_advance);
         TOP_coupled = create_HOmod_model(width,depth, ext_cycles, int_cycles, time_advance);
     } else {
     } else {
         abort();
         abort();

+ 4 - 6
devstone/cadmium/src/dynamic/LI_generator.cpp

@@ -24,12 +24,12 @@
  */
  */
 
 
 #include <chrono>
 #include <chrono>
+#include <unordered_map>
 #include <boost/format.hpp>
 #include <boost/format.hpp>
 
 
 #include "../cadmium-devstone-atomic.hpp"
 #include "../cadmium-devstone-atomic.hpp"
 #include "../cadmium-event-reader.hpp"
 #include "../cadmium-event-reader.hpp"
 
 
-//#include <cadmium/modeling/coupled_model.hpp>
 #include <cadmium/modeling/ports.hpp>
 #include <cadmium/modeling/ports.hpp>
 #include <cadmium/modeling/dynamic_model_translator.hpp>
 #include <cadmium/modeling/dynamic_model_translator.hpp>
 #include <cadmium/concept/coupled_model_assert.hpp>
 #include <cadmium/concept/coupled_model_assert.hpp>
@@ -45,12 +45,11 @@ using TIME = float;
 struct coupledLI_in_port : public cadmium::in_port<int>{};
 struct coupledLI_in_port : public cadmium::in_port<int>{};
 struct coupledLI_out_port : public cadmium::out_port<int>{};
 struct coupledLI_out_port : public cadmium::out_port<int>{};
 
 
-std::shared_ptr<cadmium::dynamic::modeling::coupled<TIME>> create_LI_model(
-        uint width, uint depth, int ext_cycles, int int_cycles, TIME time_advance) {
+std::shared_ptr<cadmium::dynamic::modeling::coupled<TIME>> create_LI_model(uint width, uint depth, int int_cycles, int ext_cycles, TIME time_advance) {
     // Creates the LI model with the passed parameters
     // Creates the LI model with the passed parameters
     // Returns a shared_ptr to the TOP model
     // Returns a shared_ptr to the TOP model
-    auto make_atomic_devstone = [&ext_cycles, &int_cycles, &time_advance](std::string model_id) -> std::shared_ptr<cadmium::dynamic::modeling::model> {
-        return cadmium::dynamic::translate::make_dynamic_atomic_model<devstone_atomic, TIME>(model_id, ext_cycles, int_cycles, time_advance);
+    auto make_atomic_devstone = [&ext_cycles, &int_cycles](const std::string& model_id) -> std::shared_ptr<cadmium::dynamic::modeling::model> {
+        return cadmium::dynamic::translate::make_dynamic_atomic_model<devstone_atomic, TIME>(model_id, int_cycles, ext_cycles);
     };
     };
     //Level 0 has always a single model
     //Level 0 has always a single model
     std::shared_ptr<cadmium::dynamic::modeling::model> devstone_atomic_L0_0 = make_atomic_devstone("devstone_atomic_L0_0");
     std::shared_ptr<cadmium::dynamic::modeling::model> devstone_atomic_L0_0 = make_atomic_devstone("devstone_atomic_L0_0");
@@ -145,6 +144,5 @@ std::shared_ptr<cadmium::dynamic::modeling::coupled<TIME>> create_LI_model(
      TOP_eocs,
      TOP_eocs,
      TOP_ics
      TOP_ics
     );
     );
-
     return TOP_coupled;
     return TOP_coupled;
 }
 }

+ 2 - 2
devstone_comparative.py

@@ -18,8 +18,8 @@ COMMANDS = {
     "cadmium": {
     "cadmium": {
         "v1": "devstone/cadmium/build/cadmium-dynamic-devstone --kind={model_type} --depth={depth} --width={width} --int-cycles={int_cycles} --ext-cycles={ext_cycles}",
         "v1": "devstone/cadmium/build/cadmium-dynamic-devstone --kind={model_type} --depth={depth} --width={width} --int-cycles={int_cycles} --ext-cycles={ext_cycles}",
         "v2": {
         "v2": {
-            "sequential": ,
-            "parallel": ,
+            "sequential": "simulators/cadmium_v2/bin/main_devstone {model_type} {width} {depth} {int_cycles} {ext_cycles}",
+            "parallel": "simulators/cadmium_v2/bin/parallel_main_devstone {model_type} {width} {depth} {int_cycles} {ext_cycles}",
         },
         },
     },
     },
     "cdboost": "devstone/cdboost/build/cdboost-devstone --kind={model_type} --depth={depth} --width={width} --int-cycles={int_cycles} --ext-cycles={ext_cycles} --event-list=events_devstone.txt",
     "cdboost": "devstone/cdboost/build/cdboost-devstone --kind={model_type} --depth={depth} --width={width} --int-cycles={int_cycles} --ext-cycles={ext_cycles} --event-list=events_devstone.txt",

+ 30 - 28
setup.sh

@@ -1,47 +1,49 @@
 # DOWNLOAD AND SET ALL THE GIT REPOSITORIES WITH THE SOURCE CODE OF ENGINES
 # DOWNLOAD AND SET ALL THE GIT REPOSITORIES WITH THE SOURCE CODE OF ENGINES
 git submodule update --init --recursive
 git submodule update --init --recursive
 git submodule update --recursive
 git submodule update --recursive
-# Set up CDBoost repository
-cd simulators/cdboost
-git checkout 90e7074edb3ab6a655104bbc82adc57fcfafa373
-# Set up Cadmium repository
-cd ../cadmium
+# Set up Cadmium v1 repository
+cd simulators/cadmium
 git checkout b6636f791d3fbff41b6b72e1d9e34ce18152065d
 git checkout b6636f791d3fbff41b6b72e1d9e34ce18152065d
-# Set up aDEVS repository
-cd ../adevs
-git checkout ae4ed330151416f20366d04074e3b1e38e08beec
+# Set up Cadmium v2 repository
+cd ../cadmium_v2
+git checkout devel # TODO set to a release tag when available
+# Set up CDBoost repository
+cd ../cdboost
+git checkout 6c5f4a457745a5da4f9bf2ddc5a5d46ff4f78fa2
 # Set up xDEVS Java repository
 # Set up xDEVS Java repository
-cd ../xdevs-java
-git checkout a180827f9bdfc3f44d9f1cc207294d8552e2882d
+# cd ../xdevs-java
+# git checkout a180827f9bdfc3f44d9f1cc207294d8552e2882d
 # Set up xDEVS Python repository
 # Set up xDEVS Python repository
-cd ../xdevs-python
-git checkout e578d581452394556bb0a85f03f5427fd5e72857
+# cd ../xdevs-python
+# git checkout e578d581452394556bb0a85f03f5427fd5e72857
 # Set up xDEVS C++ repository
 # Set up xDEVS C++ repository
-cd ../xdevs-c++
-git checkout bdb8c72dc25d7793665e7146b9d17f70b5a12db0
+# cd ../xdevs-c++
+# git checkout bdb8c72dc25d7793665e7146b9d17f70b5a12db0
 # Set up PythonPDEVS repository
 # Set up PythonPDEVS repository
 cd ../pythonpdevs
 cd ../pythonpdevs
 git checkout 190a70532a96a76445b007c4e0f9cb5a4ce03e55
 git checkout 190a70532a96a76445b007c4e0f9cb5a4ce03e55
 cd ../..
 cd ../..
 
 
 # COMPILE THE DEVSTONE PROJECT FOR ALL THE DIFFERENT ENGINES
 # COMPILE THE DEVSTONE PROJECT FOR ALL THE DIFFERENT ENGINES
-cd devstone
-# Set up aDEVS project
-cd adevs
+# Compile DEVStone for aDEVS
+cd devstone/adevs
 cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
 cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
 cmake --build build/ --target devstone
 cmake --build build/ --target devstone
-# Set up Cadmium project
-cd ../../cadmium
+# Compile DEVStone for Cadmium v1
+cd ../cadmium
 cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
 cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
 cmake --build build/ --target devstone
 cmake --build build/ --target devstone
-# Set up CDBoost project
-cd ../../cdboost
-mkdir build
-cd build
-cmake ..
-make
+# Compile DEVStone for CDBoost
+cd ../cdboost
+cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
+cmake --build build/ --target devstone
+# Compile DEVStone for Cadmium v2
+cd ../../simulators/cadmium_v2
+cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
+cmake --build build/ --target main_devstone parallel_main_devstone
+
 # Compile xDEVS java
 # Compile xDEVS java
-cd ../../../simulators/xdevs-java
+cd ../../simulators/xdevs-java
 find -name "*.java" | grep src/* > sources.txt
 find -name "*.java" | grep src/* > sources.txt
 javac @sources.txt -encoding ISO-8859-1 -d out
 javac @sources.txt -encoding ISO-8859-1 -d out
 # build xDEVS Python
 # build xDEVS Python
@@ -51,5 +53,5 @@ python3 setup.py install
 cd ../pythonpdevs/src
 cd ../pythonpdevs/src
 python3 setup.py install --user
 python3 setup.py install --user
 # Set up xDEVS C++ project
 # Set up xDEVS C++ project
-cd ../../xdevs-c++/src/xdevs/examples/DevStone/
-make
+# cd ../../xdevs-c++/src/xdevs/examples/DevStone/
+# make

+ 1 - 0
simulators/cadmium_v2

@@ -0,0 +1 @@
+Subproject commit 145a7c68caece68b6bb298a50deb5ab4eaffd0ba