Exemplo n.º 1
0
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;
};
Exemplo n.º 2
0
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
};