KrisLibrary  1.0.0
vectorfunction.h
Go to the documentation of this file.
1 #ifndef MATH_VECTOR_FUNCTION_H
2 #define MATH_VECTOR_FUNCTION_H
3 
4 #include "function.h"
5 #include "vector.h"
6 #include "matrix.h"
7 #include <memory>
8 #include <vector>
9 #include <assert.h>
10 
16 namespace Math {
17 
20 
29 {
30 public:
31  ScalarFieldDirectionalFunction(ScalarFieldFunction& _f,const Vector& x,const Vector& n,bool ref=false);
32  virtual std::string Label() const;
33  virtual void PreEval(Real t);
34  virtual Real Eval(Real t);
35  virtual Real Deriv(Real t);
36  virtual Real Deriv2(Real t);
37  virtual const Vector& LastEvaluation() const { return tmp; }
38 
39 private:
41  Vector x;
42  Vector n;
43  Vector tmp;
44 };
45 
53 {
54 public:
56  virtual std::string Label() const;
57  virtual void PreEval(Real t);
58  virtual Real Eval(Real t);
59  virtual Real Deriv(Real t);
60  virtual Real Deriv2(Real t);
61 
62 private:
64  Real xi0;
65  int i;
66  Vector tmp;
67 };
68 
73 {
74 public:
75  LinearScalarFieldFunction(const Vector& _a,Real _b,bool ref=false) {
76  if(ref) {
77  a.setRef(_a);
78  b = _b;
79  }
80  else {
81  a=_a;
82  b=_b;
83  }
84  }
85 
86  virtual std::string Label() const { return "<a^t*x+b>"; }
87  virtual Real Eval(const Vector& x) { return a.dot(x)+b; }
88  virtual void Gradient(const Vector& x,Vector& grad) { grad = a; }
89  virtual Real Gradient_i(const Vector& x,int i) { return a(i); }
90  virtual void Hessian(const Vector& x,Matrix& H) { H.setZero(); }
91  virtual Real Hessian_ij(const Vector& x,int i,int j) { return 0; }
92 
93  Vector a;
94  Real b;
95 };
96 
101 {
102  public:
103  QuadraticScalarFieldFunction(const Matrix& _A,const Vector& _b,Real _c,bool ref=false) {
104  if(ref) {
105  A.setRef(_A);
106  b.setRef(_b);
107  c = _c;
108  }
109  else {
110  A=_A;
111  b=_b;
112  c=_c;
113  }
114  }
115  virtual std::string Label() const { return "[0.5*x'Ax+bx+c]"; }
116  virtual void PreEval(const Vector& x) { A.mul(x,Ax); }
117  virtual Real Eval(const Vector& x) { return Half*x.dot(Ax) + x.dot(b) + c; }
118  virtual void Gradient(const Vector& x,Vector& grad)
119  { grad.add(Ax,b); }
120  virtual Real Gradient_i(const Vector& x,int i)
121  { return Ax(i) + b(i); }
122  virtual Real DirectionalDeriv(const Vector& x,const Vector& h)
123  { return Ax.dot(h) + b.dot(h); }
124  virtual void Hessian(const Vector& x,Matrix& H) { H = A; }
125  virtual Real Hessian_ij(const Vector& x,int i,int j) { return A(i,j); }
126  virtual Real DirectionalDeriv2(const Vector& x,const Vector& h)
127  { Real sum = 0;
128  for(int i=0;i<A.m;i++) sum += h(i)*A.dotRow(i,h);
129  return sum;
130  }
131 
132  Matrix A;
133  Vector b;
134  Real c;
135  //temp
136  Vector Ax;
137 };
138 
141 {
142  virtual std::string Label() const { return "<|x|^2>"; }
143  virtual Real Eval(const Vector& x) { return x.normSquared(); }
144  virtual void Gradient(const Vector& x,Vector& grad) { grad.add(x,x); }
145  virtual Real Gradient_i(const Vector& x,int i) { return Two*x(i); }
146  virtual void Hessian(const Vector& x,Matrix& H) { H.setIdentity(); H.inplaceMul(Two); }
147  virtual Real Hessian_ij(const Vector& x,int i,int j) { return Two*Delta(i,j); }
148 };
149 
152 {
153  NormScalarFieldFunction(Real _degree=Two) : degree(_degree) {}
154  virtual std::string Label() const;
155  virtual void PreEval(const Vector& x);
156  virtual Real Eval(const Vector& x);
157  virtual void Gradient(const Vector& x,Vector& grad);
158  virtual Real Gradient_i(const Vector& x,int i);
159  virtual void Hessian(const Vector& x,Matrix& H);
160  virtual Real Hessian_ij(const Vector& x,int i,int j);
161 
162  Real degree;
163  Real norm;
164 };
165 
168 {
169 public:
170  virtual std::string Label() const { return "<min_i xi>"; }
171  virtual void PreEval(const Vector& x);
172  virtual Real Eval(const Vector& x);
173  virtual void Gradient(const Vector& x,Vector& grad);
174  virtual Real Gradient_i(const Vector& x,int i);
175  virtual void Hessian(const Vector& x,Matrix& H) { H.setZero(); }
176  virtual Real Hessian_ij(const Vector& x,Matrix& H) { return Zero; }
177 
178  Real xmin;
179  int index;
180 };
181 
184 {
185 public:
186  virtual std::string Label() const { return "<max_i xi>"; }
187  virtual void PreEval(const Vector& x);
188  virtual Real Eval(const Vector& x);
189  virtual void Gradient(const Vector& x,Vector& grad);
190  virtual Real Gradient_i(const Vector& x,int i);
191  virtual void Hessian(const Vector& x,Matrix& H) { H.setZero(); }
192  virtual Real Hessian_ij(const Vector& x,Matrix& H) { return Zero; }
193 
194  Real xmax;
195  int index;
196 };
197 
200 {
201 public:
202  ComposeScalarFieldFunction(std::shared_ptr<RealFunction> _f,std::shared_ptr<ScalarFieldFunction> _g) : f(_f), g(_g) {}
203  virtual std::string Label() const;
204  virtual void PreEval(const Vector& x);
205  virtual Real Eval(const Vector& x) { return f->Eval(gx); }
206  virtual void Gradient(const Vector& x,Vector& grad);
207  virtual Real Gradient_i(const Vector& x,int i);
208  virtual void Hessian(const Vector& x,Matrix& H);
209  virtual Real Hessian_ij(const Vector& x,int i,int j);
210 
211  std::shared_ptr<RealFunction> f;
212  std::shared_ptr<ScalarFieldFunction> g;
213  //temp
214  Real gx;
215 };
216 
217 
218 
219 
221 {
222 public:
223  virtual ~Vector3FieldFunction() {}
224  virtual void Curl(const Vector& x,Vector& curl)
225  {
226  assert(x.n==3);
227  curl.resize(3);
228  curl(0)=Jacobian_ij(x,2,1)-Jacobian_ij(x,1,2);
229  curl(1)=Jacobian_ij(x,0,2)-Jacobian_ij(x,2,0);
230  curl(2)=Jacobian_ij(x,1,0)-Jacobian_ij(x,0,1);
231  }
232  virtual int NumDimensions() const { return 3; }
233 };
234 
239 {
240  public:
241  LinearVectorFieldFunction(const Matrix& _A,const Vector& _b,bool ref=false) {
242  if(ref) {
243  A.setRef(_A);
244  b.setRef(_b);
245  }
246  else {
247  A=_A;
248  b=_b;
249  }
250  }
251  virtual std::string Label() const { return "[A*x+b]"; }
252  virtual int NumDimensions() const { return A.m; }
253  virtual void Eval(const Vector& x,Vector& v) { A.mul(x,v); v+=b; }
254  virtual Real Eval_i(const Vector& x,int i) { return A.dotRow(i,x)+b(i); }
255  virtual Real Jacobian_ij(const Vector& x,int i,int j) { return A(i,j); }
256  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji) { A.getRowCopy(i,Ji); }
257  virtual void Jacobian_j(const Vector& x,int j,Vector& Jj) { A.getColCopy(j,Jj); }
258  virtual void Jacobian(const Vector& x,Matrix& J) { J=A; }
259  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v) { A.mul(h,v); }
260  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi) { Hi.setZero(); }
261  virtual Real Hessian_ijk(const Vector& x,int i,int j,int k) { return 0; }
262 
263  Matrix A;
264  Vector b;
265 };
266 
269 {
270 public:
271  Compose_SF_VF_Function(std::shared_ptr<ScalarFieldFunction> _f,std::shared_ptr<VectorFieldFunction> _g) : f(_f), g(_g) {}
272  virtual std::string Label() const;
273  virtual void PreEval(const Vector& x);
274  virtual Real Eval(const Vector& x) { return f->Eval(gx); }
275  virtual void Gradient(const Vector& x,Vector& grad);
276  virtual Real Gradient_i(const Vector& x,int i);
277  virtual void Hessian(const Vector& x,Matrix& H);
278  virtual Real Hessian_ij(const Vector& x,int i,int j);
279 
280  std::shared_ptr<ScalarFieldFunction> f;
281  std::shared_ptr<VectorFieldFunction> g;
282  //temp
283  Vector gx;
284  Vector gradf;
285  Matrix Jg;
286 };
287 
290 {
291 public:
292  Compose_VF_VF_Function(std::shared_ptr<VectorFieldFunction> _f,std::shared_ptr<VectorFieldFunction> _g) : f(_f), g(_g) {}
293  virtual std::string Label() const;
294  virtual void PreEval(const Vector& x);
295  virtual void Eval(const Vector& x,Vector& v) { f->Eval(gx,v); }
296  virtual Real Eval_i(const Vector& x,int i) { return f->Eval_i(gx,i); }
297  virtual void Jacobian(const Vector& x,Matrix& J);
298  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
299  virtual void Jacobian_j(const Vector& x,int j,Vector& Jj);
300 
301  std::shared_ptr<VectorFieldFunction> f;
302  std::shared_ptr<VectorFieldFunction> g;
303  Vector gx;
304  Matrix Jg,Jf;
305 };
306 
310 {
311 public:
312  virtual std::string Label() const;
313  virtual std::string Label(int i) const;
314  virtual int NumDimensions() const;
315  virtual void PreEval(const Vector& x);
316  virtual void Eval(const Vector& x, Vector& v);
317  virtual Real Eval_i(const Vector& x,int i);
318  virtual void Jacobian(const Vector& x,Matrix& J);
319  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
320  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
321  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
322 
323  std::vector<std::shared_ptr<ScalarFieldFunction> > functions;
324 };
325 
328 {
329 public:
331  virtual std::string Label() const;
332  virtual void PreEval(const Vector& x) { f->PreEval(x); }
333  virtual Real Eval(const Vector& x);
334  virtual void Gradient(const Vector& x,Vector& grad);
335 
336 private:
338  int i;
339 };
340 
341 
345 {
346 public:
348  CompositeVectorFieldFunction(std::shared_ptr<VectorFieldFunction> f1,std::shared_ptr<VectorFieldFunction>& f2);
349  CompositeVectorFieldFunction(const std::vector<std::shared_ptr<VectorFieldFunction> >& fs);
350  virtual std::string Label() const;
351  virtual std::string Label(int i) const;
352  virtual int NumDimensions() const;
353  virtual void PreEval(const Vector& x);
354  virtual void Eval(const Vector& x, Vector& v);
355  virtual Real Eval_i(const Vector& x,int i);
356  virtual void Jacobian(const Vector& x,Matrix& J);
357  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
358  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
359  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
360 
361  int GetFunction(int &i) const;
362 
363  std::vector<std::shared_ptr<VectorFieldFunction> > functions;
364 };
365 
368 {
369 public:
370  virtual std::string Label() const;
371  virtual std::string Label(int i) const;
372  virtual int NumDimensions() const;
373  virtual void PreEval(const Vector& x);
374  virtual void Eval(const Vector& x, Vector& v);
375  virtual Real Eval_i(const Vector& x,int i);
376  virtual void Jacobian(const Vector& x,Matrix& J);
377  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
378  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
379  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
380 
381  std::shared_ptr<VectorFieldFunction> function;
382  std::vector<int> xindices,findices;
383 
384  //temp
385  Vector vf,xsub;
386  Matrix Jf;
387 };
388 
391 {
392 public:
393  virtual std::string Label() const;
394  virtual std::string Label(int i) const;
395  virtual int NumDimensions() const;
396  virtual void PreEval(const Vector& x);
397  virtual void Eval(const Vector& x, Vector& v);
398  virtual Real Eval_i(const Vector& x,int i);
399  virtual void Jacobian(const Vector& x,Matrix& J);
400  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
401  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
402  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
403 
404  std::shared_ptr<VectorFieldFunction> function;
405  Vector x0;
406  std::vector<int> xindices;
407 
408  //temp
409  Vector vf,xfull;
410  Matrix Jf;
411 };
412 
413 
416 } //namespace Math
417 
418 #endif
Definition: vectorfunction.h:309
Definition: vectorfunction.h:344
Abstract base classes for function interfaces.
Definition: vectorfunction.h:72
A vector field function h(x) = f(g(x)) (f,g vector fields)
Definition: vectorfunction.h:289
A vector field function f(x) = g(x0 | x0[xindices]=x)
Definition: vectorfunction.h:390
A scalar field h(x) = f(g(x))
Definition: vectorfunction.h:199
A function from R^n to R^m.
Definition: function.h:134
A scalar field function h(x) = f(g(x)) (g vector-valued)
Definition: vectorfunction.h:268
A scalar field min_i xi.
Definition: vectorfunction.h:167
Real Delta(T i, T j)
Kronecker delta.
Definition: math.h:233
A vector field function f(x) = g(x[xindices])[findices].
Definition: vectorfunction.h:367
A function g(x) that returns the i&#39;th component of vector field f(x)
Definition: vectorfunction.h:327
A function from R to R.
Definition: function.h:42
A function from R^n to R.
Definition: function.h:97
Definition: vectorfunction.h:52
Definition: vectorfunction.h:100
A scalar field for the L-d norm, where d is passed into the constructor.
Definition: vectorfunction.h:151
A scalar field max_i xi.
Definition: vectorfunction.h:183
A function g(t) that returns f(x+tn) for a scalar field f(x) If ref is true, then x...
Definition: vectorfunction.h:28
Definition: vectorfunction.h:238
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
Definition: vectorfunction.h:220
A scalar field ||x||^2.
Definition: vectorfunction.h:140