KASKADE 7 development version
newton_base.hh
Go to the documentation of this file.
1#ifndef NEWTON_BASE_HH
2#define NEWTON_BASE_HH
3
4#include <vector>
5#include <memory>
6
8#include "algorithm_base.hh"
9
10namespace Kaskade
11{
12
17//------------------------------------------------------------------------------------------
18
20{
21public:
22 NewtonParameters(double desiredAccuracy_, int maxSteps_)
23 : IterationParameters(desiredAccuracy_, maxSteps_), reuseFactorization(false)
24 {
25 reset();
26 }
27
28
29//Parameters with values that must be supplied by client
30// double desiredAccuracy;
31// int maxSteps;
32
33 virtual ~NewtonParameters() {}
34
35 virtual void reset() {
37 }
38
40
41protected:
42 friend class NewtonsMethod;
43 friend class SimpleNewtonMethod;
44
45 void logStep() {
47 }
48
49 virtual void doForAll(LQAction::ToDo td)
50 {
51 normCorr.doAction(td,"|Corr|");
52 }
53
55};
56
58{
59public:
61 AbstractFunctionSpaceElement const& perturbation,
62 AbstractLinearization const& lin,
63 std::vector<std::shared_ptr<AbstractFunctionSpaceElement> > basis = std::vector<std::shared_ptr<AbstractFunctionSpaceElement> >()) const
64 {
65 newIterate = lin.getOrigin();
66 newIterate += perturbation;
67 }
68};
69
70//class TrivialAbstractChart : public AbstractChart
71//{
72//public:
73// void addPerturbation(AbstractFunctionSpaceElement& newIterate,
74// AbstractFunctionSpaceElement const& perturbation,
75// AbstractLinearization const& lin,
76// std::vector<AbstractFunctionSpaceElement* > basis = std::vector<AbstractFunctionSpaceElement* >()) const
77// {
78// newIterate = lin.getOrigin();
79// newIterate += perturbation;
80// }
81//};
82
84
89{
90public:
92
93 virtual ~NewtonsMethod() {}
94
97 linearSolver(l), chart(chart_), norm(n), p(p_) {}
98
101
104
106 {
109 else
110 {
111 std::cout << "No Factorization available: set NewtonParameters::reuseFactorization=true" << std::endl;
112 }
113}
114
115 virtual Parameters& getParameters() {return p;}
117 void setDesiredAccuracy(double da) { assert(da>0); p.desiredAccuracy=da;}
119 virtual void setDesiredRelativeAccuracy(double ra) { assert(false); }
122
123 int stepsPerformed() {return step;}
124
125 bool changedGrid() { return gridHasChanged; }
126
128 {
130 direction *= -1.0;
131 }
132
133
135 {
136 chart.addPerturbation(trialIterate, direction, lin);
137 }
138
140
142
143protected:
144
146 virtual void initialize();
148 virtual void finalize(int);
150 virtual void logQuantities() { p.logStep();}
151
152 virtual void initNewtonStep() {};
153
156
159
161 virtual double& dampingFactor() { dummy=1.0; return dummy;}
163 virtual double maxSteps() {return p.maxSteps;}
164
168 AbstractLinearization const& lin);
169
175 virtual RegularityTest regularityTest(double scalingFactor)
176 {
178 }
179
186 AbstractLinearization const& lin) = 0;
187
188
189 template<class T>
191 {
192 public:
193 CycleDetection() : hasIncreased(false) {};
194
195 bool detectCycling(T& quantity)
196 {
197 if(quantityCycle.size()!=0)
198 if(*std::min_element(quantityCycle.begin(),quantityCycle.end())<quantity) hasIncreased=true;
199
200 if(hasIncreased && quantity < *std::min_element(quantityCycle.begin(),quantityCycle.end()))
201 {
202 quantity = *std::min_element(quantityCycle.begin(),quantityCycle.end());
203 std::cout << "Detected Cycling: decreased below already accepted step size:" << quantity << std::endl;
204 return true;
205 }
206
207 for(int i = 0; i< quantityCycle.size(); i++)
208 if(std::abs(quantityCycle[i]-quantity)<std::abs(quantity)*std::numeric_limits<double>::epsilon()){
209 quantity = quantityCycle[i+1];
210 std::cout << "Detected Cycling: two identical step sizes:" << quantity << std::endl;
211 return true;
212 }
213
214 if(quantityCycle.size() > 20){
215 quantity=quantity/4.0;
216 std::cout << "Detected Cycling: too many trials:" << quantity << std::endl;
217 return true;
218 }
219 quantityCycle.push_back(quantity);
220 return false;
221 }
222
223 private:
224 std::vector<T> quantityCycle;
225 bool hasIncreased;
226 };
227
228 virtual void terminationMessage(int flag);
229
235
236 std::unique_ptr<AbstractFunctionSpaceElement> iterate, trialIterate, correction;
237
238 std::unique_ptr<AbstractLinearization> newtonLinearization;
239 std::unique_ptr<AbstractLinearization> simplifiedLinearization;
241
242 int step;
243
244private:
245 int runAlgorithm();
246
248
249 double dummy;
250
251
252 bool doOneStep;
253 bool gridHasChanged;
254};
255
256
257
260} // namespace Kaskade
261#endif
Interfaces for function space oriented algorithms.
virtual void addPerturbation(AbstractFunctionSpaceElement &newIterate, AbstractFunctionSpaceElement const &perturbation, AbstractLinearization const &lin, std::vector< std::shared_ptr< AbstractFunctionSpaceElement > > basis=std::vector< std::shared_ptr< AbstractFunctionSpaceElement > >()) const =0
Abstract Vector for function space algorithms.
Representation of a nonlinear functional.
virtual AbstractFunctionSpaceElement const & getOrigin() const =0
Get point of linearization.
Class that models the functionality of a (possibly inexact) linear solver.
void ordinary(AbstractFunctionSpaceElement &correction, AbstractLinearization &linearization)
void simplified(AbstractFunctionSpaceElement &correction, AbstractLinearization const &linearization, AbstractLinearization const &oldlinearization) const
Base class for algorithms. Provides a unified interface and some simple wrapper routines,...
void addPerturbation(AbstractFunctionSpaceElement &newIterate, AbstractFunctionSpaceElement const &perturbation, AbstractLinearization const &lin, std::vector< std::shared_ptr< AbstractFunctionSpaceElement > > basis=std::vector< std::shared_ptr< AbstractFunctionSpaceElement > >()) const
Definition: newton_base.hh:60
Base class for algorithmic parameters.
void doAction(LQAction::ToDo td, std::string const &name_="noName")
LoggedQuantity< double > normCorr
Definition: newton_base.hh:54
virtual void reset()
Reset all quantities in this class.
Definition: newton_base.hh:35
NewtonParameters(double desiredAccuracy_, int maxSteps_)
Definition: newton_base.hh:22
virtual void doForAll(LQAction::ToDo td)
To be overloaded by derived class.
Definition: newton_base.hh:49
friend class SimpleNewtonMethod
Definition: newton_base.hh:43
Base class for Newton's method. Defines the main algorithm, potentially using damping.
Definition: newton_base.hh:89
virtual double maxSteps()
return the maximal number of steps
Definition: newton_base.hh:163
virtual void initialize()
Called before Iteration.
virtual AcceptanceTest evaluateTrialIterate(AbstractFunctionSpaceElement const &trialIterate, AbstractFunctionSpaceElement const &correction, AbstractLinearization const &lin)=0
void setDesiredAccuracy(double da)
set the desired accuracy
Definition: newton_base.hh:117
AbstractLinearization * newtonPtr
Definition: newton_base.hh:240
AbstractLinearization const & getLastSimplifiedLinearization()
Definition: newton_base.hh:141
std::unique_ptr< AbstractFunctionSpaceElement > correction
Definition: newton_base.hh:236
AbstractNorm & norm
Definition: newton_base.hh:233
virtual void finalize(int)
Called after Iteration.
void solve(AbstractFunctional *f, AbstractFunctionSpaceElement &x)
Solve the system f=0 with starting value x. On (successful) exit, the solution is x,...
void resetParameters()
Reset all algorithmic parameters to their default values.
Definition: newton_base.hh:121
AbstractLinearization const & getLastLinearization()
Definition: newton_base.hh:139
std::unique_ptr< AbstractFunctionSpaceElement > iterate
Definition: newton_base.hh:236
AbstractFunctional * functional
Definition: newton_base.hh:230
virtual void terminationMessage(int flag)
void oneStep(AbstractFunctional *f, AbstractLinearization *l, AbstractFunctionSpaceElement &x)
Perform one Newton step (which may be several trial steps, if damping is applied)
virtual void predictNextDampingFactor(AbstractFunctionSpaceElement &correction)
Should compute a damping factor.
Definition: newton_base.hh:158
AbstractNewtonDirection & linearSolver
Definition: newton_base.hh:231
virtual void computeTrialIterate(AbstractFunctionSpaceElement &trialIterate, AbstractFunctionSpaceElement const &direction, AbstractLinearization const &lin)
Definition: newton_base.hh:134
NewtonsMethod(AbstractNewtonDirection &l, AbstractChart &chart_, AbstractNorm &n, Parameters &p_)
Create Newton's Method, providing a solver, a norm and algorithmic parameters.
Definition: newton_base.hh:96
virtual double & dampingFactor()
Return a damping factor.
Definition: newton_base.hh:161
virtual void getSearchDirection(AbstractFunctionSpaceElement &direction)
Definition: newton_base.hh:127
void resolve(AbstractFunctionSpaceElement &x, AbstractLinearization const &l)
Definition: newton_base.hh:105
virtual void setDesiredRelativeAccuracy(double ra)
set the desired accuracy
Definition: newton_base.hh:119
virtual Convergence convergenceTest(AbstractFunctionSpaceElement const &correction, AbstractFunctionSpaceElement const &iterate)=0
Return true, if convergence is detected, false otherwise.
std::unique_ptr< AbstractFunctionSpaceElement > trialIterate
Definition: newton_base.hh:236
virtual void initNewtonStep()
Definition: newton_base.hh:152
std::unique_ptr< AbstractLinearization > newtonLinearization
Definition: newton_base.hh:238
AbstractChart & chart
Definition: newton_base.hh:232
std::unique_ptr< AbstractLinearization > simplifiedLinearization
Definition: newton_base.hh:239
virtual void logQuantities()
Performs logging of quantities.
Definition: newton_base.hh:150
NewtonParameters Parameters
Definition: newton_base.hh:91
virtual Parameters & getParameters()
Definition: newton_base.hh:115
virtual void updateIterate(AbstractFunctionSpaceElement &iterate, AbstractFunctionSpaceElement &trialIterate, AbstractLinearization const &lin)
update an accepted iterate, default: iterate=trialIterate
virtual RegularityTest regularityTest(double scalingFactor)
Definition: newton_base.hh:175
enum toDo ToDo