GURLS++  2.0.00
C++ Implementation of GURLS Matlab Toolbox
recrlswrapper.hpp
00001 
00002 //#include "gurls.h"
00003 //#include "optlist.h"
00004 #include "gurls++/recrlswrapper.h"
00005 
00006 namespace gurls
00007 {
00008 template <typename T>
00009 RecursiveRLSWrapper<T>::RecursiveRLSWrapper(const std::string &name): GurlsWrapper<T>(name)
00010 {
00011     this->opt->template getOptValue<OptNumber>("nholdouts") = 1.0;
00012 }
00013 
00014 template <typename T>
00015 void RecursiveRLSWrapper<T>::train(const gMat2D<T> &X, const gMat2D<T> &y)
00016 {
00017     this->opt->removeOpt("split");
00018     this->opt->removeOpt("paramsel");
00019     this->opt->removeOpt("optimizer");
00020     this->opt->removeOpt("kernel");
00021 
00022 
00023     SplitHo<T> splitTask;
00024     GurlsOptionsList* split = splitTask.execute(X, y, *(this->opt));
00025     this->opt->addOpt("split", split);
00026 
00027 
00028     const gMat2D<unsigned long>& split_indices = split->getOptValue<OptMatrix<gMat2D<unsigned long> > >("indices");
00029     const gMat2D<unsigned long>& split_lasts = split->getOptValue<OptMatrix<gMat2D<unsigned long> > >("lasts");
00030 
00031     const unsigned long n = X.rows();
00032     const unsigned long d = X.cols();
00033     const unsigned long t = y.cols();
00034 
00035     const unsigned long last = split_lasts.getData()[0];
00036     const unsigned long nva = n-last;
00037 
00038     unsigned long* va = new unsigned long[nva];
00039     copy(va, split_indices.getData()+last, nva);
00040 
00041     gMat2D<T>* Xva = new gMat2D<T>(nva, d);
00042     gMat2D<T>* yva = new gMat2D<T>(nva, t);
00043 
00044     subMatrixFromRows(X.getData(), n, d, va, nva, Xva->getData());
00045     subMatrixFromRows(y.getData(), n, t, va, nva, yva->getData());
00046 
00047     gMat2D<T>* XtX = new gMat2D<T>(d, d);
00048     gMat2D<T>* Xty = new gMat2D<T>(d, t);
00049 
00050 
00051     dot(X.getData(), X.getData(), XtX->getData(), n, d, n, d, d, d, CblasTrans, CblasNoTrans, CblasColMajor);
00052     dot(X.getData(), y.getData(), Xty->getData(), n, d, n, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor);
00053 
00054 
00055     GurlsOptionsList* kernel = new GurlsOptionsList("kernel");
00056     kernel->addOpt("XtX", new OptMatrix<gMat2D<T> >(*XtX));
00057     kernel->addOpt("Xty", new OptMatrix<gMat2D<T> >(*Xty));
00058 
00059     kernel->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva));
00060     kernel->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva));
00061 
00062     nTot = n;
00063     this->opt->addOpt("kernel", kernel);
00064 
00065     ParamSelHoPrimal<T> paramselTask;
00066     this->opt->addOpt("paramsel", paramselTask.execute(X, y, *(this->opt)));
00067 
00068 
00069     RLSPrimalRecInit<T> optimizerTask;
00070     this->opt->addOpt("optimizer", optimizerTask.execute(X, y, *(this->opt)));
00071 }
00072 
00073 template <typename T>
00074 void RecursiveRLSWrapper<T>::update(const gVec<T> &X, const gVec<T> &y)
00075 {
00076     if(!this->trainedModel())
00077         throw gException("Error, Train Model First");
00078 
00079     RLSPrimalRecUpdate<T> optimizer;
00080 
00081     const unsigned long d = X.getSize();
00082     const unsigned long t = y.getSize();
00083 
00084     gMat2D<T>X_mat(1, d);
00085     copy(X_mat.getData(), X.getData(), d);
00086     gMat2D<T>y_mat(1, t);
00087     copy(y_mat.getData(), y.getData(), t);
00088 
00089     GurlsOptionsList* ret = optimizer.execute(X_mat, y_mat, *(this->opt));
00090     this->opt->removeOpt("optimizer");
00091     this->opt->addOpt("optimizer", ret);
00092 
00093     ++nTot;
00094 
00095     gMat2D<T>* xtx = new gMat2D<T>(d,d);
00096     gMat2D<T>* xty = new gMat2D<T>(d,t);
00097 
00098     dot(X.getData(), X.getData(), xtx->getData(), 1, d, 1, d, d, d, CblasTrans, CblasNoTrans, CblasColMajor);
00099     dot(X.getData(), y.getData(), xty->getData(), 1, d, 1, t, d, t, CblasTrans, CblasNoTrans, CblasColMajor);
00100 
00101     GurlsOptionsList* kernel = this->opt->template getOptAs<GurlsOptionsList>("kernel");
00102 
00103     const gMat2D<T>& XtX = kernel->getOptValue<OptMatrix<gMat2D<T> > >("XtX");
00104     const gMat2D<T>& Xty = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xty");
00105 
00106     axpy(d*d, (T)1.0, XtX.getData(), 1, xtx->getData(), 1);
00107     axpy(d*t, (T)1.0, Xty.getData(), 1, xty->getData(), 1);
00108 
00109     kernel->removeOpt("XtX");
00110     kernel->addOpt("XtX", new OptMatrix<gMat2D<T> >(*xtx));
00111 
00112     kernel->removeOpt("Xty");
00113     kernel->addOpt("Xty", new OptMatrix<gMat2D<T> >(*xty));
00114 
00115 
00116     unsigned long proportion = static_cast<unsigned long>(gurls::round(1.0/this->opt->getOptAsNumber("hoproportion")));
00117 
00118     if(nTot % proportion == 0)
00119     {
00120         const gMat2D<T>& Xva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xva");
00121         const gMat2D<T>& yva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("yva");
00122 
00123         const unsigned long nva = Xva.rows();
00124         const unsigned long nva_new = nva+1;
00125 
00126 
00127         gMat2D<T>* Xva_new = new gMat2D<T>(nva_new, d);
00128 
00129         const T* old_it = Xva.getData();
00130         T* new_it = Xva_new->getData();
00131         for(const T* end = new_it+(nva_new*d); new_it< end; old_it+=nva, new_it +=nva_new)
00132             copy(new_it, old_it, nva);
00133 
00134         copy(Xva_new->getData()+nva, X.getData(), d, nva_new, 1);
00135 
00136         kernel->removeOpt("Xva");
00137         kernel->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva_new));
00138 
00139 
00140         gMat2D<T>* yva_new = new gMat2D<T>(nva_new, t);
00141 
00142         old_it = yva.getData();
00143         new_it = yva_new->getData();
00144         for(const T* end = new_it+(nva_new*t); new_it< end; old_it+=nva, new_it +=nva_new)
00145             copy(new_it, old_it, nva);
00146 
00147         copy(yva_new->getData()+nva, y.getData(), t, nva_new, 1);
00148 
00149         kernel->removeOpt("yva");
00150         kernel->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva_new));
00151 
00152     }
00153 }
00154 
00155 template <typename T>
00156 gMat2D<T>* RecursiveRLSWrapper<T>::eval(const gMat2D<T> &X)
00157 {
00158     if(!this->trainedModel())
00159         throw gException("Error, Train Model First");
00160 
00161     gurls::PredPrimal<T> predTask;
00162     gMat2D<T> y;
00163 
00164     OptMatrix<gMat2D<T> >* result = predTask.execute(X, y, *(this->opt));
00165 
00166     gMat2D<T>& pred_mat = result->getValue();
00167     result->detachValue();
00168     delete result;
00169 
00170     return &pred_mat;
00171 }
00172 
00173 template <typename T>
00174 void RecursiveRLSWrapper<T>::retrain()
00175 {
00176     GurlsOptionsList* kernel = this->opt->template getOptAs<GurlsOptionsList>("kernel");
00177     const gMat2D<T> &Xva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("Xva");
00178     const gMat2D<T> &yva = kernel->getOptValue<OptMatrix<gMat2D<T> > >("yva");
00179 
00180     const unsigned long nva = Xva.rows();
00181 
00182     this->opt->removeOpt("paramsel");
00183     this->opt->removeOpt("optimizer");
00184 
00185     GurlsOptionsList* split = this->opt->template getOptAs<GurlsOptionsList>("split");
00186     split->removeOpt("indices");
00187     split->removeOpt("lasts");
00188 
00189 
00190     gMat2D<unsigned long>* indices = new gMat2D<unsigned long>(1, nTot);
00191     gMat2D<unsigned long>* lasts = new gMat2D<unsigned long>(1, 1);
00192 
00193     set(indices->getData(), 0ul, nTot-nva);
00194     unsigned long * it = indices->getData() + (nTot-nva);
00195     for(unsigned long i=0; i<nva; ++i, ++it)
00196         *it = i;
00197 
00198     lasts->getData()[0] = (nTot-nva);
00199 
00200     split->addOpt("indices", new OptMatrix<gMat2D<unsigned long> >(*indices));
00201     split->addOpt("lasts", new OptMatrix<gMat2D<unsigned long> >(*lasts));
00202 
00203 
00204     ParamSelHoPrimal<T> paramselTask;
00205     this->opt->addOpt("paramsel", paramselTask.execute(Xva, yva, *(this->opt)));
00206 
00207 
00208     RLSPrimalRecInit<T> optimizerTask;
00209     gMat2D<T> emptyMat;
00210     this->opt->addOpt("nTot", new OptNumber(nTot));
00211     this->opt->addOpt("optimizer", optimizerTask.execute(emptyMat, emptyMat, *(this->opt)));
00212     this->opt->removeOpt("nTot");
00213 
00214 }
00215 
00216 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends