00001 #ifndef ML_EXPRESSIONS_H
00002 #define ML_EXPRESSIONS_H
00003
00004 #include "MLAPI_LinearCombinations.h"
00005
00006 namespace MLAPI {
00007
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00028
00029 #ifndef MLAPI_LC
00030 MultiVectorCombination operator+(const MultiVector& x, const MultiVector& y);
00031
00032 LinearCombinationAdd operator+(const BaseLinearCombination& left,
00033 const BaseLinearCombination& right);
00034
00035 LinearCombinationMixed operator+(const BaseLinearCombination& left,
00036 const MultiVector& right);
00037
00038 LinearCombinationMixed operator+(const MultiVector& left,
00039 const BaseLinearCombination& right);
00040
00041
00043
00044
00045 MultiVectorCombination operator+(const MultiVectorScaled& left,
00046 const MultiVectorScaled& right);
00047
00048
00050
00051
00052 Residual operator+(const MultiVectorScaled& left,
00053 const BaseOperatorTimesMultiVector& right);
00054
00055
00057
00058
00059 Residual operator+(const MultiVector& left,
00060 const BaseOperatorTimesMultiVector& right);
00061
00062
00064
00065
00066 MultiVectorCombination operator+(const MultiVectorScaled& left,
00067 const MultiVectorScaled& right);
00068
00069
00071
00072
00073 Residual operator+(const MultiVectorScaled& left,
00074 const BaseOperatorTimesMultiVector& right);
00075
00076
00078
00079
00080 Residual operator+(const MultiVector& left,
00081 const BaseOperatorTimesMultiVector& right);
00082
00083
00084
00085
00086
00087
00089
00090
00091 MultiVectorCombination operator-(const MultiVector& x, const MultiVector& y);
00092
00093 LinearCombinationAdd operator-(const BaseLinearCombination& left,
00094 const BaseLinearCombination& right);
00095
00096 LinearCombinationMixed operator-(const BaseLinearCombination& left,
00097 const MultiVector& right);
00098
00099 LinearCombinationMixed operator-(const MultiVector& left,
00100 const BaseLinearCombination& right);
00101
00102
00104
00105
00106 Residual operator-(const MultiVector& left,
00107 const BaseOperatorTimesMultiVector& right);
00108 #else
00109 inline
00110 MultiVector operator+(const MultiVector& x, const MultiVector& y)
00111 {
00112 MultiVector res(x.GetVectorSpace(), y.GetNumVectors());
00113 res.Update(1.0, x, 1.0, y);
00114 return(res);
00115 }
00116
00117 inline
00118 MultiVector operator-(const MultiVector& x, const MultiVector& y)
00119 {
00120 MultiVector res(x.GetVectorSpace(), y.GetNumVectors());
00121 res.Update(1.0, x, -1.0, y);
00122 return(res);
00123 }
00124
00125 inline
00126 MultiVector operator*(const Operator& A, const MultiVector& y)
00127 {
00128 MultiVector res(A.GetOperatorRangeSpace(), y.GetNumVectors());
00129 A.Apply(y, res);
00130 return(res);
00131 }
00132 #endif
00133
00134
00136
00137
00138 MultiVector operator+(const MultiVector& x, const double alpha);
00139
00140
00142
00143
00144 MultiVector operator+(const double alpha, const MultiVector& x);
00145
00146
00148
00149
00150 MultiVector operator-(const MultiVector& x, const double alpha);
00151
00152
00154
00155
00156 MultiVector operator-(const double alpha, const MultiVector& x);
00157
00158 #if 0
00159
00161
00162
00163 MultiVector operator+= (const double alpha);
00164
00165
00167
00168
00169 MultiVector operator-= (const double alpha);
00170 #endif
00171
00172
00174
00175
00176 Operator operator+(const Operator& A, const Operator& B);
00177
00178
00180
00181
00182 Operator operator-(const Operator& A, const Operator& B);
00183
00184
00186
00187
00188 Operator operator*(const Operator& A, const Operator& B);
00189
00190
00192
00193
00194 Operator operator*(const Operator& A, const double alpha);
00195
00196
00198
00199
00200 Operator operator*(const double alpha, const Operator& A);
00201
00202
00204
00205
00206 inline Operator operator/(const Operator& A, const double alpha)
00207 {
00208 return(A * (1.0 / alpha));
00209 }
00210
00211
00213
00214
00215 MultiVector operator*(const MultiVector& x, const double alpha);
00216
00217 inline MultiVector operator*(const double alpha, const MultiVector&x)
00218 {
00219 return(x * alpha);
00220 }
00221
00222
00224
00225
00226 MultiVector operator/(const MultiVector& x, const double alpha);
00227
00228 #ifndef MLAPI_LC
00229
00231
00232
00233 BaseOperatorTimesMultiVector operator*(const BaseOperator& A, const MultiVector& x);
00234
00235
00237
00238
00239 BaseOperatorTimesMultiVector operator*(const BaseOperator& A,
00240 const BaseLinearCombination& x);
00241 #else
00242 inline
00243 MultiVector operator*(const BaseOperator& A, const MultiVector& x)
00244 {
00245 MultiVector res(A.GetOperatorRangeSpace(), x.GetNumVectors());
00246 A.Apply(x, res);
00247 return(res);
00248 }
00249 #endif
00250
00251
00253
00254
00255 double operator* (const MultiVector& x, const MultiVector& y);
00256
00257 #ifndef MLAPI_LC
00258 double operator* (const MultiVector& x, const BaseLinearCombination& y);
00259
00260 double operator* (const BaseLinearCombination& x, const MultiVector& y);
00261
00262 double operator* (const BaseLinearCombination& x, const BaseLinearCombination& y);
00263 #endif
00264
00265 }
00266
00267 #endif // if ML_EXPRESSIONS_H