43 # define M_E 2.7182818284590452354
44 # define M_LOG2E 1.4426950408889634074
45 # define M_LOG10E 0.43429448190325182765
46 # define M_LN2 0.69314718055994530942
47 # define M_LN10 2.30258509299404568402
48 # define M_PI 3.14159265358979323846
49 # define M_PI_2 1.57079632679489661923
50 # define M_PI_4 0.78539816339744830962
51 # define M_1_PI 0.31830988618379067154
52 # define M_2_PI 0.63661977236758134308
53 # define M_2_SQRTPI 1.12837916709551257390
54 # define M_SQRT2 1.41421356237309504880
55 # define M_SQRT1_2 0.70710678118654752440
59 # define M_PIl 3.1415926535897932384626433832795029L
60 # define M_PI_2l 1.5707963267948966192313216916397514L
61 # define M_PI_4l 0.7853981633974483096156608458198757L
62 # define M_1_PIl 0.3183098861837906715377675267450287L
63 # define M_2_PIl 0.6366197723675813430755350534900574L
64 # define M_2_SQRTPIl 1.1283791670955125738961589031215452L
75 struct abstract_null_type {
76 abstract_null_type(
int=0) {}
77 template <
typename A,
typename B,
typename C>
void operator()(A,B,C) {}
80 struct linalg_true {};
81 struct linalg_false {};
83 template <
typename V,
typename W>
struct linalg_and
84 {
typedef linalg_false bool_type; };
85 template <>
struct linalg_and<linalg_true, linalg_true>
86 {
typedef linalg_true bool_type; };
87 template <
typename V,
typename W>
struct linalg_or
88 {
typedef linalg_true bool_type; };
89 template <>
struct linalg_and<linalg_false, linalg_false>
90 {
typedef linalg_false bool_type; };
92 struct linalg_const {};
93 struct linalg_modifiable {};
95 struct abstract_vector {};
96 struct abstract_matrix {};
98 struct abstract_sparse {};
99 struct abstract_skyline {};
100 struct abstract_dense {};
101 struct abstract_indirect {};
105 struct row_and_col {};
106 struct col_and_row {};
108 template <
typename T>
struct transposed_type;
109 template<>
struct transposed_type<row_major> {
typedef col_major t_type;};
110 template<>
struct transposed_type<col_major> {
typedef row_major t_type;};
111 template<>
struct transposed_type<row_and_col> {
typedef col_and_row t_type;};
112 template<>
struct transposed_type<col_and_row> {
typedef row_and_col t_type;};
114 template <
typename T>
struct principal_orientation_type
115 {
typedef abstract_null_type potype; };
116 template<>
struct principal_orientation_type<row_major>
117 {
typedef row_major potype; };
118 template<>
struct principal_orientation_type<col_major>
119 {
typedef col_major potype; };
120 template<>
struct principal_orientation_type<row_and_col>
121 {
typedef row_major potype; };
122 template<>
struct principal_orientation_type<col_and_row>
123 {
typedef col_major potype; };
126 template <
typename V>
struct linalg_traits {
127 typedef abstract_null_type this_type;
128 typedef abstract_null_type linalg_type;
129 typedef abstract_null_type value_type;
130 typedef abstract_null_type is_reference;
131 typedef abstract_null_type& reference;
132 typedef abstract_null_type* iterator;
133 typedef const abstract_null_type* const_iterator;
134 typedef abstract_null_type index_sorted;
135 typedef abstract_null_type storage_type;
136 typedef abstract_null_type origin_type;
137 typedef abstract_null_type const_sub_row_type;
138 typedef abstract_null_type sub_row_type;
139 typedef abstract_null_type const_row_iterator;
140 typedef abstract_null_type row_iterator;
141 typedef abstract_null_type const_sub_col_type;
142 typedef abstract_null_type sub_col_type;
143 typedef abstract_null_type const_col_iterator;
144 typedef abstract_null_type col_iterator;
145 typedef abstract_null_type sub_orientation;
148 template <
typename PT,
typename V>
struct vect_ref_type;
149 template <
typename P,
typename V>
struct vect_ref_type<P *, V> {
150 typedef typename linalg_traits<V>::reference access_type;
151 typedef typename linalg_traits<V>::iterator iterator;
153 template <
typename P,
typename V>
struct vect_ref_type<const P *, V> {
154 typedef typename linalg_traits<V>::value_type access_type;
155 typedef typename linalg_traits<V>::const_iterator iterator;
158 template <
typename PT>
struct const_pointer;
159 template <
typename P>
struct const_pointer<P *>
160 {
typedef const P* pointer; };
161 template <
typename P>
struct const_pointer<const P *>
162 {
typedef const P* pointer; };
164 template <
typename PT>
struct modifiable_pointer;
165 template <
typename P>
struct modifiable_pointer<P *>
166 {
typedef P* pointer; };
167 template <
typename P>
struct modifiable_pointer<const P *>
168 {
typedef P* pointer; };
170 template <
typename R>
struct const_reference;
171 template <
typename R>
struct const_reference<R &>
172 {
typedef const R &reference; };
173 template <
typename R>
struct const_reference<const R &>
174 {
typedef const R &reference; };
177 inline bool is_sparse(abstract_sparse) {
return true; }
178 inline bool is_sparse(abstract_dense) {
return false; }
179 inline bool is_sparse(abstract_skyline) {
return true; }
180 inline bool is_sparse(abstract_indirect) {
return false; }
182 template <
typename L>
inline bool is_sparse(
const L &)
183 {
return is_sparse(
typename linalg_traits<L>::storage_type()); }
185 inline bool is_row_matrix_(row_major) {
return true; }
186 inline bool is_row_matrix_(col_major) {
return false; }
187 inline bool is_row_matrix_(row_and_col) {
return true; }
188 inline bool is_row_matrix_(col_and_row) {
return true; }
190 template <
typename L>
inline bool is_row_matrix(
const L &)
191 {
return is_row_matrix_(
typename linalg_traits<L>::sub_orientation()); }
193 inline bool is_col_matrix_(row_major) {
return false; }
194 inline bool is_col_matrix_(col_major) {
return true; }
195 inline bool is_col_matrix_(row_and_col) {
return true; }
196 inline bool is_col_matrix_(col_and_row) {
return true; }
198 template <
typename L>
inline bool is_col_matrix(
const L &)
199 {
return is_col_matrix_(
typename linalg_traits<L>::sub_orientation()); }
201 inline bool is_col_matrix(row_major) {
return false; }
202 inline bool is_col_matrix(col_major) {
return true; }
203 inline bool is_row_matrix(row_major) {
return true; }
204 inline bool is_row_matrix(col_major) {
return false; }
206 template <
typename L>
inline bool is_const_reference(L) {
return false; }
207 inline bool is_const_reference(linalg_const) {
return true; }
210 template <
typename T>
struct is_gmm_interfaced_ {
211 typedef linalg_true result;
214 template<>
struct is_gmm_interfaced_<abstract_null_type> {
215 typedef linalg_false result;
218 template <
typename T>
struct is_gmm_interfaced {
219 typedef typename is_gmm_interfaced_<typename gmm::linalg_traits<T>::this_type >::result result;
226 template <
typename V>
struct org_type {
typedef V t; };
227 template <
typename V>
struct org_type<V *> {
typedef V t; };
228 template <
typename V>
struct org_type<const V *> {
typedef V t; };
229 template <
typename V>
struct org_type<V &> {
typedef V t; };
230 template <
typename V>
struct org_type<const V &> {
typedef V t; };
236 template <
typename PT,
typename R>
struct mref_type_
237 {
typedef abstract_null_type return_type; };
238 template <
typename L,
typename R>
struct mref_type_<L *, R>
239 {
typedef typename org_type<L>::t & return_type; };
240 template <
typename L,
typename R>
struct mref_type_<const L *, R>
241 {
typedef const typename org_type<L>::t & return_type; };
242 template <
typename L>
struct mref_type_<L *, linalg_const>
243 {
typedef const typename org_type<L>::t & return_type; };
244 template <
typename L>
struct mref_type_<const L *, linalg_const>
245 {
typedef const typename org_type<L>::t & return_type; };
246 template <
typename L>
struct mref_type_<const L *, linalg_modifiable>
247 {
typedef typename org_type<L>::t & return_type; };
248 template <
typename L>
struct mref_type_<L *, linalg_modifiable>
249 {
typedef typename org_type<L>::t & return_type; };
251 template <
typename PT>
struct mref_type {
252 typedef typename std::iterator_traits<PT>::value_type L;
253 typedef typename mref_type_<PT,
254 typename linalg_traits<L>::is_reference>::return_type return_type;
257 template <
typename L>
typename mref_type<const L *>::return_type
258 linalg_cast(
const L &l)
259 {
return const_cast<typename mref_type<const L *>::return_type
>(l); }
261 template <
typename L>
typename mref_type<L *>::return_type linalg_cast(L &l)
262 {
return const_cast<typename mref_type<L *>::return_type
>(l); }
264 template <
typename L,
typename R>
struct cref_type_
265 {
typedef abstract_null_type return_type; };
266 template <
typename L>
struct cref_type_<L, linalg_modifiable>
267 {
typedef typename org_type<L>::t & return_type; };
268 template <
typename L>
struct cref_type {
269 typedef typename cref_type_<L,
270 typename linalg_traits<L>::is_reference>::return_type return_type;
273 template <
typename L>
typename cref_type<L>::return_type
274 linalg_const_cast(
const L &l)
275 {
return const_cast<typename cref_type<L>::return_type
>(l); }
284 template <
typename C1,
typename C2,
typename REF>
struct select_return_ {
285 typedef abstract_null_type return_type;
287 template <
typename C1,
typename C2,
typename L>
288 struct select_return_<C1, C2, const L &> {
typedef C1 return_type; };
289 template <
typename C1,
typename C2,
typename L>
290 struct select_return_<C1, C2, L &> {
typedef C2 return_type; };
291 template <
typename C1,
typename C2,
typename PT>
struct select_return {
292 typedef typename std::iterator_traits<PT>::value_type L;
293 typedef typename select_return_<C1, C2,
294 typename mref_type<PT>::return_type>::return_type return_type;
303 template <
typename C1,
typename C2,
typename REF>
304 struct select_ref_ {
typedef abstract_null_type ref_type; };
306 template <
typename C1,
typename C2,
typename L>
307 struct select_ref_<C1, C2, const L &> {
typedef C1 ref_type; };
309 template <
typename C1,
typename C2,
typename L>
310 struct select_ref_<C1, C2, L &> {
typedef C2 ref_type; };
312 template <
typename C1,
typename C2,
typename PT>
314 typedef typename std::iterator_traits<PT>::value_type L;
315 typedef typename select_ref_<C1, C2,
316 typename mref_type<PT>::return_type>::ref_type ref_type;
319 template <
typename C1,
typename C2,
typename L>
320 struct select_ref<C1, C2, const L *> {
typedef C1 ref_type; };
323 template<
typename R>
struct is_a_reference_
324 {
typedef linalg_true reference; };
325 template<>
struct is_a_reference_<linalg_false>
326 {
typedef linalg_false reference; };
328 template<
typename L>
struct is_a_reference {
329 typedef typename is_a_reference_<typename linalg_traits<L>::is_reference>
330 ::reference reference;
334 template <
typename L>
inline bool is_original_linalg(
const L &)
335 {
return is_original_linalg(
typename is_a_reference<L>::reference()); }
336 inline bool is_original_linalg(linalg_false) {
return true; }
337 inline bool is_original_linalg(linalg_true) {
return false; }
340 template <
typename PT>
struct which_reference
341 {
typedef abstract_null_type is_reference; };
342 template <
typename PT>
struct which_reference<PT *>
343 {
typedef linalg_modifiable is_reference; };
344 template <
typename PT>
struct which_reference<const PT *>
345 {
typedef linalg_const is_reference; };
348 template <
typename C1,
typename C2,
typename R>
struct select_orientation_
349 {
typedef abstract_null_type return_type; };
350 template <
typename C1,
typename C2>
351 struct select_orientation_<C1, C2, row_major>
352 {
typedef C1 return_type; };
353 template <
typename C1,
typename C2>
354 struct select_orientation_<C1, C2, col_major>
355 {
typedef C2 return_type; };
356 template <
typename C1,
typename C2,
typename L>
struct select_orientation {
357 typedef typename select_orientation_<C1, C2,
358 typename principal_orientation_type<
typename
359 linalg_traits<L>::sub_orientation>::potype>::return_type return_type;
366 template <
typename T>
inline T sqr(T a) {
return T(a * a); }
367 template <
typename T>
inline T abs(T a) {
return (a < T(0)) ? T(-a) : a; }
368 template <
typename T>
inline T abs(std::complex<T> a)
369 { T x = a.real(), y = a.imag();
return T(::sqrt(x*x+y*y)); }
370 template <
typename T>
inline T abs_sqr(T a) {
return T(a*a); }
371 template <
typename T>
inline T abs_sqr(std::complex<T> a)
372 {
return gmm::sqr(a.real()) + gmm::sqr(a.imag()); }
373 template <
typename T>
inline T pos(T a) {
return (a < T(0)) ? T(0) : a; }
374 template <
typename T>
inline T neg(T a) {
return (a < T(0)) ? T(-a) : T(0); }
375 template <
typename T>
inline T sgn(T a) {
return (a < T(0)) ? T(-1) : T(1); }
376 template <
typename T>
inline T Heaviside(T a) {
return (a < T(0)) ? T(0) : T(1); }
377 inline double random() {
return double(rand())/(RAND_MAX+0.5); }
378 template <
typename T>
inline T random(T)
379 {
return T(rand()*2.0)/(T(RAND_MAX)+T(1)/T(2)) - T(1); }
380 template <
typename T>
inline std::complex<T> random(std::complex<T>)
381 {
return std::complex<T>(gmm::random(T()), gmm::random(T())); }
382 template <
typename T>
inline T irandom(T max)
383 {
return T(gmm::random() *
double(max)); }
384 template <
typename T>
inline T conj(T a) {
return a; }
385 template <
typename T>
inline std::complex<T> conj(std::complex<T> a)
386 {
return std::conj(a); }
387 template <
typename T>
inline T real(T a) {
return a; }
388 template <
typename T>
inline T real(std::complex<T> a) {
return a.real(); }
389 template <
typename T>
inline T imag(T ) {
return T(0); }
390 template <
typename T>
inline T imag(std::complex<T> a) {
return a.imag(); }
391 template <
typename T>
inline T sqrt(T a) {
return T(::sqrt(a)); }
392 template <
typename T>
inline std::complex<T> sqrt(std::complex<T> a) {
393 T x = a.real(), y = a.imag();
395 T t = T(::sqrt(gmm::abs(y) / T(2)));
396 return std::complex<T>(t, y < T(0) ? -t : t);
398 T t = T(::sqrt(T(2) * (gmm::abs(a) + gmm::abs(x)))), u = t / T(2);
399 return x > T(0) ? std::complex<T>(u, y / t)
400 : std::complex<T>(gmm::abs(y) / t, y < T(0) ? -u : u);
405 template <
typename T>
struct number_traits {
406 typedef T magnitude_type;
409 template <
typename T>
struct number_traits<std::complex<T> > {
410 typedef T magnitude_type;
413 template <
typename T>
inline T conj_product(T a, T b) {
return a * b; }
414 template <
typename T>
inline
415 std::complex<T> conj_product(std::complex<T> a, std::complex<T> b)
416 {
return std::conj(a) * b; }
418 template <
typename T>
inline bool is_complex(T) {
return false; }
419 template <
typename T>
inline bool is_complex(std::complex<T> )
422 # define magnitude_of_linalg(M) typename number_traits<typename \
423 linalg_traits<M>::value_type>::magnitude_type
430 template <
typename T1,
typename T2,
bool c>
431 struct strongest_numeric_type_aux {
434 template <
typename T1,
typename T2>
435 struct strongest_numeric_type_aux<T1,T2,false> {
439 template <
typename T1,
typename T2>
440 struct strongest_numeric_type {
442 strongest_numeric_type_aux<T1,T2,(
sizeof(T1)>
sizeof(T2))>::T T;
444 template <
typename T1,
typename T2>
445 struct strongest_numeric_type<T1,std::complex<T2> > {
446 typedef typename number_traits<T1>::magnitude_type R1;
447 typedef std::complex<typename strongest_numeric_type<R1,T2>::T > T;
449 template <
typename T1,
typename T2>
450 struct strongest_numeric_type<std::complex<T1>,T2 > {
451 typedef typename number_traits<T2>::magnitude_type R2;
452 typedef std::complex<typename strongest_numeric_type<T1,R2>::T > T;
454 template <
typename T1,
typename T2>
455 struct strongest_numeric_type<std::complex<T1>,std::complex<T2> > {
456 typedef std::complex<typename strongest_numeric_type<T1,T2>::T > T;
459 template<>
struct strongest_numeric_type<int,float> {
typedef float T; };
460 template<>
struct strongest_numeric_type<float,int> {
typedef float T; };
461 template<>
struct strongest_numeric_type<long,float> {
typedef float T; };
462 template<>
struct strongest_numeric_type<float,long> {
typedef float T; };
463 template<>
struct strongest_numeric_type<long,double> {
typedef double T; };
464 template<>
struct strongest_numeric_type<double,long> {
typedef double T; };
466 template <
typename V1,
typename V2>
467 struct strongest_value_type {
469 strongest_numeric_type<typename linalg_traits<V1>::value_type,
470 typename linalg_traits<V2>::value_type>::T
473 template <
typename V1,
typename V2,
typename V3>
474 struct strongest_value_type3 {
476 strongest_value_type<V1,
typename
477 strongest_value_type<V2,V3>::value_type>::value_type
487 template<
typename T>
struct dense_vector_type
488 {
typedef std::vector<T> vector_type; };
490 template <
typename T>
class wsvector;
491 template <
typename T>
class rsvector;
492 template <
typename T>
class dsvector;
494 {
typedef wsvector<T> vector_type; };
496 template <
typename T>
class slvector;
497 template <
typename T>
class dense_matrix;
498 template <
typename VECT>
class row_matrix;
499 template <
typename VECT>
class col_matrix;
510 template <
typename R,
typename S,
typename L,
typename V>
511 struct temporary_vector_ {
512 typedef abstract_null_type vector_type;
514 template <
typename V,
typename L>
515 struct temporary_vector_<linalg_true, abstract_sparse, L, V>
516 {
typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };
517 template <
typename V,
typename L>
518 struct temporary_vector_<linalg_true, abstract_skyline, L, V>
519 {
typedef slvector<typename linalg_traits<V>::value_type> vector_type; };
520 template <
typename V,
typename L>
521 struct temporary_vector_<linalg_true, abstract_dense, L, V>
522 {
typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };
523 template <
typename S,
typename V>
524 struct temporary_vector_<linalg_false, S, abstract_vector, V>
525 {
typedef V vector_type; };
526 template <
typename V>
527 struct temporary_vector_<linalg_false, abstract_dense, abstract_matrix, V>
528 {
typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };
529 template <
typename V>
530 struct temporary_vector_<linalg_false, abstract_sparse, abstract_matrix, V>
531 {
typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };
533 template <
typename V>
struct temporary_vector {
534 typedef typename temporary_vector_<typename is_a_reference<V>::reference,
535 typename linalg_traits<V>::storage_type,
536 typename linalg_traits<V>::linalg_type,
537 V>::vector_type vector_type;
548 template <
typename R,
typename S,
typename L,
typename V>
549 struct temporary_matrix_ {
typedef abstract_null_type matrix_type; };
550 template <
typename V,
typename L>
551 struct temporary_matrix_<linalg_true, abstract_sparse, L, V> {
552 typedef typename linalg_traits<V>::value_type T;
553 typedef row_matrix<wsvector<T> > matrix_type;
555 template <
typename V,
typename L>
556 struct temporary_matrix_<linalg_true, abstract_skyline, L, V> {
557 typedef typename linalg_traits<V>::value_type T;
558 typedef row_matrix<slvector<T> > matrix_type;
560 template <
typename V,
typename L>
561 struct temporary_matrix_<linalg_true, abstract_dense, L, V>
562 {
typedef dense_matrix<typename linalg_traits<V>::value_type> matrix_type; };
563 template <
typename S,
typename V>
564 struct temporary_matrix_<linalg_false, S, abstract_matrix, V>
565 {
typedef V matrix_type; };
567 template <
typename V>
struct temporary_matrix {
568 typedef typename temporary_matrix_<typename is_a_reference<V>::reference,
569 typename linalg_traits<V>::storage_type,
570 typename linalg_traits<V>::linalg_type,
571 V>::matrix_type matrix_type;
575 template <
typename S,
typename L,
typename V>
576 struct temporary_col_matrix_ {
typedef abstract_null_type matrix_type; };
577 template <
typename V,
typename L>
578 struct temporary_col_matrix_<abstract_sparse, L, V> {
579 typedef typename linalg_traits<V>::value_type T;
580 typedef col_matrix<wsvector<T> > matrix_type;
582 template <
typename V,
typename L>
583 struct temporary_col_matrix_<abstract_skyline, L, V> {
584 typedef typename linalg_traits<V>::value_type T;
585 typedef col_matrix<slvector<T> > matrix_type;
587 template <
typename V,
typename L>
588 struct temporary_col_matrix_<abstract_dense, L, V>
589 {
typedef dense_matrix<typename linalg_traits<V>::value_type> matrix_type; };
591 template <
typename V>
struct temporary_col_matrix {
592 typedef typename temporary_col_matrix_<
593 typename linalg_traits<V>::storage_type,
594 typename linalg_traits<V>::linalg_type,
595 V>::matrix_type matrix_type;
601 template <
typename S,
typename L,
typename V>
602 struct temporary_row_matrix_ {
typedef abstract_null_type matrix_type; };
603 template <
typename V,
typename L>
604 struct temporary_row_matrix_<abstract_sparse, L, V> {
605 typedef typename linalg_traits<V>::value_type T;
606 typedef row_matrix<wsvector<T> > matrix_type;
608 template <
typename V,
typename L>
609 struct temporary_row_matrix_<abstract_skyline, L, V> {
610 typedef typename linalg_traits<V>::value_type T;
611 typedef row_matrix<slvector<T> > matrix_type;
613 template <
typename V,
typename L>
614 struct temporary_row_matrix_<abstract_dense, L, V>
615 {
typedef dense_matrix<typename linalg_traits<V>::value_type> matrix_type; };
617 template <
typename V>
struct temporary_row_matrix {
618 typedef typename temporary_row_matrix_<
619 typename linalg_traits<V>::storage_type,
620 typename linalg_traits<V>::linalg_type,
621 V>::matrix_type matrix_type;
632 template <
typename R,
typename S,
typename V>
633 struct temporary_dense_vector_ {
typedef abstract_null_type vector_type; };
634 template <
typename S,
typename V>
635 struct temporary_dense_vector_<linalg_true, S, V>
636 {
typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };
637 template <
typename V>
638 struct temporary_dense_vector_<linalg_false, abstract_sparse, V>
639 {
typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };
640 template <
typename V>
641 struct temporary_dense_vector_<linalg_false, abstract_skyline, V>
642 {
typedef std::vector<typename linalg_traits<V>::value_type> vector_type; };
643 template <
typename V>
644 struct temporary_dense_vector_<linalg_false, abstract_dense, V>
645 {
typedef V vector_type; };
647 template <
typename V>
struct temporary_dense_vector {
648 typedef typename temporary_dense_vector_<
typename
649 is_a_reference<V>::reference,
650 typename linalg_traits<V>::storage_type, V>::vector_type vector_type;
659 template <
typename R,
typename S,
typename V>
660 struct temporary_sparse_vector_ {
typedef abstract_null_type vector_type; };
661 template <
typename S,
typename V>
662 struct temporary_sparse_vector_<linalg_true, S, V>
663 {
typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };
664 template <
typename V>
665 struct temporary_sparse_vector_<linalg_false, abstract_sparse, V>
666 {
typedef V vector_type; };
667 template <
typename V>
668 struct temporary_sparse_vector_<linalg_false, abstract_dense, V>
669 {
typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };
670 template <
typename V>
671 struct temporary_sparse_vector_<linalg_false, abstract_skyline, V>
672 {
typedef wsvector<typename linalg_traits<V>::value_type> vector_type; };
674 template <
typename V>
struct temporary_sparse_vector {
675 typedef typename temporary_sparse_vector_<
typename
676 is_a_reference<V>::reference,
677 typename linalg_traits<V>::storage_type, V>::vector_type vector_type;
686 template <
typename R,
typename S,
typename V>
687 struct temporary_skyline_vector_
688 {
typedef abstract_null_type vector_type; };
689 template <
typename S,
typename V>
690 struct temporary_skyline_vector_<linalg_true, S, V>
691 {
typedef slvector<typename linalg_traits<V>::value_type> vector_type; };
692 template <
typename V>
693 struct temporary_skyline_vector_<linalg_false, abstract_skyline, V>
694 {
typedef V vector_type; };
695 template <
typename V>
696 struct temporary_skyline_vector_<linalg_false, abstract_dense, V>
697 {
typedef slvector<typename linalg_traits<V>::value_type> vector_type; };
698 template <
typename V>
699 struct temporary_skyline_vector_<linalg_false, abstract_sparse, V>
700 {
typedef slvector<typename linalg_traits<V>::value_type> vector_type; };
702 template <
typename V>
struct temporary_skylines_vector {
703 typedef typename temporary_skyline_vector_<
typename
704 is_a_reference<V>::reference,
705 typename linalg_traits<V>::storage_type, V>::vector_type vector_type;
712 template <
typename L>
713 typename select_return<const typename linalg_traits<L>::origin_type *,
714 typename linalg_traits<L>::origin_type *,
717 {
return linalg_traits<L>::origin(linalg_cast(l)); }
719 template <
typename L>
720 typename select_return<const typename linalg_traits<L>::origin_type *,
721 typename linalg_traits<L>::origin_type *,
722 const L *>::return_type
723 linalg_origin(
const L &l)
724 {
return linalg_traits<L>::origin(linalg_cast(l)); }
726 template <
typename PT1,
typename PT2>
727 bool same_porigin(PT1, PT2) {
return false; }
729 template <
typename PT>
730 bool same_porigin(PT pt1, PT pt2) {
return (pt1 == pt2); }
732 template <
typename L1,
typename L2>
733 bool same_origin(
const L1 &l1,
const L2 &l2)
734 {
return same_porigin(linalg_origin(l1), linalg_origin(l2)); }
741 template <
typename V>
inline size_type vect_size(
const V &v)
742 {
return linalg_traits<V>::size(v); }
744 template <
typename MAT>
inline size_type mat_nrows(
const MAT &m)
745 {
return linalg_traits<MAT>::nrows(m); }
747 template <
typename MAT>
inline size_type mat_ncols(
const MAT &m)
748 {
return linalg_traits<MAT>::ncols(m); }
751 template <
typename V>
inline
752 typename select_return<typename linalg_traits<V>::const_iterator,
753 typename linalg_traits<V>::iterator,
756 {
return linalg_traits<V>::begin(linalg_cast(v)); }
758 template <
typename V>
inline
759 typename select_return<typename linalg_traits<V>::const_iterator,
760 typename linalg_traits<V>::iterator,
761 const V *>::return_type
762 vect_begin(
const V &v)
763 {
return linalg_traits<V>::begin(linalg_cast(v)); }
765 template <
typename V>
inline
766 typename linalg_traits<V>::const_iterator
767 vect_const_begin(
const V &v)
768 {
return linalg_traits<V>::begin(v); }
770 template <
typename V>
inline
771 typename select_return<typename linalg_traits<V>::const_iterator,
772 typename linalg_traits<V>::iterator,
775 {
return linalg_traits<V>::end(linalg_cast(v)); }
777 template <
typename V>
inline
778 typename select_return<typename linalg_traits<V>::const_iterator,
779 typename linalg_traits<V>::iterator,
780 const V *>::return_type
782 {
return linalg_traits<V>::end(linalg_cast(v)); }
784 template <
typename V>
inline
785 typename linalg_traits<V>::const_iterator
786 vect_const_end(
const V &v)
787 {
return linalg_traits<V>::end(v); }
789 template <
typename M>
inline
790 typename select_return<typename linalg_traits<M>::const_row_iterator,
791 typename linalg_traits<M>::row_iterator,
793 mat_row_begin(M &m) {
return linalg_traits<M>::row_begin(linalg_cast(m)); }
795 template <
typename M>
inline
796 typename select_return<typename linalg_traits<M>::const_row_iterator,
797 typename linalg_traits<M>::row_iterator,
798 const M *>::return_type
799 mat_row_begin(
const M &m)
800 {
return linalg_traits<M>::row_begin(linalg_cast(m)); }
802 template <
typename M>
inline typename linalg_traits<M>::const_row_iterator
803 mat_row_const_begin(
const M &m)
804 {
return linalg_traits<M>::row_begin(m); }
806 template <
typename M>
inline
807 typename select_return<typename linalg_traits<M>::const_row_iterator,
808 typename linalg_traits<M>::row_iterator,
811 return linalg_traits<M>::row_end(linalg_cast(v));
814 template <
typename M>
inline
815 typename select_return<typename linalg_traits<M>::const_row_iterator,
816 typename linalg_traits<M>::row_iterator,
817 const M *>::return_type
818 mat_row_end(
const M &v) {
819 return linalg_traits<M>::row_end(linalg_cast(v));
822 template <
typename M>
inline
823 typename linalg_traits<M>::const_row_iterator
824 mat_row_const_end(
const M &v)
825 {
return linalg_traits<M>::row_end(v); }
827 template <
typename M>
inline
828 typename select_return<typename linalg_traits<M>::const_col_iterator,
829 typename linalg_traits<M>::col_iterator,
831 mat_col_begin(M &v) {
832 return linalg_traits<M>::col_begin(linalg_cast(v));
835 template <
typename M>
inline
836 typename select_return<typename linalg_traits<M>::const_col_iterator,
837 typename linalg_traits<M>::col_iterator,
838 const M *>::return_type
839 mat_col_begin(
const M &v) {
840 return linalg_traits<M>::col_begin(linalg_cast(v));
843 template <
typename M>
inline
844 typename linalg_traits<M>::const_col_iterator
845 mat_col_const_begin(
const M &v)
846 {
return linalg_traits<M>::col_begin(v); }
848 template <
typename M>
inline
849 typename linalg_traits<M>::const_col_iterator
850 mat_col_const_end(
const M &v)
851 {
return linalg_traits<M>::col_end(v); }
853 template <
typename M>
inline
854 typename select_return<typename linalg_traits<M>::const_col_iterator,
855 typename linalg_traits<M>::col_iterator,
858 {
return linalg_traits<M>::col_end(linalg_cast(m)); }
860 template <
typename M>
inline
861 typename select_return<typename linalg_traits<M>::const_col_iterator,
862 typename linalg_traits<M>::col_iterator,
863 const M *>::return_type
864 mat_col_end(
const M &m)
865 {
return linalg_traits<M>::col_end(linalg_cast(m)); }
867 template <
typename MAT>
inline
868 typename select_return<typename linalg_traits<MAT>::const_sub_row_type,
869 typename linalg_traits<MAT>::sub_row_type,
870 const MAT *>::return_type
871 mat_row(
const MAT &m, size_type i)
872 {
return linalg_traits<MAT>::row(mat_row_begin(m) + i); }
874 template <
typename MAT>
inline
875 typename select_return<typename linalg_traits<MAT>::const_sub_row_type,
876 typename linalg_traits<MAT>::sub_row_type,
878 mat_row(MAT &m, size_type i)
879 {
return linalg_traits<MAT>::row(mat_row_begin(m) + i); }
881 template <
typename MAT>
inline
882 typename linalg_traits<MAT>::const_sub_row_type
883 mat_const_row(
const MAT &m, size_type i)
884 {
return linalg_traits<MAT>::row(mat_row_const_begin(m) + i); }
886 template <
typename MAT>
inline
887 typename select_return<typename linalg_traits<MAT>::const_sub_col_type,
888 typename linalg_traits<MAT>::sub_col_type,
889 const MAT *>::return_type
890 mat_col(
const MAT &m, size_type i)
891 {
return linalg_traits<MAT>::col(mat_col_begin(m) + i); }
894 template <
typename MAT>
inline
895 typename select_return<typename linalg_traits<MAT>::const_sub_col_type,
896 typename linalg_traits<MAT>::sub_col_type,
898 mat_col(MAT &m, size_type i)
899 {
return linalg_traits<MAT>::col(mat_col_begin(m) + i); }
901 template <
typename MAT>
inline
902 typename linalg_traits<MAT>::const_sub_col_type
903 mat_const_col(
const MAT &m, size_type i)
904 {
return linalg_traits<MAT>::col(mat_col_const_begin(m) + i); }
910 template <
typename IT,
typename ORG,
typename VECT>
inline
911 void set_to_begin(IT &it, ORG o, VECT *, linalg_false)
912 { it = vect_begin(*o); }
914 template <
typename IT,
typename ORG,
typename VECT>
inline
915 void set_to_begin(IT &it, ORG o,
const VECT *, linalg_false)
916 { it = vect_const_begin(*o); }
918 template <
typename IT,
typename ORG,
typename VECT>
inline
919 void set_to_end(IT &it, ORG o, VECT *, linalg_false)
920 { it = vect_end(*o); }
922 template <
typename IT,
typename ORG,
typename VECT>
inline
923 void set_to_end(IT &it, ORG o,
const VECT *, linalg_false)
924 { it = vect_const_end(*o); }
927 template <
typename IT,
typename ORG,
typename VECT>
inline
928 void set_to_begin(IT &, ORG, VECT *, linalg_const) { }
930 template <
typename IT,
typename ORG,
typename VECT>
inline
931 void set_to_begin(IT &, ORG,
const VECT *, linalg_const) { }
933 template <
typename IT,
typename ORG,
typename VECT>
inline
934 void set_to_end(IT &, ORG, VECT *, linalg_const) { }
936 template <
typename IT,
typename ORG,
typename VECT>
inline
937 void set_to_end(IT &, ORG,
const VECT *, linalg_const) { }
939 template <
typename IT,
typename ORG,
typename VECT>
inline
940 void set_to_begin(IT &, ORG, VECT *v, linalg_modifiable)
941 { GMM_ASSERT3(!is_sparse(*v),
"internal_error"); (void)v; }
943 template <
typename IT,
typename ORG,
typename VECT>
inline
944 void set_to_begin(IT &, ORG,
const VECT *v, linalg_modifiable)
945 { GMM_ASSERT3(!is_sparse(*v),
"internal_error"); (void)v; }
947 template <
typename IT,
typename ORG,
typename VECT>
inline
948 void set_to_end(IT &, ORG, VECT *v, linalg_modifiable)
949 { GMM_ASSERT3(!is_sparse(*v),
"internal_error"); (void)v; }
951 template <
typename IT,
typename ORG,
typename VECT>
inline
952 void set_to_end(IT &, ORG,
const VECT *v, linalg_modifiable)
953 { GMM_ASSERT3(!is_sparse(*v),
"internal_error"); (void)v; }
960 size_type index_of_it(
const IT &it, size_type, abstract_sparse)
961 {
return it.index(); }
963 size_type index_of_it(
const IT &it, size_type, abstract_skyline)
964 {
return it.index(); }
966 size_type index_of_it(
const IT &, size_type k, abstract_dense)
973 template<
typename T>
inline T default_tol(T) {
977 if (numeric_limits<T>::is_specialized)
978 tol = numeric_limits<T>::epsilon();
980 int i=int(
sizeof(T)/4);
while(i-- > 0) tol*=T(1E-8);
981 GMM_WARNING1(
"The numeric type " <<
typeid(T).name()
982 <<
" has no numeric_limits defined !!\n"
983 <<
"Taking " << tol <<
" as default tolerance");
988 template<
typename T>
inline T default_tol(std::complex<T>)
989 {
return default_tol(T()); }
991 template<
typename T>
inline T default_min(T) {
995 if (numeric_limits<T>::is_specialized)
996 mi = std::numeric_limits<T>::min();
999 GMM_WARNING1(
"The numeric type " <<
typeid(T).name()
1000 <<
" has no numeric_limits defined !!\n"
1001 <<
"Taking 0 as default minimum");
1006 template<
typename T>
inline T default_min(std::complex<T>)
1007 {
return default_min(T()); }
1009 template<
typename T>
inline T default_max(T) {
1010 using namespace std;
1013 if (numeric_limits<T>::is_specialized)
1014 mi = std::numeric_limits<T>::max();
1017 GMM_WARNING1(
"The numeric type " <<
typeid(T).name()
1018 <<
" has no numeric_limits defined !!\n"
1019 <<
"Taking 1 as default maximum !");
1024 template<
typename T>
inline T default_max(std::complex<T>)
1025 {
return default_max(T()); }
1033 template<
typename T>
inline T safe_divide(T a, T b) {
return a/b; }
1034 template<
typename T>
inline std::complex<T>
1035 safe_divide(std::complex<T> a, std::complex<T> b) {
1036 T m = std::max(gmm::abs(b.real()), gmm::abs(b.imag()));
1037 a = std::complex<T>(a.real()/m, a.imag()/m);
1038 b = std::complex<T>(b.real()/m, b.imag()/m);
1047 template <
typename T>
struct cast_char_type {
typedef T return_type; };
1048 template <>
struct cast_char_type<signed char> {
typedef int return_type; };
1049 template <>
struct cast_char_type<unsigned char>
1050 {
typedef unsigned int return_type; };
1051 template <
typename T>
inline typename cast_char_type<T>::return_type
1052 cast_char(
const T &c) {
return typename cast_char_type<T>::return_type(c); }
1055 template <
typename L>
inline void write(std::ostream &o,
const L &l)
1056 { write(o, l,
typename linalg_traits<L>::linalg_type()); }
1058 template <
typename L>
void write(std::ostream &o,
const L &l,
1060 o <<
"vector(" << vect_size(l) <<
") [";
1061 write(o, l,
typename linalg_traits<L>::storage_type());
1065 template <
typename L>
void write(std::ostream &o,
const L &l,
1067 typename linalg_traits<L>::const_iterator it = vect_const_begin(l),
1068 ite = vect_const_end(l);
1069 for (; it != ite; ++it)
1070 o <<
" (r" << it.index() <<
", " << cast_char(*it) <<
")";
1073 template <
typename L>
void write(std::ostream &o,
const L &l,
1075 typename linalg_traits<L>::const_iterator it = vect_const_begin(l),
1076 ite = vect_const_end(l);
1077 if (it != ite) o <<
" " << cast_char(*it++);
1078 for (; it != ite; ++it) o <<
", " << cast_char(*it);
1081 template <
typename L>
void write(std::ostream &o,
const L &l,
1083 typedef typename linalg_traits<L>::const_iterator const_iterator;
1084 const_iterator it = vect_const_begin(l), ite = vect_const_end(l);
1086 o <<
"<r+" << it.index() <<
">";
1087 if (it != ite) o <<
" " << cast_char(*it++);
1088 for (; it != ite; ++it) { o <<
", " << cast_char(*it); }
1092 template <
typename L>
inline void write(std::ostream &o,
const L &l,
1094 write(o, l,
typename linalg_traits<L>::sub_orientation());
1098 template <
typename L>
void write(std::ostream &o,
const L &l,
1100 o <<
"matrix(" << mat_nrows(l) <<
", " << mat_ncols(l) <<
")" << endl;
1101 for (size_type i = 0; i < mat_nrows(l); ++i) {
1103 write(o, mat_const_row(l, i),
typename linalg_traits<L>::storage_type());
1108 template <
typename L>
inline
1109 void write(std::ostream &o,
const L &l, row_and_col)
1110 { write(o, l, row_major()); }
1112 template <
typename L>
inline
1113 void write(std::ostream &o,
const L &l, col_and_row)
1114 { write(o, l, row_major()); }
1116 template <
typename L>
void write(std::ostream &o,
const L &l, col_major) {
1117 o <<
"matrix(" << mat_nrows(l) <<
", " << mat_ncols(l) <<
")" << endl;
1118 for (size_type i = 0; i < mat_nrows(l); ++i) {
1121 for (size_type j = 0; j < mat_ncols(l); ++j)
1122 if (l(i,j) !=
typename linalg_traits<L>::value_type(0))
1123 o <<
" (r" << j <<
", " << l(i,j) <<
")";
1126 if (mat_ncols(l) != 0) o <<
' ' << l(i, 0);
1127 for (size_type j = 1; j < mat_ncols(l); ++j) o <<
", " << l(i, j);
sparse vector built upon std::vector.
Provide some simple pseudo-containers.
size_t size_type
used as the common size type in the library