![]() |
GURLS++
2.0.00
C++ Implementation of GURLS Matlab Toolbox
|
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 }