KASKADE 7 development version
searchspace.hh
Go to the documentation of this file.
1#ifndef SEARCHSPACE_HH
2#define SEARCHSPACE_HH
3
4#include <memory>
6#include "opt_interface.hh"
7#include "algorithm_base.hh"
8#include "istl/matrix.hh"
10#include <vector>
11#include "dune/common/fmatrix.hh"
12
13
14namespace Kaskade
15{
16
25{
26public:
27 SearchSpaceCreator(AbstractTangentialSolver* tangentialSolver_,AbstractNormalSolver* normalSolver_):
28 tangentialSolver(tangentialSolver_),normalSolver(normalSolver_), normalactive(false) {};
29
30
31 virtual ~SearchSpaceCreator() {};
32 int getMaxDimension() const
33 {
34 int dim=0;
35 if(tangentialSolver) dim+=tangentialSolver->nSolutionVectors();
36 if(normalSolver) dim+=1;
37 return dim;
38 };
39
40 AbstractNormalSolver* getNormalSolver() { return normalSolver; }
41 AbstractTangentialSolver* getTangentialSolver() { return tangentialSolver; }
42
43 int getDimension() const
44 {
45 return currentdimension;
46 };
47
48 bool normalFactorizationPresent() {return normalactive;}
49
50 bool hasEqualityConstraints() { return (normalSolver!=0); }
51 bool hasNontrivialFunctional() { return (tangentialSolver!=0); }
52
53 virtual void computeBasisVectors(std::vector<AbstractFunctionSpaceElement *>& basisVectors,
55 AbstractLinearization& normalLinearization,
56 AbstractFunctional& tangentialFunctional,
57 std::unique_ptr<AbstractLinearization>& tangentialLinearization,
58 AbstractNorm const& norm,
59 double ThetaAim,
60 double omegaC,
61 double omegaL,
62 double omegaH,
63 int report,
64 double& nu0,
65 double& normNormal);
66 void getLinearCombination(std::vector<AbstractFunctionSpaceElement *>& basisVectors, std::vector<double>const & coefficients, AbstractFunctionSpaceElement& result) const;
67
68private:
69
70 AbstractTangentialSolver* tangentialSolver;
71 AbstractNormalSolver* normalSolver;
72 bool normalactive;
73 int currentdimension;
74};
75
76
77
80{
81public:
82
85
87
88 CUBThetaModelFunction(AbstractLinearization const& linT, AbstractLinearization const& linN, std::vector<AbstractFunctionSpaceElement* >& basis, AbstractScalarProduct& scL, AbstractScalarProduct& scC, SearchSpaceCreator& sp);
89
91 AbstractLinearization const& linN,
92 std::vector<AbstractFunctionSpaceElement *>& basis,
95 AbstractTangentialSolver const* tS,
97 bool useHessianAsNorm);
98
99
100template<class Paras>
101void reparametrize(double omegaL_,double omegaC_, double gamma_, Paras p)
102 {
103 omegaL=omegaL_;
104 omegaC=omegaC_;
105 gamma=gamma_;
106 aimContraction = p.ThetaAim/p.safetyFactor;
107 normalContraction = p.ThetaNormal/p.safetyFactor;
108 alpha = p.alpha;
109 }
110
111 // minimize functional
112 void getMinimalCoefficients(std::vector<double>& coeff);
113
114// Interface to UNCMIN
115virtual double evalModel(std::vector<double> & iterate)
116 {
117 double d= eval(iterate,0.0,0.0,0.0);
118// d -= 0.5*(computeblf(normblf,iterate,iterate)-computeblf(norm2blf,iterate,iterate));
119 return d;
120 }
121
122 virtual double evalRegModel(std::vector<double> & iterate, double omegaL)
123 {
124 double d= eval(iterate,omegaL,0.0,0.0);
125// d -= 0.5*(computeblf(normblf,iterate,iterate)-computeblf(norm2blf,iterate,iterate));
126 return d;
127 }
128
129
130virtual double eval(std::vector<double> & iterate, double oL, double oC, double g, double soscale=1.0,double foscale=1.0,double alpha=1.0)
131 {
132 if(fixednu && iterate.size()<sz) iterate.push_back(lopt);
133 double f(0.0);
135 {
136 // f'dx
137 f += foscale*dot(gradientcoeff, iterate);
138 // f''dx^2 blf = bilinear form
139 f += soscale*0.5*computeblf(hessianblf,iterate,iterate);
140 double np3=std::pow(std::fabs(computeblf(normMblf,iterate,iterate)),1.5);
141 f += oL/6.0*np3;
142 }
143 f *= alpha;
144
145 // barrier term instead of trust region
146 if(normalstep && g != 0.0)
147 f -= g*std::log(compute_barrier_arg(iterate,oC));
148 return f;
149 }
150
151 // Function to minimize
153 {
154 std::vector<double> iterate(p.data);
155 double f=eval(iterate,omegaL,omegaC,gamma,1.0,1.0,alpha);
156 return f;
157 }
158
159 // Gradient of function to minimize
160virtual void gradient(dvec &p, dvec &g)
161 {
162 std::vector<double> iterate(p.data);
163 if(fixednu && iterate.size()<sz) iterate.push_back(1.0);
164 std::vector<double> v(sz),w(sz),w2(sz);
165
166 MatMultiply(hessianblf,iterate,v);
167
168 MatMultiply(normMblf,iterate,w);
169 MatMultiply(normCblf,iterate,w2);
170
171 double f=std::pow(std::fabs(computeblf(normMblf,iterate,iterate)),0.5);
172 double normCiter=std::pow(std::fabs(computeblf(normCblf,iterate,iterate)),0.5);
173
174 if(tangentialstep)
175 for(int i=0; i<g.data.size();++i)
176 g.data[i]=alpha*(gradientcoeff[i]+v[i]+0.5*omegaL*f*w[i]);
177 else
178 for(int i=0; i<g.data.size();++i)
179 g.data[i]=0.0;
180
181 if(normalstep)
182 {
183 double b=-gamma/compute_barrier_arg(iterate,omegaC);
184 for(int i=0; i<g.data.size();++i)
185 g.data[i]-=b*omegaC/2.0*w2[i]/normCiter;
186 }
187 }
188
189 // Hessian not used in this example
190 void hessian(dvec /* &x */, dmat /* &h */) {}
191
192 // Indicates analytic gradient is used
193virtual int HasAnalyticGradient() {return 1;}
194
195 // Indicates analytic hessian is not used
196 int HasAnalyticHessian() {return 0;}
197
198 // Any real vector will contain valid parameter values
199virtual int ValidParameters(dvec &x) {
200 std::vector<double> iterate(x.data);
201 if(fixednu && iterate.size()<sz) iterate.push_back(lopt);
202 return (!normalstep) || compute_barrier_arg(iterate,omegaC)>0;
203 }
204
205 // Dimension of problem
206 int dim() {return sz-(fixednu==true && normalstep);}
207
208
209 double normC(std::vector<double>& coeff)
210 {
211 return std::sqrt(std::fabs(computeblf(normCblf,coeff,coeff)));
212 }
213
214 double normL(std::vector<double>& coeff)
215 {
216 return std::sqrt(std::fabs(computeblf(normLblf,coeff,coeff)));
217 }
218
219 double normH(std::vector<double>& coeff)
220 {
221 return std::sqrt(std::fabs(computeblf(normHblf,coeff,coeff)));
222 }
223
224protected:
225
226 void MatMultiply(SLAPMatrix<double>& mat, std::vector<double>& in, std::vector<double>& out)
227 {
228 if(in.size() < mat.cols() || out.size() < mat.rows())
229 {
230 std::vector<double> in2(mat.cols(),0.0), out2(mat.rows(),0.0);
231 for(int i=0; i<in.size();++i)
232 in2[i]=in[i];
233 MatrixMultiply(mat,in2,out2);
234 for(int i=0; i<out.size();++i)
235 out[i]=out2[i];
236 }
237 else
238 MatrixMultiply(mat,in,out);
239 }
240
241 double computeblf(SLAPMatrix<double>& blf, std::vector<double>& left, std::vector<double>& right)
242 {
243 std::vector<double> Ar(left.size());
244 MatMultiply(blf,right, Ar);
245 return dot(Ar,left);
246 }
247
248 // Function to minimize
249 double compute_barrier_arg(std::vector<double> &iterate, double oC)
250 {
251 double normIter=std::pow(std::fabs(computeblf(normCblf,iterate,iterate)),0.5);
252 double barg(aimContraction);
253 barg -= oC/2 * normIter;
254 return barg;
255 }
256
257 double dot(std::vector<double>const& v1,std::vector<double>const& v2)
258 {
259 double sum(0.0);
260 for(int i=0; i<v1.size(); ++i)
261 sum+=v1[i]*v2[i];
262 return sum;
263 }
264 void debugInfo();
265
267
270 std::vector<double> gradientcoeff;
271 double omegaL, omegaC;
272 double gamma;
274 double scalef,lopt;
276 bool const normalstep;
277 bool const tangentialstep;
278};
279
280} // namespace Kaskade
281#endif
282
283
Interfaces for function space oriented algorithms.
Abstract Vector for function space algorithms.
Representation of a nonlinear functional.
For optimization with cubic upper bounds method.
Definition: searchspace.hh:80
double normL(std::vector< double > &coeff)
Definition: searchspace.hh:214
double normC(std::vector< double > &coeff)
Definition: searchspace.hh:209
double compute_barrier_arg(std::vector< double > &iterate, double oC)
Definition: searchspace.hh:249
CUBThetaModelFunction(AbstractLinearization const &linT, AbstractLinearization const &linN, std::vector< AbstractFunctionSpaceElement * > &basis, AbstractScalarProduct &scL, AbstractScalarProduct &scC, SearchSpaceCreator &sp)
CUBThetaModelFunction(AbstractLinearization const &linT, AbstractLinearization const &linN, std::vector< AbstractFunctionSpaceElement * > &basis, AbstractScalarProduct &scL, AbstractScalarProduct &scC, AbstractTangentialSolver const *tS, SearchSpaceCreator &sp, bool useHessianAsNorm)
virtual void gradient(dvec &p, dvec &g)
Definition: searchspace.hh:160
SLAPMatrix< double, 1 > dmat
Definition: searchspace.hh:84
void getMinimalCoefficients(std::vector< double > &coeff)
double dot(std::vector< double >const &v1, std::vector< double >const &v2)
Definition: searchspace.hh:257
double computeblf(SLAPMatrix< double > &blf, std::vector< double > &left, std::vector< double > &right)
Definition: searchspace.hh:241
virtual double evalModel(std::vector< double > &iterate)
Definition: searchspace.hh:115
SLAPMatrix< double > normMblf
Definition: searchspace.hh:269
std::vector< double > gradientcoeff
Definition: searchspace.hh:270
virtual int ValidParameters(dvec &x)
Definition: searchspace.hh:199
virtual double eval(std::vector< double > &iterate, double oL, double oC, double g, double soscale=1.0, double foscale=1.0, double alpha=1.0)
Definition: searchspace.hh:130
virtual double evalRegModel(std::vector< double > &iterate, double omegaL)
Definition: searchspace.hh:122
double normH(std::vector< double > &coeff)
Definition: searchspace.hh:219
SLAPMatrix< double > normLblf
Definition: searchspace.hh:269
SLAPMatrix< double > hessianblf
Definition: searchspace.hh:269
void MatMultiply(SLAPMatrix< double > &mat, std::vector< double > &in, std::vector< double > &out)
Definition: searchspace.hh:226
SLAPMatrix< double > normHblf
Definition: searchspace.hh:269
SLAPMatrix< double > normCblf
Definition: searchspace.hh:269
void reparametrize(double omegaL_, double omegaC_, double gamma_, Paras p)
Definition: searchspace.hh:101
SLAPMatrix< double > ablf
Definition: searchspace.hh:269
Very simple dense matrix class for interfacing with LAPACK routines and the optimization tool uncmin.
int rows() const
Rows.
int cols() const
Columns.
virtual void computeBasisVectors(std::vector< AbstractFunctionSpaceElement * > &basisVectors, AbstractFunctionSpaceElement &iterate, AbstractLinearization &normalLinearization, AbstractFunctional &tangentialFunctional, std::unique_ptr< AbstractLinearization > &tangentialLinearization, AbstractNorm const &norm, double ThetaAim, double omegaC, double omegaL, double omegaH, int report, double &nu0, double &normNormal)
void getLinearCombination(std::vector< AbstractFunctionSpaceElement * > &basisVectors, std::vector< double >const &coefficients, AbstractFunctionSpaceElement &result) const
SearchSpaceCreator(AbstractTangentialSolver *tangentialSolver_, AbstractNormalSolver *normalSolver_)
Definition: searchspace.hh:27
AbstractNormalSolver * getNormalSolver()
Definition: searchspace.hh:40
AbstractTangentialSolver * getTangentialSolver()
Definition: searchspace.hh:41
Very simple vector wrapper for the use of the optimization tool uncmin, which is not capable of using...
std::vector< double > data
void MatrixMultiply(SLAPMatrix< double > A, std::vector< double > &in, std::vector< double > &out)
Matrix multiplication.
Simple interface to acml (AMD Core Math Library), to be augmented.