void Stiefel::VectorTransport(Variable *x, Vector *etax, Variable *y, Vector *xix, Vector *result) const { if (VecTran == PARALLELIZATION && !HasHHR) return Manifold::VectorTransport(x, etax, y, xix, result); if (HasHHR) return LCVectorTransport(x, etax, y, xix, result); Rcpp::Rcout << "Error: VectorTransport has not been done!" << std::endl; };
void ProductManifold::VectorTransport(Variable *x, Vector *etax, Variable *y, Vector *xix, Vector *result) const { if (HasHHR) return LCVectorTransport(x, etax, y, xix, result); ProdVariable *prodx = dynamic_cast<ProdVariable *> (x); ProdVector *prodetax = dynamic_cast<ProdVector *> (etax); ProdVariable *prody = dynamic_cast<ProdVariable *> (y); ProdVector *prodxix = dynamic_cast<ProdVector *> (xix); ProdVector *prodresult = dynamic_cast<ProdVector *> (result); if (xix == result) { ProdVector *prodresultTemp = prodresult->ConstructEmpty(); prodresultTemp->NewMemoryOnWrite(); for (integer i = 0; i < numofmani; i++) { for (integer j = powsinterval[i]; j < powsinterval[i + 1]; j++) { manifolds[i]->VectorTransport(prodx->GetElement(j), prodetax->GetElement(j), prody->GetElement(j), prodxix->GetElement(j), prodresultTemp->GetElement(j)); } } prodresultTemp->CopyTo(prodresult); delete prodresultTemp; } else { prodresult->NewMemoryOnWrite(); for (integer i = 0; i < numofmani; i++) { for (integer j = powsinterval[i]; j < powsinterval[i + 1]; j++) { manifolds[i]->VectorTransport(prodx->GetElement(j), prodetax->GetElement(j), prody->GetElement(j), prodxix->GetElement(j), prodresult->GetElement(j)); } } } #ifdef CHECKMEMORY prodresult->CheckMemory(); #endif };