void Stiefel::InverseVectorTransport(Variable *x, Vector *etax, Variable *y, Vector *xiy, Vector *result) const { if (VecTran == PARALLELIZATION && !HasHHR) return Manifold::InverseVectorTransport(x, etax, y, xiy, result); if (HasHHR) return LCInverseVectorTransport(x, etax, y, xiy, result); Rcpp::Rcout << "Error: InverseVectorTransport has not been done!" << std::endl; };
void ProductManifold::InverseVectorTransport(Variable *x, Vector *etax, Variable *y, Vector *xiy, Vector *result) const { if (HasHHR) return LCInverseVectorTransport(x, etax, y, xiy, result); ProdVariable *prodx = dynamic_cast<ProdVariable *> (x); ProdVector *prodetax = dynamic_cast<ProdVector *> (etax); ProdVariable *prody = dynamic_cast<ProdVariable *> (y); ProdVector *prodxiy = dynamic_cast<ProdVector *> (xiy); ProdVector *prodresult = dynamic_cast<ProdVector *> (result); if (xiy == 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]->InverseVectorTransport(prodx->GetElement(j), prodetax->GetElement(j), prody->GetElement(j), prodxiy->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]->InverseVectorTransport(prodx->GetElement(j), prodetax->GetElement(j), prody->GetElement(j), prodxiy->GetElement(j), prodresult->GetElement(j)); } } } #ifdef CHECKMEMORY prodresult->CheckMemory(); #endif };