Hybrid Query Processing Engine for Coprocessing in Database Systems
HyPE
|
00001 00002 #include <iostream> 00003 #include <fstream> 00004 #include <cmath> 00005 00006 #include <config/global_definitions.hpp> 00007 #include <config/configuration.hpp> 00008 00009 #include <core/algorithm_statistics.hpp> 00010 00011 #include <boost/filesystem.hpp> 00012 00013 using namespace std; 00014 00015 namespace hype{ 00016 namespace core{ 00017 00018 00019 AlgorithmStatistics::AlgorithmStatistics() : executionHistory_(), 00020 relative_errors_(), 00021 number_of_recomputations_(0), 00022 number_of_decisions_for_this_algorithm_(0), 00023 average_relative_error_(0), 00024 total_execution_time_(0), 00025 number_of_terminated_executions_of_this_algorithm_(0){ 00026 00027 } 00028 00029 bool AlgorithmStatistics::writeToDisc(const std::string& operation_name, const std::string& algorithm_name) const{ 00030 const std::string output_dir_name="output"; 00031 if(!boost::filesystem::exists(output_dir_name)){ 00032 if(!quiet) cout << "create Directory '" << output_dir_name << "'" << endl; 00033 if(!boost::filesystem::create_directory(output_dir_name)){ 00034 cout << "HyPE Library: Failed to created Output Directory '" << output_dir_name << "' for operation statistics, skipping the write operation for statistical data for operation '" << operation_name << "'" << endl; 00035 } 00036 } 00037 00038 std::string dir_name=output_dir_name+"/"; 00039 dir_name+=operation_name; 00040 dir_name+="/"; 00041 00042 00043 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00044 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00045 00046 dir_name+=algorithm_name; 00047 00048 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00049 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00050 00051 00052 std::string basic_file_name=dir_name+"/"; 00053 //basic_file_name+=algorithm_name; 00054 00055 std::string file_name_measurement_pairs=basic_file_name+"measurement_pairs.data"; 00056 fstream file(file_name_measurement_pairs.c_str(),std::ios_base::out | std::ios_base::trunc); 00057 executionHistory_.store(file); 00058 00059 std::string file_name_relative_errors=basic_file_name+"relative_errors.data"; 00060 fstream file_rel_err(file_name_relative_errors.c_str(),std::ios_base::out | std::ios_base::trunc); 00061 00062 std::vector<double> average_estimation_errors; 00063 00064 //TODO: NOTE: here is somewere an ERROR, because for some 00065 double sum=0; 00066 unsigned int length_of_initial_training_phase=Runtime_Configuration::instance().getTrainingLength(); //Configuration::period_for_periodic_recomputation; 00067 for(unsigned int i=length_of_initial_training_phase+1;i<relative_errors_.size();i++){ 00068 file_rel_err << (i-length_of_initial_training_phase) << "\t" << relative_errors_[i] << std::endl; 00069 sum+=abs(relative_errors_[i]); 00070 average_estimation_errors.push_back(sum/double(i-length_of_initial_training_phase+1)); //compute average estimation error after each execution of the algorithm, so we can plot it over "time" 00071 } 00072 00073 std::string file_name_average_relative_errors=basic_file_name+"average_relative_errors.data"; 00074 fstream file_average_rel_err(file_name_average_relative_errors.c_str(),std::ios_base::out | std::ios_base::trunc); 00075 00076 for(unsigned int i=length_of_initial_training_phase;i<average_estimation_errors.size();i++){ 00077 file_average_rel_err << (i-length_of_initial_training_phase) << "\t" << average_estimation_errors[i] << std::endl; 00078 } 00079 00080 //code to compute windowed average relative estimation errors 00081 std::string file_name_windowed_average_relative_errors=basic_file_name+"windowed_average_relative_errors.data"; 00082 if(!quiet) cout << "File: " << file_name_windowed_average_relative_errors << endl; 00083 fstream file_average_windowed_rel_err(file_name_windowed_average_relative_errors.c_str(),std::ios_base::out | std::ios_base::trunc); 00084 00085 assert(Runtime_Configuration::instance().getRelativeErrorWindowSize()>0); 00086 for(unsigned int i=length_of_initial_training_phase;i<relative_errors_.size();i++){ 00087 double sum=0; 00088 if((int)i < (int)relative_errors_.size()-(int)Runtime_Configuration::instance().getRelativeErrorWindowSize()){ 00089 for(unsigned int j=0;j<Runtime_Configuration::instance().getRelativeErrorWindowSize();j++){ 00090 sum+=abs(relative_errors_[i+j]); 00091 } 00092 00093 } 00094 file_average_windowed_rel_err << (i-length_of_initial_training_phase) << "\t" << sum/double(Runtime_Configuration::instance().getRelativeErrorWindowSize()) << std::endl; //compute average estimation error after each execution of the algorithm, so we can plot it over "time" 00095 } 00096 00097 00098 00099 //output report for algorithm 00100 cout << "==========================================================================" << endl 00101 << "Report for Algorithm '" << algorithm_name << "'" << endl 00102 << "Average Relative Error: " << sum/double(relative_errors_.size()) << endl 00103 << "Number of Recomputations: " << number_of_recomputations_ << endl 00104 << "Number of Decisions for this Algorithm: " << number_of_decisions_for_this_algorithm_ << endl 00105 << "Total Execution Time of this Algorithm: " << total_execution_time_ << "ns" << endl 00106 //<< "**************************************************************************" 00107 << endl; 00108 00109 00110 00111 00112 00113 return true; 00114 } 00115 00116 };//end namespace core 00117 }; //end namespace hype 00118