MyraMath
Permutation.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_PERMUTATION_H
7 #define MYRAMATH_SPARSE_PERMUTATION_H
8 
14 #include <myramath/utility/detail/LIBPUBLIC.h>
15 
17 
18 #include <vector>
19 #include <iosfwd>
20 
21 namespace myra {
22 
23 // Forward declarations.
24 class Permutation;
25 class InputStream;
26 class OutputStream;
27 class intCRange;
28 class intRange;
29 template<class Number> class VectorRange;
30 template<class Number> class MatrixRange;
31 template<class Number> class SparseMatrix;
32 
34 class LIBPUBLIC Permutation
35  {
36  public:
37 
38  // ------------------------------------ Construction, serialization, value semantics.
39 
41  Permutation();
42 
43 
44  // Tags for upcoming constructors. Since all of these inputs are the same type (range of int), specify which is intended by using a Tag.
45  class permTag{};
46  class ipermTag{};
47  class swapsTag{};
48 
50  explicit Permutation(const intCRange& perm, const permTag&);
52  explicit Permutation(const intCRange& iperm, const ipermTag&);
53  explicit Permutation(const intCRange& swaps, const swapsTag&);
55 
57  Permutation(const Permutation& that);
58 
60  void swap(Permutation& that);
61 
62 #ifdef MYRAMATH_ENABLE_CPP11
63  Permutation(Permutation&& that);
65 #endif
66 
68  Permutation& operator= (Permutation that);
69 
71  explicit Permutation(InputStream& in);
72 
74  void write(OutputStream& out) const;
75 
77  ~Permutation();
78 
79  // ------------------------------------ Presentation API.
80 
82  int size() const;
83 
85  const intCRange perm() const;
87  int perm(int n) const;
89 
91  const intCRange iperm() const;
93  int iperm(int n) const;
95 
97  const intCRange swaps() const;
99  int swaps(int n) const;
101 
103  template<class Number> SparseMatrix<Number> make_SparseMatrix() const;
104 
106  void verify() const;
107 
108  // ------------------------------------ Static generators.
109 
111  static Permutation identity(int N);
112 
114  static Permutation random(int N);
115 
117  static Permutation from_perm(const intCRange& perm);
119  static Permutation from_iperm(const intCRange& iperm);
120  static Permutation from_swaps(const intCRange& swaps);
122 
123  private:
124 
125  // Internal contents.
126  int N;
127  std::vector<int> contents;
128 
129  // Mutable ranges, used internally.
130  const intRange perm();
131  const intRange iperm();
132  const intRange swaps();
133 
134  };
135 
137 std::ostream& operator << (std::ostream& out, const Permutation& P);
138 
139 // Specializations of Permutation::make_SparseMatrix()
140 template<> LIBPUBLIC SparseMatrix<NumberS> Permutation::make_SparseMatrix<NumberS>() const;
141 template<> LIBPUBLIC SparseMatrix<NumberD> Permutation::make_SparseMatrix<NumberD>() const;
142 template<> LIBPUBLIC SparseMatrix<NumberC> Permutation::make_SparseMatrix<NumberC>() const;
143 template<> LIBPUBLIC SparseMatrix<NumberZ> Permutation::make_SparseMatrix<NumberZ>() const;
144 
146 // Rarely needed, note P can present/apply it's own inverse already.
147 LIBPUBLIC Permutation inverse(const Permutation& P);
148 
150 LIBPUBLIC void gemm_inplace(const Permutation& P, char op, const MatrixRange<NumberS>& X);
151 LIBPUBLIC void gemm_inplace(const Permutation& P, char op, const MatrixRange<NumberD>& X);
152 LIBPUBLIC void gemm_inplace(const Permutation& P, char op, const MatrixRange<NumberC>& X);
153 LIBPUBLIC void gemm_inplace(const Permutation& P, char op, const MatrixRange<NumberZ>& X);
154 
156 LIBPUBLIC void gemm_inplace(const Permutation& P, const MatrixRange<NumberS>& X);
157 LIBPUBLIC void gemm_inplace(const Permutation& P, const MatrixRange<NumberD>& X);
158 LIBPUBLIC void gemm_inplace(const Permutation& P, const MatrixRange<NumberC>& X);
159 LIBPUBLIC void gemm_inplace(const Permutation& P, const MatrixRange<NumberZ>& X);
160 
162 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberS>& X, const Permutation& P, char op);
163 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberD>& X, const Permutation& P, char op);
164 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberC>& X, const Permutation& P, char op);
165 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberZ>& X, const Permutation& P, char op);
166 
168 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberS>& X, const Permutation& P);
169 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberD>& X, const Permutation& P);
170 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberC>& X, const Permutation& P);
171 LIBPUBLIC void gemm_inplace(const MatrixRange<NumberZ>& X, const Permutation& P);
172 
174 LIBPUBLIC void gemv_inplace(const Permutation& P, char op, const VectorRange<NumberS>& x);
175 LIBPUBLIC void gemv_inplace(const Permutation& P, char op, const VectorRange<NumberD>& x);
176 LIBPUBLIC void gemv_inplace(const Permutation& P, char op, const VectorRange<NumberC>& x);
177 LIBPUBLIC void gemv_inplace(const Permutation& P, char op, const VectorRange<NumberZ>& x);
178 
180 LIBPUBLIC void gemv_inplace(const Permutation& P, const VectorRange<NumberS>& x);
181 LIBPUBLIC void gemv_inplace(const Permutation& P, const VectorRange<NumberD>& x);
182 LIBPUBLIC void gemv_inplace(const Permutation& P, const VectorRange<NumberC>& x);
183 LIBPUBLIC void gemv_inplace(const Permutation& P, const VectorRange<NumberZ>& x);
184 
186 LIBPUBLIC Permutation multiply (const Permutation& P, const Permutation& Q);
187 LIBPUBLIC Permutation operator* (const Permutation& P, const Permutation& Q);
188 
189 } // namespace myra
190 
191 #endif
Number random()
Generate random real/complex Numbers, uniformly distributed over [-1,1].
Represents a Permutation matrix, used to reorder rows/columns/etc of various numeric containers...
Definition: Permutation.h:34
Represents a mutable VectorRange.
Definition: axpy.h:21
Definition: syntax.dox:1
Abstraction layer, serializable objects write themselves to these.
Definition: Streams.h:39
Represents a mutable intRange.
Definition: intRange.h:33
Definition: Permutation.h:47
Various utility functions/classes related to scalar Number types.
Represents a mutable MatrixRange.
Definition: conjugate.h:26
Abstraction layer, deserializable objects read themselves from these.
Definition: Streams.h:47
Definition: Permutation.h:46
Definition: Permutation.h:45
Stores an IxJ matrix A in compressed sparse column format.
Definition: bothcat.h:23
Represents a const intRange.
Definition: intRange.h:142