Hybrid Query Processing Engine for Coprocessing in Database Systems
HyPE
|
00001 00002 #include <core/plotscriptgenerator.hpp> 00003 #include <config/global_definitions.hpp> 00004 #include <config/configuration.hpp> 00005 00006 #include <iostream> 00007 #include <fstream> 00008 #include <cmath> 00009 00010 #include <boost/filesystem.hpp> 00011 00012 namespace hype{ 00013 namespace core{ 00014 00015 using namespace std; 00016 00017 bool PlotScriptGenerator::create(const std::string& title, const std::string& xlabel, const std::string& ylabel, const std::string& operation_name, const std::vector<std::string>& algorithm_names){ 00018 00019 00020 const std::string output_dir_name="output"; 00021 if(!boost::filesystem::exists(output_dir_name)){ 00022 if(!quiet) cout << "create Directory '" << output_dir_name << "'" << endl; 00023 if(!boost::filesystem::create_directory(output_dir_name)){ 00024 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; 00025 } 00026 } 00027 std::string dir_name=output_dir_name+"/"; 00028 00029 dir_name+=operation_name; 00030 dir_name+="/"; 00031 00032 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00033 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00034 00035 // dir_name+=algorithm_name; 00036 // 00037 // if(!boost::filesystem::create_directory(dir_name)); 00038 // std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00039 00040 00041 // std::string basic_file_name=dir_name+"/"; 00042 // basic_file_name+=algorithm_name; 00043 00044 00045 std::string file_name_measurement_times=dir_name+"execution_times.plt"; 00046 if(!quiet) std::cout << "Creating gnuplot script file '" << file_name_measurement_times.c_str() << "'" << std::endl; 00047 std::fstream file(file_name_measurement_times.c_str(),std::ios_base::out | std::ios_base::trunc); 00048 00049 file << "set title '" << title << "'" << std::endl 00050 << "set xtics nomirror" << std::endl 00051 << "set ytics nomirror" << std::endl 00052 << "set xlabel '" << xlabel << "'" << std::endl 00053 << "set ylabel '" << ylabel << "'" << std::endl 00054 << "set key top left Left reverse samplen 1" << std::endl 00055 << std::endl << "plot "; 00056 00057 00058 for(unsigned int i=0;i<algorithm_names.size();i++){ 00059 00060 file <<"'"<< algorithm_names[i]<<"/"<<"measurement_pairs.data' using 1:2 title \""<<algorithm_names[i]<<" measured execution times\" with points, \\"<<std::endl 00061 <<"'"<< algorithm_names[i]<<"/"<<"measurement_pairs.data' using 1:3 title \""<<algorithm_names[i]<<" estimated execution times\" with points"; 00062 if(i<algorithm_names.size()-1) file << ", \\" << std::endl; 00063 } 00064 file << std::endl << std::endl 00065 << "set output \"execution_times.pdf\"" << std::endl 00066 << "set terminal pdfcairo font \"Helvetica,9\"" << std::endl 00067 << "replot" << std::endl; 00068 // 00069 // 00070 00071 return true; 00072 } 00073 00074 00075 bool PlotScriptGenerator::createRelativeErrorScript(const std::string& operation_name, const std::vector<std::string>& algorithm_names){ 00076 std::string dir_name="output/"; 00077 dir_name+=operation_name; 00078 dir_name+="/"; 00079 00080 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00081 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00082 00083 // dir_name+=algorithm_name; 00084 // 00085 // if(!boost::filesystem::create_directory(dir_name)); 00086 // std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00087 00088 00089 // std::string basic_file_name=dir_name+"/"; 00090 // basic_file_name+=algorithm_name; 00091 00092 00093 std::string file_name_measurement_times=dir_name+"relative_errors.plt"; 00094 if(!quiet) std::cout << "Creating gnuplot script file '" << file_name_measurement_times.c_str() << "'" << std::endl; 00095 std::fstream file(file_name_measurement_times.c_str(),std::ios_base::out | std::ios_base::trunc); 00096 00097 file << "set title 'relative estimation errors for operation " << operation_name << "'" << std::endl 00098 << "set xtics nomirror" << std::endl 00099 << "set ytics nomirror" << std::endl 00100 << "set xlabel 'iterations'" << std::endl 00101 << "set ylabel 'absolute relative estmation error'" << std::endl 00102 << "set logscale y" << std::endl 00103 //<< "set key top left Left reverse samplen 1" << std::endl 00104 << "set key below" << std::endl 00105 << "set key box" << std::endl 00106 << std::endl << "plot "; 00107 00108 00109 for(unsigned int i=0;i<algorithm_names.size();i++){ 00110 00111 file <<"'"<< algorithm_names[i]<<"/"<<"relative_errors.data' using 1:(abs($2)) title \""<<algorithm_names[i]<<" relative error\" with points"; 00112 if(i<algorithm_names.size()-1){ 00113 file << ", \\" << std::endl; 00114 } 00115 } 00116 file << std::endl << std::endl 00117 << "set output \"relative_errors.pdf\"" << std::endl 00118 << "set terminal pdfcairo font \"Helvetica,9\"" << std::endl 00119 << "replot" << std::endl; 00120 // 00121 // 00122 00123 return true; 00124 00125 } 00126 00127 bool PlotScriptGenerator::createAverageRelativeErrorScript(const std::string& operation_name, const std::vector<std::string>& algorithm_names){ 00128 std::string dir_name="output/"; 00129 dir_name+=operation_name; 00130 dir_name+="/"; 00131 00132 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00133 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00134 00135 // dir_name+=algorithm_name; 00136 // 00137 // if(!boost::filesystem::create_directory(dir_name)); 00138 // std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00139 00140 00141 // std::string basic_file_name=dir_name+"/"; 00142 // basic_file_name+=algorithm_name; 00143 00144 00145 std::string file_name_measurement_times=dir_name+"average_relative_errors.plt"; 00146 if(!quiet) std::cout << "Creating gnuplot script file '" << file_name_measurement_times.c_str() << "'" << std::endl; 00147 std::fstream file(file_name_measurement_times.c_str(),std::ios_base::out | std::ios_base::trunc); 00148 00149 file << "set title 'average relative estimation errors for operation " << operation_name << "'" << std::endl 00150 << "set xtics nomirror" << std::endl 00151 << "set ytics nomirror" << std::endl 00152 << "set xlabel 'iterations'" << std::endl 00153 << "set ylabel 'average absolute relative estmation error'" << std::endl 00154 << "set logscale y" << std::endl 00155 //<< "set key top left Left reverse samplen 1" << std::endl 00156 << "set key below" << std::endl 00157 << "set key box" << std::endl 00158 << std::endl << "plot "; 00159 00160 00161 for(unsigned int i=0;i<algorithm_names.size();i++){ 00162 00163 file <<"'"<< algorithm_names[i]<<"/"<<"average_relative_errors.data' using 1:(abs($2)) title \""<<algorithm_names[i]<<" relative error\" with points"; 00164 if(i<algorithm_names.size()-1){ 00165 file << ", \\" << std::endl; 00166 } 00167 } 00168 file << std::endl << std::endl 00169 << "set output \"average_relative_errors.pdf\"" << std::endl 00170 << "set terminal pdfcairo font \"Helvetica,9\"" << std::endl 00171 << "replot" << std::endl; 00172 // 00173 // 00174 00175 return true; 00176 00177 } 00178 00179 bool PlotScriptGenerator::createWindowedAverageRelativeErrorScript(const std::string& operation_name, const std::vector<std::string>& algorithm_names){ 00180 std::string dir_name="output/"; 00181 dir_name+=operation_name; 00182 dir_name+="/"; 00183 00184 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00185 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00186 00187 // dir_name+=algorithm_name; 00188 // 00189 // if(!boost::filesystem::create_directory(dir_name)); 00190 // std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00191 00192 00193 // std::string basic_file_name=dir_name+"/"; 00194 // basic_file_name+=algorithm_name; 00195 00196 00197 std::string file_name_measurement_times=dir_name+"windowed_average_relative_errors.plt"; 00198 if(!quiet) std::cout << "Creating gnuplot script file '" << file_name_measurement_times.c_str() << "'" << std::endl; 00199 std::fstream file(file_name_measurement_times.c_str(),std::ios_base::out | std::ios_base::trunc); 00200 00201 file << "set title 'windowed average relative estimation errors for operation " << operation_name << " (Window size=" << Runtime_Configuration::instance().getRelativeErrorWindowSize() << ")'" << std::endl 00202 << "set xtics nomirror" << std::endl 00203 << "set ytics nomirror" << std::endl 00204 << "set xlabel 'iterations'" << std::endl 00205 << "set ylabel 'windowed average absolute relative estmation error'" << std::endl 00206 << "set logscale y" << std::endl 00207 //<< "set key top left Left reverse samplen 1" << std::endl 00208 << "set key below" << std::endl 00209 << "set key box" << std::endl 00210 << std::endl << "plot "; 00211 00212 00213 for(unsigned int i=0;i<algorithm_names.size();i++){ 00214 00215 file <<"'"<< algorithm_names[i]<<"/"<<"windowed_average_relative_errors.data' using 1:(abs($2)) title \""<<algorithm_names[i]<<" relative error\" with points"; 00216 if(i<algorithm_names.size()-1) file << ", \\" << std::endl; 00217 } 00218 file << std::endl << std::endl 00219 << "set output \"windowed_average_relative_errors.pdf\"" << std::endl 00220 << "set terminal pdfcairo font \"Helvetica,9\"" << std::endl 00221 << "replot" << std::endl; 00222 // 00223 // 00224 00225 return true; 00226 00227 } 00228 00229 bool PlotScriptGenerator::create_3d_plot(const std::string& title, const std::string& xlabel, const std::string& ylabel, const std::string& directory_path, const std::vector<std::string>& algorithm_names){ 00230 std::string dir_name=directory_path+"/"; 00231 00232 if(!boost::filesystem::create_directory(dir_name) && !quiet) 00233 std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00234 00235 // dir_name+=algorithm_name; 00236 // 00237 // if(!boost::filesystem::create_directory(dir_name)); 00238 // std::cout << "Directory '" << dir_name << "' already exists!" << std::endl; 00239 00240 00241 // std::string basic_file_name=dir_name+"/"; 00242 // basic_file_name+=algorithm_name; 00243 00244 std::string file_name_measurement_times=dir_name+"execution_times.plt"; 00245 if(!quiet) std::cout << "Creating gnuplot script file '" << file_name_measurement_times.c_str() << "'" << std::endl; 00246 std::fstream file(file_name_measurement_times.c_str(),std::ios_base::out | std::ios_base::trunc); 00247 00248 file << "set title '" << title << "'" << std::endl 00249 << "set xtics nomirror" << std::endl 00250 << "set ytics nomirror" << std::endl 00251 << "set xlabel '" << xlabel << "'" << std::endl 00252 << "set ylabel '" << ylabel << "'" << std::endl 00253 << "set zlabel 'execution time in ns'" << std::endl 00254 << "set key below" << std::endl 00255 << "set key box" << std::endl 00256 //<< "set key top left Left reverse samplen 1" << std::endl 00257 << "set hidden3d" << std::endl 00258 << "set view 75,40,1.0,2.5" << std::endl 00259 << std::endl << "splot "; 00260 00261 00262 for(unsigned int i=0;i<algorithm_names.size();i++){ 00263 file <<"'"<< algorithm_names[i] << ".data' using 1:2:3 title \"" << algorithm_names[i] << " measured execution times\" with points"; 00264 // file <<"'"<< algorithm_names[i] << ".data' using 1:2:3 title \"" << algorithm_names[i] << " measured execution times\" with points, \\"<<std::endl 00265 // <<"'"<< algorithm_names[i] << ".data' using 1:2:4 title \"" << algorithm_names[i] << " estimated execution times\" with points"; 00266 if(i<algorithm_names.size()-1) file << ", \\" << std::endl; 00267 } 00268 file << ", \\" << std::endl << "'complete_execution_history.data' using 1:2:3 title \"decision\" with points, \\" << std::endl 00269 << "'complete_execution_history.data' using 1:2:4 title \"estimation\" with points" << std::endl; 00270 00271 // file << std::endl << std::endl 00272 // << "set output \"execution_times.pdf\"" << std::endl 00273 // << "set terminal pdfcairo font \"Helvetica,7\"" << std::endl 00274 // << "replot" << std::endl; 00275 // 00276 // 00277 00278 return true; 00279 } 00280 00281 }; //end namespace core 00282 }; //end namespace hype 00283 00284