00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MATH_LINEAR_OPERATOR_INCLUDE
00013 #define MATH_LINEAR_OPERATOR_INCLUDE
00014
00015 #ifdef __GXX_CONCEPTS__
00016 # include <concepts>
00017 #else
00018 # include <boost/numeric/linear_algebra/pseudo_concept.hpp>
00019 #endif
00020
00021 namespace math {
00022
00027 #ifdef __GXX_CONCEPTS__
00028 concept LinearOperator<typename Operator, typename VectorDomain, typename VectorImage>
00029 {
00030 requires VectorSpace<VectorDomain>;
00031 requires VectorSpace<VectorImage>;
00032
00033 typename result_type;
00034 result_type operator* (Operator, VectorDomain);
00035
00036 typename assign_type;
00037 assign_type operator= (VectorImage, result_type);
00038
00039
00040 typename plus_assign_type;
00041 plus_assign_type operator+= (VectorImage, result_type);
00042
00043 typename minus_assign_type;
00044 minus_assign_type operator-= (VectorImage, result_type);
00045
00046 axiom Addability(Operator a, VectorDomain x, VectorDomain y)
00047 {
00048 a * (x + y) == a*x + a*y;
00049 }
00050
00051
00052 axiom Scalability(Operator a, VectorSpace<VectorDomain>::scalar_type alpha, VectorDomain x)
00053 {
00054 a * (alpha * x) == alpha * (a * x);
00055 }
00056 };
00057 #else
00058
00059
00128 template <typename Operator, typename VectorDomain, typename VectorImage>
00129 struct LinearOperator
00130 {
00132 typedef associated_type result_type;
00134 result_type operator* (Operator, VectorDomain);
00135
00137
00138 typedef associated_type assign_type;
00140 assign_type operator= (VectorImage, result_type);
00141
00142
00144
00145 typedef associated_type plus_assign_type;
00147 plus_assign_type operator+= (VectorImage, result_type);
00148
00149
00151
00152 typedef associated_type minus_assign_type;
00154 minus_assign_type operator+= (VectorImage, result_type);
00155
00157 axiom Addability(Operator a, VectorDomain x, VectorDomain y)
00158 {
00159 a * (x + y) == a*x + a*y;
00160 }
00161
00163 axiom Scalability(Operator a, VectorSpace<VectorDomain>::scalar_type alpha, VectorDomain x)
00164 {
00165 a * (alpha * x) == alpha * (a * x);
00166 }
00167 };
00168 #endif
00169
00170
00171 #ifdef __GXX_CONCEPTS__
00172 concept SelfAdjointOperator<typename Operator, typename VectorDomain, typename VectorImage>
00173 : LinearOperator<Operator, VectorDomain, VectorImage>
00174 {};
00175 #else
00176
00177
00187 template <typename Operator, typename VectorDomain, typename VectorImage>
00188 struct SelfAdjointOperator
00189 : LinearOperator<Operator, VectorDomain, VectorImage>
00190 {};
00191 #endif
00192
00193
00194 #ifdef __GXX_CONCEPTS__
00195 concept RealOperator<typename Operator, typename VectorDomain, typename VectorImage>
00196 : LinearOperator<Operator, VectorDomain, VectorImage>
00197 {};
00198 #else
00199
00200
00210 template <typename Operator, typename VectorDomain, typename VectorImage>
00211 struct RealOperator
00212 : LinearOperator<Operator, VectorDomain, VectorImage>
00213 {};
00214 #endif
00215
00216
00217 #ifdef __GXX_CONCEPTS__
00218 concept SymmetricOperator<typename Operator, typename VectorDomain, typename VectorImage>
00219 : SelfAdjointOperator<Operator, VectorDomain, VectorImage>,
00220 RealOperator<Operator, VectorDomain, VectorImage>
00221 {};
00222 #else
00223
00224
00235 template <typename Operator, typename VectorDomain, typename VectorImage>
00236 struct SymmetricOperator
00237 : SelfAdjointOperator<Operator, VectorDomain, VectorImage>,
00238 RealOperator<Operator, VectorDomain, VectorImage>
00239 {};
00240 #endif
00241
00243
00244 }
00245
00246 #endif // MATH_LINEAR_OPERATOR_INCLUDE