ViennaCL - The Vienna Computing Library: examples/tutorial/vector-io.hpp Source File

ViennaCL - The Vienna Computing Library 1.7.1 Free open-source GPU-accelerated linear algebra and solver library. |

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
vector-io.hpp
Go to the documentation of this file.
1 #ifndef VECTOR_IO_HPP_
2 #define VECTOR_IO_HPP_
3
4 /* =========================================================================
5 Copyright (c) 2010-2016, Institute for Microelectronics,
6 Institute for Analysis and Scientific Computing,
7 TU Wien.
8 Portions of this software are copyright by UChicago Argonne, LLC.
9
10 -----------------
11 ViennaCL - The Vienna Computing Library
12 -----------------
13
14 Project Head: Karl Rupp rupp@iue.tuwien.ac.at
15
16 (A list of authors and contributors can be found in the PDF manual)
17
18 License: MIT (X11), see file LICENSE in the base directory
19 ============================================================================= */
20
21 #include <string>
22 #include <iostream>
23 #include <fstream>
24
25 #include "viennacl/tools/tools.hpp"
26 #include "viennacl/meta/result_of.hpp"
27 #include "viennacl/traits/size.hpp"
28
29
30 template<typename MatrixType, typename ScalarType>
31 void insert(MatrixType & matrix, long row, long col, ScalarType value)
32 {
33 matrix(row, col) = value;
34 }
35
36 #ifdef VIENNACL_HAVE_EIGEN
37 template<typename ScalarType, int option>
38 void insert(Eigen::SparseMatrix<ScalarType, option> & matrix, long row, long col, double value)
39 {
40 matrix.fill(row, col) = value;
41 }
42 #endif
43
44 template<typename MatrixType>
45 class my_inserter
46 {
47 public:
48 my_inserter(MatrixType & mat) : mat_(mat) {}
49
50 void apply(long row, long col, double value)
51 {
52 insert(mat_, row, col, value);
53 }
54
55 private:
56 MatrixType & mat_;
57 };
58
59 #ifdef VIENNACL_HAVE_MTL4
60 #include <boost/numeric/mtl/matrix/inserter.hpp>
61 /*template<typename ScalarType>
62 void insert(mtl::compressed2D<ScalarType> & matrix, long row, long col, ScalarType value)
63 {
64 typedef mtl::compressed2D<ScalarType> MatrixType;
65 mtl::matrix::inserter<MatrixType> ins(matrix);
66
67 typename mtl::Collection<MatrixType>::value_type val(value);
68 ins(row, col) << val;
69 //matrix.fill(row, col) = val;
70 }*/
71
72 template<typename ScalarType>
73 void resize_vector(mtl::dense_vector<ScalarType> & vec, unsigned int size)
74 {
75 vec.change_dim(size);
76 }
77
78 template<typename ScalarType>
79 class my_inserter<mtl::compressed2D<ScalarType> >
80 {
81 typedef mtl::compressed2D<ScalarType> MatrixType;
82 public:
83 my_inserter(MatrixType & mat) : mat_(mat), ins_(mat) {}
84
85 void apply(long row, long col, ScalarType value)
86 {
87 typename mtl::Collection<MatrixType>::value_type val(value);
88 ins_(row, col) << val;
89 }
90
91 private:
92 MatrixType & mat_;
93 mtl::matrix::inserter<MatrixType> ins_;
94 };
95 #endif
96
97 template<typename VectorType>
98 void resize_vector(VectorType & vec, unsigned int size)
99 {
100 vec.resize(size);
101 }
102
103 template<typename VectorType>
104 bool readVectorFromFile(const std::string & filename,
105 VectorType & vec)
106 {
107 typedef typename viennacl::result_of::value_type<VectorType>::type ScalarType;
108
109 std::ifstream file(filename.c_str());
110
111 if (!file) return false;
112
113 unsigned int size;
114 file >> size;
115
116 resize_vector(vec, size);
117
118 for (unsigned int i = 0; i < size; ++i)
119 {
120 ScalarType element;
121 file >> element;
122 vec[i] = element;
123 }
124
125 return true;
126 }
127
128
129 template<class MatrixType>
130 bool readMatrixFromFile(const std::string & filename, MatrixType & matrix)
131 {
132 typedef typename viennacl::result_of::value_type<MatrixType>::type ScalarType;
133
134 std::cout << "Reading matrix..." << std::endl;
135
136 std::ifstream file(filename.c_str());
137
138 if (!file) return false;
139
140 std::string id;
141 file >> id;
142 if (id != "Matrix") return false;
143
144
145 unsigned int num_rows, num_columns;
146 file >> num_rows >> num_columns;
147 if (num_rows != num_columns) return false;
148
149 viennacl::traits::resize(matrix, num_rows, num_rows);
150
151 my_inserter<MatrixType> ins(matrix);
152 for (unsigned int row = 0; row < num_rows; ++row)
153 {
154 int num_entries;
155 file >> num_entries;
156 for (int j = 0; j < num_entries; ++j)
157 {
158 unsigned int column;
159 ScalarType element;
160 file >> column >> element;
161
162 ins.apply(row, column, element);
163 //insert(matrix, row, column, element);
164 //note: the obvious 'matrix(row, column) = element;' does not work with Eigen, hence another level of indirection
165 }
166 //std::cout << "reading of row finished" << std::endl;
167 }
168
169 return true;
170 }
171
172
173 #endif
size.hpp
Generic size and resize functionality for different vector and matrix types.
tools.hpp
Various little tools used here and there in ViennaCL.
viennacl::result_of::value_type::type
T::value_type type
Definition: result_of.hpp:213
my_inserter::my_inserter
my_inserter(MatrixType &mat)
Definition: vector-io.hpp:48
viennacl::traits::size
vcl_size_t size(VectorType const &vec)
Generic routine for obtaining the size of a vector (ViennaCL, uBLAS, etc.)
Definition: size.hpp:239
insert
void insert(MatrixType &matrix, long row, long col, ScalarType value)
Definition: vector-io.hpp:31
viennacl::traits::resize
void resize(MatrixType &matrix, vcl_size_t rows, vcl_size_t cols)
Generic resize routine for resizing a matrix (ViennaCL, uBLAS, etc.) to a new size/dimension.
Definition: size.hpp:63
readMatrixFromFile
bool readMatrixFromFile(const std::string &filename, MatrixType &matrix)
Definition: vector-io.hpp:130
readVectorFromFile
bool readVectorFromFile(const std::string &filename, VectorType &vec)
Definition: vector-io.hpp:104
viennacl::row
vector_expression< const matrix_base< NumericT, F >, const unsigned int, op_row > row(const matrix_base< NumericT, F > &A, unsigned int i)
Definition: matrix.hpp:910
resize_vector
void resize_vector(VectorType &vec, unsigned int size)
Definition: vector-io.hpp:98
ScalarType
float ScalarType
Definition: fft_1d.cpp:42
my_inserter::apply
void apply(long row, long col, double value)
Definition: vector-io.hpp:50
my_inserter
Definition: vector-io.hpp:45
viennacl::column
vector_expression< const matrix_base< NumericT, F >, const unsigned int, op_column > column(const matrix_base< NumericT, F > &A, unsigned int j)
Definition: matrix.hpp:918
result_of.hpp
A collection of compile time type deductions.