GURLS++  2.0.00
C++ Implementation of GURLS Matlab Toolbox
icholwrapper.hpp
00001 #include "gurls++/icholwrapper.h"
00002 
00003 #include "gurls++/optmatrix.h"
00004 #include "gurls++/predkerneltraintest.h"
00005 #include "gurls++/primal.h"
00006 #include "gurls++/utils.h"
00007 #include "gurls++/splitho.h"
00008 
00009 #include "gurls++/macroavg.h"
00010 #include "gurls++/precisionrecall.h"
00011 #include "gurls++/rmse.h"
00012 
00013 #include <boost/date_time/posix_time/posix_time_types.hpp>
00014 
00015 namespace gurls
00016 {
00017 
00018 template <typename T>
00019 ICholWrapper<T>::ICholWrapper(const std::string& name):GurlsWrapper<T>(name)
00020 {
00021     this->opt = new GurlsOptionsList(name, true);
00022 
00023     GurlsOptionsList *paramsel = new GurlsOptionsList("paramsel");
00024     this->opt->addOpt("paramsel", paramsel);
00025 
00026     GurlsOptionsList *split = new GurlsOptionsList("split");
00027     this->opt->addOpt("split", split);
00028 }
00029 
00030 template <typename T>
00031 void ICholWrapper<T>::train(const gMat2D<T> &X, const gMat2D<T> &y)
00032 {
00033     GurlsOptionsList*opt = this->opt;
00034 
00035     const unsigned long m = static_cast<unsigned long>(opt->getOptAsNumber("paramsel.rank_max"));
00036     const unsigned long n_rank = static_cast<unsigned long>(opt->getOptAsNumber("paramsel.n_rank"));
00037 
00038     const double sigma = opt->getOptAsNumber("paramsel.sigma");
00039 
00040     const unsigned long n = X.rows();
00041     const unsigned long d = X.cols();
00042     const unsigned long t = y.cols();
00043 
00044     Performance<T> * perfTask = Performance<T>::factory(opt->getOptAsString("hoperf"));
00045 
00046     bool computePred = (opt->hasOpt("split.Xva") && opt->hasOpt("split.yva"));
00047 
00048 
00049     GurlsOptionsList* tmp_optimizer = new GurlsOptionsList("optimizer");
00050     OptMatrix<const gMat2D<T> > *X_opt = new OptMatrix<const gMat2D<T> >(X, false);
00051     tmp_optimizer->addOpt("X", X_opt);
00052 
00053     const gMat2D<T>* Xva = NULL;
00054     const gMat2D<T>* yva = NULL;
00055     gMat2D<T>* predKernel_K = NULL;
00056     const gMat2D<T> empty;
00057 
00058     if(computePred)
00059     {
00060         Xva = &(opt->getOptValue<OptMatrix<gMat2D<T> > >("split.Xva"));
00061         yva = &(opt->getOptValue<OptMatrix<gMat2D<T> > >("split.yva"));
00062 
00063 
00064         GurlsOptionsList* opt_tmp = new GurlsOptionsList("tmp");
00065         GurlsOptionsList* tmp_kernel = new GurlsOptionsList("kernel");
00066         GurlsOptionsList* tmp_paramsel = new GurlsOptionsList("paramsel");
00067 
00068         opt_tmp->addOpt("kernel", tmp_kernel);
00069         opt_tmp->addOpt("paramsel", tmp_paramsel);
00070         opt_tmp->addOpt("optimizer", tmp_optimizer);
00071 
00072         tmp_kernel->addOpt("type", "rbf");
00073         tmp_paramsel->addOpt("sigma", new OptNumber(sigma));
00074 
00075 
00076         PredKernelTrainTest<T> predKernelTask;
00077         GurlsOptionsList* predKernel = predKernelTask.execute(*Xva, empty, *opt_tmp);
00078 
00079         OptMatrix<gMat2D<T> > *k_opt = predKernel->getOptAs<OptMatrix<gMat2D<T> > >("K");
00080         k_opt->detachValue();
00081         predKernel_K = &(k_opt->getValue());
00082 
00083         delete predKernel;
00084         opt_tmp->removeOpt("optimizer", false);
00085         delete opt_tmp;
00086     }
00087 
00088     opt->addOpt("optimizer", tmp_optimizer);
00089 
00090 
00091     std::set<unsigned long> ireg;
00092 //    for(unsigned long i=0; i<n_rank; ++i)
00093 //        ireg.insert( static_cast<unsigned long>(gurls::round(std::pow(m, (i+1.0)/n_rank)))-1);
00094 
00095     unsigned long step = static_cast<unsigned long>(floor(m/n_rank));
00096     for(unsigned long i = m-1, count = 0; count < n_rank; i-=step, ++count)
00097         ireg.insert(i);
00098 
00099 
00100     GurlsOptionsList* perf_opt = new GurlsOptionsList("perf_opt");
00101     gMat2D<T>* alpha = new gMat2D<T>();
00102     T maxPerf = -std::numeric_limits<T>::max();
00103     unsigned long maxRank = 0;
00104     gMat2D<T> *perfs_mat = new gMat2D<T>(1, ireg.size());
00105     T *perfs = perfs_mat->getData();
00106     set(perfs, (T)-1, ireg.size());
00107 
00108     gMat2D<T> *times_mat = new gMat2D<T>(1, ireg.size());
00109     T *times = times_mat->getData();
00110     set(times, (T)0, ireg.size());
00111 
00112 
00113     gMat2D<T> *guesses_mat = new gMat2D<T>(1, ireg.size());
00114     T *guesses_mat_it = guesses_mat->getData();
00115     set(guesses_mat_it, (T)-1, ireg.size());
00116 
00117 
00118     T* G = new T[n*m];  //Cholesky factor
00119     set(G, (T)0.0, n*m);
00120 
00121     T* Q = new T[n*m];  //Q part of the QR decomposition
00122     set(Q, (T)0.0, n*m);
00123 
00124     T* RR = new T[m*m];  //inverse of R*R'
00125     set(RR, (T)0.0, m*m);
00126 
00127     T* yPvec = new T[n*t];
00128     copy(yPvec, y.getData(), n*t);
00129 
00130 
00131     boost::posix_time::ptime begin, end;
00132     boost::posix_time::time_duration diff;
00133 
00134     T prevPerf = 0;
00135 
00136     // ---- Cholesky decomposition ----
00137     T* diagG;
00138     T* newKcol;
00139     unsigned long* pVec;
00140     T normG;
00141 
00142     begin = boost::posix_time::microsec_clock::local_time();
00143     for(unsigned long i=0; i<m; ++i)
00144     {
00145 
00146         if(i==0)
00147         {
00148             //First iteration
00149             diagG = new T[n];
00150             set(diagG, (T)1.0, n);
00151 
00152             pVec = new unsigned long[n];
00153             for(unsigned long *it = pVec, *const end = pVec+n, i=0; it != end; ++it, ++i)
00154                 *it = i;
00155 
00156             G[0] = 1.0;
00157 
00158 
00159         //     newKcol = exp(-1/sigma^2*square_distance(X(Pvec(2:n),:)',X(1,:)'));
00160             newKcol = computeNewKcol(X.getData(), n, d, sigma, pVec, 1, n);
00161 
00162         //    G(2:n,1) = newKcol;
00163             copy(G + 1, newKcol, n-1);
00164 
00165         //    diagG(2:n)=ones(n-1,1)-sum(G(2:n,1).^2,2);
00166             mult(newKcol, newKcol, newKcol, n-1);
00167             axpy(n-1, (T)-1.0, newKcol, 1, diagG+1, 1); // assumes diagG has been previously initialized to 1
00168 
00169         //    normG = norm(G(:,1));
00170             normG = sqrt(sumv(newKcol, n-1) + (G[0]*G[0]));
00171             delete [] newKcol;
00172 
00173         //    Q(:,1) = G(:,1) / normG;
00174             copy(Q, G, n);
00175             scal(n, (T)1.0/normG, Q, 1);
00176 
00177         //    RR(1,1) = 1/(normG^2);
00178             RR[0] = 1.0/ (normG*normG);
00179         }
00180         else // all other iterations
00181         {
00182             // find best new element
00183             unsigned long jast = std::max_element(diagG+i, diagG+n)-diagG;
00184 
00185             // updates permutation
00186     //        Pvec( [i jast] ) = Pvec( [jast i] );
00187             std::swap(*(pVec+i), *(pVec+jast));
00188 
00189             // swap y
00190             gurls::swap(t, yPvec+i, n, yPvec+jast, n);
00191 
00192             // updates all elements of G due to new permutation
00193     //        G([i jast],1:i)=G([ jast i],1:i);
00194             gurls::swap(i+1, G+i, n, G+jast, n);
00195 
00196 
00197             // updates all elements of Q due to new permutation
00198     //        Q([i jast],1:i-1) = Q([ jast i],1:i-1);
00199             gurls::swap(i, Q+i, n, Q+jast, n);
00200 
00201 
00202             // do the cholesky update
00203     //        G(i,i)=diagG(jast);
00204     //        G(i,i)=sqrt(G(i,i));
00205             const T G_ii = sqrt(diagG[jast]);
00206             G[(n*i)+i] = G_ii;
00207 
00208 
00209     //        newKcol = exp(-1/sigma^2*square_distance(X(Pvec((i+1):n),:)',X(Pvec(i),:)'));
00210             newKcol = computeNewKcol(X.getData(), n, d, sigma, pVec, i+1, n);
00211 
00212     //        G((i+1):n,i)=1/G(i,i)*( newKcol - G((i+1):n,1:(i-1))*(G(i,1:(i-1)))');
00213             const int rows = (n-(i+1));
00214             const unsigned long cols = i;
00215 
00216             T* G_ip1_n = new T[rows*(cols+1)]; // extracting +1 cols for future use
00217 
00218             for(T *G_it = G+(i+1), *Gi_it = G_ip1_n, *const Gi_end = Gi_it+rows*cols; Gi_it != Gi_end; G_it+=n, Gi_it+=rows)
00219                 copy(Gi_it, G_it, rows);
00220 
00221             T* G_i= new T[cols];
00222             copy(G_i, G+i, cols, 1, n);
00223 
00224             const T beta = 1.0/G_ii;
00225 
00226             gemv(CblasNoTrans, rows, cols, -beta, G_ip1_n, rows, G_i, 1, beta, newKcol, 1);
00227             copy(G+(i+1)+(n*i), newKcol, rows);
00228 
00229             delete [] G_i;
00230 
00231             // updates diagonal elements
00232     //        diagG((i+1):n)=ones(n-i,1)-sum(G((i+1):n,1:i).^2,2  );
00233             copy(G_ip1_n+(rows*cols), newKcol, rows);
00234             mult(G_ip1_n, G_ip1_n, G_ip1_n, rows*(cols+1));
00235 
00236             delete [] newKcol;
00237 
00238             T* sums = new T[rows];
00239             sum_col(G_ip1_n, sums, rows, cols+1);
00240             set(diagG+(i+1), (T)1.0, rows);
00241             axpy(rows, (T)-1.0, sums, 1, diagG+(i+1), 1);
00242 
00243             delete [] sums;
00244             delete [] G_ip1_n;
00245 
00246 
00247             // performs QR decomposition
00248     //        Gcol = G(:,i);
00249             T* Gcol = new T[n];
00250             copy(Gcol, G+(n*i), n);
00251 
00252     //        Rcol = Q(:,1:(i-1))' * Gcol;
00253             T* Rcol = new T[cols];
00254             T* Q_sub = new T[n*cols];
00255             copy(Q_sub, Q, n*cols);
00256             gemv(CblasTrans, n, cols, (T)1.0, Q_sub, n, Gcol, 1, (T)0.0, Rcol, 1);
00257 
00258 
00259     //        Q(:,i) = Gcol - Q(:,1:(i-1)) * Rcol;
00260             T* Q_i = Q+(n*i);
00261             copy(Q_i, Gcol, n);
00262             gemv(CblasNoTrans, n, cols, (T)-1.0, Q_sub, n, Rcol, 1, (T)1.0, Q_i, 1);
00263 
00264             delete [] Gcol;
00265             delete [] Q_sub;
00266 
00267     //        Rii = norm(Q(:,i));
00268     //        Q(:,i) = Q(:,i) / Rii;
00269             normG = nrm2(n, Q_i, 1);
00270             scal(n, (T)1.0/normG, Q_i, 1);
00271 
00272 
00273             // updates
00274     //        RR(1:(i-1),i) = -(RR(1:(i-1),1:(i-1))*Rcol)./Rii;
00275             T* RR_sub = new T[cols*cols];
00276             for(T *R_it = RR, *Rs_it = RR_sub, *const R_end = R_it+(i*m); R_it != R_end; R_it+=m, Rs_it+=cols)
00277                 copy(Rs_it, R_it, cols);
00278 
00279             T* RR_i = RR+(m*i);
00280             T* RR_Rcol = new T[cols];
00281 
00282             gemv(CblasNoTrans, cols, cols, (T)1.0, RR_sub, cols, Rcol, 1, (T)0.0, RR_Rcol, 1);
00283             copy(RR_i, RR_Rcol, cols);
00284             scal(cols, (T)-1.0/normG, RR_i, 1);
00285 
00286             delete[] RR_sub;
00287 
00288     //        RR(i,1:(i-1)) = RR(1:(i-1),i)';
00289             copy(RR+i, RR_i, cols, m, 1);
00290 
00291     //        RR(i,i) = (Rcol'*RR(1:(i-1),1:(i-1))*Rcol + 1)./(Rii^2);
00292             normG *= normG;
00293             RR[i+(i*m)] = (dot(cols, Rcol, 1, RR_Rcol, 1)+1) / normG;
00294 
00295             delete [] Rcol;
00296             delete [] RR_Rcol;
00297         }
00298 
00299 
00300         if(ireg.find(i) != ireg.end())
00301         {
00302             *guesses_mat_it++ = i+1;
00303 
00304 //            vout.alpha = Q(:,1:i)*RR(1:i,1:i)*(Q(:,1:i)'*y(Pvec,:));
00305 
00306             const unsigned long ii = i+1;
00307 
00308 
00309             T* QtYp = new T[ii*t];
00310             dot(Q, yPvec, QtYp, n, ii, n, t, ii, t, CblasTrans, CblasNoTrans, CblasColMajor);
00311 
00312             T* RR_sub = new T[ii*ii];
00313             for(T *R_it = RR, *Rs_it = RR_sub, *const R_end = R_it+(ii*m); R_it != R_end; R_it+=m, Rs_it+=ii)
00314                 copy(Rs_it, R_it, ii);
00315 
00316             T* RRQtYp = new T[ii*t];
00317             dot(RR_sub, QtYp, RRQtYp, ii, ii, ii, t, ii, t, CblasNoTrans, CblasNoTrans, CblasColMajor);
00318 
00319             delete [] RR_sub;
00320             delete [] QtYp;
00321 
00322             T* alpha_i = new T[n*t];
00323             dot(Q, RRQtYp, alpha_i, n, ii, ii, t, n, t, CblasNoTrans, CblasNoTrans, CblasColMajor);
00324 
00325             delete [] RRQtYp;
00326 
00327 
00328 
00329         //    permute indices of alpha
00330         //    vout.alpha(Pvec, :) = vout.alpha;
00331             gMat2D<T>* alphaMat = new gMat2D<T>(n,t);
00332 
00333             T *const alphaMat_it = alphaMat->getData();
00334             for (unsigned long j=0; j<n; ++j)
00335                 copy(alphaMat_it+pVec[j], alpha_i+j, t, n, n);
00336 
00337             delete [] alpha_i;
00338 
00339             if(computePred)
00340             {
00341                 // pred_primal
00342                 gMat2D<T> * pred = new gMat2D<T>(Xva->rows(), t);
00343                 dot(predKernel_K->getData(), alphaMat_it, pred->getData(), Xva->rows(), n, n, t, Xva->rows(), t, CblasNoTrans, CblasNoTrans, CblasColMajor);
00344 
00345                 // perf_macroavg
00346 
00347                 perf_opt->addOpt("pred", new OptMatrix<gMat2D<T> >(*pred));
00348                 GurlsOptionsList* perf = perfTask->execute(empty, *yva, *perf_opt);
00349 
00350                 gMat2D<T>& acc = perf->getOptValue<OptMatrix<gMat2D<T> > >("acc");
00351                 T perf_i = sumv(acc.getData(), acc.getSize())/acc.getSize();
00352                 *perfs = perf_i;
00353 //                ++perfs;
00354 
00355                 perf_opt->removeOpt("pred");
00356                 delete perf;
00357 
00358                 if(perf_i > maxPerf)
00359                 {
00360                     maxPerf = perf_i;
00361                     maxRank = i;
00362 
00363                     delete alpha;
00364                     alpha = alphaMat;
00365                 }
00366                 else
00367                     delete alphaMat;
00368 
00369 
00370                 if(le(*perfs, prevPerf) && i > 10)
00371                     break;
00372                 else
00373                 {
00374                     prevPerf = *perfs;
00375                     ++perfs;
00376                 }
00377             }
00378             else
00379             {
00380                 if(i == m-1)
00381                 {
00382                     delete alpha;
00383                     alpha = alphaMat;
00384                     maxPerf = 1;
00385                     maxRank = i;
00386 
00387                     set(perfs, (T)0.0, ireg.size());
00388                     set(times, (T)0.0, ireg.size());
00389                 }
00390             }
00391 
00392             end = boost::posix_time::microsec_clock::local_time();
00393             diff = end-begin;
00394 
00395             *times = diff.total_milliseconds();
00396             ++times;
00397 
00398         }
00399 
00400     }
00401 
00402     delete perf_opt;
00403     delete perfTask;
00404 
00405     delete [] G;
00406     delete [] diagG;
00407 
00408 
00409     delete [] yPvec;
00410     delete [] RR;
00411     delete [] Q;
00412 
00413     delete [] pVec;
00414 
00415     delete predKernel_K;
00416 
00417     GurlsOptionsList* paramsel = opt->getOptAs<GurlsOptionsList>("paramsel");
00418     paramsel->removeOpt("alpha");
00419     paramsel->removeOpt("acc");
00420     paramsel->removeOpt("maxRank");
00421     paramsel->removeOpt("maxPerf");
00422     paramsel->removeOpt("times");
00423     paramsel->removeOpt("guesses");
00424 
00425     paramsel->addOpt("alpha", new OptMatrix<gMat2D<T> >(*alpha));
00426     paramsel->addOpt("acc", new OptMatrix<gMat2D<T> >(*perfs_mat));
00427     paramsel->addOpt("maxRank", new OptNumber(maxRank));
00428     paramsel->addOpt("maxPerf", new OptNumber(maxPerf));
00429     paramsel->addOpt("times", new OptMatrix<gMat2D<T> >(*times_mat));
00430     paramsel->addOpt("guesses", new OptMatrix<gMat2D<T> >(*guesses_mat));
00431 
00432 }
00433 
00434 template <typename T>
00435 void ICholWrapper<T>::update(const gVec<T> &X, const gVec<T> &y)
00436 {
00437 }
00438 
00439 template <typename T>
00440 gMat2D<T>* ICholWrapper<T>::eval(const gMat2D<T> &X)
00441 {
00442     GurlsOptionsList *opt = this->opt;
00443 
00444     const gMat2D<T> &alpha_mat = opt->getOptValue<OptMatrix<gMat2D<T> > >("paramsel.alpha");
00445     const T *const alpha = alpha_mat.getData();
00446 
00447     const unsigned long n = X.rows();
00448     const unsigned long nt = alpha_mat.rows();
00449     const unsigned long t = alpha_mat.cols();
00450 
00451     PredKernelTrainTest<T> predKernelTask;
00452 
00453     gMat2D<T> empty;
00454 
00455 
00456     GurlsOptionsList* opt_tmp = new GurlsOptionsList("tmp");
00457     GurlsOptionsList* tmp_kernel = new GurlsOptionsList("kernel");
00458     GurlsOptionsList* tmp_paramsel = new GurlsOptionsList("paramsel");
00459 
00460     opt_tmp->addOpt("kernel", tmp_kernel);
00461     opt_tmp->addOpt("paramsel", tmp_paramsel);
00462     opt_tmp->addOpt("optimizer", opt->getOpt("optimizer"));
00463 
00464     tmp_kernel->addOpt("type", "rbf");
00465     tmp_paramsel->addOpt("sigma", new OptNumber(opt->getOptAsNumber("paramsel.sigma")));
00466 
00467 
00468     gMat2D<T> *y = new gMat2D<T>(n, t);
00469 
00470     GurlsOptionsList *predKernel = predKernelTask.execute(X, empty, *opt_tmp);
00471     const gMat2D<T> &predKernel_K = predKernel->getOptValue<OptMatrix<gMat2D<T> > >("K");
00472 
00473     dot(predKernel_K.getData(), alpha, y->getData(), n, nt, nt, t, n, t, CblasNoTrans, CblasNoTrans, CblasColMajor);
00474 
00475     opt_tmp->removeOpt("optimizer", false);
00476     delete opt_tmp;
00477     delete predKernel;
00478 
00479     return y;
00480 }
00481 
00482 template <typename T>
00483 gMat2D<T>* ICholWrapper<T>::eval_ls(const gMat2D<T> &X)
00484 {
00485     GurlsOptionsList *opt = this->opt;
00486 
00487     const gMat2D<T> &alpha_mat = opt->getOptValue<OptMatrix<gMat2D<T> > >("paramsel.alpha");
00488     const T *const alpha = alpha_mat.getData();
00489 
00490     const unsigned long n = X.rows();
00491     const unsigned long d = X.cols();
00492     const unsigned long nt = alpha_mat.rows();
00493     const unsigned long t = alpha_mat.cols();
00494 
00495     gMat2D<T> Xi_mat(1, d);
00496     T* yi = new T[t];
00497     T* const Xi = Xi_mat.getData();
00498 
00499     gMat2D<T> *y_mat = new gMat2D<T>(n, t);
00500     T* y_it = y_mat->getData();
00501 
00502     GurlsOptionsList* opt_tmp = new GurlsOptionsList("tmp");
00503     GurlsOptionsList* tmp_kernel = new GurlsOptionsList("kernel");
00504     GurlsOptionsList* tmp_paramsel = new GurlsOptionsList("paramsel");
00505 
00506     opt_tmp->addOpt("kernel", tmp_kernel);
00507     opt_tmp->addOpt("paramsel", tmp_paramsel);
00508     opt_tmp->addOpt("optimizer", opt->getOpt("optimizer"));
00509 
00510     tmp_kernel->addOpt("type", "rbf");
00511     tmp_paramsel->addOpt("sigma", new OptNumber(opt->getOptAsNumber("paramsel.sigma")));
00512 
00513 
00514     PredKernelTrainTest<T> predKernelTask;
00515     const gMat2D<T> empty;
00516 
00517     for(int i=0; i<n; ++i, ++y_it)
00518     {
00519         getRow(X.getData(), n, d, i, Xi);
00520 
00521         GurlsOptionsList *predKernel = predKernelTask.execute(Xi_mat, empty, *opt_tmp);
00522         const gMat2D<T> &predKernel_K = predKernel->getOptValue<OptMatrix<gMat2D<T> > >("K");
00523 
00524         dot(predKernel_K.getData(), alpha, yi, 1, nt, nt, t, 1, t, CblasNoTrans, CblasNoTrans, CblasColMajor);
00525         copy(y_it, yi, t, n, 1);
00526 
00527         delete predKernel;
00528     }
00529 
00530     opt_tmp->removeOpt("optimizer", false);
00531     delete opt_tmp;
00532     delete [] yi;
00533 
00534     return y_mat;
00535 }
00536 
00537 template <typename T>
00538 void ICholWrapper<T>::setRankMax(unsigned long rank)
00539 {
00540     GurlsOptionsList* paramsel = this->opt->template getOptAs<GurlsOptionsList>("paramsel");
00541     paramsel->removeOpt("rank_max");
00542     paramsel->addOpt("rank_max", new OptNumber(rank));
00543 }
00544 
00545 template <typename T>
00546 void ICholWrapper<T>::setNRank(unsigned long n_rank)
00547 {
00548     GurlsOptionsList* paramsel = this->opt->template getOptAs<GurlsOptionsList>("paramsel");
00549     paramsel->removeOpt("n_rank");
00550     paramsel->addOpt("n_rank", new OptNumber(n_rank));
00551 }
00552 
00553 template <typename T>
00554 void ICholWrapper<T>::setSigma(double sigma)
00555 {
00556     GurlsOptionsList* paramsel = this->opt->template getOptAs<GurlsOptionsList>("paramsel");
00557     paramsel->removeOpt("sigma");
00558     paramsel->addOpt("sigma", new OptNumber(sigma));
00559 }
00560 
00561 template <typename T>
00562 void ICholWrapper<T>::setXva(const gMat2D<T> &Xva)
00563 {
00564     GurlsOptionsList* split = this->opt->template getOptAs<GurlsOptionsList>("split");
00565     gMat2D<T> *Xva_mat = new gMat2D<T>(Xva);
00566     split->removeOpt("Xva");
00567     split->addOpt("Xva", new OptMatrix<gMat2D<T> >(*Xva_mat));
00568 }
00569 
00570 template <typename T>
00571 void ICholWrapper<T>::setyva(const gMat2D<T> &yva)
00572 {
00573     GurlsOptionsList* split = this->opt->template getOptAs<GurlsOptionsList>("split");
00574     gMat2D<T> *yva_mat = new gMat2D<T>(yva);
00575     split->removeOpt("yva");
00576     split->addOpt("yva", new OptMatrix<gMat2D<T> >(*yva_mat));
00577 }
00578 
00579 template <typename T>
00580 T* ICholWrapper<T>::computeNewKcol(const T* Xtr, const unsigned long xr, const unsigned long xc,
00581                                              const double sigma,
00582                                              const unsigned long* pVec,
00583                                              const unsigned long start, const unsigned long n)
00584 {
00585     // newKcol = exp(-1/sigma^2*square_distance(Xtr(Pvec(start:n),:)',Xtr(Pvec(start-1),:)'));
00586 
00587     const unsigned long len = n-start;
00588 
00589     T* newKcol = new T[len];
00590 
00591     T* XtrPvec = new T[len*xc];
00592     subMatrixFromRows(Xtr, xr, xc, pVec+start, len, XtrPvec);
00593 
00594     T* XtrPvecT = new T[xc*len];
00595     transpose(XtrPvec, len, xc, XtrPvecT);
00596     delete[] XtrPvec;
00597 
00598     T* XtrRow = new T[xc];
00599     getRow(Xtr, xr, xc, pVec[start-1], XtrRow);
00600 
00601     distance(XtrPvecT, XtrRow, xc, len, 1, newKcol);
00602     delete [] XtrRow;
00603     delete [] XtrPvecT;
00604 
00605     scal(len, (T)(-1.0/(sigma*sigma)), newKcol, 1);
00606     gurls::exp(newKcol, len);
00607 
00608     return newKcol;
00609 }
00610 
00611 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends