KrisLibrary  1.0.0
InequalityConstraint.h
1 #ifndef MATH_INEQUALITY_CONSTRAINT_H
2 #define MATH_INEQUALITY_CONSTRAINT_H
3 
4 #include "function.h"
5 #include "matrix.h"
6 #include <KrisLibrary/utils/DirtyData.h>
7 #include <vector>
8 
9 namespace Math {
12 
21 {
22 public:
23  virtual ~InequalityConstraint() {}
24  virtual int NumDimensions() const;
25 
26  //default implementation assumes constraints are independent
27  virtual Real Margin(const Vector& x,int& minConstraint);
28  virtual bool Satisfies(const Vector& x,Real d=Zero);
29  virtual bool Satisfies_i(const Vector& x,int i,Real d=Zero);
30 
36  virtual void LineSearch(const Vector& x0,const Vector& dx,Real& u);
37  virtual void LineSearch_i(const Vector& x0,const Vector& dx,Real& u,int i);
38  virtual void LineSearch_j(const Vector& x0,int j,Real& u);
39 
42  virtual bool Push(Vector& x,Real d);
43  virtual bool Push_i(Vector&,int i,Real d);
44 };
45 
47 {
48 public:
49  virtual std::string Label() const;
50  virtual std::string Label(int i) const;
51  virtual int NumDimensions() const;
52  virtual void PreEval(const Vector& x);
53  virtual void Eval(const Vector& x, Vector& v);
54  virtual Real Eval_i(const Vector& x,int i);
55  virtual void Jacobian(const Vector& x,Matrix& J);
56  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
57  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
58  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
59  virtual Real Margin(const Vector& x,int& minConstraint);
60  virtual bool Satisfies(const Vector& x,Real d=Zero);
61  virtual bool Satisfies_i(const Vector& x,int i,Real d=Zero);
62  virtual void LineSearch(const Vector& x0,const Vector& dx,Real& u);
63  virtual void LineSearch_i(const Vector& x0,const Vector& dx,Real& u,int i);
64  virtual bool Push(Vector& x,Real d);
65  virtual bool Push_i(Vector& x,int i,Real d);
66 
67  int GetConstraint(int &i) const;
68 
69  std::vector<InequalityConstraint*> constraints;
70 };
71 
73 {
74 public:
75  LimitConstraint(const Vector& bmin,const Vector& bmax);
76  virtual std::string Label() const { return "<x within limits>"; }
77  virtual int NumDimensions() const;
78  virtual void Eval(const Vector& x,Vector& v);
79  virtual Real Eval_i(const Vector& x,int i);
80  virtual void Jacobian(const Vector& x,Matrix& J);
81  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
82  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
83  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
84  virtual Real Margin(const Vector& x,int& minConstraint);
85  virtual bool Satisfies(const Vector& x,Real d=Zero);
86  virtual bool Satisfies_i(const Vector& x,int i,Real d=Zero);
87  virtual void LineSearch(const Vector& x0,const Vector& dx,Real& u);
88  virtual void LineSearch_i(const Vector& x0,const Vector& dx,Real& u,int i);
89  virtual void LineSearch_j(const Vector& x0,int j,Real& u);
90  virtual bool Push(Vector& x,Real d);
91  virtual bool Push_i(Vector& x,int i,Real d);
92 
93  const Vector &bmin,&bmax;
94 };
95 
99 {
100 public:
101  LinearConstraint(const Matrix& A,const Vector& b);
102 
103  virtual std::string Label() const { return "<Ax>=b>"; }
104  virtual int NumDimensions() const { return A.m; }
105  virtual void Eval(const Vector& x, Vector& v);
106  virtual Real Eval_i(const Vector& x,int i);
107  virtual void Jacobian(const Vector& x,Matrix& J);
108  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji);
109  virtual Real Jacobian_ij(const Vector& x,int i,int j);
110  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi);
111  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v);
112  virtual bool Satisfies_i(const Vector& x,int i,Real d=Zero);
113  //can perform the line search analytically
114  virtual void LineSearch (const Vector& x0,const Vector& dx,Real& u);
115  virtual void LineSearch_i(const Vector& x0,const Vector& dx,Real& u,int i);
116  //can perform the push operation nearly analytically
117  virtual bool Push(Vector& x,Real d=Zero);
118 
119  const Matrix& A;
120  const Vector& b;
121 };
122 
126 {
128  {}
129  virtual ~InequalityConstraintAdaptor() {}
130  virtual std::string Label() const { return f.Label(); }
131  virtual std::string Label(int i) const { return f.Label(i); }
132  virtual int NumDimensions() const { return f.NumDimensions(); }
133  virtual void PreEval(const Vector& x) { f.PreEval(x); }
134  virtual void Eval(const Vector& x, Vector& v) { f.Eval(x,v); }
135  virtual Real Eval_i(const Vector& x,int i) { return f.Eval_i(x,i); }
136  virtual void Jacobian(const Vector& x,Matrix& J) { f.Jacobian(x,J); }
137  virtual void Jacobian_i(const Vector& x,int i,Vector& Ji) { f.Jacobian_i(x,i,Ji); }
138  virtual void Hessian_i(const Vector& x,int i,Matrix& Hi) { f.Hessian_i(x,i,Hi); }
139  virtual void DirectionalDeriv(const Vector& x,const Vector& h,Vector& v) {f.DirectionalDeriv(x,h,v); }
140 
141  virtual Real Margin(const Vector& x,int& minConstraint) { return f.Margin(x,minConstraint); }
142  virtual bool Satisfies(const Vector& x,Real d=Zero) { return f.Satisfies(x,d); }
143  virtual bool Satisfies_i(const Vector& x,int i,Real d=Zero) { return f.Satisfies_i(x,i,d); }
144  virtual void LineSearch(const Vector& x0,const Vector& dx,Real& u) { f.LineSearch(x0,dx,u); }
145  virtual void LineSearch_i(const Vector& x0,const Vector& dx,Real& u,int i) { f.LineSearch_i(x0,dx,u,i); }
146  virtual void LineSearch_j(const Vector& x0,int j,Real& u) { f.LineSearch_j(x0,j,u); }
147 
148  virtual bool Push(Vector& x,Real d) { return f.Push(x,d); }
149  virtual bool Push_i(Vector& x,int i,Real d) { return f.Push_i(x,i,d); }
150 
152 };
153 
155 } //namespace Math
156 
157 #endif
Abstract base classes for function interfaces.
A function from R^n to R^m.
Definition: function.h:134
Definition: InequalityConstraint.h:72
virtual bool Push(Vector &x, Real d)
Definition: InequalityConstraint.h:148
constraint represented as A*x >= b i.e. constraint value is A*x-b
Definition: InequalityConstraint.h:98
virtual bool Push(Vector &x, Real d)
Definition: InequalityConstraint.cpp:150
virtual void LineSearch(const Vector &x0, const Vector &dx, Real &u)
Definition: InequalityConstraint.h:144
A class that makes it easier to construct "plugin" classes to alter constraint behavior.
Definition: InequalityConstraint.h:125
Definition: InequalityConstraint.h:46
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
A vector field with constraints s.t. ci(x) >= 0.
Definition: InequalityConstraint.h:20
virtual void LineSearch(const Vector &x0, const Vector &dx, Real &u)
Definition: InequalityConstraint.cpp:56