MyraMath
SparseMatrixBuilder.h
Go to the documentation of this file.
1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
6 #ifndef MYRAMATH_SPARSE_SPARSEMATRIXBUILDER_H
7 #define MYRAMATH_SPARSE_SPARSEMATRIXBUILDER_H
8 
15 #include <myramath/MYRAMATH_EXPORT.h>
17 
18 #include <vector>
19 #include <map>
20 #include <iosfwd>
21 
22 namespace myra {
23 
24 // Forward declarations.
25 class Pattern;
26 class PatternRange;
27 class InputStream;
28 class OutputStream;
29 template<class Number> class SparseMatrix;
30 template<class Number> class CSparseMatrixRange;
31 template<class Number> class Matrix;
32 
34 template<class Number> class MYRAMATH_EXPORT SparseMatrixTriplet
35  {
36  public:
37 
38  // Data members, all public.
39  int i;
40  int j;
41  Number value;
42 
43  // Constructs from (i,j,value) arguments.
44  SparseMatrixTriplet(int ii, int jj, Number vv)
45  : i(ii), j(jj), value(vv) { }
46 
47  // Constructs from (i,j) and zero-initializes value.
48  SparseMatrixTriplet(int ii, int jj)
49  : i(ii), j(jj), value(0) { }
50 
51  // Default constructs, i = j = value = 0.
53  : i(0), j(0), value(0) { }
54 
55  };
56 
58 template<class Number> class MYRAMATH_EXPORT SparseMatrixBuilder
59  {
60  public:
61 
62  // Useful typedefs.
63  typedef SparseMatrixTriplet<Number> Triplet;
64  typedef std::vector<Triplet> Triplets;
65  typedef const Triplet* Iterator;
66 
67  // ------------------------------------ Construction, serialization, value semantics.
68 
70  SparseMatrixBuilder();
71 
73  explicit SparseMatrixBuilder(int in_I, int in_J);
74  explicit SparseMatrixBuilder(std::pair<int,int> in_IJ);
75 
77  SparseMatrixBuilder(const SparseMatrixBuilder& that);
78 
80  void swap(SparseMatrixBuilder& that);
81 
82 #ifdef MYRAMATH_ENABLE_CPP11
83  SparseMatrixBuilder(SparseMatrixBuilder&& that);
85 #endif
86 
88  SparseMatrixBuilder& operator = (SparseMatrixBuilder that);
89 
91  SparseMatrixBuilder& operator = (const CSparseMatrixRange<Number>& that);
92 
94  explicit SparseMatrixBuilder(const CSparseMatrixRange<Number>& that);
95 
97  explicit SparseMatrixBuilder(InputStream& in);
98 
100  void write(OutputStream& out) const;
101 
103  ~SparseMatrixBuilder();
104 
105  // ------------------------------------ Iterators.
106 
108  Iterator begin() const;
109  Iterator end() const;
110 
112  std::pair<int,int> size() const;
113 
114  // ------------------------------------ Manipulating numeric contents.
115 
117  Number& operator () (int i, int j);
118 
119  // Erases a single structural nonzero. Note this is *exceedingly* slow, linear complexity.
120  void erase(int i, int j);
121 
123  void operator += (const SparseMatrixBuilder& that);
124  void operator += (const CSparseMatrixRange<Number>& that);
125 
127  void operator -= (const SparseMatrixBuilder& that);
128  void operator -= (const CSparseMatrixRange<Number>& that);
129 
131  void operator *= (Number alpha);
132 
134  void operator /= (Number alpha);
135 
136  // ------------------------------------ Static generators.
137 
139  static SparseMatrixBuilder<Number> identity(int IJ);
140 
142  static SparseMatrixBuilder<Number> random(int I, int J, int N);
143 
145  static SparseMatrixBuilder<Number> random(const PatternRange& P);
146 
148  Pattern make_Pattern() const;
149 
151  SparseMatrix<Number> make_SparseMatrix() const;
152 
154  Matrix<Number> make_Matrix() const;
155 
156  private:
157 
158  // Throws if IJ is not the same size as *this.
159  void check_size(const std::pair<int,int>& IJ) const;
160 
161  // Holds size.
162  int I;
163  int J;
164 
165  // Internal contents.
166  Triplets triplets;
167 
168  // Compresses triplets into CSC-compatible order.
169  void compress();
170 
171  };
172 
174 template<class Number> class ReflectNumber< SparseMatrixTriplet<Number> >
175  { public: typedef Number type; };
176 
178 template<class Number> class ReflectNumber< SparseMatrixBuilder<Number> >
179  { public: typedef Number type; };
180 
182 MYRAMATH_EXPORT SparseMatrixBuilder<NumberS> operator + (const SparseMatrixBuilder<NumberS>& A, const SparseMatrixBuilder<NumberS>& B);
183 MYRAMATH_EXPORT SparseMatrixBuilder<NumberD> operator + (const SparseMatrixBuilder<NumberD>& A, const SparseMatrixBuilder<NumberD>& B);
184 MYRAMATH_EXPORT SparseMatrixBuilder<NumberC> operator + (const SparseMatrixBuilder<NumberC>& A, const SparseMatrixBuilder<NumberC>& B);
185 MYRAMATH_EXPORT SparseMatrixBuilder<NumberZ> operator + (const SparseMatrixBuilder<NumberZ>& A, const SparseMatrixBuilder<NumberZ>& B);
186 
188 MYRAMATH_EXPORT SparseMatrixBuilder<NumberS> operator - (const SparseMatrixBuilder<NumberS>& A, const SparseMatrixBuilder<NumberS>& B);
189 MYRAMATH_EXPORT SparseMatrixBuilder<NumberD> operator - (const SparseMatrixBuilder<NumberD>& A, const SparseMatrixBuilder<NumberD>& B);
190 MYRAMATH_EXPORT SparseMatrixBuilder<NumberC> operator - (const SparseMatrixBuilder<NumberC>& A, const SparseMatrixBuilder<NumberC>& B);
191 MYRAMATH_EXPORT SparseMatrixBuilder<NumberZ> operator - (const SparseMatrixBuilder<NumberZ>& A, const SparseMatrixBuilder<NumberZ>& B);
192 
194 MYRAMATH_EXPORT SparseMatrixBuilder<NumberS> operator * (const SparseMatrixBuilder<NumberS>& A, NumberS alpha);
195 MYRAMATH_EXPORT SparseMatrixBuilder<NumberD> operator * (const SparseMatrixBuilder<NumberD>& A, NumberD alpha);
196 MYRAMATH_EXPORT SparseMatrixBuilder<NumberC> operator * (const SparseMatrixBuilder<NumberC>& A, NumberC alpha);
197 MYRAMATH_EXPORT SparseMatrixBuilder<NumberZ> operator * (const SparseMatrixBuilder<NumberZ>& A, NumberZ alpha);
198 
200 MYRAMATH_EXPORT SparseMatrixBuilder<NumberS> operator * (NumberS alpha, const SparseMatrixBuilder<NumberS>& A);
201 MYRAMATH_EXPORT SparseMatrixBuilder<NumberD> operator * (NumberD alpha, const SparseMatrixBuilder<NumberD>& A);
202 MYRAMATH_EXPORT SparseMatrixBuilder<NumberC> operator * (NumberC alpha, const SparseMatrixBuilder<NumberC>& A);
203 MYRAMATH_EXPORT SparseMatrixBuilder<NumberZ> operator * (NumberZ alpha, const SparseMatrixBuilder<NumberZ>& A);
204 
206 MYRAMATH_EXPORT std::ostream& operator << (std::ostream& out, const SparseMatrixBuilder<NumberS>& A);
207 MYRAMATH_EXPORT std::ostream& operator << (std::ostream& out, const SparseMatrixBuilder<NumberD>& A);
208 MYRAMATH_EXPORT std::ostream& operator << (std::ostream& out, const SparseMatrixBuilder<NumberC>& A);
209 MYRAMATH_EXPORT std::ostream& operator << (std::ostream& out, const SparseMatrixBuilder<NumberZ>& A);
210 
211 } // namespace
212 
213 #endif
Number random()
Generate random real/complex Numbers, uniformly distributed over [-1,1].
Reflects Number trait for a Container, containers of Numbers (Matrix&#39;s, Vector&#39;s, etc) should special...
Definition: Number.h:55
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
Definition: syntax.dox:1
Represents an immutable view of a Pattern.
Definition: PatternRange.h:31
Abstraction layer, serializable objects write themselves to these.
Definition: Streams.h:39
Value type of SparseMatrixBuilder, a triplet of (i,j,value)
Definition: SparseMatrixBuilder.h:34
Various utility functions/classes related to scalar Number types.
Abstraction layer, deserializable objects read themselves from these.
Definition: Streams.h:47
Represents a const SparseMatrixRange.
Definition: bothcat.h:24
Holds the nonzero pattern of a sparse matrix.
Definition: Pattern.h:55
Convenience type for building SparseMatrix&#39;s, uses coordinate/triplet format.
Definition: SparseMatrix.h:32
Stores an IxJ matrix A in compressed sparse column format.
Definition: bothcat.h:23
float NumberS
Useful typedefs.
Definition: Number.h:21