00001
00002
00008 #if !defined(__numerical_FunctionWithQuadraticPenalty_h__)
00009 #define __numerical_FunctionWithQuadraticPenalty_h__
00010
00011
00012 #if defined(DEBUG_numerical) && !defined(DEBUG_FunctionWithQuadraticPenalty)
00013 #define DEBUG_FunctionWithQuadraticPenalty
00014 #endif
00015
00016 #include "../defs.h"
00017
00018 #include <functional>
00019
00020 #include <cassert>
00021
00022 BEGIN_NAMESPACE_NUMERICAL
00023
00025
00032 template <int N, class Function, class Constraint,
00033 typename T = typename Function::result_type,
00034 typename Point = typename Function::argument_type>
00035 class FunctionWithQuadraticPenalty :
00036 public std::unary_function<Point,T>
00037 {
00038 private:
00039
00040 typedef std::unary_function<Point,T> base_type;
00041
00042 public:
00043
00044
00045
00046
00047
00049 typedef typename base_type::argument_type argument_type;
00050
00052 typedef typename base_type::result_type result_type;
00053
00054 private:
00055
00056
00057
00058
00059
00060
00061 typedef Function function_type;
00062
00063
00064 typedef Constraint constraint_type;
00065
00066
00067 typedef result_type number_type;
00068
00069
00070 typedef argument_type point_type;
00071
00072 private:
00073
00074
00075
00076
00077
00078
00079 const function_type& _function;
00080
00081
00082 const constraint_type& _constraint;
00083
00084
00085 mutable number_type _penalty_parameter;
00086
00087
00088 mutable number_type _reduction_factor;
00089
00090
00091
00092
00093
00094
00095 FunctionWithQuadraticPenalty();
00096
00097
00098 FunctionWithQuadraticPenalty&
00099 operator=( const FunctionWithQuadraticPenalty& );
00100
00101 public:
00102
00103
00105
00106
00108 FunctionWithQuadraticPenalty( const function_type& function,
00109 const constraint_type& constraint,
00110 const number_type penalty_parameter = 1,
00111 const number_type reduction_factor = 0.1 );
00112
00114 FunctionWithQuadraticPenalty( const FunctionWithQuadraticPenalty& x );
00115
00117 virtual
00118 ~FunctionWithQuadraticPenalty()
00119 {}
00120
00121
00122
00124
00125
00127 result_type
00128 operator()( const argument_type& x ) const;
00129
00131 void
00132 gradient( const argument_type& x, argument_type& gradient ) const;
00133
00134
00135
00137
00138
00140 const function_type&
00141 function() const
00142 {
00143 return _function;
00144 }
00145
00147 const constraint_type&
00148 constraint() const
00149 {
00150 return _constraint;
00151 }
00152
00154 number_type
00155 penalty_parameter() const
00156 {
00157 return _penalty_parameter;
00158 }
00159
00161 number_type
00162 reduction_factor() const
00163 {
00164 return _reduction_factor;
00165 }
00166
00167
00168
00170
00171
00173 void
00174 increase_penalty() const
00175 {
00176 _penalty_parameter *= _reduction_factor;
00177 }
00178
00180 void
00181 set_penalty_parameter( const number_type penalty_parameter ) const
00182 {
00183 _penalty_parameter = penalty_parameter;
00184 }
00185
00187 void
00188 set_reduction_factor( const number_type reduction_factor ) const
00189 {
00190 _reduction_factor = reduction_factor;
00191 }
00192
00193
00194 };
00195
00196 END_NAMESPACE_NUMERICAL
00197
00198 #define __FunctionWithQuadraticPenalty_ipp__
00199 #include "FunctionWithQuadraticPenalty.ipp"
00200 #undef __FunctionWithQuadraticPenalty_ipp__
00201
00202 #endif