source: Sophya/trunk/Eval/JET/jet.h@ 4054

Last change on this file since 4054 was 2798, checked in by ansari, 20 years ago

Adaptation aux modifs 2004-2005 de SOPHYA , compil pour PBG4 - Reza 3 Juin 2005

File size: 7.0 KB
Line 
1#ifndef JET_H_SEEN
2#define JET_H_SEEN
3
4#include "machdefs.h"
5#include "sopnamsp.h"
6
7
8
9//========================================================
10// Test d'expression template sur tableaux
11// Reza - Avril 2003
12//========================================================
13
14// ---------------------------------------------------
15// -------- Classe Taille objet Matrice --------------
16// ---------------------------------------------------
17class MtxSize {
18public:
19 MtxSize() : nrow_(0), ncol_(0) { }
20 MtxSize(MtxSize const & a) : nrow_(a.nrow_), ncol_(a.ncol_) { }
21 MtxSize(sa_size_t nr, sa_size_t nc) { nrow_ = nr; ncol_ = nc; }
22 ~MtxSize() {};
23 void ReSize(const MtxSize & a) { nrow_ = a.nrow_; ncol_ = a.ncol_; }
24 bool CompareSize(const MtxSize & a) const
25{
26 if ((a.nrow_ == 0) || (a.ncol_ == 0) )
27 throw RangeCheckError("MtxSize::CompareSize(mx) Size(mx) = 0");
28 if ((nrow_ == a.nrow_) && (ncol_ == a.ncol_)) return true;
29 else return false;
30}
31protected:
32 sa_size_t nrow_, ncol_;
33};
34
35
36class JETEvaluator {
37public:
38 JETEvaluator() {}
39 // virtual ~JETEvaluator() {}
40 virtual void EvaluateAll(AnyDataObj& dest) const = 0;
41 /*
42 { throw PError("JETEvaluator::EvaluateAll(AnyDataObj &) Unsupported operation"); }
43 virtual void EvaluateAll(NDataBlock<T> & dest) const
44 { throw PError("JETEvaluator::EvaluateAll( &) Unsupported operation"); }
45 */
46};
47
48// -------- Classe generique d'expression --------------
49
50template <class T, class E>
51class JETExpression : public JETEvaluator {
52public:
53 JETExpression() : e_() { }
54 JETExpression(E const & e) : e_(e) { }
55 JETExpression( JETExpression<T, E> const & e) : e_(e.e_) { }
56 inline T EvaluateAndStep() const { return e_.EvaluateAndStep(); }
57 inline MtxSize const & RefSize() const { return e_.RefSize(); }
58 inline void Reset() const { e_.Reset(); }
59 virtual void EvaluateAll(AnyDataObj& dest) const;
60 inline E & Expression() { return e_; }
61protected:
62 E e_;
63};
64
65// -------- Classe Expression+Constante --------------
66
67template <class T, class E>
68class JETExprAddConst {
69public:
70 JETExprAddConst(E e, T c) : e_(e) , c_(c)
71 { }
72 JETExprAddConst(JETExprAddConst<T, E> const & a) : e_(a.e_), c_(a.c_) { }
73
74 inline T EvaluateAndStep() const { return (e_.EvaluateAndStep()+c_); }
75 MtxSize const & RefSize() const { return e_.RefSize() ; }
76 inline void Reset() const { e_.Reset(); }
77
78protected:
79 E e_;
80 T c_;
81};
82
83// -------- Classe Expression*Constante --------------
84
85template <class T, class E>
86class JETExprMulConst {
87public:
88 JETExprMulConst(E e, T c) : e_(e) , c_(c)
89 { }
90 JETExprMulConst(JETExprMulConst<T, E> const & a) : e_(a.e_), c_(a.c_) { }
91
92 inline T EvaluateAndStep() const { return (e_.EvaluateAndStep()*c_); }
93 MtxSize const & RefSize() const { return e_.RefSize() ; }
94 inline void Reset() const { e_.Reset(); }
95
96protected:
97 E e_;
98 T c_;
99};
100
101
102
103// -------- Classe Expression+Expression --------------
104template <class T, class E1, class E2>
105class JETExprAdd {
106public:
107 JETExprAdd(E1 e1, E2 e2) :
108 e1_(e1) , e2_(e2)
109 {
110 if (! e1.RefSize().CompareSize(e2.RefSize()) )
111 throw SzMismatchError("JETExprAdd() Unequal matrix size");
112 }
113 JETExprAdd(JETExprAdd<T, E1, E2> const & a) : e1_(a.e1_), e2_(a.e2_) { }
114
115 inline T EvaluateAndStep() const { return (e1_.EvaluateAndStep() + e2_.EvaluateAndStep()); }
116 virtual MtxSize const & RefSize() const { return e1_.RefSize() ; }
117 inline void Reset() const { e1_.Reset(); e2_.Reset(); }
118protected:
119 E1 e1_;
120 E2 e2_;
121};
122
123// -------- Classe Expression*Expression --------------
124template <class T, class E1, class E2>
125class JETExprMult {
126public:
127 JETExprMult(E1 e1, E2 e2) :
128 e1_(e1) , e2_(e2)
129 {
130 if (! e1.RefSize().CompareSize(e2.RefSize()) )
131 throw SzMismatchError("JETExprAdd() Unequal matrix size");
132 }
133 JETExprMult(JETExprMult<T, E1, E2> const & a) : e1_(a.e1_), e2_(a.e2_) { }
134
135 inline T EvaluateAndStep() const { return (e1_.EvaluateAndStep() * e2_.EvaluateAndStep()); }
136 virtual MtxSize const & RefSize() const { return e1_.RefSize() ; }
137 inline void Reset() const { e1_.Reset(); e2_.Reset(); }
138protected:
139 E1 e1_;
140 E2 e2_;
141};
142
143// -------- Classe Fonc(Expression) --------------
144template <class T>
145class FSin {
146public:
147 FSin() { }
148 FSin(FSin<T> const &) { }
149 inline T FuncVal(T x) const { return sin(x); }
150};
151template <class T>
152class FCos {
153public:
154 FCos() { }
155 FCos(FCos<T> const &) { }
156 inline T FuncVal(T x) const { return cos(x); }
157};
158template <class T>
159class FTan {
160public:
161 FTan() { }
162 FTan(FTan<T> const &) { }
163 inline T FuncVal(T x) const { return tan(x); }
164};
165template <class T>
166class FLog {
167public:
168 FLog() { }
169 FLog(FLog<T> const &) { }
170 inline T FuncVal(T x) const { return log(x); }
171};
172template <class T>
173class FExp {
174public:
175 FExp() { }
176 FExp(FExp<T> const &) { }
177 inline T FuncVal(T x) const { return exp(x); }
178};
179
180template <class T, class E, class F>
181class JETExprFunc {
182public:
183 JETExprFunc(E e, F f) : e_(e), f_(f) { }
184 JETExprFunc( JETExprFunc<T, E, F> const & a) : e_(a.e_), f_(a.f_) { }
185 inline T EvaluateAndStep() const { return f_.FuncVal(e_.EvaluateAndStep()); }
186 virtual MtxSize const & RefSize() const { return e_.RefSize() ; }
187 inline void Reset() const { e_.Reset(); }
188protected:
189 E e_;
190 F f_;
191};
192
193
194//----- Definition operateur Expression + Cste
195template <class T, class E>
196JETExpression< T, JETExprAddConst<T,E> > operator +
197 (JETExpression<T,E> e, T c)
198 { return JETExpression< T, JETExprAddConst<T,E> >
199 (JETExprAddConst<T,E>(e.Expression(), c) ); }
200
201template <class T, class E>
202JETExpression< T, JETExprAddConst<T,E> > operator +
203 (T c, JETExpression<T,E> e)
204 { return JETExpression< T, JETExprAddConst<T,E> >
205 (JETExprAddConst<T,E>(e.Expression(), c) ); }
206
207//----- Definition operateur Expression * Cste
208template <class T, class E>
209JETExpression< T, JETExprMulConst<T,E> > operator *
210 (JETExpression<T,E> e, T c)
211 { return JETExpression< T, JETExprMulConst<T,E> >
212 (JETExprMulConst<T,E>(e.Expression(), c) ); }
213
214template <class T, class E>
215JETExpression< T, JETExprMulConst<T,E> > operator *
216 (T c, JETExpression<T,E> e)
217 { return JETExpression< T, JETExprMulConst<T,E> >
218 (JETExprMulConst<T,E>(e.Expression(), c) ); }
219
220//----- Definition operateur Expression + Expression
221template <class T, class E1, class E2>
222JETExpression< T, JETExprAdd<T,E1, E2> > operator +
223 (JETExpression<T,E1> e1, JETExpression<T,E2> e2)
224 { return JETExpression< T, JETExprAdd<T, E1, E2> >
225 (JETExprAdd<T,E1,E2>(e1.Expression(), e2.Expression()) ); }
226
227//----- Definition operateur Expression * Expression
228template <class T, class E1, class E2>
229JETExpression< T, JETExprMult<T,E1, E2> > operator *
230 (JETExpression<T,E1> e1, JETExpression<T,E2> e2)
231 { return JETExpression< T, JETExprMult<T, E1, E2> >
232 (JETExprMult<T,E1,E2>(e1.Expression(), e2.Expression()) ); }
233
234//---- Definition Sin/Cos/Tan/Log/Exp
235template <class T, class E>
236JETExpression< T, JETExprFunc<T,E,FSin<T> > > Sin ( JETExpression<T,E> e)
237{ return JETExpression< T, JETExprFunc<T,E,FSin<T> > > (JETExprFunc<T,E,FSin<T> >(e.Expression(), FSin<T>() ) ); }
238#endif
239
Note: See TracBrowser for help on using the repository browser.