Hybrid Query Processing Engine for Coprocessing in Database Systems
HyPE
|
00001 00002 #include <plugins/statistical_methods/multi_dim_least_squares.hpp> 00003 #include <core/algorithm.hpp> 00004 00005 #include <util/begin_ptr.hpp> 00006 00007 #include <iostream> 00008 00009 #include <ap.h> 00010 #include <interpolation.h> 00011 00012 using namespace std; 00013 00014 namespace hype{ 00015 namespace core{ 00016 00017 Least_Squares_Method_2D::Least_Squares_Method_2D() : StatisticalMethod_Internal("Least Squares 2D"),degree_of_polynomial_(2),polynomial_computed_(false), objHeArray_() { 00018 00019 } 00020 00021 Least_Squares_Method_2D::~Least_Squares_Method_2D(){} 00022 00023 const EstimatedTime Least_Squares_Method_2D::computeEstimation(const Tuple& input_values){ 00024 if(input_values.size()!=2){ 00025 std::cout << "FATAL ERROR: Least_Squares_Method_2D cannot handle input dimensions other than 2" << std::endl; 00026 exit(-1); 00027 } 00028 //negative estimation is invalid value, allowing to distinguish between a regular estimation and a dummy value, which is returned if Algorithm is in trainingphase 00029 //double returnval=-1; 00030 if(polynomial_computed_){ 00031 double dblEstimation = 0.0; 00032 //if (isActive_){ 00033 assert((unsigned int)objHeArray_.length()==input_values.size()); 00034 //cout << "Estimation:"; 00035 for(unsigned int i = 0; i < input_values.size(); i++){ 00036 dblEstimation += objHeArray_[i] * input_values[i]; 00037 //cout << objHeArray_[i] << "*" << input_values[i] << "+"; 00038 } 00039 //cout << "=" << dblEstimation << endl; 00040 //} 00041 return EstimatedTime(dblEstimation); 00042 } 00043 00044 return EstimatedTime(-1); 00045 00046 // if(polynomial_computed_){ 00047 // //returnval = alglib::barycentriccalc(timeestimationpolynomial_,input_values[0]); 00048 // } 00049 // assert(true==false); 00050 // return EstimatedTime(returnval); 00051 } 00052 00053 bool Least_Squares_Method_2D::inTrainingPhase() const throw(){ 00054 return !polynomial_computed_; //if polynomial is not computed, we are in the initial trainingphase 00055 } 00056 00057 void Least_Squares_Method_2D::retrain(){ 00058 polynomial_computed_=false; 00059 } 00060 00061 bool Least_Squares_Method_2D::recomuteApproximationFunction(Algorithm& algorithm){ 00062 // int intMax = (int) vecValue->size(); 00063 // if(intMax == 0 || (int)vecFeature->size() % intMax != 0){return false;} 00064 // int intMaxInner = (int)vecFeature->size() / intMax; 00065 00066 polynomial_computed_=true; 00067 00068 std::vector<Tuple> features = algorithm.getAlgorithmStatistics().executionHistory_.getColumnFeatureValues(); 00069 00070 std::vector<MeasuredTime> measurements = algorithm.getAlgorithmStatistics().executionHistory_.getColumnMeasurements(); 00071 00072 assert(!features.empty()); 00073 00074 vector<double> features_array(features.size()*features[0].size()); 00075 00076 //cout << "Matrix:" << endl; 00077 for(unsigned int i=0;i<features.size();i++){ 00078 Tuple t = features[i]; 00079 for(unsigned int j=0;j<features[0].size();j++){ 00080 features_array[i*features[0].size()+j]=t[j]; 00081 //cout << t[j] << " "; //<< endl; 00082 } 00083 //cout << endl; 00084 } 00085 00086 00087 00088 alglib::real_2d_array objArrayMulti; 00089 objArrayMulti.setlength(features.size(),features[0].size()); //(intMax, intMaxInner); 00090 objArrayMulti.setcontent(features.size(),features[0].size(), util::begin_ptr(features_array)); 00091 00092 vector<double> measurements_array(measurements.size()); 00093 for(unsigned int i=0;i<measurements.size();i++){ 00094 measurements_array[i]=measurements[i].getTimeinNanoseconds(); 00095 } 00096 00097 alglib::real_1d_array objArray; 00098 objArray.setlength(measurements_array.size()); 00099 objArray.setcontent(measurements_array.size(), util::begin_ptr(measurements_array)); 00100 00101 alglib::ae_int_t intInfo; 00102 alglib::real_1d_array objResult; 00103 //objResult.setlength(intMaxInner); 00104 alglib::lsfitreport objReport; 00105 alglib::lsfitlinear(objArray, objArrayMulti, intInfo, objResult, objReport); 00106 00107 //std::cout << "Ausgabe" << objResult[0] << " "<< objResult[1] << " " << objResult[2] << "\n"; 00108 00110 objHeArray_ = objResult; 00111 00112 //isActive_ = true; 00113 return true; 00114 } 00115 00116 // static Least_Squares_Method_2D* Least_Squares_Method_2D::create(){ 00117 // return new Least_Squares_Method_2D(); 00118 // } 00119 00120 }; //end namespace core 00121 }; //end namespace hype 00122 00123