1 /*
2 * Copyright (c) 2010, Michael Lehn
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1) Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2) Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 * 3) Neither the name of the FLENS development group nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #ifndef FLENS_BLAS_LEVEL3_R2K_TCC
34 #define FLENS_BLAS_LEVEL3_R2K_TCC
35
36 #include <flens/typedefs.h>
37
38 namespace flens { namespace blas {
39
40 //-- her2k
41 template <typename ALPHA, typename MA, typename MB, typename BETA, typename MC>
42 void
43 r2k(Transpose trans,
44 const ALPHA &alpha,
45 const GeMatrix<MA> &A, const GeMatrix<MB> &B,
46 const BETA &beta,
47 HeMatrix<MC> &C)
48 {
49 typedef typename GeMatrix<MA>::IndexType IndexType;
50
51 IndexType n = (trans==NoTrans) ? A.numRows()
52 : A.numCols();
53 IndexType k = (trans==NoTrans) ? A.numCols()
54 : A.numRows();
55
56 ASSERT(A.numRows()==B.numRows());
57 ASSERT(A.numCols()==B.numCols());
58 ASSERT((beta==static_cast<BETA>(0)) || (C.dim()==n));
59
60 if (C.dim()!=n) {
61 C.resize(n, n);
62 }
63
64 # ifdef HAVE_CXXBLAS_HER2K
65 cxxblas::her2k(MC::order, C.upLo(), trans,
66 n, k,
67 alpha,
68 A.data(), A.leadingDimension(),
69 B.data(), B.leadingDimension(),
70 beta,
71 C.data(), C.leadingDimension());
72 # else
73 ASSERT(0);
74 # endif
75 }
76
77 //-- syr2k
78 template <typename ALPHA, typename MA, typename MB, typename BETA, typename MC>
79 void
80 r2k(Transpose trans,
81 const ALPHA &alpha,
82 const GeMatrix<MA> &A, const GeMatrix<MB> &B,
83 const BETA &beta,
84 SyMatrix<MC> &C)
85 {
86 typedef typename GeMatrix<MA>::IndexType IndexType;
87
88 IndexType n = (trans==NoTrans) ? A.numRows()
89 : A.numCols();
90 IndexType k = (trans==NoTrans) ? A.numCols()
91 : A.numRows();
92
93 ASSERT(A.numRows()==B.numRows());
94 ASSERT(A.numCols()==B.numCols());
95 ASSERT((beta==static_cast<BETA>(0)) || (C.dim()==n));
96
97 if (C.dim()!=n) {
98 C.resize(n, n);
99 }
100
101 # ifdef HAVE_CXXBLAS_SYR2K
102 cxxblas::syr2k(MC::order, C.upLo(), trans,
103 n, k,
104 alpha,
105 A.data(), A.leadingDimension(),
106 B.data(), B.leadingDimension(),
107 beta,
108 C.data(), C.leadingDimension());
109 # else
110 ASSERT(0);
111 # endif
112 }
113
114 } } // namespace blas, flens
115
116 #endif // FLENS_BLAS_LEVEL3_R2K_TCC
2 * Copyright (c) 2010, Michael Lehn
3 *
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1) Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2) Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 * 3) Neither the name of the FLENS development group nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #ifndef FLENS_BLAS_LEVEL3_R2K_TCC
34 #define FLENS_BLAS_LEVEL3_R2K_TCC
35
36 #include <flens/typedefs.h>
37
38 namespace flens { namespace blas {
39
40 //-- her2k
41 template <typename ALPHA, typename MA, typename MB, typename BETA, typename MC>
42 void
43 r2k(Transpose trans,
44 const ALPHA &alpha,
45 const GeMatrix<MA> &A, const GeMatrix<MB> &B,
46 const BETA &beta,
47 HeMatrix<MC> &C)
48 {
49 typedef typename GeMatrix<MA>::IndexType IndexType;
50
51 IndexType n = (trans==NoTrans) ? A.numRows()
52 : A.numCols();
53 IndexType k = (trans==NoTrans) ? A.numCols()
54 : A.numRows();
55
56 ASSERT(A.numRows()==B.numRows());
57 ASSERT(A.numCols()==B.numCols());
58 ASSERT((beta==static_cast<BETA>(0)) || (C.dim()==n));
59
60 if (C.dim()!=n) {
61 C.resize(n, n);
62 }
63
64 # ifdef HAVE_CXXBLAS_HER2K
65 cxxblas::her2k(MC::order, C.upLo(), trans,
66 n, k,
67 alpha,
68 A.data(), A.leadingDimension(),
69 B.data(), B.leadingDimension(),
70 beta,
71 C.data(), C.leadingDimension());
72 # else
73 ASSERT(0);
74 # endif
75 }
76
77 //-- syr2k
78 template <typename ALPHA, typename MA, typename MB, typename BETA, typename MC>
79 void
80 r2k(Transpose trans,
81 const ALPHA &alpha,
82 const GeMatrix<MA> &A, const GeMatrix<MB> &B,
83 const BETA &beta,
84 SyMatrix<MC> &C)
85 {
86 typedef typename GeMatrix<MA>::IndexType IndexType;
87
88 IndexType n = (trans==NoTrans) ? A.numRows()
89 : A.numCols();
90 IndexType k = (trans==NoTrans) ? A.numCols()
91 : A.numRows();
92
93 ASSERT(A.numRows()==B.numRows());
94 ASSERT(A.numCols()==B.numCols());
95 ASSERT((beta==static_cast<BETA>(0)) || (C.dim()==n));
96
97 if (C.dim()!=n) {
98 C.resize(n, n);
99 }
100
101 # ifdef HAVE_CXXBLAS_SYR2K
102 cxxblas::syr2k(MC::order, C.upLo(), trans,
103 n, k,
104 alpha,
105 A.data(), A.leadingDimension(),
106 B.data(), B.leadingDimension(),
107 beta,
108 C.data(), C.leadingDimension());
109 # else
110 ASSERT(0);
111 # endif
112 }
113
114 } } // namespace blas, flens
115
116 #endif // FLENS_BLAS_LEVEL3_R2K_TCC