1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "sparse.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int OtherStorage, typename SparseMatrixType> void sparse_permutations(const SparseMatrixType& ref)
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename SparseMatrixType::Index Index;
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Index rows = ref.rows();
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Index cols = ref.cols();
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename SparseMatrixType::Scalar Scalar;
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename SparseMatrixType::Index Index;
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef SparseMatrix<Scalar, OtherStorage, Index> OtherSparseMatrixType;
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Index,Dynamic,1> VectorI;
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  double density = (std::max)(8./(rows*cols), 0.01);
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  SparseMatrixType mat(rows, cols), up(rows,cols), lo(rows,cols);
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  OtherSparseMatrixType res;
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  DenseMatrix mat_d = DenseMatrix::Zero(rows, cols), up_sym_d, lo_sym_d, res_d;
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  initSparse<Scalar>(density, mat_d, mat, 0);
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  up = mat.template triangularView<Upper>();
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lo = mat.template triangularView<Lower>();
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  up_sym_d = mat_d.template selfadjointView<Upper>();
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lo_sym_d = mat_d.template selfadjointView<Lower>();
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(mat, mat_d);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(up, DenseMatrix(mat_d.template triangularView<Upper>()));
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(lo, DenseMatrix(mat_d.template triangularView<Lower>()));
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PermutationMatrix<Dynamic> p, p_null;
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VectorI pi;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  randomPermutationVector(pi, cols);
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  p.indices() = pi;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat*p;
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = mat_d*p;
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "mat*p");
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = p*mat;
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = p*mat_d;
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "p*mat");
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat*p.inverse();
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = mat*p.inverse();
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "mat*inv(p)");
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = p.inverse()*mat;
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = p.inverse()*mat_d;
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "inv(p)*mat");
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.twistedBy(p);
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = (p * mat_d) * p.inverse();
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "p*mat*inv(p)");
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.template selfadjointView<Upper>().twistedBy(p_null);
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = up_sym_d;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper to full");
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.template selfadjointView<Lower>().twistedBy(p_null);
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = lo_sym_d;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower to full");
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = up.template selfadjointView<Upper>().twistedBy(p_null);
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = up_sym_d;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "upper selfadjoint to full");
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = lo.template selfadjointView<Lower>().twistedBy(p_null);
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = lo_sym_d;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "lower selfadjoint full");
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.template selfadjointView<Upper>();
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = up_sym_d;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper to full");
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.template selfadjointView<Lower>();
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = lo_sym_d;
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower to full");
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = up.template selfadjointView<Upper>();
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = up_sym_d;
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "upper selfadjoint to full");
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = lo.template selfadjointView<Lower>();
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = lo_sym_d;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "lower selfadjoint full");
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Upper>() = mat.template selfadjointView<Upper>();
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = up_sym_d.template triangularView<Upper>();
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper to upper");
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Lower>() = mat.template selfadjointView<Upper>();
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = up_sym_d.template triangularView<Lower>();
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper to lower");
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Upper>() = mat.template selfadjointView<Lower>();
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = lo_sym_d.template triangularView<Upper>();
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower to upper");
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Lower>() = mat.template selfadjointView<Lower>();
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = lo_sym_d.template triangularView<Lower>();
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower to lower");
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Upper>() = mat.template selfadjointView<Upper>().twistedBy(p);
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Upper>();
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to upper");
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Upper>() = mat.template selfadjointView<Lower>().twistedBy(p);
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Upper>();
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to upper");
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Lower>() = mat.template selfadjointView<Lower>().twistedBy(p);
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Lower>();
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to lower");
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Lower>() = mat.template selfadjointView<Upper>().twistedBy(p);
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Lower>();
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to lower");
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Upper>() = up.template selfadjointView<Upper>().twistedBy(p);
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Upper>();
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to upper");
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Upper>() = lo.template selfadjointView<Lower>().twistedBy(p);
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Upper>();
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to upper");
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Lower>() = lo.template selfadjointView<Lower>().twistedBy(p);
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * lo_sym_d) * p.inverse()).eval().template triangularView<Lower>();
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to lower");
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res.template selfadjointView<Lower>() = up.template selfadjointView<Upper>().twistedBy(p);
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = ((p * up_sym_d) * p.inverse()).eval().template triangularView<Lower>();
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to lower");
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.template selfadjointView<Upper>().twistedBy(p);
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = (p * up_sym_d) * p.inverse();
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint upper twisted to full");
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = mat.template selfadjointView<Lower>().twistedBy(p);
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = (p * lo_sym_d) * p.inverse();
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "full selfadjoint lower twisted to full");
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = up.template selfadjointView<Upper>().twistedBy(p);
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = (p * up_sym_d) * p.inverse();
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "upper selfadjoint twisted to full");
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res = lo.template selfadjointView<Lower>().twistedBy(p);
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  res_d = (p * lo_sym_d) * p.inverse();
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(res.isApprox(res_d) && "lower selfadjoint twisted to full");
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> void sparse_permutations_all(int size)
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(( sparse_permutations<ColMajor>(SparseMatrix<Scalar, ColMajor>(size,size)) ));
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(( sparse_permutations<ColMajor>(SparseMatrix<Scalar, RowMajor>(size,size)) ));
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(( sparse_permutations<RowMajor>(SparseMatrix<Scalar, ColMajor>(size,size)) ));
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST(( sparse_permutations<RowMajor>(SparseMatrix<Scalar, RowMajor>(size,size)) ));
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_sparse_permutations()
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < g_repeat; i++) {
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    int s = Eigen::internal::random<int>(1,50);
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1((  sparse_permutations_all<double>(s) ));
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2((  sparse_permutations_all<std::complex<double> >(s) ));
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
188