Fast Evolution of Parton Distributions
matrix_template.h
Go to the documentation of this file.
1 
8 /*
9  * Copyright (C) 2002 Stefan Weinzierl
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24  */
25 
26 #ifndef __PDF_MATRIX_TEMPLATE_H__
27 #define __PDF_MATRIX_TEMPLATE_H__
28 
29 #include <cstddef>
30 #include <valarray>
31 #include <iostream>
32 
33 namespace pdf {
34 
35  // forward declaration
36  template<class T> class matrix_template;
37 
56  template<class T> class vector_template {
57 
58  // ctors
59  public :
60  vector_template(void);
61  explicit vector_template(size_t n);
62  vector_template(const T & val, size_t n);
63  vector_template(const T* p, size_t n);
64  explicit vector_template(const std::valarray<T> & vv);
65 
66  // functions
67  public :
68  size_t size(void) const;
69 
70 
71  // subscripting
72  public :
73  T operator[](size_t i) const;
74  T & operator[](size_t i);
75 
76  T operator()(size_t i) const;
77  T & operator()(size_t i);
78 
79  // friends
80  template<class TT> friend vector_template<TT> operator+ (const vector_template<TT> & v1, const vector_template<TT> & v2);
81  template<class TT> friend vector_template<TT> operator- (const vector_template<TT> & v1, const vector_template<TT> & v2);
82  template<class TT> friend vector_template<TT> operator+ (const vector_template<TT> & v1);
83  template<class TT> friend vector_template<TT> operator- (const vector_template<TT> & v1);
84  template<class TT, class SS> friend vector_template<TT> operator* (const SS & c, const vector_template<TT> & v2);
85  template<class TT, class SS> friend vector_template<TT> operator* (const vector_template<TT> & v1, const SS & c);
86  template<class TT, class SS> friend vector_template<TT> operator/ (const vector_template<TT> & v1, const SS & c);
87 
88  template<class TT> friend TT operator* (const vector_template<TT> & v1, const vector_template<TT> & v2);
89  template<class TT> friend vector_template<TT> operator* (const matrix_template<TT> & v1, const vector_template<TT> & v2);
90  template<class TT> friend vector_template<TT> operator* (const vector_template<TT> & v1, const matrix_template<TT> & v2);
91 
92  // I/O operators
93  template<class TT> friend std::ostream & operator<< (std::ostream & os, const vector_template<TT> & v);
94 
95  // member variables :
96  protected :
97  std::valarray<T> v;
98 
99  };
100 
118  template<class T> class matrix_template {
119 
120  // ctors
121  public :
122  matrix_template(void);
123  matrix_template(size_t n, size_t m);
124  matrix_template(const T & val, size_t n, size_t m);
125  matrix_template(const T* p, size_t n, size_t m);
126  matrix_template(const std::valarray<T> & vv, size_t n, size_t m);
127 
128  // functions
129  public :
130  size_t rows(void) const;
131  size_t columns(void) const;
132 
133 
134  // subscripting
135  public :
136  T operator()(size_t i, size_t j) const;
137  T & operator()(size_t i, size_t j);
138 
139  // friends
140  template<class TT> friend matrix_template<TT> operator+ (const matrix_template<TT> & v1, const matrix_template<TT> & v2);
141  template<class TT> friend matrix_template<TT> operator- (const matrix_template<TT> & v1, const matrix_template<TT> & v2);
142  template<class TT> friend matrix_template<TT> operator+ (const matrix_template<TT> & v1);
143  template<class TT> friend matrix_template<TT> operator- (const matrix_template<TT> & v1);
144  template<class TT, class SS> friend matrix_template<TT> operator* (const SS & c, const matrix_template<TT> & v2);
145  template<class TT, class SS> friend matrix_template<TT> operator* (const matrix_template<TT> & v1, const SS & c);
146  template<class TT, class SS> friend matrix_template<TT> operator/ (const matrix_template<TT> & v1, const SS & c);
147 
148  template<class TT> friend matrix_template<TT> operator* (const matrix_template<TT> & v1, const matrix_template<TT> & v2);
149  template<class TT> friend vector_template<TT> operator* (const matrix_template<TT> & v1, const vector_template<TT> & v2);
150  template<class TT> friend vector_template<TT> operator* (const vector_template<TT> & v1, const matrix_template<TT> & v2);
151 
152  // I/O operators
153  template<class TT> friend std::ostream & operator<< (std::ostream & os, const matrix_template<TT> & v);
154 
155  // member variables :
156  protected :
158  size_t nrows;
160  size_t ncols;
161  std::valarray<T> v;
162 
163  };
164 
165  // ----------------------------------------------------------------------------
166 
167  // performance-critical inlined method implementations
168 
169  // ctors
170 
176  template<class T> inline vector_template<T>::vector_template(void) : v()
177  {}
178 
184  template<class T> inline vector_template<T>::vector_template(size_t n) : v(n)
185  {}
186 
192  template<class T> inline vector_template<T>::vector_template(const T & val, size_t n) : v(val, n)
193  {}
194 
200  template<class T> inline vector_template<T>::vector_template(const T* p, size_t n) : v(p,n)
201  {}
202 
208  template<class T> inline vector_template<T>::vector_template(const std::valarray<T> & vv) : v(vv)
209  {}
210 
211  // functions
212 
218  template<class T> inline size_t vector_template<T>::size(void) const
219  {
220  return v.size();
221  }
222 
223  // subscripting
224 
230  template<class T> inline T vector_template<T>::operator[](size_t i) const
231  {
232  return v[i];
233  }
234 
240  template<class T> inline T & vector_template<T>::operator[](size_t i)
241  {
242  return v[i];
243  }
244 
250  template<class T> inline T vector_template<T>::operator()(size_t i) const
251  {
252  return v[i];
253  }
254 
260  template<class T> inline T & vector_template<T>::operator()(size_t i)
261  {
262  return v[i];
263  }
264 
265  // friends
266 
267  // operators
268 
277  template<class T> inline vector_template<T> operator+ (const vector_template<T> & v1, const vector_template<T> & v2)
278  {
279  return vector_template<T>(v1.v+v2.v);
280  }
281 
290  template<class T> inline vector_template<T> operator- (const vector_template<T> & v1, const vector_template<T> & v2)
291  {
292  return vector_template<T>(v1.v-v2.v);
293  }
294 
303  template<class T> inline vector_template<T> operator+ (const vector_template<T> & v1)
304  {
305  return vector_template<T>(+v1.v);
306  }
307 
316  template<class T> inline vector_template<T> operator- (const vector_template<T> & v1)
317  {
318  return vector_template<T>(-v1.v);
319  }
320 
329  template<class T, class S> inline vector_template<T> operator* (const S & c, const vector_template<T> & v2)
330  {
331  T cc = c;
332  return vector_template<T>( cc*v2.v);
333  }
334 
343  template<class T, class S> inline vector_template<T> operator* (const vector_template<T> & v1, const S & c)
344  {
345  T cc = c;
346  return vector_template<T>(v1.v*cc);
347  }
348 
357  template<class T, class S> inline vector_template<T> operator/ (const vector_template<T> & v1, const S & c)
358  {
359  T cc = c;
360  return vector_template<T>(v1.v/cc);
361  }
362 
371  template<class T> inline T operator* (const vector_template<T> & v1, const vector_template<T> & v2)
372  {
373  T res = 0;
374  for ( size_t i=0; i<v1.size(); i++) res += v1(i)*v2(i);
375 
376  return res;
377  }
378 
379  // I/O operators
380 
386  template<class T> inline std::ostream & operator<< (std::ostream & os, const vector_template<T> & v)
387  {
388  os << "[";
389  for ( size_t i=0; i<v.size(); i++)
390  {
391  if (i>0) os << ",";
392  os << v(i);
393  }
394 
395  return os << "]";
396  }
397 
398 
399  // --------------------------------------------------------------
400 
401  // ctors
402 
408  template<class T> inline matrix_template<T>::matrix_template(void) : nrows(), ncols(), v()
409  {}
410 
416  template<class T> inline matrix_template<T>::matrix_template(size_t n, size_t m) : nrows(n), ncols(m), v(n*m)
417  {}
418 
424  template<class T> inline matrix_template<T>::matrix_template(const T & val, size_t n, size_t m) :
425  nrows(n), ncols(m), v(val, n*m)
426  {}
427 
433  template<class T> inline matrix_template<T>::matrix_template(const T* p, size_t n, size_t m) :
434  nrows(n), ncols(m), v(p,n*m)
435  {}
436 
442  template<class T> inline matrix_template<T>::matrix_template(const std::valarray<T> & vv, size_t n, size_t m) :
443  nrows(n), ncols(m), v(vv)
444  {}
445 
446  // functions
447 
453  template<class T> inline size_t matrix_template<T>::rows(void) const
454  {
455  return nrows;
456  }
457 
463  template<class T> inline size_t matrix_template<T>::columns(void) const
464  {
465  return ncols;
466  }
467 
468  // subscripting
469 
475  template<class T> inline T matrix_template<T>::operator()(size_t i, size_t j) const
476  {
477  // this fixes the physical layout
478  return v[i*ncols+j];
479  }
480 
486  template<class T> inline T & matrix_template<T>::operator()(size_t i, size_t j)
487  {
488  // this fixes the physical layout
489  return v[i*ncols+j];
490  }
491 
492  // friends
493 
494  // operators
495 
504  template<class T> inline matrix_template<T> operator+ (const matrix_template<T> & v1, const matrix_template<T> & v2)
505  {
506  return matrix_template<T>(v1.v+v2.v, v1.nrows, v1.ncols);
507  }
508 
517  template<class T> inline matrix_template<T> operator- (const matrix_template<T> & v1, const matrix_template<T> & v2)
518  {
519  return matrix_template<T>(v1.v-v2.v, v1.nrows, v1.ncols);
520  }
521 
530  template<class T> inline matrix_template<T> operator+ (const matrix_template<T> & v1)
531  {
532  return matrix_template<T>(+v1.v, v1.nrows, v1.ncols);
533  }
534 
543  template<class T> inline matrix_template<T> operator- (const matrix_template<T> & v1)
544  {
545  return matrix_template<T>(-v1.v, v1.nrows, v1.ncols);
546  }
547 
556  template<class T, class S> inline matrix_template<T> operator* (const S & c, const matrix_template<T> & v2)
557  {
558  T cc = c;
559  return matrix_template<T>(cc*v2.v, v2.nrows, v2.ncols);
560  }
561 
570  template<class T, class S> inline matrix_template<T> operator* (const matrix_template<T> & v1, const S & c)
571  {
572  T cc = c;
573  return matrix_template<T>(v1.v*cc, v1.nrows, v1.ncols);
574  }
575 
584  template<class T, class S> inline matrix_template<T> operator/ (const matrix_template<T> & v1, const S & c)
585  {
586  T cc = c;
587  return matrix_template<T>(v1.v/cc, v1.nrows, v1.ncols);
588  }
589 
598  template<class T> inline matrix_template<T> operator* (const matrix_template<T> & v1, const matrix_template<T> & v2)
599  {
600  std::valarray<T> res(v1.nrows*v2.ncols);
601 
602  for ( size_t i=0; i<v1.nrows; i++)
603  {
604  for ( size_t j=0; j<v2.ncols; j++)
605  {
606  T res_scal = 0;
607  for ( size_t k=0; k<v1.ncols; k++) res_scal += v1.v[i*v1.ncols+k]*v2.v[k*v2.ncols+j];
608  res[i*v2.ncols+j] = res_scal;
609  }
610  }
611 
612  return matrix_template<T>(res, v1.nrows, v2.ncols);
613  }
614 
623  template<class T> inline vector_template<T> operator* (const matrix_template<T> & v1, const vector_template<T> & v2)
624  {
625  std::valarray<T> res(v1.nrows);
626 
627  for ( size_t i=0; i<v1.nrows; i++)
628  {
629  T res_scal = 0;
630  for ( size_t k=0; k<v1.ncols; k++) res_scal += v1.v[i*v1.ncols+k]*v2.v[k];
631  res[i] = res_scal;
632  }
633 
634  return vector_template<T>(res);
635  }
636 
645  template<class T> inline vector_template<T> operator* (const vector_template<T> & v1, const matrix_template<T> & v2)
646  {
647  std::valarray<T> res(v2.ncols);
648 
649  for ( size_t j=0; j<v2.ncols; j++)
650  {
651  T res_scal = 0;
652  for ( size_t k=0; k<v2.nrows; k++) res_scal += v1.v[k]*v2.v[k*v2.ncols+j];
653  res[j] = res_scal;
654  }
655 
656  return vector_template<T>(res);
657  }
658 
659  // I/O operators
660 
666  template<class T> inline std::ostream & operator<< (std::ostream & os, const matrix_template<T> & v)
667  {
668  os << "[";
669  for ( size_t i=0; i<v.rows(); i++)
670  {
671  if (i>0) os << ",";
672  os << "[";
673  for ( size_t j=0; j<v.columns(); j++)
674  {
675  if (j>0) os << ",";
676  os << v(i,j);
677  }
678  os << "]";
679  }
680 
681  return os << "]";
682  }
683 
684 
685 
686 } // namespace pdf
687 
688 #endif // ndef __PDF_MATRIX_TEMPLATE_H__
689 
size_t nrows
number of rows
Definition: matrix_template.h:158
T operator()(size_t i, size_t j) const
Definition: matrix_template.h:475
T operator[](size_t i) const
Definition: matrix_template.h:230
Definition: matrix_template.h:36
size_t columns(void) const
Definition: matrix_template.h:463
size_t ncols
number of columns
Definition: matrix_template.h:160
size_t size(void) const
Definition: matrix_template.h:218
size_t rows(void) const
Definition: matrix_template.h:453
T operator()(size_t i) const
Definition: matrix_template.h:250
Definition: matrix_template.h:56
matrix_template(void)
Definition: matrix_template.h:408
vector_template(void)
Definition: matrix_template.h:176
Definition: anomalous.cc:33