OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
FTpsData.h
Go to the documentation of this file.
1 #ifndef CLASSIC_FTpsData_H
2 #define CLASSIC_FTpsData_H
3 
4 // ------------------------------------------------------------------------
5 // $RCSfile: FTpsData.h,v $
6 // ------------------------------------------------------------------------
7 // $Revision: 1.2.2.10 $
8 // ------------------------------------------------------------------------
9 // Copyright: see Copyright.readme
10 // ------------------------------------------------------------------------
11 //
12 // Template class: FTpsData
13 //
14 // ------------------------------------------------------------------------
15 // Class category: FixedAlgebra
16 // ------------------------------------------------------------------------
17 //
18 // $Date: 2004/11/12 18:57:54 $
19 // $Author: adelmann $
20 //
21 // ------------------------------------------------------------------------
22 
23 #include "Algebra/Array1D.h"
25 #include "FixedAlgebra/FArray1D.h"
26 #include "FixedAlgebra/FMonomial.h"
27 
28 #define DEBUG_FTpsData_H
29 
30 // Template class FTpsData<N>
31 // ------------------------------------------------------------------------
33 
34 template <int N>
35 class FTpsData {
36 
37 public:
38 
39  FTpsData();
40  ~FTpsData();
41 
42  // Return exponents for the monomial with given Giorgilli index.
43  static inline const FMonomial<N> &getExponents(int index);
44 
45  // Return the Giorgilli index for a given monomial.
46  static int getIndex(const FMonomial<N> &);
47 
48  // Order of monomial which has Giorgilli index "index".
49  static inline int getOrder(int index);
50 
51  // Number of terms in an FTps<T,N> object of order "order".
52  static inline int getSize(int order);
53 
54  // Index at which order "order" begins; this equals the number
55  // of monomials of degree <= (order - 1) in an FTps<T,N> object.
56  static inline int orderStart(int order);
57 
58  // Index at which order "order" begins for polynomials in nv (<= N) variables.
59  static inline int orderStart(int order, int nv);
60 
61  // One plus the index at which order "order" ends.
62  static inline int orderEnd(int order);
63 
64  // One plus index at which order "order" ends for polynomials in nv (<= N) variables.
65  static inline int orderEnd(int order, int nv);
66 
67  // Number of monomials of degree "order".
68  static inline int orderLength(int order);
69 
70  // Number of monomials such that "orderL" <= degree <= "orderH".
71  static inline int orderLength(int orderL, int orderH);
72 
73  // Return the product index array for monomial "index".
74  static inline const Array1D<int> &getProductArray(int index);
75 
76  // Return the variable list for monomial "index".
77  static inline const Array1D<int> &getVariableList(int index);
78 
79  // Return the substitution table.
80  static inline const Array1D<TpsSubstitution> &getSubTable();
81 
82  // To ensure proper table setup, this method must be
83  // called by FTps whenever a new object is created.
84  static void setup(int order);
85 
86 private:
87 
88  // Not implemented.
89  FTpsData(const FTpsData &);
90  void operator=(const FTpsData &);
91 
92  // Build tables for given order.
93  void build(int order);
94 
95  // Initialise Substitution table.
96  void fillSubst(int var, int order, FMonomial<N> &pow, int &next);
97 
98  // Binomial coefficients: binom[i-1][k] = (i+k)!/(i! k!); used in the indexing
99  // methods getIndex(), getSize(), orderStart(), orderEnd, and orderLength().
101 
102  // Boundary indices for each order.
104 
105  // Exponents: expon[index] = set of exponents in monomial "index".
107 
108  // Indexing information, used for Tps multiplication.
109  // prod[i][j] = index of monomial that results from
110  // multiplying monomials i and j
112 
113  // Indexing information, used for Tps multiplication
114  // using the look-back method. These two arrays are
115  // used to identify which monomial pairs contribute
116  // to a given monomial in the result.
119 
120  // Indexing information, used for Tps multiplication
121  // using the compact index method.
123 
124  // Array of variable lists; used for Tps substitution.
126 
127  // The substitution table.
129 
130  // The current maximum order for which the tables exist.
131  static int topOrder;
132 
133  // The current maximum size of any FTps object.
134  static int topSize;
135 
136  // The singleton object for local book-keeping.
138 };
139 
140 
141 // Class FTpsData, public methods.
142 // ------------------------------------------------------------------------
143 
144 // The singleton object for local book-keeping.
145 template <int N>
147 theBook = new FTpsData<N>();
148 
149 // The current maximum order for which the tables exist.
150 template <int N>
152 
153 // The current maximum size of any FTps object.
154 template <int N>
156 
157 
158 template <int N> inline
160 getExponents(int index) {
161  return theBook->expon[index];
162 }
163 
164 
165 template <int N>
166 int FTpsData<N>::
167 getIndex(const FMonomial<N> &pows) {
168  int order = 0;
169  int index = 0;
170 
171  for(int var = N; var-- > 0;) {
172  order += pows[var];
173  index += theBook->binom[order][var];
174  }
175 
176  return index;
177 }
178 
179 
180 template <int N> inline
181 int FTpsData<N>::
182 getOrder(int index) {
183  return theBook->expon[index].getOrder();
184 }
185 
186 
187 template <int N> inline
188 int FTpsData<N>::
189 getSize(int order) {
190  return theBook->bin[order+1];
191 }
192 
193 
194 template <int N> inline
195 int FTpsData<N>::
196 orderStart(int order) {
197  return theBook->bin[order];
198 }
199 
200 
201 template <int N> inline
202 int FTpsData<N>::
203 orderStart(int order, int nv) {
204  return theBook->binom[order][N-nv];
205 }
206 
207 
208 template <int N> inline
209 int FTpsData<N>::
210 orderEnd(int order) {
211  return theBook->bin[order+1];
212 }
213 
214 
215 template <int N> inline
216 int FTpsData<N>::
217 orderEnd(int order, int nv) {
218  return theBook->binom[order+1][N-nv];
219 }
220 
221 
222 template <int N> inline
223 int FTpsData<N>::
224 orderLength(int order) {
225  // return theBook->bin[order+1] - theBook->bin[order];
226  return theBook->binom[order+1][1];
227 }
228 
229 
230 template <int N> inline
231 int FTpsData<N>::
232 orderLength(int orderL, int orderH) {
233  return theBook->bin[orderH+1] - theBook->bin[orderL];
234 }
235 
236 
237 template <int N> inline
239 getProductArray(int index) {
240  return theBook->prod[index];
241 }
242 
243 
244 template <int N> inline
246 getVariableList(int index) {
247  return theBook->vrblList[index];
248 }
249 
250 
251 //template <int N> inline
252 //const Array1D<int> &FTpsData<N>::
253 //getVariableList(int index)
254 //{
255 // FMonomial<N> jlist = theBook->expon[index];
256 // Array1D<int> *result = new Array1D<int> (jlist.getOrder(),0);
257 //
258 // int k = 0;
259 // for (int v = 0; v < N; ++v) {
260 // int jv = jlist[v];
261 // while (jv-- > 0) (*result)[k++] = v;
262 // }
264 // return *result;
265 //}
266 
267 
268 template <int N> inline
271  return theBook->subTable;
272 }
273 
274 
275 template <int N>
276 void FTpsData<N>::
277 setup(int order) {
278  theBook->build(order);
279 }
280 
281 
282 // Class FTpsData, protected methods.
283 // ------------------------------------------------------------------------
284 
285 template <int N>
288  // Initialize with order 4. May expand later.
289  topOrder = 0;
290  build(4);
291 }
292 
293 
294 template <int N>
297 {}
298 
299 
300 // Class FTpsData, private methods.
301 // ------------------------------------------------------------------------
302 
303 template <int N>
304 void FTpsData<N>::
305 build(int order) {
306  if(topOrder < order) {
307  topOrder = order;
308  int prodSize = 0;
309 
310  // Build array containing binomial coefficients:
311  // binom[0 ... topOrder+1][0 ... N].
312  binom = Array1D < FArray1D < int, N + 1 > > (topOrder + 2);
313  // Here var runs from N to 0.
314  for(int var = N + 1; var-- > 0;) binom[0][var] = 0;
315  for(int ord = 1; ord <= topOrder + 1; ord++) {
316  binom[ord][N] = 1;
317  // Here var runs from N-1 to 0.
318  for(int var = N; var-- > 0;)
319  binom[ord][var] = binom[ord-1][var] + binom[ord][var+1];
320  }
321 
322  // Build array of indices that mark order boundaries.
323  bin = Array1D<int>(topOrder + 2);
324  for(int i = 0; i < topOrder + 2; i++) bin[i] = binom[i][0];
325 
326  // Build table of monomial exponents for orders zero through topOrder.
327  // (algorithm due to Liam Healey (Marylie 3.0)).
328  {
329  topSize = bin[topOrder+1];
330  expon = Array1D < FMonomial<N> >(topSize);
331  FMonomial<N> power;
332 
333  if(N == 1)
334  for(int index = 1; index < topSize; index++) expon[index][0] = index;
335  else
336  for(int index = 1; index < topSize; index++) {
337  int carry = power[N-1];
338  power[N-1] = 0;
339  int lastnz = N - 2;
340  while(power[lastnz] == 0 && lastnz-- > 0) {}
341 
342  if(lastnz == -1) power[0] = 1 + carry;
343  else {
344  power[lastnz]--;
345  power[lastnz+1] += 1 + carry;
346  }
347 
348  expon[index] = power;
349  }
350  }
351 
352  // Build table of products for orders zero through topOrder.
353  {
354  FMonomial<N> power;
355  prod = Array1D < Array1D<int> >(topSize);
356  for(int xord = 0; xord <= topOrder; xord++) {
357  int yord = topOrder - xord;
358  int ysize = bin[yord+1];
359  for(int i = bin[xord]; i < bin[xord+1]; i++) {
360  prod[i] = Array1D<int>(ysize);
361  // use symmetry for LL half of prod array
362  for(int j = 0; j < std::min(i, ysize); j++) {
363  prod[i][j] = prod[j][i];
364  ++prodSize;
365  }
366  for(int j = i; j < ysize; j++) {
367  power = expon[i] * expon[j];
368  int ord = 0;
369  int ind = 0;
370  for(int vv = N; vv-- > 0;) {
371  ord += power[vv];
372  ind += binom[ord][vv];
373  }
374  prod[i][j] = ind;
375  ++prodSize;
376  }
377  }
378  }
379  }
380 
381  // Build table of variable lists.
382  {
383  // Allocate variable list pointers and working array.
384  vrblList = Array1D< Array1D<int> >(topSize);
385  int *vars = new int[topOrder];
386  // Initialise counter.
387  int j = 1, N1 = N - 1;
388  // Loop over the orders.
389  for(int ord = 1; ord <= topOrder; ord++) {
390  // Allocate first variable list; initialise both it and vars.
391  vrblList[j] = Array1D<int>(ord, 0);
392  std::fill(vars, vars + ord, int(0));
393  // Define end points.
394  int last_j = bin[ord+1];
395  int *vlast = vars + ord;
396  // Build remaining variable lists at this order.
397  while(++j < last_j) {
398  // From last variable list (in vars), construct next one.
399  int *vi = vlast;
400  while(*--vi == N1) {};
401  int k = *vi + 1;
402  std::fill(vi, vlast, k);
403  // Allocate j-th variable list and copy from vars.
404  vrblList[j] = Array1D<int>(ord);
405  std::copy(vars, vars + ord, vrblList[j].begin());
406  }
407  }
408  delete [] vars;
409  }
410 
411  // Build the substitution table.
412  {
413  subTable = Array1D<TpsSubstitution>(topSize);
414  FMonomial<N> power;
415  int next = 1;
416  fillSubst(0, 1, power, next);
417  }
418  }
419 }
420 
421 
422 template <int N>
423 void FTpsData<N>::
424 fillSubst(int var, int order, FMonomial<N> &power, int &next) {
425  for(int v = var; v < N; v++) {
426  TpsSubstitution &s = subTable[next];
427  power[v]++;
428  int ord = 0;
429  int ind = 0;
430  for(int vv = N; vv-- > 0;) {
431  ord += power[vv];
432  ind += binom[ord][vv];
433  }
434  s.index = ind;
435  s.order = order;
436  s.variable = v;
437  next++;
438  if(order < topOrder) fillSubst(v, order + 1, power, next);
439  s.skip = next;
440  power[v]--;
441  }
442 }
443 
444 #endif // CLASSIC_FTpsData_H
static const Array1D< int > & getProductArray(int index)
Definition: FTpsData.h:239
static int orderLength(int order)
Definition: FTpsData.h:224
static const Array1D< TpsSubstitution > & getSubTable()
Definition: FTpsData.h:270
static int topSize
Definition: FTpsData.h:134
Representation of the exponents for a monomial with fixed dimension.
Definition: FMonomial.h:32
static int orderStart(int order)
Definition: FTpsData.h:196
static void setup(int order)
Definition: FTpsData.h:277
Array1D< FMonomial< N > > expon
Definition: FTpsData.h:106
static const Array1D< int > & getVariableList(int index)
Definition: FTpsData.h:246
void fillSubst(int var, int order, FMonomial< N > &pow, int &next)
Definition: FTpsData.h:424
Array1D< Array1D< int > > vrblList
Definition: FTpsData.h:125
~FTpsData()
Definition: FTpsData.h:296
static int orderEnd(int order)
Definition: FTpsData.h:210
static int getSize(int order)
Definition: FTpsData.h:189
static FTpsData< N > * theBook
Definition: FTpsData.h:137
Internal utility class for FTps&lt;T,N&gt; class.
Definition: FTpsData.h:35
Array1D< int > bin
Definition: FTpsData.h:103
Array1D< TpsSubstitution > subTable
Definition: FTpsData.h:128
FTpsData()
Definition: FTpsData.h:287
static int getOrder(int index)
Definition: FTpsData.h:182
static int topOrder
Definition: FTpsData.h:131
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Definition: TpsMath.h:76
Array1D< int > lbBound
Definition: FTpsData.h:118
static int getIndex(const FMonomial< N > &)
Definition: FTpsData.h:167
void operator=(const FTpsData &)
static const FMonomial< N > & getExponents(int index)
Definition: FTpsData.h:160
Substitution for Tps&lt;T&gt;.
Array1D< int > Giorgilli2ExponIndex
Definition: FTpsData.h:122
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
Definition: PETE.h:1243
Array1D< Array1D< int > > prod
Definition: FTpsData.h:111
void build(int order)
Definition: FTpsData.h:305
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:95
Array1D< FArray1D< int, N+1 > > binom
Definition: FTpsData.h:100
Array1D< int > lookBack
Definition: FTpsData.h:117