Hybrid Query Processing Engine for Coprocessing in Database Systems
HyPE
algorithm_statistics.cpp
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines