Developer documentation

texp_expression.hpp
Go to the documentation of this file.
1 #ifndef realroot_ARITHM_TEXP_TEMPLATE_EXPRESSION_H
2 #define realroot_ARITHM_TEXP_TEMPLATE_EXPRESSION_H
3 #include <iostream>
4 #include <realroot/assign.hpp>
5 #include <realroot/texp_sup.hpp>
7 
8 namespace mmx {
9 
10 namespace texp {
11 
12  template<class F, class X, class Y>
14  {
15  enum { V = 0 };
16  typedef texp::false_t T;
17  };
18  // in place example
19  // G(r,s,t) (1) ==> r = s; G(r,z) (2)
20  // (2) is better than (1) if G is "in place" otherwise G(r,z) ==> G(r,s=r,z) (3)
21  // and (3) is worst than (1).
22  // note: makes sense if s or t are unevaluated expression, (2) is better because the
23  // expression s will be evaluated in the same memory space as the following call to operator.
24  // note: able to "unroll" (a . b. c. d) as r = a, r.= b, r .=c, r .=d
25  template<class F, class X, class Y>
27  {
28  enum { V = 0 };
29  typedef texp::false_t T;
30  };
31 
32  template<class op, class X>
34  {
35  typedef X F;
36  typedef X U;
37  };
38 
39 
40  template<class op, class X, class Y, class SX, class SY>
42  {
43  typedef typename sup< X, Y >::T F;
44  typedef X U;
45  typedef Y V;
46  };
47 
48  template<class op, class X, class Y>
50  {
51  typedef binary_operator_structure_prototype< op, X, Y,
52  typename structureof<X>::T,
54  typedef typename proto::F F;
55  typedef typename proto::U U;
56  typedef typename proto::V V;
57  };
58 
59  template<typename O, typename A> struct unary_operator {};
60  template<typename O, typename A, typename B> struct binary_operator {};
61  template< class A >
62  struct template_expression_operand { typedef const A & T; };
63  template<>
64  struct template_expression_operand<int> { typedef int T; };
65 
66  template<class A>
68  {
69  typedef true_t terminal_t;
70  typedef A E;
72  inline const A & term() const { return a; };
73  template<class X> operator X() { return X(term()); };
74  template_expression( const A & a ) : a(a) {};
75  };
76 
77 
78  template< class O, class A >
80  {
84 
85  A a;
86 
87  operator E()
88  {
89  E tmp;
90  eval(tmp);
91  return tmp;
92  };
93 
94 
95  template<class E> inline template_expression( const E& e ): a(e.a) { };
96  inline template_expression( const A& _a ): a(_a) {};
97 
98 
99  template<class R>
100  static inline void evalterm ( E & r, R & l ) { L tmp; let::assign(tmp,l); O()(r,l); };
101  static inline void evalterm ( E & r, L & l ) { O()(r,l); };
102 
103  inline void evaltree( E & r ) const
104  {
105  L tmp;
106  a.eval(tmp);
107  O()(r,tmp);
108  };
109 
110  inline void eval ( E & r, const false_t & ) const { evaltree( r ); };
111  inline void eval ( E & r, const true_t& ) const { evalterm( r, a.a ); };
112  inline void eval ( E & r ) const { eval(r,typename A::terminal_t()); };
113  template<class R>
114  inline void eval( R & r ) const
115  {
116  E tmp;
117  eval(tmp);
118  let::assign(r,tmp);
119  };
120  };
121 
122 
123  // evaluation on terminals.
124 
125 
126  template< class O, class A, class B>
128  {
132 
133  A a;
134  B b;
135  typedef O Operator;
137  typedef typename S::F E;
138  typedef typename S::U L;
139  typedef typename S::V R;
140 
141  inline operator E() { E tmp; eval(tmp); return tmp; };
142 
144  template<class E>
145  inline template_expression( const E& e ) { a = e.a; b = e.b; };
146  inline template_expression( const A& _a, const B& _b ) : a(_a), b(_b) {};
147 
148  template<class S>
149  bool operator!=( const S& s )
150  {
151  E tmp;
152  eval(tmp);
153  return tmp != s;
154  };
155 
156  public:
157  inline void eval( E & e, const L & l, const R & r ) const { O()(e,l,r); };
158 
159  template<class X> inline
160  void eval( E & r, const X & a, const R & b ) const
161  {
162  using namespace let;
163  L _a;
164  let::assign(_a,a);
165  O()(r,_a,b);
166  };
167 
168  template<class Y> inline
169  void eval( E & r, const L & a, const Y & b ) const
170  {
171  using namespace let;
172  R _b;
173  let::assign(_b,b);
174  O()(r,a,_b);
175  };
176 
177  template<class X, class Y> inline
178  void eval( E & r, const X & a, const Y & b ) const
179  {
180  L _a;
181  R _b;
182  using namespace let;
183  let::assign(_a,a);
184  let::assign(_b,b);
185  O()( r, _a, _b );
186  };
187 
188  inline void _eval_( E& r, const false_t&, const false_t& ) const
189  {
190  /* if ( isinplace< O, L, R >::V )
191  {
192  a._eval_(r);
193  R b_;
194  b.eval(b_);
195  eval(r,b.a);
196  }
197  else */
198  {
199  L _a; a._eval_(_a);
200  R _b; b._eval_(_b);
201  eval(r,_a,_b);
202  };
203  };
204 
205  inline void eval( E& r, const false_t&, const false_t& ) const
206  {
207  L _a; a._eval_(_a);
208  R _b; b._eval_(_b);
209  eval(r,_a,_b);
210  };
211 
212  inline void _eval_( E & r, const false_t&, const true_t& ) const
213  {
214  /* if ( isinplace< O, L, R >::V ) (check if E == A::E)
215  { a._eval_( r ); eval(r,b.a); }
216  else
217  */
218 
219  { L _a; a._eval_(_a); eval(r,_a,b.a); };
220  };
221  inline void eval ( E & r, const false_t&, const true_t& ) const
222  {
223  L _a;
224  a._eval_(_a);
225  eval(r,_a,b.a);
226  };
227 
228  inline void _eval_( E & r, const true_t&, const false_t& ) const
229  {
230  /* if ( isinplace< O, L, R >::V && iscommutative< O, L, R >::V )
231  {
232  b._eval_(r);
233  eval(r,a.a);
234  }
235  else */
236  {
237  R b_;
238  b._eval_(b_);
239  eval(r,a.a,b_);
240  };
241  };
242 
243  inline void eval ( E & r, const true_t&, const false_t& ) const
244  { R _b; b._eval_(_b); eval(r,a.a,_b); };
245 
246 
247  inline void eval ( E & r, const true_t& , const true_t& ) const { eval(r,a.a,b.a); };
248  inline void _eval_( E & r, const true_t& , const true_t& ) const { eval(r,a.a,b.a); };
249 
250 
251  // evaluation on T which is not the result type F of the operator O(A::E,B::E)
252  template<class T> inline
253  void eval( T & r ) const
254  {
255  using namespace let;
256  E tmp;
257  _eval_(tmp, typename A::terminal_t(), typename B::terminal_t());
258  let::assign(r,tmp);
259  };
260  // same thing on temporary object
261  template<class U> inline
262  void _eval_( U & r ) const
263  {
264  using namespace let;
265  E tmp;
266  _eval_(tmp,typename A::terminal_t(), typename B::terminal_t());
267  let::assign(r,tmp);
268  };
269 
270  inline void eval( E& r ) const { eval( r, typename A::terminal_t(), typename B::terminal_t() ); };
271  inline void _eval_( E& r ) const { _eval_( r, typename A::terminal_t(), typename B::terminal_t() ); };
272  //template<class X> operator X() { X tmp; eval(tmp,*this); return tmp; };
273  /* operator E() {
274  E tmp;
275  _eval_(tmp);
276  return tmp;
277  };
278  */
279  };
280 
281 
282  template< class A > inline
283  std::ostream& operator<<( std::ostream& o, const template_expression<A>& e )
284  {
285  o << (e.a);
286  return o;
287  };
288 
289  template< class O, class A > inline
290  std::ostream& operator<<( std::ostream& o, const template_expression< unary_operator< O, A > > & a )
291  {
292  return (o << O::name() << "(" << a.a << ")");
293  };
294 
295  template< class O, class A, class B > inline
296  std::ostream& operator<<( std::ostream& o, const template_expression< binary_operator< O, A, B > >& a )
297  {
298  o << O::name() << "(";
299  o << a.a << "," << a.b << ")";
300  return o;
301  };
302 }
303 
304  //using namespace arithm;
305 
306 }// end namespace mmx
307 
308 #include "texp_operators.hpp"
310 
311 #endif
Definition: texp_expression.hpp:62
const A & term() const
Definition: texp_expression.hpp:72
const A & T
Definition: texp_expression.hpp:62
template_expression()
Definition: texp_expression.hpp:143
proto::V V
Definition: texp_expression.hpp:56
X U
Definition: texp_expression.hpp:36
const C & b
Definition: Interval_glue.hpp:25
TMPL X
Definition: polynomial_operators.hpp:148
void eval(E &r, const true_t &) const
Definition: texp_expression.hpp:111
Definition: texp_expression.hpp:28
void eval(E &r, const X &a, const R &b) const
Definition: texp_expression.hpp:160
Y V
Definition: texp_expression.hpp:45
proto::F F
Definition: texp_expression.hpp:54
void eval(E &e, const L &l, const R &r) const
Definition: texp_expression.hpp:157
Result eval(const Polynomial &polynomial, const Parameters &parameters)
Multivariate Polynomial Evaluation.
Definition: polynomial_fcts.hpp:135
false_t terminal_t
Definition: texp_expression.hpp:81
texp::false_t T
Definition: texp_expression.hpp:29
Definition: texp_expression.hpp:60
void _eval_(E &r, const false_t &, const false_t &) const
Definition: texp_expression.hpp:188
Definition: texp_expression.hpp:15
Definition: texp_structureof.hpp:13
true_t terminal_t
Definition: texp_expression.hpp:69
unary_operator_prototype< O, typename A::E >::U L
Definition: texp_expression.hpp:83
A E
Definition: texp_expression.hpp:70
template_expression(const A &_a, const B &_b)
Definition: texp_expression.hpp:146
int T
Definition: texp_expression.hpp:64
void _eval_(E &r) const
Definition: texp_expression.hpp:271
Definition: texp_expression.hpp:26
void eval(E &r, const false_t &, const true_t &) const
Definition: texp_expression.hpp:221
void _eval_(E &r, const true_t &, const true_t &) const
Definition: texp_expression.hpp:248
structure defining a positive answer
Definition: texp_bool.hpp:7
texp::false_t T
Definition: texp_expression.hpp:16
void evaltree(E &r) const
Definition: texp_expression.hpp:103
Definition: texp_expression.hpp:49
unary_operator_prototype< O, typename A::E >::F E
Definition: texp_expression.hpp:82
Definition: texp_expression.hpp:67
void eval(E &r) const
Definition: texp_expression.hpp:112
template_expression(const A &_a)
Definition: texp_expression.hpp:96
template_expression(const E &e)
Definition: texp_expression.hpp:95
void eval(E &r, const false_t &) const
Definition: texp_expression.hpp:110
static void evalterm(E &r, L &l)
Definition: texp_expression.hpp:101
X F
Definition: texp_expression.hpp:35
Definition: texp_expression.hpp:59
void _eval_(E &r, const true_t &, const false_t &) const
Definition: texp_expression.hpp:228
bool operator!=(const S &s)
Definition: texp_expression.hpp:149
void eval(E &r, const L &a, const Y &b) const
Definition: texp_expression.hpp:169
sup< X, Y >::T F
Definition: texp_expression.hpp:43
void eval(R &r) const
Definition: texp_expression.hpp:114
void eval(E &r) const
Definition: texp_expression.hpp:270
texp::false_t false_t
Definition: texp_expression.hpp:129
template_expression(const E &e)
Definition: texp_expression.hpp:145
texp::false_t terminal_t
Definition: texp_expression.hpp:131
Definition: texp_expression.hpp:41
const char * name()
Definition: texp_demangle.hpp:9
proto::U U
Definition: texp_expression.hpp:55
Definition: texp_expression.hpp:13
binary_operator_prototype< O, typename A::E, typename B::E > S
Definition: texp_expression.hpp:136
sfirstnn< C, A, B >::T T
Definition: texp_sup.hpp:31
structure defining a negative answer
Definition: texp_bool.hpp:9
template_expression(const A &a)
Definition: texp_expression.hpp:74
void eval(T &r) const
Definition: texp_expression.hpp:253
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
X U
Definition: texp_expression.hpp:44
template_expression_operand< A >::T a
Definition: texp_expression.hpp:71
void _eval_(E &r, const false_t &, const true_t &) const
Definition: texp_expression.hpp:212
void eval(E &r, const true_t &, const false_t &) const
Definition: texp_expression.hpp:243
void eval(E &r, const false_t &, const false_t &) const
Definition: texp_expression.hpp:205
Definition: array.hpp:12
texp::true_t true_t
Definition: texp_expression.hpp:130
Definition: texp_expression.hpp:33
binary_operator_structure_prototype< op, X, Y, typename structureof< X >::T, typename structureof< Y >::T > proto
Definition: texp_expression.hpp:53
void eval(E &r, const true_t &, const true_t &) const
Definition: texp_expression.hpp:247
void eval(E &r, const X &a, const Y &b) const
Definition: texp_expression.hpp:178
void _eval_(U &r) const
Definition: texp_expression.hpp:262
static void evalterm(E &r, R &l)
Definition: texp_expression.hpp:100
Home