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