46 #include <viennacl/linalg/matrix_operations.hpp>
47 #include <viennacl/linalg/vector_operations.hpp>
48 #endif // HAVE_VIENNACL
56 namespace implementation
62 template <enum Backend,
class Matrix>
66 typedef typename Matrix::Scalar
T;
76 static void compute(Matrix A, Matrix B, Matrix C, T alpha, T beta);
82 template <
class Matrix>
83 struct add<Backend::NATIVE, Matrix>
86 typedef typename Matrix::Scalar
T;
102 "Dimension mismatch! A(%d x %d) vs B(%d x %d)\n",
127 "Dimension mismatch! A(%d x %d) vs B(%d x %d)\n",
130 "Dimension mismatch! A(%d x %d) vs C(%d x %d)\n",
146 "A(%d) vs B(%d)\n", A.
vlen, B.
vlen);
166 "A(%d) vs B(%d)\n", A.
vlen, B.
vlen);
168 "A(%d) vs C(%d)\n", A.
vlen, C.
vlen);
184 for (int32_t i=0; i<len; i++)
185 C[i]=alpha*A[i]+beta*B[i];
194 template <
class Matrix>
195 struct add<Backend::EIGEN3, Matrix>
198 typedef typename Matrix::Scalar
T;
220 "Dimension mismatch! A(%d x %d) vs B(%d x %d)\n",
244 C_eig=alpha*A_eig+beta*B_eig;
258 "A(%d) vs B(%d)\n", A.
vlen, B.
vlen);
281 C_eig=alpha*A_eig+beta*B_eig;
284 #endif // HAVE_EIGEN3
291 template <
class Matrix>
292 struct add<Backend::VIENNACL, Matrix>
295 typedef typename Matrix::Scalar
T;
305 static CGPUMatrix<T>
compute(CGPUMatrix<T> A, CGPUMatrix<T> B, T alpha=1, T beta=1)
307 REQUIRE(A.matrix,
"Matrix A is not initialized!\n");
308 REQUIRE(B.matrix,
"Matrix B is not initialized!\n");
310 REQUIRE(A.num_rows == B.num_rows && A.num_cols == B.num_cols,
311 "Dimension mismatch! A(%d x %d) vs B(%d x %d)\n",
312 A.num_rows, A.num_cols, B.num_rows, B.num_cols);
314 CGPUMatrix<T> C(A.num_rows, A.num_cols);
328 static void compute(CGPUMatrix<T> A, CGPUMatrix<T> B, CGPUMatrix<T> C,
331 C.vcl_matrix()=alpha*A.vcl_matrix()+beta*B.vcl_matrix();
342 static CGPUVector<T>
compute(CGPUVector<T> A, CGPUVector<T> B, T alpha=1, T beta=1)
344 REQUIRE(A.vlen == B.vlen,
"Vectors should have same length! "
345 "A(%d) vs B(%d)\n", A.vlen, B.vlen);
347 CGPUVector<T> C(A.vlen);
361 static void compute(CGPUVector<T> A, CGPUVector<T> B, CGPUVector<T> C,
364 C.vcl_vector()=alpha*A.vcl_vector()+beta*B.vcl_vector();
368 #endif // HAVE_VIENNACL
375 #endif // ADD_IMPL_H_
static SGMatrix< T > compute(SGMatrix< T > A, SGMatrix< T > B, T alpha=1, T beta=1)
static SGVector< T > compute(SGVector< T > A, SGVector< T > B, T alpha=1, T beta=1)
static void compute(SGVector< T > A, SGVector< T > B, SGVector< T > C, T alpha=1, T beta=1)
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > MatrixXt
void add(Matrix A, Matrix B, Matrix C, typename Matrix::Scalar alpha=1.0, typename Matrix::Scalar beta=1.0)
Generic class which is specialized for different backends to perform addition.
Eigen::Matrix< T, Eigen::Dynamic, 1 > VectorXt
static void compute(Matrix A, Matrix B, Matrix C, T alpha, T beta)
static void compute(SGVector< T > A, SGVector< T > B, SGVector< T > C, T alpha, T beta)
static void compute(SGMatrix< T > A, SGMatrix< T > B, SGMatrix< T > C, T alpha, T beta)
all of classes and functions are contained in the shogun namespace
static SGMatrix< T > compute(SGMatrix< T > A, SGMatrix< T > B, T alpha=1, T beta=1)
static void compute(SGMatrix< T > A, SGMatrix< T > B, SGMatrix< T > C, T alpha=1, T beta=1)
static void compute(T *A, T *B, T *C, T alpha, T beta, index_t len)
static SGVector< T > compute(SGVector< T > A, SGVector< T > B, T alpha=1, T beta=1)