diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-05-06 17:46:34 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-05-06 17:46:34 +0200 |
| commit | 0ba773d913450f88ff7bcf54a39e0c8a8c4d7d64 (patch) | |
| tree | 4a4e034d38620bd0161388e5f1739918c631dc56 /src/inputs.cc | |
| parent | 87dd4219138ec98999b50d08c7190a942072b33f (diff) | |
Refactoring and start extended version
Diffstat (limited to 'src/inputs.cc')
| -rw-r--r-- | src/inputs.cc | 162 |
1 files changed, 0 insertions, 162 deletions
diff --git a/src/inputs.cc b/src/inputs.cc deleted file mode 100644 index 84acdb7..0000000 --- a/src/inputs.cc +++ /dev/null @@ -1,162 +0,0 @@ -#include "inputs.hpp" -#include "xbt/log.h" -#include <algorithm> -#include <iostream> -#include <fstream> - - -Inputs::Inputs(std::string node_name){ - // Here we doing all the boring stuff - FILE* input_file = fopen(INPUTS_FILE, "rb"); - char input_file_buffer[JSON_BUFFER_SIZE]; - rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); - d.ParseStream(is); - fclose(input_file); - - // Init all variables - is_sender=d[node_name.c_str()]["is_sender"].GetBool(); - use_hint=d[node_name.c_str()]["use_hint"].GetBool(); - data_size=d[node_name.c_str()]["data_size"].GetInt(); - for(auto& v:d[node_name.c_str()]["wake_ts"].GetArray()){ - wake_ts.push_back(v.GetDouble()); - } - for(auto& v:d[node_name.c_str()]["wake_duration"].GetArray()){ - wake_duration.push_back(v.GetDouble()); - } - - // Identity check - if(wake_ts.size()!=wake_duration.size()){ - std::cerr << "Invalid node configuration: wake_ts.size() != wake_duration.size()" <<std::endl; - exit(1); - } - if(!std::is_sorted(wake_ts.begin(),wake_ts.end())){ - std::cerr << "Invalid node configuration: wake_ts is not sorted" <<std::endl; - exit(1); - } - - // Ensure events are merged - MergeEvents(); -} - -void Inputs::MergeEvents(){ - for(int i=0;i<(wake_ts.size()-1);i++){ - double cur_ts=wake_ts[i]; - double next_ts=wake_ts[i+1]; - double cur_duration=wake_duration[i]; - double next_duration=wake_duration[i+1]; - // If we should merge then - if((cur_ts+cur_duration)>=next_ts){ - // Create variable for convenience - double start=cur_ts; - double end=std::max(cur_ts+cur_duration,next_ts+next_duration); - wake_duration[i]=end-start; - // Now remove next event - wake_ts.erase(wake_ts.begin() + i + 1); - wake_duration.erase(wake_duration.begin() + i +1); - // This is not optimal. Yet it is simple :D - MergeEvents(); - } - } -} - -double Inputs::GetNextTS(){ - // Ensure the caller is smart - if(wake_duration.size()<2){ - std::cerr << "You are trying to access to the next timestamp but it does not exists" <<std::endl; - exit(1); - } - return wake_ts[1]; -} - -double Inputs::GetNextDuration(){ - // Ensure the caller is smart - if(wake_duration.size()<2){ - std::cerr << "You are trying to access to the next duration but it does not exists" <<std::endl; - exit(1); - } - return wake_duration[1]; -} - -void Inputs::GotoNextEvent(){ - wake_ts.erase(wake_ts.begin()); - wake_duration.erase(wake_duration.begin()); -} - -void Inputs::DumpEvents(){ - std::cout << "Timestamps: "; - for(auto a:wake_ts){ - std::cout << std::setw(5) << a << " "; - } - std::cout << std::endl; - std::cout << "Wake Durations: "; - for(auto a:wake_duration){ - std::cout << std::setw(5) << a << " "; - } - std::cout << std::endl; -} - -void Inputs::AddEvent(double ts, double duration){ - // First handle timestamp - int pos=0; - for(auto it = std::begin(wake_ts); it != std::end(wake_ts); ++it) { - if(*it>=ts){ - wake_ts.insert(it,ts); - break; - } - pos++; - } - - // Ensure that ts and duration should not go to the end - if(pos==wake_ts.size()){ - wake_ts.push_back(ts); - wake_duration.push_back(duration); - } - else { - // Handle durations here - int pos2=0; - for(auto it = std::begin(wake_duration); it != std::end(wake_duration); ++it) { - if(pos==pos2){ - wake_duration.insert(it,duration); - break; - } - else if (it+1==std::end(wake_duration)) { - wake_duration.push_back(duration); - } - pos2++; - } - } - // Don't forget - MergeEvents(); -} - -void Inputs::GeneratePlatform(std::string p){ - // The boring stuff - FILE* input_file = fopen(INPUTS_FILE, "rb"); - char input_file_buffer[JSON_BUFFER_SIZE]; - rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); - rapidjson::Document d; - d.ParseStream(is); - fclose(input_file); - - // Write platform file - std::ofstream pf; - pf.open (p); - pf << "<?xml version='1.0'?>\n"; - pf << "<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\">\n"; - pf << "<platform version=\"4.1\">\n <AS id=\"AS0\" routing=\"Cluster\">\n"; - pf << " <link id=\"link\" bandwidth=\"1Mbps\" latency=\"0ms\" sharing_policy=\"SHARED\"></link>\n"; - for (Value::ConstMemberIterator itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr) - { - std::string name=itr->name.GetString(); - double power_on=d[itr->name.GetString()]["power_on"].GetDouble(); - double power_off=d[itr->name.GetString()]["power_off"].GetDouble(); - - //db=d[itr->name.GetString()]["wake_interval"].GetDouble(); - pf << " <host id=\""<<name<<"\" speed=\"100.0f,100.0f\" pstate=\"0\">\n"; - pf << " <prop id=\"wattage_per_state\" value=\""<< power_off<<":"<<power_off<<", "<< power_on<<":"<<power_on<<"\" />\n"; - pf << " <prop id=\"wattage_off\" value=\"0\" />\n </host>\n"; - pf << " <host_link id=\""<<name<<"\" up=\"link\" down=\"link\"/>\n"; - } - pf << " </AS>\n</platform>\n"; - pf.close(); -}
\ No newline at end of file |
