KASKADE 7 development version
optimization.hh
Go to the documentation of this file.
1#ifndef OPTIMIZATION_HH
2#define OPTIMIZATION_HH
3
4#include <memory>
5#include <vector>
6#include "dune/grid/config.h"
7#include "opt_interface.hh"
8#include "algorithm_base.hh"
10#include "newton_bridge.hh"
11#include "lipschitzConstants.hh"
12#include "linalg/triplet.hh"
14
15namespace Kaskade
16{
17 class QuadraticFunction;
18 class RegularizedQuadraticFunction;
19
20 template <class X>
22 {
24
25 virtual void setOrigin(AbstractLinearization const& linearization)
26 {
27 SparseLinearSystem const& m = dynamic_cast<SparseLinearSystem const&>(linearization);
28 m.getMatrixBlocks(Hu,0,1,0,1);
29 m.getMatrixBlocks(Hy,1,2,1,2);
30 }
31
33 {
34 X const& x = Bridge::getImpl<X>(v);
35 X const& y = Bridge::getImpl<X>(w);
36
37 using namespace boost::fusion;
38
39 int sizeu=x.descriptions.degreesOfFreedom(0,1);
40 int sizey=x.descriptions.degreesOfFreedom(1,2);
41
42 double sumu(0.0);
43 {
44 std::vector<double> Hx(sizeu,0.0), argument1(sizeu,0.0), argument2(sizeu,0.0);
45 vectorToSequence(at_c<0>(x.data).coefficients(),argument1.begin());
46 vectorToSequence(at_c<0>(y.data).coefficients(),argument2.begin());
47 Hu.axpy(Hx, argument1);
48 for(int i=0; i<sizeu; ++i) sumu += Hx[i]*argument2[i];
49 }
50
51
52 double sumy(0.0);
53 {
54 std::vector<double> Hx(sizey,0.0), argument1(sizey,0.0),argument2(sizey,0.0);
55 vectorToSequence(at_c<1>(x.data).coefficients(),argument1.begin());
56 vectorToSequence(at_c<1>(y.data).coefficients(),argument2.begin());
57 Hy.axpy(Hx, argument1);
58 for(int i=0; i<sizey; ++i) sumy += Hx[i]*argument2[i];
59 }
60
61 return sumy + sumu;
62 }
63
64 private:
66 };
67
68
70 {
71 public:
72 OptimizationParameters(double desiredAccuracy_, int maxSteps_);
73
76
77 // Parameters with predefined values that can be changed by client
78 double desiredAccuracy = 1e-12;
80 double minimalDampingFactor = 1e-12;
81 double etaMin = 0.5;
82 double etaLock = 0.99;
83 double minimalAccuracy = 1e-3;
84 size_t maxSteps = 1000;
85 size_t maxGridSize = 10000;
87
88 void setThetaAim(double theta);
89 void setThetaNormal(double theta);
90 void setThetaMax(double theta);
91 void setThetas(double thetaNormal, double thetaAim, double thetaMax);
92 void setEps(double eps_);
93
94 double getThetaAim() const;
95 double getThetaNormal() const;
96 double getThetaMax() const;
97 double getEps() const;
98 double getSqrtEps() const;
99 double getThirdSqrtEps() const;
100
101 private:
102 void ensureAdmissibleThetas();
103
104 double ThetaAim = 0.25; // required contraction
105 double ThetaNormal = 0.1; // required contraction
106 double ThetaMax = 0.5; //
107 double eps = 1e-15;
108 double sqrtEps = sqrt(1e-15);
109 double thirdSqrtEps = 1e-5;
110 };
111
112
114 {
115 public:
117 AbstractFunctionSpaceElement const& perturbation,
118 AbstractLinearization const& lin,
119 std::vector<std::shared_ptr<AbstractFunctionSpaceElement> > basis = std::vector<std::shared_ptr<AbstractFunctionSpaceElement> >()) const
120 {
121 newIterate = lin.getOrigin();
122 newIterate.axpy_role(1.0,perturbation,"primal");
123 }
124
125 std::unique_ptr<AbstractChart> clone() const { return std::unique_ptr<PrimalChart>(new PrimalChart(*this)); }
126 };
127
128 class Optimization : public Algorithm
129 {
130 public:
133 AbstractTangentialSpace& tangentSpace_,
135 OptimizationParameters const& p_,
136 double omegaCinit=1,
137 double omegaLinit=1,
138 int verbose=1);
139
143 AbstractChart const& chart_,
144 OptimizationParameters const& p_,
145 int verbose=1);
146
150 AbstractChart const& chart_,
151 OptimizationParameters const& p_,
153 int verbose=1);
154
155 virtual ~Optimization();
156
159
161
165
167
168private:
170 int runAlgorithm();
171
172 std::pair<std::unique_ptr<AbstractFunctionSpaceElement>,std::unique_ptr<AbstractFunctionSpaceElement> > computeNormalStep(AbstractFunctionSpaceElement* normalStepResidual, AbstractFunctionSpaceElement* adjointResidual);
173// std::unique_ptr<AbstractFunctionSpaceElement> computeAdjoint();
174 std::unique_ptr<AbstractFunctionSpaceElement> computeSimplifiedNormalStep(AbstractLinearization const& lin_xplus, AbstractFunctionSpaceElement* normalStepResidual = nullptr);
175 std::unique_ptr<AbstractFunctionSpaceElement> computeSecondOrderCorrection(AbstractLinearization const& lin_xplus, AbstractFunctionSpaceElement const& normalStep, double nu);
176 std::vector<std::shared_ptr<AbstractFunctionSpaceElement> > computeTangentialStep(LagrangeLinearization&, AbstractFunctionSpaceElement const& normalStep, double nu, std::vector<double> const& tau);
177
178 void updateConstraintD1LipschitzConstant(double normSimplifiedNormal, double normCAtCorr);
179 double updateLagrangianD2LipschitzConstant(AbstractLinearization const& lin_x0, AbstractFunctionSpaceElement const& secondOrderCorrected, double normCAtCorr, double quadraticModelAtCorr, RegularizedQuadraticFunction const& cubic, double nu, std::vector<double> const& tau, AbstractFunctionSpaceElement const& normalStep, AbstractFunctionSpaceElement const& trialIterate, AbstractFunctionSpaceElement const& sNormalStep, AbstractFunctionSpaceElement const& correction, double Lxdn_res);
180
181 double updateNormalStepDampingFactor(double normNormal) const;
182 void updateTangentialDampingFactor(double nu, double normNormal, double normTangential, RegularizedQuadraticFunction const& cubic, std::vector<double>& tau) const;
183 bool adaptiveMeshRefinement(LagrangeLinearization& lin, double nu, std::vector<double> tau, AbstractFunctionSpaceElement const& correction);
184
185 AcceptanceTest acceptanceTest(double eta, double nu, std::vector<double> const& tau, double normOfCorrection) const;
186 bool regularityTest(double nu, std::vector<double> const& tau, bool reliableQuadraticModel) const;
187 Convergence convergenceTest(double nu, std::vector<double> const& tau, double normOfCorrection) const;
188
189 void terminationMessage(int flag);
190 void printNormalStep(double normNormal, double nu) const;
191 void printTangentialStep(double normTangential, double tau) const;
192
193 bool noDamping(double d) const;
194 bool noDamping(std::vector<double> const& tau) const;
195
196 std::unique_ptr<AbstractFunctionSpaceElement> createCorrection(double nu, AbstractFunctionSpaceElement const& normalStep, std::vector<double> const& tau, std::vector<std::shared_ptr<AbstractFunctionSpaceElement> > const& tangentialBasis) const;
197 void addCorrection(AbstractFunctionSpaceElement& v, double nu, AbstractFunctionSpaceElement const& normalStep, std::vector<double> const& tau, std::vector<std::shared_ptr<AbstractFunctionSpaceElement> > const& tangentialBasis) const;
198
199 AbstractFunctional* functionalN = nullptr, * functionalT = nullptr;
200 AbstractScalarProduct &normL, &normC;
201 std::unique_ptr<AbstractChart const> chart = std::unique_ptr<AbstractChart const>(new PrimalChart());
203
204 std::shared_ptr<AbstractLinearization> normalLinearization = nullptr, tangentialLinearization = nullptr;
205 AbstractCompositeStepErrorEstimator* errorEstimator = nullptr;
206 AbstractHierarchicalErrorEstimator* hbErrorEstimator = nullptr;
207 AbstractNormalDirection* normalDirection = nullptr;
208 AbstractTangentialSpace* tangentSpace = nullptr;
209 int verbose = 0;
210 std::string csPre = std::string("COMPOSITE STEP: ");
211 std::unique_ptr<AbstractFunctionSpaceElement> iterate;
212
213 // algorithmic parameters
214 double dampingFactorTolerance = 1e-2;
215 double normalStepComputationTime = 0, tangentialStepComputationTime = 0;
216
217 // internal variables
218 double normOfLastCorrection = -1., normOfLastCorrection_Undamped = -1., normOfIterate = 0;
219
222 public:
223 size_t step = 0;
224 };
225
226} // namespace Kaskade
227#endif
Interfaces for function space oriented algorithms.
Representation of an error estimator.
Abstract Vector for function space algorithms.
AbstractFunctionSpaceElement & axpy_role(double alpha, AbstractFunctionSpaceElement const &l, std::string const role)
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.
Base class for algorithms. Provides a unified interface and some simple wrapper routines,...
void axpy(Y &out, X const &in, Scalar alpha=1.0, int nvectors=1) const
Matrix-vector multiplication: out += alpha * (*this) * in.
Definition: triplet.hh:262
void solve(AbstractFunctional &fN, AbstractFunctional &fT, AbstractFunctionSpaceElement &x, AbstractHierarchicalErrorEstimator &hbErrorEstimator_)
Solve the system f=0 with starting value x. On (successful) exit, the solution is x,...
void solve(AbstractFunctional &fN, AbstractFunctional &fT, AbstractFunctionSpaceElement &x)
Solve the system f=0 with starting value x. On (successful) exit, the solution is x,...
Optimization(AbstractNormalDirection &normalSolver, AbstractTangentialSpace &tangentSpace_, AbstractScalarProduct &nL, OptimizationParameters const &p_, double omegaCinit=1, double omegaLinit=1, int verbose=1)
Create Newton's Method, providing a solver, a norm and algorithmic parameters.
Optimization(AbstractScalarProduct &nL, AbstractScalarProduct &nC, AbstractChart const &chart_, OptimizationParameters const &p_, AbstractCompositeStepErrorEstimator *errorEstimator_, int verbose=1)
Create Newton's Method, providing a solver, a norm and algorithmic parameters.
Optimization(AbstractNormalDirection &normalSolver, AbstractScalarProduct &nL, AbstractScalarProduct &nC, AbstractChart const &chart_, OptimizationParameters const &p_, int verbose=1)
void solve(AbstractFunctional &f, AbstractFunctionSpaceElement &x, AbstractHierarchicalErrorEstimator &errorEstimator)
OptimizationParameters & operator=(OptimizationParameters const &)=default
OptimizationParameters(double desiredAccuracy_, int maxSteps_)
void setThetaAim(double theta)
void setThetas(double thetaNormal, double thetaAim, double thetaMax)
void setThetaNormal(double theta)
void setThetaMax(double theta)
OptimizationParameters(OptimizationParameters const &)=default
std::unique_ptr< AbstractChart > clone() const
void addPerturbation(AbstractFunctionSpaceElement &newIterate, AbstractFunctionSpaceElement const &perturbation, AbstractLinearization const &lin, std::vector< std::shared_ptr< AbstractFunctionSpaceElement > > basis=std::vector< std::shared_ptr< AbstractFunctionSpaceElement > >()) const
Abstract base class for a sparse linear system.
Definition: linearsystem.hh:30
virtual void getMatrixBlocks(MatrixAsTriplet< double > &mat, int rbegin, int rend, int colbegin, int colend) const =0
Return matrix blocks of the linear system in triplet format.
OutIter vectorToSequence(double x, OutIter iter)
Definition: crsutil.hh:30
Bridge classes that connect low level FE algorithms to higher level algorithms.
virtual void setOrigin(AbstractLinearization const &linearization)
Definition: optimization.hh:25
virtual double operator()(AbstractFunctionSpaceElement const &v, AbstractFunctionSpaceElement const &w) const
Definition: optimization.hh:32