diff --git a/src/targetspacertrsolver.cc b/src/targetspacertrsolver.cc index bb74781122ac9c95b93102b205bea8e47eb3bbe4..fb23d717cda28eeb39d88f01a7c71b2c8203542b 100644 --- a/src/targetspacertrsolver.cc +++ b/src/targetspacertrsolver.cc @@ -50,12 +50,8 @@ setup(const AverageDistanceAssembler<TargetSpace>* assembler, template <class TargetSpace> void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() { -#if 0 - MaxNormTrustRegion<blocksize> trustRegion(x_.size(), initialTrustRegionRadius_); - - std::vector<std::vector<BoxConstraint<field_type,blocksize> > > trustRegionObstacles((mgStep) - ? mgStep->numLevels_ - : 0); + MaxNormTrustRegion<blocksize> trustRegion(1, // we have only one block + initialTrustRegionRadius_); // ///////////////////////////////////////////////////// // Trust-Region Solver @@ -71,11 +67,13 @@ void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() } CorrectionType rhs; - CorrectionType corr(x_.size()); + CorrectionType corr(1); // length is 1 _block_ corr = 0; - assembler_->assembleGradient(x_, rhs); - assembler_->assembleMatrix(x_, hesseMatrix); + MatrixType hesseMatrix; + + assembler_->assembleGradient(x_, rhs[0]); + assembler_->assembleMatrix(x_, hesseMatrix[0][0]); //gradientFDCheck(x_, rhs, *rodAssembler_); //hessianFDCheck(x_, *hessianMatrix_, *rodAssembler_); @@ -83,10 +81,9 @@ void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() // The right hand side is the _negative_ gradient rhs *= -1; - mgStep->setProblem(*hessianMatrix_, corr, rhs, grid_->maxLevel()+1); + dynamic_cast<LinearIterationStep<MatrixType,CorrectionType>*>(innerSolver_->iterationStep_)->setProblem(hesseMatrix, corr, rhs); - trustRegionObstacles.back() = trustRegion.obstacles(); - mgStep->obstacles_ = &trustRegionObstacles; + dynamic_cast<TrustRegionGSStep<MatrixType,CorrectionType>*>(innerSolver_->iterationStep_)->obstacles_ = &trustRegion.obstacles(); innerSolver_->preprocess(); @@ -96,7 +93,7 @@ void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() innerSolver_->solve(); - corr = mgStep->getSol(); + corr = innerSolver_->iterationStep_->getSol(); //std::cout << "Correction: " << std::endl << corr << std::endl; @@ -118,7 +115,7 @@ void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() // //////////////////////////////////////////////////// TargetSpace newIterate = x_; - newIterate = TargetSpace::exp(newIterate, corr); + newIterate = TargetSpace::exp(newIterate, corr[0]); /** \todo Don't always recompute oldEnergy */ double oldEnergy = assembler_->value(x_); @@ -129,10 +126,10 @@ void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() // Note that rhs = -g CorrectionType tmp(corr.size()); tmp = 0; - hessianMatrix_->umv(corr, tmp); + hesseMatrix.umv(corr, tmp); double modelDecrease = (rhs*corr) - 0.5 * (corr*tmp); - if (/* this->verbosity_ == NumProc::FULL */) { + if (this->verbosity_ == NumProc::FULL) { std::cout << "Absolute model decrease: " << modelDecrease << ", functional decrease: " << oldEnergy - energy << std::endl; std::cout << "Relative model decrease: " << modelDecrease / energy @@ -184,5 +181,5 @@ void TargetSpaceRiemannianTRSolver<TargetSpace>::solve() std::cout << "--- Current energy: " << energy << " ---" << std::endl; } -#endif + }