3
* Copyright (c) Kresimir Fresl 2002
5
* Distributed under the Boost Software License, Version 1.0.
6
* (See accompanying file LICENSE_1_0.txt or copy at
7
* http://www.boost.org/LICENSE_1_0.txt)
9
* Author acknowledges the support of the Faculty of Civil Engineering,
10
* University of Zagreb, Croatia.
14
#ifndef BOOST_NUMERIC_BINDINGS_CBLAS_LEVEL_3_HPP
15
#define BOOST_NUMERIC_BINDINGS_CBLAS_LEVEL_3_HPP
19
#include <boost/numeric/bindings/traits/traits.hpp>
20
#include <boost/numeric/bindings/traits/type_traits.hpp>
21
#include <boost/numeric/bindings/atlas/cblas3_overloads.hpp>
22
#include <boost/numeric/bindings/atlas/cblas_enum.hpp>
23
#include <boost/type_traits/same_traits.hpp>
24
#include <boost/mpl/if.hpp>
26
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
27
# include <boost/static_assert.hpp>
30
namespace boost { namespace numeric { namespace bindings {
34
// C <- alpha * op (A) * op (B) + beta * C
35
// op (A) == A || A^T || A^H
36
template <typename T, typename MatrA, typename MatrB, typename MatrC>
38
void gemm (CBLAS_TRANSPOSE const TransA, CBLAS_TRANSPOSE const TransB,
39
T const& alpha, MatrA const& a, MatrB const& b,
40
T const& beta, MatrC& c
43
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
44
BOOST_STATIC_ASSERT((boost::is_same<
45
typename traits::matrix_traits<MatrA>::matrix_structure,
48
BOOST_STATIC_ASSERT((boost::is_same<
49
typename traits::matrix_traits<MatrB>::matrix_structure,
52
BOOST_STATIC_ASSERT((boost::is_same<
53
typename traits::matrix_traits<MatrC>::matrix_structure,
57
BOOST_STATIC_ASSERT((boost::is_same<
58
typename traits::matrix_traits<MatrA>::ordering_type,
59
typename traits::matrix_traits<MatrB>::ordering_type
61
BOOST_STATIC_ASSERT((boost::is_same<
62
typename traits::matrix_traits<MatrA>::ordering_type,
63
typename traits::matrix_traits<MatrC>::ordering_type
67
assert (TransA == CblasNoTrans
68
|| TransA == CblasTrans
69
|| TransA == CblasConjTrans);
70
assert (TransB == CblasNoTrans
71
|| TransB == CblasTrans
72
|| TransB == CblasConjTrans);
74
int const m = TransA == CblasNoTrans
75
? traits::matrix_size1 (a)
76
: traits::matrix_size2 (a);
77
int const n = TransB == CblasNoTrans
78
? traits::matrix_size2 (b)
79
: traits::matrix_size1 (b);
80
int const k = TransA == CblasNoTrans
81
? traits::matrix_size2 (a)
82
: traits::matrix_size1 (a);
83
assert (m == traits::matrix_size1 (c));
84
assert (n == traits::matrix_size2 (c));
86
int const k1 = TransB == CblasNoTrans
87
? traits::matrix_size1 (b)
88
: traits::matrix_size2 (b);
91
// .. what about AtlasConj?
93
CBLAS_ORDER const stor_ord
94
= enum_cast<CBLAS_ORDER const>
96
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
97
typename traits::matrix_traits<MatrA>::ordering_type
99
typename MatrA::orientation_category
103
detail::gemm (stor_ord, TransA, TransB, m, n, k, alpha,
104
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
105
traits::matrix_storage (a),
107
traits::matrix_storage_const (a),
109
traits::leading_dimension (a),
110
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
111
traits::matrix_storage (b),
113
traits::matrix_storage_const (b),
115
traits::leading_dimension (b),
117
traits::matrix_storage (c),
118
traits::leading_dimension (c));
122
// C <- alpha * A * B + beta * C
123
template <typename T, typename MatrA, typename MatrB, typename MatrC>
125
void gemm (T const& alpha, MatrA const& a, MatrB const& b,
126
T const& beta, MatrC& c)
128
gemm (CblasNoTrans, CblasNoTrans, alpha, a, b, beta, c) ;
133
template <typename MatrA, typename MatrB, typename MatrC>
135
void gemm (MatrA const& a, MatrB const& b, MatrC& c) {
136
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
137
typedef typename traits::matrix_traits<MatrC>::value_type val_t;
139
typedef typename MatrC::value_type val_t;
141
gemm (CblasNoTrans, CblasNoTrans, (val_t) 1, a, b, (val_t) 0, c);
146
// C <- alpha * A * B + beta * C
147
// C <- alpha * B * A + beta * C
152
template <typename T, typename SymmA, typename MatrB, typename MatrC>
154
void symm (CBLAS_SIDE const side, CBLAS_UPLO const uplo,
155
T const& alpha, SymmA const& a, MatrB const& b,
156
T const& beta, MatrC& c)
158
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
159
BOOST_STATIC_ASSERT((boost::is_same<
160
typename traits::matrix_traits<MatrB>::matrix_structure,
163
BOOST_STATIC_ASSERT((boost::is_same<
164
typename traits::matrix_traits<MatrC>::matrix_structure,
168
BOOST_STATIC_ASSERT((boost::is_same<
169
typename traits::matrix_traits<SymmA>::ordering_type,
170
typename traits::matrix_traits<MatrB>::ordering_type
172
BOOST_STATIC_ASSERT((boost::is_same<
173
typename traits::matrix_traits<SymmA>::ordering_type,
174
typename traits::matrix_traits<MatrC>::ordering_type
178
assert (side == CblasLeft || side == CblasRight);
179
assert (uplo == CblasUpper || uplo == CblasLower);
181
int const m = traits::matrix_size1 (c);
182
int const n = traits::matrix_size2 (c);
184
assert (side == CblasLeft
185
? m == traits::matrix_size1 (a)
186
&& m == traits::matrix_size2 (a)
187
: n == traits::matrix_size1 (a)
188
&& n == traits::matrix_size2 (a));
189
assert (m == traits::matrix_size1 (b)
190
&& n == traits::matrix_size2 (b));
192
CBLAS_ORDER const stor_ord
193
= enum_cast<CBLAS_ORDER const>
195
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
196
typename traits::matrix_traits<SymmA>::ordering_type
198
typename SymmA::orientation_category
202
symm (stor_ord, side, uplo,
204
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
205
traits::matrix_storage (a),
207
traits::matrix_storage_const (a),
209
traits::leading_dimension (a),
210
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
211
traits::matrix_storage (b),
213
traits::matrix_storage_const (b),
215
traits::leading_dimension (b),
217
traits::matrix_storage (c),
218
traits::leading_dimension (c));
223
// C <- alpha * A * B + beta * C
224
// C <- alpha * B * A + beta * C
226
template <typename T, typename SymmA, typename MatrB, typename MatrC>
228
void symm (CBLAS_SIDE const side, CBLAS_UPLO const uplo,
229
T const& alpha, SymmA const& a, MatrB const& b,
230
T const& beta, MatrC& c)
232
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
233
BOOST_STATIC_ASSERT((boost::is_same<
234
typename traits::matrix_traits<SymmA>::matrix_structure,
239
detail::symm (side, uplo, alpha, a, b, beta, c);
242
template <typename T, typename SymmA, typename MatrB, typename MatrC>
244
void symm (CBLAS_SIDE const side,
245
T const& alpha, SymmA const& a, MatrB const& b,
246
T const& beta, MatrC& c)
248
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
249
BOOST_STATIC_ASSERT((boost::is_same<
250
typename traits::matrix_traits<SymmA>::matrix_structure,
255
CBLAS_UPLO const uplo
256
= enum_cast<CBLAS_UPLO const>
258
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
259
typename traits::matrix_traits<SymmA>::uplo_type
261
typename SymmA::packed_category
265
detail::symm (side, uplo, alpha, a, b, beta, c);
269
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
273
// C <- alpha * A * B + beta * C ; A == A^T
275
template <typename T, typename SymmA, typename MatrB, typename MatrC>
276
static void f (T const& alpha, SymmA const& a, MatrB const& b,
277
T const& beta, MatrC& c)
279
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
280
BOOST_STATIC_ASSERT((boost::is_same<
281
typename traits::matrix_traits<SymmA>::matrix_structure,
284
BOOST_STATIC_ASSERT((boost::is_same<
285
typename traits::matrix_traits<MatrB>::matrix_structure,
290
int const m = traits::matrix_size1 (c);
291
int const n = traits::matrix_size2 (c);
293
assert (m == traits::matrix_size1 (a)
294
&& m == traits::matrix_size2 (a));
295
assert (m == traits::matrix_size1 (b)
296
&& n == traits::matrix_size2 (b));
298
CBLAS_ORDER const stor_ord
299
= enum_cast<CBLAS_ORDER const>
301
typename traits::matrix_traits<SymmA>::ordering_type
304
CBLAS_UPLO const uplo
305
= enum_cast<CBLAS_UPLO const>
307
typename traits::matrix_traits<SymmA>::uplo_type
310
symm (stor_ord, CblasLeft, uplo,
312
traits::matrix_storage (a), traits::leading_dimension (a),
313
traits::matrix_storage (b), traits::leading_dimension (b),
315
traits::matrix_storage (c), traits::leading_dimension (c));
319
// C <- alpha * A * B + beta * C ; B == B^T
321
template <typename T, typename MatrA, typename SymmB, typename MatrC>
322
static void f (T const& alpha, MatrA const& a, SymmB const& b,
323
T const& beta, MatrC& c)
325
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
326
BOOST_STATIC_ASSERT((boost::is_same<
327
typename traits::matrix_traits<MatrA>::matrix_structure,
330
BOOST_STATIC_ASSERT((boost::is_same<
331
typename traits::matrix_traits<SymmB>::matrix_structure,
336
int const m = traits::matrix_size1 (c);
337
int const n = traits::matrix_size2 (c);
339
assert (n == traits::matrix_size1 (b)
340
&& n == traits::matrix_size2 (b));
341
assert (m == traits::matrix_size1 (a)
342
&& n == traits::matrix_size2 (a));
344
CBLAS_ORDER const stor_ord
345
= enum_cast<CBLAS_ORDER const>
347
typename traits::matrix_traits<SymmB>::ordering_type
350
CBLAS_UPLO const uplo
351
= enum_cast<CBLAS_UPLO const>
353
typename traits::matrix_traits<SymmB>::uplo_type
356
symm (stor_ord, CblasRight, uplo,
358
traits::matrix_storage (b), traits::leading_dimension (b),
359
traits::matrix_storage (a), traits::leading_dimension (a),
361
traits::matrix_storage (c), traits::leading_dimension (c));
367
// C <- alpha * A * B + beta * C
368
// C <- alpha * B * A + beta * C
370
template <typename T, typename MatrA, typename MatrB, typename MatrC>
372
void symm (T const& alpha, MatrA const& a, MatrB const& b,
373
T const& beta, MatrC& c)
375
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
376
BOOST_STATIC_ASSERT((boost::is_same<
377
typename traits::matrix_traits<MatrC>::matrix_structure,
381
BOOST_STATIC_ASSERT((boost::is_same<
382
typename traits::matrix_traits<MatrA>::ordering_type,
383
typename traits::matrix_traits<MatrB>::ordering_type
385
BOOST_STATIC_ASSERT((boost::is_same<
386
typename traits::matrix_traits<MatrA>::ordering_type,
387
typename traits::matrix_traits<MatrC>::ordering_type
394
typename traits::matrix_traits<MatrA>::matrix_structure,
401
functor::f (alpha, a, b, beta, c);
406
template <typename MatrA, typename MatrB, typename MatrC>
408
void symm (MatrA const& a, MatrB const& b, MatrC& c) {
409
typedef typename traits::matrix_traits<MatrC>::value_type val_t;
410
symm ((val_t) 1, a, b, (val_t) 0, c);
413
#endif // BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
417
// C <- alpha * A * B + beta * C
418
// C <- alpha * B * A + beta * C
423
template <typename T, typename HermA, typename MatrB, typename MatrC>
425
void hemm (CBLAS_SIDE const side, CBLAS_UPLO const uplo,
426
T const& alpha, HermA const& a, MatrB const& b,
427
T const& beta, MatrC& c)
429
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
430
BOOST_STATIC_ASSERT((boost::is_same<
431
typename traits::matrix_traits<MatrB>::matrix_structure,
434
BOOST_STATIC_ASSERT((boost::is_same<
435
typename traits::matrix_traits<MatrC>::matrix_structure,
439
BOOST_STATIC_ASSERT((boost::is_same<
440
typename traits::matrix_traits<HermA>::ordering_type,
441
typename traits::matrix_traits<MatrB>::ordering_type
443
BOOST_STATIC_ASSERT((boost::is_same<
444
typename traits::matrix_traits<HermA>::ordering_type,
445
typename traits::matrix_traits<MatrC>::ordering_type
449
assert (side == CblasLeft || side == CblasRight);
450
assert (uplo == CblasUpper || uplo == CblasLower);
452
int const m = traits::matrix_size1 (c);
453
int const n = traits::matrix_size2 (c);
455
assert (side == CblasLeft
456
? m == traits::matrix_size1 (a)
457
&& m == traits::matrix_size2 (a)
458
: n == traits::matrix_size1 (a)
459
&& n == traits::matrix_size2 (a));
460
assert (m == traits::matrix_size1 (b)
461
&& n == traits::matrix_size2 (b));
463
CBLAS_ORDER const stor_ord
464
= enum_cast<CBLAS_ORDER const>
466
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
467
typename traits::matrix_traits<HermA>::ordering_type
469
typename HermA::orientation_category
473
hemm (stor_ord, side, uplo,
475
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
476
traits::matrix_storage (a),
478
traits::matrix_storage_const (a),
480
traits::leading_dimension (a),
481
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
482
traits::matrix_storage (b),
484
traits::matrix_storage_const (b),
486
traits::leading_dimension (b),
488
traits::matrix_storage (c),
489
traits::leading_dimension (c));
494
// C <- alpha * A * B + beta * C
495
// C <- alpha * B * A + beta * C
497
template <typename T, typename HermA, typename MatrB, typename MatrC>
499
void hemm (CBLAS_SIDE const side, CBLAS_UPLO const uplo,
500
T const& alpha, HermA const& a, MatrB const& b,
501
T const& beta, MatrC& c)
503
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
504
BOOST_STATIC_ASSERT((boost::is_same<
505
typename traits::matrix_traits<HermA>::matrix_structure,
510
detail::hemm (side, uplo, alpha, a, b, beta, c);
513
template <typename T, typename HermA, typename MatrB, typename MatrC>
515
void hemm (CBLAS_SIDE const side,
516
T const& alpha, HermA const& a, MatrB const& b,
517
T const& beta, MatrC& c)
519
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
520
BOOST_STATIC_ASSERT((boost::is_same<
521
typename traits::matrix_traits<HermA>::matrix_structure,
526
CBLAS_UPLO const uplo
527
= enum_cast<CBLAS_UPLO const>
529
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
530
typename traits::matrix_traits<HermA>::uplo_type
532
typename HermA::packed_category
536
detail::hemm (side, uplo, alpha, a, b, beta, c);
540
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
544
// C <- alpha * A * B + beta * C ; A == A^H
546
template <typename T, typename HermA, typename MatrB, typename MatrC>
547
static void f (T const& alpha, HermA const& a, MatrB const& b,
548
T const& beta, MatrC& c)
550
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
551
BOOST_STATIC_ASSERT((boost::is_same<
552
typename traits::matrix_traits<HermA>::matrix_structure,
555
BOOST_STATIC_ASSERT((boost::is_same<
556
typename traits::matrix_traits<MatrB>::matrix_structure,
561
int const m = traits::matrix_size1 (c);
562
int const n = traits::matrix_size2 (c);
564
assert (m == traits::matrix_size1 (a)
565
&& m == traits::matrix_size2 (a));
566
assert (m == traits::matrix_size1 (b)
567
&& n == traits::matrix_size2 (b));
569
CBLAS_ORDER const stor_ord
570
= enum_cast<CBLAS_ORDER const>
572
typename traits::matrix_traits<HermA>::ordering_type
575
CBLAS_UPLO const uplo
576
= enum_cast<CBLAS_UPLO const>
578
typename traits::matrix_traits<HermA>::uplo_type
581
hemm (stor_ord, CblasLeft, uplo,
583
traits::matrix_storage (a), traits::leading_dimension (a),
584
traits::matrix_storage (b), traits::leading_dimension (b),
586
traits::matrix_storage (c), traits::leading_dimension (c));
590
// C <- alpha * A * B + beta * C ; B == B^H
592
template <typename T, typename MatrA, typename HermB, typename MatrC>
593
static void f (T const& alpha, MatrA const& a, HermB const& b,
594
T const& beta, MatrC& c)
596
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
597
BOOST_STATIC_ASSERT((boost::is_same<
598
typename traits::matrix_traits<MatrA>::matrix_structure,
601
BOOST_STATIC_ASSERT((boost::is_same<
602
typename traits::matrix_traits<HermB>::matrix_structure,
607
int const m = traits::matrix_size1 (c);
608
int const n = traits::matrix_size2 (c);
610
assert (n == traits::matrix_size1 (b)
611
&& n == traits::matrix_size2 (b));
612
assert (m == traits::matrix_size1 (a)
613
&& n == traits::matrix_size2 (a));
615
CBLAS_ORDER const stor_ord
616
= enum_cast<CBLAS_ORDER const>
618
typename traits::matrix_traits<HermB>::ordering_type
621
CBLAS_UPLO const uplo
622
= enum_cast<CBLAS_UPLO const>
624
typename traits::matrix_traits<HermB>::uplo_type
627
hemm (stor_ord, CblasRight, uplo,
629
traits::matrix_storage (b), traits::leading_dimension (b),
630
traits::matrix_storage (a), traits::leading_dimension (a),
632
traits::matrix_storage (c), traits::leading_dimension (c));
638
template <typename T, typename MatrA, typename MatrB, typename MatrC>
640
void hemm (T const& alpha, MatrA const& a, MatrB const& b,
641
T const& beta, MatrC& c)
643
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
644
BOOST_STATIC_ASSERT((boost::is_same<
645
typename traits::matrix_traits<MatrC>::matrix_structure,
649
BOOST_STATIC_ASSERT((boost::is_same<
650
typename traits::matrix_traits<MatrA>::ordering_type,
651
typename traits::matrix_traits<MatrB>::ordering_type
653
BOOST_STATIC_ASSERT((boost::is_same<
654
typename traits::matrix_traits<MatrA>::ordering_type,
655
typename traits::matrix_traits<MatrC>::ordering_type
662
typename traits::matrix_traits<MatrA>::matrix_structure,
669
functor::f (alpha, a, b, beta, c);
674
template <typename MatrA, typename MatrB, typename MatrC>
676
void hemm (MatrA const& a, MatrB const& b, MatrC& c) {
677
typedef typename traits::matrix_traits<MatrC>::value_type val_t;
678
hemm ((val_t) 1, a, b, (val_t) 0, c);
681
#endif // BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
684
// C <- alpha * A * A^T + beta * C
685
// C <- alpha * A^T * A + beta * C
690
template <typename T, typename MatrA, typename SymmC>
692
void syrk (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
693
T const& alpha, MatrA const& a,
694
T const& beta, SymmC& c)
696
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
697
BOOST_STATIC_ASSERT((boost::is_same<
698
typename traits::matrix_traits<MatrA>::matrix_structure,
701
BOOST_STATIC_ASSERT((boost::is_same<
702
typename traits::matrix_traits<MatrA>::ordering_type,
703
typename traits::matrix_traits<SymmC>::ordering_type
707
assert (uplo == CblasUpper || uplo == CblasLower);
708
assert (trans == CblasNoTrans
709
|| trans == CblasTrans
710
|| trans == CblasConjTrans);
712
int const n = traits::matrix_size1 (c);
713
assert (n == traits::matrix_size2 (c));
715
int const k = trans == CblasNoTrans
716
? traits::matrix_size2 (a)
717
: traits::matrix_size1 (a);
718
assert (n == (trans == CblasNoTrans
719
? traits::matrix_size1 (a)
720
: traits::matrix_size2 (a)));
722
CBLAS_ORDER const stor_ord
723
= enum_cast<CBLAS_ORDER const>
725
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
726
typename traits::matrix_traits<SymmC>::ordering_type
728
typename SymmC::orientation_category
732
syrk (stor_ord, uplo, trans,
734
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
735
traits::matrix_storage (a),
737
traits::matrix_storage_const (a),
739
traits::leading_dimension (a),
741
traits::matrix_storage (c),
742
traits::leading_dimension (c));
747
// C <- alpha * A * A^T + beta * C
748
// C <- alpha * A^T * A + beta * C
750
template <typename T, typename MatrA, typename SymmC>
752
void syrk (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
753
T const& alpha, MatrA const& a,
754
T const& beta, SymmC& c)
756
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
757
BOOST_STATIC_ASSERT((boost::is_same<
758
typename traits::matrix_traits<SymmC>::matrix_structure,
763
detail::syrk (uplo, trans, alpha, a, beta, c);
766
template <typename T, typename MatrA, typename SymmC>
768
void syrk (CBLAS_TRANSPOSE trans,
769
T const& alpha, MatrA const& a,
770
T const& beta, SymmC& c)
772
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
773
BOOST_STATIC_ASSERT((boost::is_same<
774
typename traits::matrix_traits<SymmC>::matrix_structure,
779
CBLAS_UPLO const uplo
780
= enum_cast<CBLAS_UPLO const>
782
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
783
typename traits::matrix_traits<SymmC>::uplo_type
785
typename SymmC::packed_category
789
detail::syrk (uplo, trans, alpha, a, beta, c);
794
template <typename MatrA, typename SymmC>
796
void syrk (CBLAS_TRANSPOSE trans, MatrA const& a, SymmC& c) {
797
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
798
typedef typename traits::matrix_traits<SymmC>::value_type val_t;
800
typedef typename SymmC::value_type val_t;
802
syrk (trans, (val_t) 1, a, (val_t) 0, c);
806
// C <- alpha * A * B^T + conj(alpha) * B * A^T + beta * C
807
// C <- alpha * A^T * B + conj(alpha) * B^T * A + beta * C
812
template <typename T, typename MatrA, typename MatrB, typename SymmC>
814
void syr2k (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
815
T const& alpha, MatrA const& a, MatrB const& b,
816
T const& beta, SymmC& c)
818
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
819
BOOST_STATIC_ASSERT((boost::is_same<
820
typename traits::matrix_traits<MatrA>::matrix_structure,
823
BOOST_STATIC_ASSERT((boost::is_same<
824
typename traits::matrix_traits<MatrB>::matrix_structure,
827
BOOST_STATIC_ASSERT((boost::is_same<
828
typename traits::matrix_traits<MatrA>::ordering_type,
829
typename traits::matrix_traits<SymmC>::ordering_type
831
BOOST_STATIC_ASSERT((boost::is_same<
832
typename traits::matrix_traits<MatrB>::ordering_type,
833
typename traits::matrix_traits<SymmC>::ordering_type
837
assert (uplo == CblasUpper || uplo == CblasLower);
838
assert (trans == CblasNoTrans
839
|| trans == CblasTrans
840
|| trans == CblasConjTrans);
842
int const n = traits::matrix_size1 (c);
843
assert (n == traits::matrix_size2 (c));
845
int const k = trans == CblasNoTrans
846
? traits::matrix_size2 (a)
847
: traits::matrix_size1 (a);
848
assert (k == (trans == CblasNoTrans
849
? traits::matrix_size2 (b)
850
: traits::matrix_size1 (b)));
851
assert (n == (trans == CblasNoTrans
852
? traits::matrix_size1 (a)
853
: traits::matrix_size2 (a)));
854
assert (n == (trans == CblasNoTrans
855
? traits::matrix_size1 (b)
856
: traits::matrix_size2 (b)));
858
CBLAS_ORDER const stor_ord
859
= enum_cast<CBLAS_ORDER const>
861
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
862
typename traits::matrix_traits<SymmC>::ordering_type
864
typename SymmC::orientation_category
868
syr2k (stor_ord, uplo, trans,
870
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
871
traits::matrix_storage (a),
873
traits::matrix_storage_const (a),
875
traits::leading_dimension (a),
876
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
877
traits::matrix_storage (b),
879
traits::matrix_storage_const (b),
881
traits::leading_dimension (b),
883
traits::matrix_storage (c),
884
traits::leading_dimension (c));
889
// C <- alpha * A * B^T + conj(alpha) * B * A^T + beta * C
890
// C <- alpha * A^T * B + conj(alpha) * B^T * A + beta * C
892
template <typename T, typename MatrA, typename MatrB, typename SymmC>
894
void syr2k (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
895
T const& alpha, MatrA const& a, MatrB const& b,
896
T const& beta, SymmC& c)
898
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
899
BOOST_STATIC_ASSERT((boost::is_same<
900
typename traits::matrix_traits<SymmC>::matrix_structure,
905
detail::syr2k (uplo, trans, alpha, a, b, beta, c);
908
template <typename T, typename MatrA, typename MatrB, typename SymmC>
910
void syr2k (CBLAS_TRANSPOSE trans,
911
T const& alpha, MatrA const& a, MatrB const& b,
912
T const& beta, SymmC& c)
914
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
915
BOOST_STATIC_ASSERT((boost::is_same<
916
typename traits::matrix_traits<SymmC>::matrix_structure,
921
CBLAS_UPLO const uplo
922
= enum_cast<CBLAS_UPLO const>
924
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
925
typename traits::matrix_traits<SymmC>::uplo_type
927
typename SymmC::packed_category
931
detail::syr2k (uplo, trans, alpha, a, b, beta, c);
934
// C <- A * B^T + B * A^T + C
935
// C <- A^T * B + B^T * A + C
936
template <typename MatrA, typename MatrB, typename SymmC>
938
void syr2k (CBLAS_TRANSPOSE trans,
939
MatrA const& a, MatrB const& b, SymmC& c)
941
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
942
typedef typename traits::matrix_traits<SymmC>::value_type val_t;
944
typedef typename SymmC::value_type val_t;
946
syr2k (trans, (val_t) 1, a, b, (val_t) 0, c);
950
// C <- alpha * A * A^H + beta * C
951
// C <- alpha * A^H * A + beta * C
956
template <typename T, typename MatrA, typename HermC>
958
void herk (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
959
T const& alpha, MatrA const& a,
960
T const& beta, HermC& c)
962
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
963
BOOST_STATIC_ASSERT((boost::is_same<
964
typename traits::matrix_traits<MatrA>::matrix_structure,
967
BOOST_STATIC_ASSERT((boost::is_same<
968
typename traits::matrix_traits<MatrA>::ordering_type,
969
typename traits::matrix_traits<HermC>::ordering_type
973
assert (uplo == CblasUpper || uplo == CblasLower);
974
assert (trans == CblasNoTrans || trans == CblasConjTrans);
976
int const n = traits::matrix_size1 (c);
977
assert (n == traits::matrix_size2 (c));
979
int const k = trans == CblasNoTrans
980
? traits::matrix_size2 (a)
981
: traits::matrix_size1 (a);
982
assert (n == (trans == CblasNoTrans
983
? traits::matrix_size1 (a)
984
: traits::matrix_size2 (a)));
986
CBLAS_ORDER const stor_ord
987
= enum_cast<CBLAS_ORDER const>
989
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
990
typename traits::matrix_traits<HermC>::ordering_type
992
typename HermC::orientation_category
996
herk (stor_ord, uplo, trans,
998
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
999
traits::matrix_storage (a),
1001
traits::matrix_storage_const (a),
1003
traits::leading_dimension (a),
1005
traits::matrix_storage (c),
1006
traits::leading_dimension (c));
1011
// C <- alpha * A * A^H + beta * C
1012
// C <- alpha * A^H * A + beta * C
1014
template <typename T, typename MatrA, typename HermC>
1016
void herk (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
1017
T const& alpha, MatrA const& a,
1018
T const& beta, HermC& c)
1020
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1021
BOOST_STATIC_ASSERT((boost::is_same<
1022
typename traits::matrix_traits<HermC>::matrix_structure,
1027
detail::herk (uplo, trans, alpha, a, beta, c);
1030
template <typename T, typename MatrA, typename HermC>
1032
void herk (CBLAS_TRANSPOSE trans,
1033
T const& alpha, MatrA const& a,
1034
T const& beta, HermC& c)
1036
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1037
BOOST_STATIC_ASSERT((boost::is_same<
1038
typename traits::matrix_traits<HermC>::matrix_structure,
1043
CBLAS_UPLO const uplo
1044
= enum_cast<CBLAS_UPLO const>
1046
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1047
typename traits::matrix_traits<HermC>::uplo_type
1049
typename HermC::packed_category
1053
detail::herk (uplo, trans, alpha, a, beta, c);
1058
template <typename MatrA, typename HermC>
1060
void herk (CBLAS_TRANSPOSE trans, MatrA const& a, HermC& c) {
1061
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1062
typedef typename traits::matrix_traits<HermC>::value_type val_t;
1064
typedef typename HermC::value_type val_t;
1066
typedef typename traits::type_traits<val_t>::real_type real_t;
1067
herk (trans, (real_t) 1, a, (real_t) 0, c);
1071
// C <- alpha * A * B^H + conj(alpha) * B * A^H + beta * C
1072
// C <- alpha * A^H * B + conj(alpha) * B^H * A + beta * C
1077
template <typename T1, typename T2,
1078
typename MatrA, typename MatrB, typename HermC>
1080
void her2k (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
1081
T1 const& alpha, MatrA const& a, MatrB const& b,
1082
T2 const& beta, HermC& c)
1084
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1085
BOOST_STATIC_ASSERT((boost::is_same<
1086
typename traits::matrix_traits<MatrA>::matrix_structure,
1089
BOOST_STATIC_ASSERT((boost::is_same<
1090
typename traits::matrix_traits<MatrB>::matrix_structure,
1093
BOOST_STATIC_ASSERT((boost::is_same<
1094
typename traits::matrix_traits<MatrA>::ordering_type,
1095
typename traits::matrix_traits<HermC>::ordering_type
1097
BOOST_STATIC_ASSERT((boost::is_same<
1098
typename traits::matrix_traits<MatrB>::ordering_type,
1099
typename traits::matrix_traits<HermC>::ordering_type
1103
assert (uplo == CblasUpper || uplo == CblasLower);
1104
assert (trans == CblasNoTrans || trans == CblasConjTrans);
1106
int const n = traits::matrix_size1 (c);
1107
assert (n == traits::matrix_size2 (c));
1109
int const k = trans == CblasNoTrans
1110
? traits::matrix_size2 (a)
1111
: traits::matrix_size1 (a);
1112
assert (k == (trans == CblasNoTrans
1113
? traits::matrix_size2 (b)
1114
: traits::matrix_size1 (b)));
1115
assert (n == (trans == CblasNoTrans
1116
? traits::matrix_size1 (a)
1117
: traits::matrix_size2 (a)));
1118
assert (n == (trans == CblasNoTrans
1119
? traits::matrix_size1 (b)
1120
: traits::matrix_size2 (b)));
1122
CBLAS_ORDER const stor_ord
1123
= enum_cast<CBLAS_ORDER const>
1125
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1126
typename traits::matrix_traits<HermC>::ordering_type
1128
typename HermC::orientation_category
1132
her2k (stor_ord, uplo, trans,
1134
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1135
traits::matrix_storage (a),
1137
traits::matrix_storage_const (a),
1139
traits::leading_dimension (a),
1140
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1141
traits::matrix_storage (b),
1143
traits::matrix_storage_const (b),
1145
traits::leading_dimension (b),
1147
traits::matrix_storage (c),
1148
traits::leading_dimension (c));
1153
// C <- alpha * A * B^H + conj(alpha) * B * A^H + beta * C
1154
// C <- alpha * A^H * B + conj(alpha) * B^H * A + beta * C
1156
template <typename T1, typename T2,
1157
typename MatrA, typename MatrB, typename HermC>
1159
void her2k (CBLAS_UPLO const uplo, CBLAS_TRANSPOSE trans,
1160
T1 const& alpha, MatrA const& a, MatrB const& b,
1161
T2 const& beta, HermC& c)
1163
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1164
BOOST_STATIC_ASSERT((boost::is_same<
1165
typename traits::matrix_traits<HermC>::matrix_structure,
1170
detail::her2k (uplo, trans, alpha, a, b, beta, c);
1173
template <typename T1, typename T2,
1174
typename MatrA, typename MatrB, typename HermC>
1176
void her2k (CBLAS_TRANSPOSE trans,
1177
T1 const& alpha, MatrA const& a, MatrB const& b,
1178
T2 const& beta, HermC& c)
1180
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1181
BOOST_STATIC_ASSERT((boost::is_same<
1182
typename traits::matrix_traits<HermC>::matrix_structure,
1187
CBLAS_UPLO const uplo
1188
= enum_cast<CBLAS_UPLO const>
1190
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1191
typename traits::matrix_traits<HermC>::uplo_type
1193
typename HermC::packed_category
1197
detail::her2k (uplo, trans, alpha, a, b, beta, c);
1200
// C <- A * B^H + B * A^H + C
1201
// C <- A^H * B + B^H * A + C
1202
template <typename MatrA, typename MatrB, typename HermC>
1204
void her2k (CBLAS_TRANSPOSE trans,
1205
MatrA const& a, MatrB const& b, HermC& c)
1207
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1208
typedef typename traits::matrix_traits<HermC>::value_type val_t;
1210
typedef typename HermC::value_type val_t;
1212
typedef typename traits::type_traits<val_t>::real_type real_t;
1213
her2k (trans, (val_t) 1, a, b, (real_t) 0, c);
1217
} // namespace atlas
1221
#endif // BOOST_NUMERIC_BINDINGS_CBLAS_LEVEL_3_HPP