3
* Copyright (c) Kresimir Fresl 2002, 2003
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_2_HPP
15
#define BOOST_NUMERIC_BINDINGS_CBLAS_LEVEL_2_HPP
19
#include <boost/numeric/bindings/traits/traits.hpp>
20
#include <boost/numeric/bindings/traits/type_traits.hpp>
21
#include <boost/numeric/bindings/atlas/cblas2_overloads.hpp>
22
#include <boost/numeric/bindings/atlas/cblas_enum.hpp>
24
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
25
# include <boost/static_assert.hpp>
26
# include <boost/type_traits/same_traits.hpp>
30
namespace boost { namespace numeric { namespace bindings {
34
// y <- alpha * op (A) * x + beta * y
35
// op (A) == A || A^T || A^H
36
template <typename T, typename Matr, typename VctX, typename VctY>
38
void gemv (CBLAS_TRANSPOSE const TransA,
39
T const& alpha, Matr const& a, VctX const& x,
40
T const& beta, VctY& y
43
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
44
BOOST_STATIC_ASSERT((boost::is_same<
45
typename traits::matrix_traits<Matr>::matrix_structure,
50
int const m = traits::matrix_size1 (a);
51
int const n = traits::matrix_size2 (a);
52
assert (traits::vector_size (x) >= (TransA == CblasNoTrans ? n : m));
53
assert (traits::vector_size (y) >= (TransA == CblasNoTrans ? m : n));
54
// .. what about AtlasConj?
56
CBLAS_ORDER const stor_ord
57
= enum_cast<CBLAS_ORDER const>
59
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
60
typename traits::matrix_traits<Matr>::ordering_type
62
typename Matr::orientation_category
66
detail::gemv (stor_ord, TransA, m, n, alpha,
67
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
68
traits::matrix_storage (a),
70
traits::matrix_storage_const (a),
72
traits::leading_dimension (a),
73
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
74
traits::vector_storage (x),
76
traits::vector_storage_const (x),
78
traits::vector_stride (x),
80
traits::vector_storage (y),
81
traits::vector_stride (y));
84
// y <- alpha * A * x + beta * y
85
template <typename T, typename Matr, typename VctX, typename VctY>
87
void gemv (T const& alpha, Matr const& a, VctX const& x,
88
T const& beta, VctY& y) {
89
gemv (CblasNoTrans, alpha, a, x, beta, y);
93
template <typename Matr, typename VctX, typename VctY>
95
void gemv (Matr const& a, VctX const& x, VctY& y) {
96
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
97
typedef typename traits::matrix_traits<Matr>::value_type val_t;
99
typedef typename Matr::value_type val_t;
101
gemv (CblasNoTrans, (val_t) 1, a, x, (val_t) 0, y);
105
// y <- alpha * A * x + beta * y
106
// A real symmetric matrix (T == float | double)
108
/* [...] with UPLO = 'U' or 'u', the leading n by n upper
109
* triangular part of the array A must contain the upper triangular
110
* part of the symmetric matrix and the strictly lower triangular
111
* part of A is not referenced.
112
* [...] with UPLO = 'L' or 'l', the leading n by n lower
113
* triangular part of the array A must contain the lower triangular
114
* part of the symmetric matrix and the strictly upper
115
* triangular part of A is not referenced.
117
template <typename T, typename SymmMatr, typename VctX, typename VctY>
119
void symv (CBLAS_UPLO const uplo, T const& alpha, SymmMatr const& a,
120
VctX const& x, T const& beta, VctY& y)
122
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
123
BOOST_STATIC_ASSERT((boost::is_same<
124
typename traits::matrix_traits<SymmMatr>::matrix_structure,
129
int const n = traits::matrix_size1 (a);
130
assert (n == traits::matrix_size2 (a));
131
assert (traits::vector_size (x) >= n);
132
assert (traits::vector_size (y) >= n);
134
CBLAS_ORDER const stor_ord
135
= enum_cast<CBLAS_ORDER const>
137
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
138
typename traits::matrix_traits<SymmMatr>::ordering_type
140
typename SymmMatr::orientation_category
144
detail::symv (stor_ord, uplo, n, alpha,
145
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
146
traits::matrix_storage (a),
148
traits::matrix_storage_const (a),
150
traits::leading_dimension (a),
151
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
152
traits::vector_storage (x),
154
traits::vector_storage_const (x),
156
traits::vector_stride (x),
158
traits::vector_storage (y),
159
traits::vector_stride (y));
162
template <typename T, typename SymmMatr, typename VctX, typename VctY>
164
void symv (T const& alpha, SymmMatr const& a, VctX const& x,
165
T const& beta, VctY& y)
167
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
168
BOOST_STATIC_ASSERT((boost::is_same<
169
typename traits::matrix_traits<SymmMatr>::matrix_structure,
174
int const n = traits::matrix_size1 (a);
175
assert (n == traits::matrix_size2 (a));
176
assert (traits::vector_size (x) >= n);
177
assert (traits::vector_size (y) >= n);
179
CBLAS_ORDER const stor_ord
180
= enum_cast<CBLAS_ORDER const>
182
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
183
typename traits::matrix_traits<SymmMatr>::ordering_type
185
typename SymmMatr::orientation_category
189
CBLAS_UPLO const uplo
190
= enum_cast<CBLAS_UPLO const>
192
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
193
typename traits::matrix_traits<SymmMatr>::uplo_type
195
typename SymmMatr::packed_category
199
detail::symv (stor_ord, uplo, n, alpha,
200
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
201
traits::matrix_storage (a),
203
traits::matrix_storage_const (a),
205
traits::leading_dimension (a),
206
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
207
traits::vector_storage (x),
209
traits::vector_storage_const (x),
211
traits::vector_stride (x),
213
traits::vector_storage (y),
214
traits::vector_stride (y));
218
template <typename SymmMatr, typename VctX, typename VctY>
220
void symv (SymmMatr const& a, VctX const& x, VctY& y) {
221
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
222
typedef typename traits::matrix_traits<SymmMatr>::value_type val_t;
224
typedef typename SymmMatr::value_type val_t;
226
symv ((val_t) 1, a, x, (val_t) 0, y);
230
// y <- alpha * A * x + beta * y
231
// A real symmetric matrix (T == float | double) in packed form
232
// [from 'dspmv.f' (description assumes column major order):]
233
/* A is an array of DIMENSION ( ( n*( n + 1 ) )/2 ).
234
* Before entry with UPLO = 'U' or 'u', the array A must contain
235
* the upper triangular part of the symmetric matrix packed
236
* sequentially, column by column, so that A( 1 ) contains a(1,1),
237
* A( 2 ) and A( 3 ) contain a(1,2) and a(2,2) respectively, and
239
* Before entry with UPLO = 'L' or 'l', the array A must contain
240
* the lower triangular part of the symmetric matrix packed
241
* sequentially, column by column, so that A( 1 ) contains a(1,1),
242
* A( 2 ) and A( 3 ) contain a(2,1) and a(3,1) respectively, and
245
template <typename T, typename SymmMatr, typename VctX, typename VctY>
247
void spmv (T const& alpha, SymmMatr const& a, VctX const& x,
248
T const& beta, VctY& y)
250
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
251
BOOST_STATIC_ASSERT((boost::is_same<
252
typename traits::matrix_traits<SymmMatr>::matrix_structure,
253
traits::symmetric_packed_t
257
int const n = traits::matrix_size1 (a);
258
assert (n == traits::matrix_size2 (a));
259
assert (traits::vector_size (x) >= n);
260
assert (traits::vector_size (y) >= n);
262
CBLAS_ORDER const stor_ord
263
= enum_cast<CBLAS_ORDER const>
265
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
266
typename traits::matrix_traits<SymmMatr>::ordering_type
268
typename SymmMatr::orientation_category
272
CBLAS_UPLO const uplo
273
= enum_cast<CBLAS_UPLO const>
275
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
276
typename traits::matrix_traits<SymmMatr>::uplo_type
278
typename SymmMatr::packed_category
282
detail::spmv (stor_ord, uplo, n, alpha,
283
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
284
traits::matrix_storage (a),
285
traits::vector_storage (x),
287
traits::matrix_storage_const (a),
288
traits::vector_storage_const (x),
290
traits::vector_stride (x),
292
traits::vector_storage (y),
293
traits::vector_stride (y));
297
template <typename SymmMatr, typename VctX, typename VctY>
299
void spmv (SymmMatr const& a, VctX const& x, VctY& y) {
300
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
301
typedef typename traits::matrix_traits<SymmMatr>::value_type val_t;
303
typedef typename SymmMatr::value_type val_t;
305
spmv ((val_t) 1, a, x, (val_t) 0, y);
309
// y <- alpha * A * x + beta * y
310
// A complex hermitian matrix
311
// (T == std::complex<float> | std::complex<double>)
312
template <typename T, typename HermMatr, typename VctX, typename VctY>
314
void hemv (CBLAS_UPLO const uplo, T const& alpha, HermMatr const& a,
315
VctX const& x, T const& beta, VctY& y)
317
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
318
BOOST_STATIC_ASSERT((boost::is_same<
319
typename traits::matrix_traits<HermMatr>::matrix_structure,
324
int const n = traits::matrix_size1 (a);
325
assert (n == traits::matrix_size2 (a));
326
assert (traits::vector_size (x) >= n);
327
assert (traits::vector_size (y) >= n);
329
CBLAS_ORDER const stor_ord
330
= enum_cast<CBLAS_ORDER const>
332
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
333
typename traits::matrix_traits<HermMatr>::ordering_type
335
typename HermMatr::orientation_category
339
detail::hemv (stor_ord, uplo, n, alpha,
340
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
341
traits::matrix_storage (a),
343
traits::matrix_storage_const (a),
345
traits::leading_dimension (a),
346
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
347
traits::vector_storage (x),
349
traits::vector_storage_const (x),
351
traits::vector_stride (x),
353
traits::vector_storage (y),
354
traits::vector_stride (y));
357
template <typename T, typename HermMatr, typename VctX, typename VctY>
359
void hemv (T const& alpha, HermMatr const& a, VctX const& x,
360
T const& beta, VctY& y)
362
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
363
BOOST_STATIC_ASSERT((boost::is_same<
364
typename traits::matrix_traits<HermMatr>::matrix_structure,
369
int const n = traits::matrix_size1 (a);
370
assert (n == traits::matrix_size2 (a));
371
assert (traits::vector_size (x) >= n);
372
assert (traits::vector_size (y) >= n);
374
CBLAS_ORDER const stor_ord
375
= enum_cast<CBLAS_ORDER const>
377
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
378
typename traits::matrix_traits<HermMatr>::ordering_type
380
typename HermMatr::orientation_category
384
CBLAS_UPLO const uplo
385
= enum_cast<CBLAS_UPLO const>
387
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
388
typename traits::matrix_traits<HermMatr>::uplo_type
390
typename HermMatr::packed_category
394
detail::hemv (stor_ord, uplo, n, alpha,
395
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
396
traits::matrix_storage (a),
398
traits::matrix_storage_const (a),
400
traits::leading_dimension (a),
401
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
402
traits::vector_storage (x),
404
traits::vector_storage_const (x),
406
traits::vector_stride (x),
408
traits::vector_storage (y),
409
traits::vector_stride (y));
413
template <typename HermMatr, typename VctX, typename VctY>
415
void hemv (HermMatr const& a, VctX const& x, VctY& y) {
416
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
417
typedef typename traits::matrix_traits<HermMatr>::value_type val_t;
419
typedef typename HermMatr::value_type val_t;
421
hemv ((val_t) 1, a, x, (val_t) 0, y);
425
// y <- alpha * A * x + beta * y
426
// A complex hermitian matrix in packed form
427
// (T == std::complex<float> | std::complex<double>)
428
template <typename T, typename HermMatr, typename VctX, typename VctY>
430
void hpmv (T const& alpha, HermMatr const& a, VctX const& x,
431
T const& beta, VctY& y)
433
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
434
BOOST_STATIC_ASSERT((boost::is_same<
435
typename traits::matrix_traits<HermMatr>::matrix_structure,
436
traits::hermitian_packed_t
440
int const n = traits::matrix_size1 (a);
441
assert (n == traits::matrix_size2 (a));
442
assert (traits::vector_size (x) >= n);
443
assert (traits::vector_size (y) >= n);
445
CBLAS_ORDER const stor_ord
446
= enum_cast<CBLAS_ORDER const>
448
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
449
typename traits::matrix_traits<HermMatr>::ordering_type
451
typename HermMatr::orientation_category
455
CBLAS_UPLO const uplo
456
= enum_cast<CBLAS_UPLO const>
458
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
459
typename traits::matrix_traits<HermMatr>::uplo_type
461
typename HermMatr::packed_category
465
detail::hpmv (stor_ord, uplo, n, alpha,
466
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
467
traits::matrix_storage (a),
468
traits::vector_storage (x),
470
traits::matrix_storage_const (a),
471
traits::vector_storage_const (x),
473
traits::vector_stride (x),
475
traits::vector_storage (y),
476
traits::vector_stride (y));
480
template <typename HermMatr, typename VctX, typename VctY>
482
void hpmv (HermMatr const& a, VctX const& x, VctY& y) {
483
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
484
typedef typename traits::matrix_traits<HermMatr>::value_type val_t;
486
typedef typename HermMatr::value_type val_t;
488
hpmv ((val_t) 1, a, x, (val_t) 0, y);
492
// A <- alpha * x * y^T + A
493
// .. real & complex types
494
template <typename T, typename Matr, typename VctX, typename VctY>
496
void ger (T const& alpha, VctX const& x, VctY const& y, Matr& a) {
497
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
498
BOOST_STATIC_ASSERT((boost::is_same<
499
typename traits::matrix_traits<Matr>::matrix_structure,
504
int const m = traits::matrix_size1 (a);
505
int const n = traits::matrix_size2 (a);
506
assert (traits::vector_size (x) >= m);
507
assert (traits::vector_size (y) >= n);
509
CBLAS_ORDER const stor_ord
510
= enum_cast<CBLAS_ORDER const>
512
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
513
typename traits::matrix_traits<Matr>::ordering_type
515
typename Matr::orientation_category
519
detail::ger (stor_ord, m, n, alpha,
520
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
521
traits::vector_storage (x),
523
traits::vector_storage_const (x),
525
traits::vector_stride (x),
526
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
527
traits::vector_storage (y),
529
traits::vector_storage_const (y),
531
traits::vector_stride (y),
532
traits::matrix_storage (a),
533
traits::leading_dimension (a));
537
template <typename Matr, typename VctX, typename VctY>
539
void ger (VctX const& x, VctY const& y, Matr& a) {
540
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
541
typedef typename traits::matrix_traits<Matr>::value_type val_t;
543
typedef typename Matr::value_type val_t;
545
ger ((val_t) 1, x, y, a);
548
// A <- alpha * x * y^T + A
549
// .. complex types only
550
template <typename T, typename Matr, typename VctX, typename VctY>
552
void geru (T const& alpha, VctX const& x, VctY const& y, Matr& a) {
553
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
554
BOOST_STATIC_ASSERT((boost::is_same<
555
typename traits::matrix_traits<Matr>::matrix_structure,
560
int const m = traits::matrix_size1 (a);
561
int const n = traits::matrix_size2 (a);
562
assert (traits::vector_size (x) >= m);
563
assert (traits::vector_size (y) >= n);
565
CBLAS_ORDER const stor_ord
566
= enum_cast<CBLAS_ORDER const>
568
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
569
typename traits::matrix_traits<Matr>::ordering_type
571
typename Matr::orientation_category
575
detail::geru (stor_ord, m, n, alpha,
576
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
577
traits::vector_storage (x),
579
traits::vector_storage_const (x),
581
traits::vector_stride (x),
582
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
583
traits::vector_storage (y),
585
traits::vector_storage_const (y),
587
traits::vector_stride (y),
588
traits::matrix_storage (a),
589
traits::leading_dimension (a));
593
template <typename Matr, typename VctX, typename VctY>
595
void geru (VctX const& x, VctY const& y, Matr& a) {
596
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
597
typedef typename traits::matrix_traits<Matr>::value_type val_t;
599
typedef typename Matr::value_type val_t;
601
geru ((val_t) 1, x, y, a);
604
// A <- alpha * x * y^H + A
605
// .. complex types only
606
template <typename T, typename Matr, typename VctX, typename VctY>
608
void gerc (T const& alpha, VctX const& x, VctY const& y, Matr& a) {
609
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
610
BOOST_STATIC_ASSERT((boost::is_same<
611
typename traits::matrix_traits<Matr>::matrix_structure,
616
int const m = traits::matrix_size1 (a);
617
int const n = traits::matrix_size2 (a);
618
assert (traits::vector_size (x) >= m);
619
assert (traits::vector_size (y) >= n);
621
CBLAS_ORDER const stor_ord
622
= enum_cast<CBLAS_ORDER const>
624
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
625
typename traits::matrix_traits<Matr>::ordering_type
627
typename Matr::orientation_category
631
detail::gerc (stor_ord, m, n, alpha,
632
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
633
traits::vector_storage (x),
635
traits::vector_storage_const (x),
637
traits::vector_stride (x),
638
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
639
traits::vector_storage (y),
641
traits::vector_storage_const (y),
643
traits::vector_stride (y),
644
traits::matrix_storage (a),
645
traits::leading_dimension (a));
649
template <typename Matr, typename VctX, typename VctY>
651
void gerc (VctX const& x, VctY const& y, Matr& a) {
652
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
653
typedef typename traits::matrix_traits<Matr>::value_type val_t;
655
typedef typename Matr::value_type val_t;
657
gerc ((val_t) 1, x, y, a);
661
// A <- alpha * x * x^T + A
662
// A real symmetric (see leading comments for 'symv()')
663
template <typename T, typename SymmM, typename VctX>
665
void syr (CBLAS_UPLO const uplo, T const& alpha, VctX const& x, SymmM& a) {
666
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
667
BOOST_STATIC_ASSERT((boost::is_same<
668
typename traits::matrix_traits<SymmM>::matrix_structure,
673
int const n = traits::matrix_size1 (a);
674
assert (n == traits::matrix_size2 (a));
675
assert (traits::vector_size (x) >= n);
677
CBLAS_ORDER const stor_ord
678
= enum_cast<CBLAS_ORDER const>
680
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
681
typename traits::matrix_traits<SymmM>::ordering_type
683
typename SymmM::orientation_category
687
detail::syr (stor_ord, uplo, n, alpha,
688
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
689
traits::vector_storage (x),
691
traits::vector_storage_const (x),
693
traits::vector_stride (x),
694
traits::matrix_storage (a),
695
traits::leading_dimension (a));
698
template <typename T, typename SymmM, typename VctX>
700
void syr (T const& alpha, VctX const& x, SymmM& a) {
701
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
702
BOOST_STATIC_ASSERT((boost::is_same<
703
typename traits::matrix_traits<SymmM>::matrix_structure,
708
int const n = traits::matrix_size1 (a);
709
assert (n == traits::matrix_size2 (a));
710
assert (traits::vector_size (x) >= n);
712
CBLAS_ORDER const stor_ord
713
= enum_cast<CBLAS_ORDER const>
715
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
716
typename traits::matrix_traits<SymmM>::ordering_type
718
typename SymmM::orientation_category
722
CBLAS_UPLO const uplo
723
= enum_cast<CBLAS_UPLO const>
725
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
726
typename traits::matrix_traits<SymmM>::uplo_type
728
typename SymmM::packed_category
732
detail::syr (stor_ord, uplo, n, alpha,
733
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
734
traits::vector_storage (x),
736
traits::vector_storage_const (x),
738
traits::vector_stride (x),
739
traits::matrix_storage (a),
740
traits::leading_dimension (a));
744
template <typename SymmM, typename VctX>
746
void syr (VctX const& x, SymmM& a) {
747
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
748
typedef typename traits::matrix_traits<SymmM>::value_type val_t;
750
typedef typename SymmM::value_type val_t;
752
syr ((val_t) 1, x, a);
756
// A <- alpha * x * x^T + A
757
// A real symmetric in packed form (see leading comments for 'spmv()')
758
template <typename T, typename SymmM, typename VctX>
760
void spr (T const& alpha, VctX const& x, SymmM& a) {
761
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
762
BOOST_STATIC_ASSERT((boost::is_same<
763
typename traits::matrix_traits<SymmM>::matrix_structure,
764
traits::symmetric_packed_t
768
int const n = traits::matrix_size1 (a);
769
assert (n == traits::matrix_size2 (a));
770
assert (traits::vector_size (x) >= n);
772
CBLAS_ORDER const stor_ord
773
= enum_cast<CBLAS_ORDER const>
775
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
776
typename traits::matrix_traits<SymmM>::ordering_type
778
typename SymmM::orientation_category
782
CBLAS_UPLO const uplo
783
= enum_cast<CBLAS_UPLO const>
785
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
786
typename traits::matrix_traits<SymmM>::uplo_type
788
typename SymmM::packed_category
792
detail::spr (stor_ord, uplo, n, alpha,
793
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
794
traits::vector_storage (x),
796
traits::vector_storage_const (x),
798
traits::vector_stride (x),
799
traits::matrix_storage (a));
803
template <typename SymmM, typename VctX>
805
void spr (VctX const& x, SymmM& a) {
806
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
807
typedef typename traits::matrix_traits<SymmM>::value_type val_t;
809
typedef typename SymmM::value_type val_t;
811
spr ((val_t) 1, x, a);
815
// A <- alpha * x * y^T + alpha * y * x^T + A
816
// A real symmetric (see leading comments for 'symv()')
817
template <typename T, typename SymmM, typename VctX, typename VctY>
819
void syr2 (CBLAS_UPLO const uplo, T const& alpha,
820
VctX const& x, VctY const& y, SymmM& a)
822
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
823
BOOST_STATIC_ASSERT((boost::is_same<
824
typename traits::matrix_traits<SymmM>::matrix_structure,
829
int const n = traits::matrix_size1 (a);
830
assert (n == traits::matrix_size2 (a));
831
assert (traits::vector_size (x) >= n);
832
assert (traits::vector_size (y) >= n);
834
CBLAS_ORDER const stor_ord
835
= enum_cast<CBLAS_ORDER const>
837
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
838
typename traits::matrix_traits<SymmM>::ordering_type
840
typename SymmM::orientation_category
844
detail::syr2 (stor_ord, uplo, n, alpha,
845
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
846
traits::vector_storage (x),
848
traits::vector_storage_const (x),
850
traits::vector_stride (x),
851
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
852
traits::vector_storage (y),
854
traits::vector_storage_const (y),
856
traits::vector_stride (y),
857
traits::matrix_storage (a),
858
traits::leading_dimension (a));
861
template <typename T, typename SymmM, typename VctX, typename VctY>
863
void syr2 (T const& alpha, VctX const& x, VctY const& y, SymmM& a) {
864
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
865
BOOST_STATIC_ASSERT((boost::is_same<
866
typename traits::matrix_traits<SymmM>::matrix_structure,
871
int const n = traits::matrix_size1 (a);
872
assert (n == traits::matrix_size2 (a));
873
assert (traits::vector_size (x) >= n);
874
assert (traits::vector_size (y) >= n);
876
CBLAS_ORDER const stor_ord
877
= enum_cast<CBLAS_ORDER const>
879
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
880
typename traits::matrix_traits<SymmM>::ordering_type
882
typename SymmM::orientation_category
886
CBLAS_UPLO const uplo
887
= enum_cast<CBLAS_UPLO const>
889
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
890
typename traits::matrix_traits<SymmM>::uplo_type
892
typename SymmM::packed_category
896
detail::syr2 (stor_ord, uplo, n, alpha,
897
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
898
traits::vector_storage (x),
900
traits::vector_storage_const (x),
902
traits::vector_stride (x),
903
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
904
traits::vector_storage (y),
906
traits::vector_storage_const (y),
908
traits::vector_stride (y),
909
traits::matrix_storage (a),
910
traits::leading_dimension (a));
913
// A <- x * y^T + y * x^T + A
914
template <typename SymmM, typename VctX, typename VctY>
916
void syr2 (VctX const& x, VctY const& y, SymmM& a) {
917
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
918
typedef typename traits::matrix_traits<SymmM>::value_type val_t;
920
typedef typename SymmM::value_type val_t;
922
syr2 ((val_t) 1, x, y, a);
926
// A <- alpha * x * y^T + alpha * y * x^T + A
927
// A real symmetric in packed form (see leading comments for 'spmv()')
928
template <typename T, typename SymmM, typename VctX, typename VctY>
930
void spr2 (T const& alpha, VctX const& x, VctY const& y, SymmM& a) {
931
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
932
BOOST_STATIC_ASSERT((boost::is_same<
933
typename traits::matrix_traits<SymmM>::matrix_structure,
934
traits::symmetric_packed_t
938
int const n = traits::matrix_size1 (a);
939
assert (n == traits::matrix_size2 (a));
940
assert (traits::vector_size (x) >= n);
941
assert (traits::vector_size (y) >= n);
943
CBLAS_ORDER const stor_ord
944
= enum_cast<CBLAS_ORDER const>
946
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
947
typename traits::matrix_traits<SymmM>::ordering_type
949
typename SymmM::orientation_category
953
CBLAS_UPLO const uplo
954
= enum_cast<CBLAS_UPLO const>
956
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
957
typename traits::matrix_traits<SymmM>::uplo_type
959
typename SymmM::packed_category
963
detail::spr2 (stor_ord, uplo, n, alpha,
964
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
965
traits::vector_storage (x),
967
traits::vector_storage_const (x),
969
traits::vector_stride (x),
970
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
971
traits::vector_storage (y),
973
traits::vector_storage_const (y),
975
traits::vector_stride (y),
976
traits::matrix_storage (a));
979
// A <- x * y^T + y * x^T + A
980
template <typename SymmM, typename VctX, typename VctY>
982
void spr2 (VctX const& x, VctY const& y, SymmM& a) {
983
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
984
typedef typename traits::matrix_traits<SymmM>::value_type val_t;
986
typedef typename SymmM::value_type val_t;
988
spr2 ((val_t) 1, x, y, a);
992
// A <- alpha * x * x^H + A
994
template <typename T, typename HermM, typename VctX>
996
void her (CBLAS_UPLO const uplo, T const& alpha, VctX const& x, HermM& a) {
997
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
998
BOOST_STATIC_ASSERT((boost::is_same<
999
typename traits::matrix_traits<HermM>::matrix_structure,
1004
int const n = traits::matrix_size1 (a);
1005
assert (n == traits::matrix_size2 (a));
1006
assert (traits::vector_size (x) >= n);
1008
CBLAS_ORDER const stor_ord
1009
= enum_cast<CBLAS_ORDER const>
1011
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1012
typename traits::matrix_traits<HermM>::ordering_type
1014
typename HermM::orientation_category
1018
detail::her (stor_ord, uplo, n, alpha,
1019
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1020
traits::vector_storage (x),
1022
traits::vector_storage_const (x),
1024
traits::vector_stride (x),
1025
traits::matrix_storage (a),
1026
traits::leading_dimension (a));
1029
template <typename T, typename HermM, typename VctX>
1031
void her (T const& alpha, VctX const& x, HermM& a) {
1032
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1033
BOOST_STATIC_ASSERT((boost::is_same<
1034
typename traits::matrix_traits<HermM>::matrix_structure,
1039
int const n = traits::matrix_size1 (a);
1040
assert (n == traits::matrix_size2 (a));
1041
assert (traits::vector_size (x) >= n);
1043
CBLAS_ORDER const stor_ord
1044
= enum_cast<CBLAS_ORDER const>
1046
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1047
typename traits::matrix_traits<HermM>::ordering_type
1049
typename HermM::orientation_category
1053
CBLAS_UPLO const uplo
1054
= enum_cast<CBLAS_UPLO const>
1056
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1057
typename traits::matrix_traits<HermM>::uplo_type
1059
typename HermM::packed_category
1063
detail::her (stor_ord, uplo, n, alpha,
1064
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1065
traits::vector_storage (x),
1067
traits::vector_storage_const (x),
1069
traits::vector_stride (x),
1070
traits::matrix_storage (a),
1071
traits::leading_dimension (a));
1075
template <typename HermM, typename VctX>
1077
void her (VctX const& x, HermM& a) {
1078
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1079
typedef typename traits::matrix_traits<HermM>::value_type val_t;
1081
typedef typename HermM::value_type val_t;
1083
typedef typename traits::type_traits<val_t>::real_type real_t;
1084
her ((real_t) 1, x, a);
1088
// A <- alpha * x * x^H + A
1089
// A hermitian in packed form
1090
template <typename T, typename HermM, typename VctX>
1092
void hpr (T const& alpha, VctX const& x, HermM& a) {
1093
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1094
BOOST_STATIC_ASSERT((boost::is_same<
1095
typename traits::matrix_traits<HermM>::matrix_structure,
1096
traits::hermitian_packed_t
1100
int const n = traits::matrix_size1 (a);
1101
assert (n == traits::matrix_size2 (a));
1102
assert (traits::vector_size (x) >= n);
1104
CBLAS_ORDER const stor_ord
1105
= enum_cast<CBLAS_ORDER const>
1107
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1108
typename traits::matrix_traits<HermM>::ordering_type
1110
typename HermM::orientation_category
1114
CBLAS_UPLO const uplo
1115
= enum_cast<CBLAS_UPLO const>
1117
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1118
typename traits::matrix_traits<HermM>::uplo_type
1120
typename HermM::packed_category
1124
detail::hpr (stor_ord, uplo, n, alpha,
1125
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1126
traits::vector_storage (x),
1128
traits::vector_storage_const (x),
1130
traits::vector_stride (x),
1131
traits::matrix_storage (a));
1135
template <typename HermM, typename VctX>
1137
void hpr (VctX const& x, HermM& a) {
1138
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1139
typedef typename traits::matrix_traits<HermM>::value_type val_t;
1141
typedef typename HermM::value_type val_t;
1143
typedef typename traits::type_traits<val_t>::real_type real_t;
1144
hpr ((real_t) 1, x, a);
1148
// A <- alpha * x * y^H + y * (alpha * x)^H + A
1150
template <typename T, typename HermM, typename VctX, typename VctY>
1152
void her2 (CBLAS_UPLO const uplo, T const& alpha,
1153
VctX const& x, VctY const& y, HermM& a)
1155
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1156
BOOST_STATIC_ASSERT((boost::is_same<
1157
typename traits::matrix_traits<HermM>::matrix_structure,
1162
int const n = traits::matrix_size1 (a);
1163
assert (n == traits::matrix_size2 (a));
1164
assert (traits::vector_size (x) >= n);
1165
assert (traits::vector_size (y) >= n);
1167
CBLAS_ORDER const stor_ord
1168
= enum_cast<CBLAS_ORDER const>
1170
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1171
typename traits::matrix_traits<HermM>::ordering_type
1173
typename HermM::orientation_category
1177
detail::her2 (stor_ord, uplo, n, alpha,
1178
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1179
traits::vector_storage (x),
1181
traits::vector_storage_const (x),
1183
traits::vector_stride (x),
1184
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1185
traits::vector_storage (y),
1187
traits::vector_storage_const (y),
1189
traits::vector_stride (y),
1190
traits::matrix_storage (a),
1191
traits::leading_dimension (a));
1194
template <typename T, typename HermM, typename VctX, typename VctY>
1196
void her2 (T const& alpha, VctX const& x, VctY const& y, HermM& a) {
1197
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1198
BOOST_STATIC_ASSERT((boost::is_same<
1199
typename traits::matrix_traits<HermM>::matrix_structure,
1204
int const n = traits::matrix_size1 (a);
1205
assert (n == traits::matrix_size2 (a));
1206
assert (traits::vector_size (x) >= n);
1207
assert (traits::vector_size (y) >= n);
1209
CBLAS_ORDER const stor_ord
1210
= enum_cast<CBLAS_ORDER const>
1212
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1213
typename traits::matrix_traits<HermM>::ordering_type
1215
typename HermM::orientation_category
1219
CBLAS_UPLO const uplo
1220
= enum_cast<CBLAS_UPLO const>
1222
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1223
typename traits::matrix_traits<HermM>::uplo_type
1225
typename HermM::packed_category
1229
detail::her2 (stor_ord, uplo, n, alpha,
1230
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1231
traits::vector_storage (x),
1233
traits::vector_storage_const (x),
1235
traits::vector_stride (x),
1236
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1237
traits::vector_storage (y),
1239
traits::vector_storage_const (y),
1241
traits::vector_stride (y),
1242
traits::matrix_storage (a),
1243
traits::leading_dimension (a));
1246
// A <- x * y^H + y * x^H + A
1247
template <typename HermM, typename VctX, typename VctY>
1249
void her2 (VctX const& x, VctY const& y, HermM& a) {
1250
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1251
typedef typename traits::matrix_traits<HermM>::value_type val_t;
1253
typedef typename HermM::value_type val_t;
1255
her2 ((val_t) 1, x, y, a);
1259
// A <- alpha * x * y^H + y * (alpha * x)^H + A
1260
// A hermitian in packed form
1261
template <typename T, typename HermM, typename VctX, typename VctY>
1263
void hpr2 (T const& alpha, VctX const& x, VctY const& y, HermM& a) {
1264
#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK
1265
BOOST_STATIC_ASSERT((boost::is_same<
1266
typename traits::matrix_traits<HermM>::matrix_structure,
1267
traits::hermitian_packed_t
1271
int const n = traits::matrix_size1 (a);
1272
assert (n == traits::matrix_size2 (a));
1273
assert (traits::vector_size (x) >= n);
1274
assert (traits::vector_size (y) >= n);
1276
CBLAS_ORDER const stor_ord
1277
= enum_cast<CBLAS_ORDER const>
1279
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1280
typename traits::matrix_traits<HermM>::ordering_type
1282
typename HermM::orientation_category
1286
CBLAS_UPLO const uplo
1287
= enum_cast<CBLAS_UPLO const>
1289
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1290
typename traits::matrix_traits<HermM>::uplo_type
1292
typename HermM::packed_category
1296
detail::hpr2 (stor_ord, uplo, n, alpha,
1297
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1298
traits::vector_storage (x),
1300
traits::vector_storage_const (x),
1302
traits::vector_stride (x),
1303
#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1304
traits::vector_storage (y),
1306
traits::vector_storage_const (y),
1308
traits::vector_stride (y),
1309
traits::matrix_storage (a));
1312
// A <- x * y^H + y * x^H + A
1313
template <typename HermM, typename VctX, typename VctY>
1315
void hpr2 (VctX const& x, VctY const& y, HermM& a) {
1316
#ifndef BOOST_NUMERIC_BINDINGS_POOR_MANS_TRAITS
1317
typedef typename traits::matrix_traits<HermM>::value_type val_t;
1319
typedef typename HermM::value_type val_t;
1321
hpr2 ((val_t) 1, x, y, a);
1325
} // namespace atlas
1329
#endif // BOOST_NUMERIC_BINDINGS_CBLAS_LEVEL_2_HPP