void run_tutorial() { typedef mtl::dense2D<ScalarType> MTL4DenseMatrix; typedef mtl::compressed2D<ScalarType> MTL4SparseMatrix; /** * Create and fill dense matrices from the MTL4 library: **/ mtl::dense2D<ScalarType> mtl4_densemat(5, 5); mtl::dense2D<ScalarType> mtl4_densemat2(5, 5); mtl4_densemat(0,0) = 2.0; mtl4_densemat(0,1) = -1.0; mtl4_densemat(1,0) = -1.0; mtl4_densemat(1,1) = 2.0; mtl4_densemat(1,2) = -1.0; mtl4_densemat(2,1) = -1.0; mtl4_densemat(2,2) = -1.0; mtl4_densemat(2,3) = -1.0; mtl4_densemat(3,2) = -1.0; mtl4_densemat(3,3) = 2.0; mtl4_densemat(3,4) = -1.0; mtl4_densemat(4,4) = -1.0; mtl4_densemat(4,4) = -1.0; /** * Create and fill sparse matrices from the MTL4 library: **/ MTL4SparseMatrix mtl4_sparsemat; set_to_zero(mtl4_sparsemat); mtl4_sparsemat.change_dim(5, 5); MTL4SparseMatrix mtl4_sparsemat2; set_to_zero(mtl4_sparsemat2); mtl4_sparsemat2.change_dim(5, 5); { mtl::matrix::inserter< MTL4SparseMatrix > ins(mtl4_sparsemat); typedef typename mtl::Collection<MTL4SparseMatrix>::value_type ValueType; ins(0,0) << ValueType(2.0); ins(0,1) << ValueType(-1.0); ins(1,1) << ValueType(2.0); ins(1,2) << ValueType(-1.0); ins(2,2) << ValueType(-1.0); ins(2,3) << ValueType(-1.0); ins(3,3) << ValueType(2.0); ins(3,4) << ValueType(-1.0); ins(4,4) << ValueType(-1.0); } /** * Create and fill a few vectors from the MTL4 library: **/ mtl::dense_vector<ScalarType> mtl4_rhs(5, 0.0); mtl::dense_vector<ScalarType> mtl4_result(5, 0.0); mtl::dense_vector<ScalarType> mtl4_temp(5, 0.0); mtl4_rhs(0) = 10.0; mtl4_rhs(1) = 11.0; mtl4_rhs(2) = 12.0; mtl4_rhs(3) = 13.0; mtl4_rhs(4) = 14.0; /** * Create the corresponding ViennaCL objects: **/ viennacl::vector<ScalarType> vcl_rhs(5); viennacl::vector<ScalarType> vcl_result(5); viennacl::matrix<ScalarType> vcl_densemat(5, 5); viennacl::compressed_matrix<ScalarType> vcl_sparsemat(5, 5); /** * Directly copy the MTL4 objects to ViennaCL objects **/ viennacl::copy(&(mtl4_rhs[0]), &(mtl4_rhs[0]) + 5, vcl_rhs.begin()); //method 1: via iterator interface (cf. std::copy()) viennacl::copy(mtl4_rhs, vcl_rhs); //method 2: via built-in wrappers (convenience layer) viennacl::copy(mtl4_densemat, vcl_densemat); viennacl::copy(mtl4_sparsemat, vcl_sparsemat); // For completeness: Copy matrices from ViennaCL back to Eigen: viennacl::copy(vcl_densemat, mtl4_densemat2); viennacl::copy(vcl_sparsemat, mtl4_sparsemat2); /** * Run dense matrix-vector products and compare results: **/ mtl4_result = mtl4_densemat * mtl4_rhs; vcl_result = viennacl::linalg::prod(vcl_densemat, vcl_rhs); viennacl::copy(vcl_result, mtl4_temp); mtl4_result -= mtl4_temp; std::cout << "Difference for dense matrix-vector product: " << mtl::two_norm(mtl4_result) << std::endl; mtl4_result = mtl4_densemat2 * mtl4_rhs - mtl4_temp; std::cout << "Difference for dense matrix-vector product (MTL4->ViennaCL->MTL4): " << mtl::two_norm(mtl4_result) << std::endl; /** * Run sparse matrix-vector products and compare results: **/ mtl4_result = mtl4_sparsemat * mtl4_rhs; vcl_result = viennacl::linalg::prod(vcl_sparsemat, vcl_rhs); viennacl::copy(vcl_result, mtl4_temp); mtl4_result -= mtl4_temp; std::cout << "Difference for sparse matrix-vector product: " << mtl::two_norm(mtl4_result) << std::endl; mtl4_result = mtl4_sparsemat2 * mtl4_rhs - mtl4_temp; std::cout << "Difference for sparse matrix-vector product (MTL4->ViennaCL->MTL4): " << mtl::two_norm(mtl4_result) << std::endl; }
void run_tutorial() { /** * Get Eigen matrix and vector types for the provided ScalarType. * Involves a little bit of template-metaprogramming. **/ typedef typename Eigen_dense_matrix<ScalarType>::type EigenMatrix; typedef typename Eigen_vector<ScalarType>::type EigenVector; /** * Create and fill dense matrices from the Eigen library: **/ EigenMatrix eigen_densemat(6, 5); EigenMatrix eigen_densemat2(6, 5); eigen_densemat(0,0) = 2.0; eigen_densemat(0,1) = -1.0; eigen_densemat(1,0) = -1.0; eigen_densemat(1,1) = 2.0; eigen_densemat(1,2) = -1.0; eigen_densemat(2,1) = -1.0; eigen_densemat(2,2) = -1.0; eigen_densemat(2,3) = -1.0; eigen_densemat(3,2) = -1.0; eigen_densemat(3,3) = 2.0; eigen_densemat(3,4) = -1.0; eigen_densemat(5,4) = -1.0; eigen_densemat(4,4) = -1.0; Eigen::Map<EigenMatrix> eigen_densemat_map(eigen_densemat.data(), 6, 5); // same as eigen_densemat, but emulating user-provided buffer /** * Create and fill sparse matrices from the Eigen library: **/ Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat(6, 5); Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat2(6, 5); eigen_sparsemat.reserve(5*2); eigen_sparsemat.insert(0,0) = 2.0; eigen_sparsemat.insert(0,1) = -1.0; eigen_sparsemat.insert(1,1) = 2.0; eigen_sparsemat.insert(1,2) = -1.0; eigen_sparsemat.insert(2,2) = -1.0; eigen_sparsemat.insert(2,3) = -1.0; eigen_sparsemat.insert(3,3) = 2.0; eigen_sparsemat.insert(3,4) = -1.0; eigen_sparsemat.insert(5,4) = -1.0; //eigen_sparsemat.endFill(); /** * Create and fill a few vectors from the Eigen library: **/ EigenVector eigen_rhs(5); Eigen::Map<EigenVector> eigen_rhs_map(eigen_rhs.data(), 5); EigenVector eigen_result(6); EigenVector eigen_temp(6); eigen_rhs(0) = 10.0; eigen_rhs(1) = 11.0; eigen_rhs(2) = 12.0; eigen_rhs(3) = 13.0; eigen_rhs(4) = 14.0; /** * Create the corresponding ViennaCL objects: **/ viennacl::vector<ScalarType> vcl_rhs(5); viennacl::vector<ScalarType> vcl_result(6); viennacl::matrix<ScalarType> vcl_densemat(6, 5); viennacl::compressed_matrix<ScalarType> vcl_sparsemat(6, 5); /** * Directly copy the Eigen objects to ViennaCL objects **/ viennacl::copy(&(eigen_rhs[0]), &(eigen_rhs[0]) + 5, vcl_rhs.begin()); // Method 1: via iterator interface (cf. std::copy()) viennacl::copy(eigen_rhs, vcl_rhs); // Method 2: via built-in wrappers (convenience layer) viennacl::copy(eigen_rhs_map, vcl_rhs); // Same as method 2, but for a mapped vector viennacl::copy(eigen_densemat, vcl_densemat); viennacl::copy(eigen_densemat_map, vcl_densemat); //same as above, using mapped matrix viennacl::copy(eigen_sparsemat, vcl_sparsemat); std::cout << "VCL sparsematrix dimensions: " << vcl_sparsemat.size1() << ", " << vcl_sparsemat.size2() << std::endl; // For completeness: Copy matrices from ViennaCL back to Eigen: viennacl::copy(vcl_densemat, eigen_densemat2); viennacl::copy(vcl_sparsemat, eigen_sparsemat2); /** * Run dense matrix-vector products and compare results: **/ eigen_result = eigen_densemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_densemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for dense matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for dense matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_densemat2 * eigen_rhs - eigen_temp).norm() << std::endl; /** * Run sparse matrix-vector products and compare results: **/ eigen_result = eigen_sparsemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_sparsemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for sparse matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for sparse matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_sparsemat2 * eigen_rhs - eigen_temp).norm() << std::endl; }
void run_test() { // // get Eigen matrix and vector types for the provided ScalarType: // typedef typename Eigen_dense_matrix<ScalarType>::type EigenMatrix; typedef typename Eigen_vector<ScalarType>::type EigenVector; // // Create and fill dense matrices from the Eigen library: // EigenMatrix eigen_densemat(6, 5); EigenMatrix eigen_densemat2(6, 5); eigen_densemat(0,0) = 2.0; eigen_densemat(0,1) = -1.0; eigen_densemat(1,0) = -1.0; eigen_densemat(1,1) = 2.0; eigen_densemat(1,2) = -1.0; eigen_densemat(2,1) = -1.0; eigen_densemat(2,2) = -1.0; eigen_densemat(2,3) = -1.0; eigen_densemat(3,2) = -1.0; eigen_densemat(3,3) = 2.0; eigen_densemat(3,4) = -1.0; eigen_densemat(5,4) = -1.0; eigen_densemat(4,4) = -1.0; // // Create and fill sparse matrices from the Eigen library: // Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat(6, 5); Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat2(6, 5); eigen_sparsemat.reserve(5*2); eigen_sparsemat.insert(0,0) = 2.0; eigen_sparsemat.insert(0,1) = -1.0; eigen_sparsemat.insert(1,1) = 2.0; eigen_sparsemat.insert(1,2) = -1.0; eigen_sparsemat.insert(2,2) = -1.0; eigen_sparsemat.insert(2,3) = -1.0; eigen_sparsemat.insert(3,3) = 2.0; eigen_sparsemat.insert(3,4) = -1.0; eigen_sparsemat.insert(5,4) = -1.0; //eigen_sparsemat.endFill(); // // Create and fill a few vectors from the Eigen library: // EigenVector eigen_rhs(5); EigenVector eigen_result(6); EigenVector eigen_temp(6); eigen_rhs(0) = 10.0; eigen_rhs(1) = 11.0; eigen_rhs(2) = 12.0; eigen_rhs(3) = 13.0; eigen_rhs(4) = 14.0; // // Let us create the ViennaCL analogues: // viennacl::vector<ScalarType> vcl_rhs(5); viennacl::vector<ScalarType> vcl_result(6); viennacl::matrix<ScalarType> vcl_densemat(6, 5); viennacl::compressed_matrix<ScalarType> vcl_sparsemat(6, 5); // // Directly copy the Eigen objects to ViennaCL objects // viennacl::copy(&(eigen_rhs[0]), &(eigen_rhs[0]) + 5, vcl_rhs.begin()); //method 1: via iterator interface (cf. std::copy()) viennacl::copy(eigen_rhs, vcl_rhs); //method 2: via built-in wrappers (convenience layer) viennacl::copy(eigen_densemat, vcl_densemat); viennacl::copy(eigen_sparsemat, vcl_sparsemat); std::cout << "VCL sparsematrix dimensions: " << vcl_sparsemat.size1() << ", " << vcl_sparsemat.size2() << std::endl; // For completeness: Copy matrices from ViennaCL back to Eigen: viennacl::copy(vcl_densemat, eigen_densemat2); viennacl::copy(vcl_sparsemat, eigen_sparsemat2); // // Run matrix-vector products and compare results: // eigen_result = eigen_densemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_densemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for dense matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for dense matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_densemat2 * eigen_rhs - eigen_temp).norm() << std::endl; // // Same for sparse matrix: // eigen_result = eigen_sparsemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_sparsemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for sparse matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for sparse matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_sparsemat2 * eigen_rhs - eigen_temp).norm() << std::endl; // // Please have a look at the other tutorials on how to use the ViennaCL types // }