SHOGUN  4.1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Scale.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) The Shogun Machine Learning Toolbox
3  * Written (w) 2014 Khaled Nasr
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 are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice, this
10  * list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * The views and conclusions contained in the software and documentation are those
27  * of the authors and should not be interpreted as representing official policies,
28  * either expressed or implied, of the Shogun Development Team.
29  */
30 
31 #ifndef SCALE_IMPL_H_
32 #define SCALE_IMPL_H_
33 
34 #include <shogun/lib/config.h>
35 #include <shogun/lib/SGMatrix.h>
36 #include <shogun/lib/SGVector.h>
37 
38 #ifdef HAVE_EIGEN3
40 #endif // HAVE_EIGEN3
41 
42 #ifdef HAVE_VIENNACL
43 #include <shogun/lib/GPUMatrix.h>
44 #include <shogun/lib/GPUVector.h>
45 #include <viennacl/linalg/matrix_operations.hpp>
46 #include <viennacl/linalg/vector_operations.hpp>
47 #endif // HAVE_VIENNACL
48 
49 namespace shogun
50 {
51 
52 namespace linalg
53 {
54 
55 namespace implementation
56 {
57 
59 template <enum Backend, class Matrix>
60 struct scale
61 {
63  typedef typename Matrix::Scalar T;
64 
66  static void compute(Matrix A, Matrix B, Matrix C, T alpha, T beta);
67 };
68 
70 template<class Matrix>
71 struct scale<Backend::NATIVE, Matrix>
72 {
73  typedef typename Matrix::Scalar T;
74 
76  static void compute(SGMatrix<T> A, SGMatrix<T> B, T alpha)
77  {
78  REQUIRE((A.num_rows==B.num_rows)&&(A.num_cols==B.num_cols),
79  "Dimensions of A(%dx%d) and B(%dx%d) don't match.",
80  A.num_rows, A.num_cols, B.num_rows, B.num_cols);
81 
82  compute(A.matrix, B.matrix, A.num_rows*A.num_cols, alpha);
83  }
84 
86  static void compute(SGVector<T> A, SGVector<T> B, T alpha)
87  {
88  REQUIRE(A.vlen==B.vlen,"Number of elements in A(%d) should be "
89  "equal to number of elements in (%d)!", A.vlen, B.vlen);
90 
91  compute(A.vector, B.vector, A.vlen, alpha);
92  }
93 
95  static void compute(T* A, T* B, index_t len, T alpha)
96  {
97  REQUIRE(A!=NULL&&B!=NULL, "Invalid pointers to matrices.");
98 
99  for (index_t i=0; i<len; i++)
100  B[i]=A[i]*alpha;
101  }
102 };
103 
104 #ifdef HAVE_EIGEN3
105 
107 template <class Matrix>
108 struct scale<Backend::EIGEN3, Matrix>
109 {
111  typedef typename Matrix::Scalar T;
112 
115 
118 
120  static void compute(SGMatrix<T> A, SGMatrix<T> B, T alpha)
121  {
122  Eigen::Map<MatrixXt> A_eig = A;
123  Eigen::Map<MatrixXt> B_eig = B;
124 
125  B_eig = alpha * A_eig;
126  }
127 
129  static void compute(SGVector<T> A, SGVector<T> B, T alpha)
130  {
131  Eigen::Map<VectorXt> A_eig = A;
132  Eigen::Map<VectorXt> B_eig = B;
133 
134  B_eig = alpha * A_eig;
135  }
136 };
137 #endif // HAVE_EIGEN3
138 
139 #ifdef HAVE_VIENNACL
140 
142 template <class Matrix>
143 struct scale<Backend::VIENNACL, Matrix>
144 {
146  typedef typename Matrix::Scalar T;
147 
149  static void compute(CGPUMatrix<T> A, CGPUMatrix<T> B, T alpha)
150  {
151  B.vcl_matrix() = alpha*A.vcl_matrix();
152  }
153 
155  static void compute(CGPUVector<T> A, CGPUVector<T> B, T alpha)
156  {
157  B.vcl_vector() = alpha*A.vcl_vector();
158  }
159 };
160 
161 #endif // HAVE_VIENNACL
162 
163 }
164 
165 }
166 
167 }
168 #endif // SCALE_IMPL_H_
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > MatrixXt
Definition: Scale.h:114
int32_t index_t
Definition: common.h:62
static void compute(SGMatrix< T > A, SGMatrix< T > B, T alpha)
Definition: Scale.h:120
#define REQUIRE(x,...)
Definition: SGIO.h:206
index_t num_cols
Definition: SGMatrix.h:378
index_t num_rows
Definition: SGMatrix.h:376
shogun matrix
index_t vlen
Definition: SGVector.h:494
shogun vector
static void compute(T *A, T *B, index_t len, T alpha)
Definition: Scale.h:95
static void compute(SGVector< T > A, SGVector< T > B, T alpha)
Definition: Scale.h:129
all of classes and functions are contained in the shogun namespace
Definition: class_list.h:18
void scale(Matrix A, Matrix B, typename Matrix::Scalar alpha)
Definition: Core.h:93
static void compute(Matrix A, Matrix B, Matrix C, T alpha, T beta)
Eigen::Matrix< T, Eigen::Dynamic, 1 > VectorXt
Definition: Scale.h:117
static void compute(SGMatrix< T > A, SGMatrix< T > B, T alpha)
Definition: Scale.h:76
static void compute(SGVector< T > A, SGVector< T > B, T alpha)
Definition: Scale.h:86

SHOGUN Machine Learning Toolbox - Documentation