26 typedef typename SparseMatrixType::StorageIndex StorageIndex;
31 const Index inner = ref.innerSize();
32 const Index outer = ref.outerSize();
36 enum {
Flags = SparseMatrixType::Flags };
44 Scalar s1 = internal::random<Scalar>();
50 std::vector<Vector2> zeroCoords;
51 std::vector<Vector2> nonzeroCoords;
52 initSparse<Scalar>(
density, refMat,
m, 0, &zeroCoords, &nonzeroCoords);
55 for (std::size_t
i = 0;
i < zeroCoords.size(); ++
i) {
62 if (!nonzeroCoords.empty()) {
63 m.coeffRef(nonzeroCoords[0].
x(), nonzeroCoords[0].
y()) =
Scalar(5);
79 bool call_reserve = internal::random<int>() % 2;
80 Index nnz = internal::random<int>(1,
int(
rows) / 2);
82 if (internal::random<int>() % 2)
83 m2.reserve(VectorXi::Constant(
m2.outerSize(),
int(nnz)));
85 m2.reserve(
m2.outerSize() * nnz);
90 Index i = internal::random<Index>(0,
rows - 1);
92 Scalar v = internal::random<Scalar>();
100 if (call_reserve && !SparseMatrixType::IsRowMajor) {
112 if (internal::random<int>() % 2)
m2.reserve(VectorXi::Constant(
m2.outerSize(), 2));
114 Index i = internal::random<Index>(0,
rows - 1);
115 Index j = internal::random<Index>(0,
cols - 1);
116 if ((
m1.coeff(
i,
j) ==
Scalar(0)) && (internal::random<int>() % 2)) {
117 Scalar v = internal::random<Scalar>();
122 Scalar v = internal::random<Scalar>();
125 m2.coeffRef(
i,
j) =
v;
132 for (
int mode = 0; mode < 4; ++mode) {
136 VectorXi
r(VectorXi::Constant(
m2.outerSize(),
137 ((mode % 2) == 0) ?
int(
m2.innerSize()) : std::max<int>(1,
int(
m2.innerSize()) / 8)));
140 Index i = internal::random<Index>(0,
rows - 1);
141 Index j = internal::random<Index>(0,
cols - 1);
143 Scalar v = internal::random<Scalar>();
148 if (mode == 3)
m2.reserve(
r);
150 if (internal::random<int>() % 2)
m2.makeCompressed();
156 for (
int mode = 0; mode < 4; mode++) {
161 for (
Index j = 0; j < outer; j++) reserveSizes(j) = internal::random<Index>(1, inner - 1);
162 m2.reserve(reserveSizes);
164 Index i = internal::random<Index>(0, inner - 1);
166 m1.coeffRefByOuterInner(
j,
i) =
val;
167 m2.insertByOuterInner(
j,
i) =
val;
169 if (mode % 2 == 0)
m2.makeCompressed();
172 Index num = internal::random<Index>(0, outer - 1);
173 Index start = internal::random<Index>(0, outer - num);
175 Index newRows = SparseMatrixType::IsRowMajor ?
rows - num :
rows;
176 Index newCols = SparseMatrixType::IsRowMajor ?
cols :
cols - num;
178 CompatibleDenseMatrix m3(newRows, newCols);
181 if (SparseMatrixType::IsRowMajor) {
183 m3.bottomRows(newRows -
start) =
m1.bottomRows(newRows -
start);
186 m3.rightCols(newCols -
start) =
m1.rightCols(newCols -
start);
189 SparseMatrixType m4 =
m2;
190 m4.removeOuterVectors(
start, num);
194 Index num = internal::random<Index>(0, outer - 1);
195 Index start = internal::random<Index>(0, outer - 1);
197 Index newRows = SparseMatrixType::IsRowMajor ?
rows + num :
rows;
198 Index newCols = SparseMatrixType::IsRowMajor ?
cols :
cols + num;
200 CompatibleDenseMatrix m3(newRows, newCols);
203 if (SparseMatrixType::IsRowMajor) {
205 m3.middleRows(
start, num).setZero();
209 m3.middleCols(
start, num).setZero();
213 SparseMatrixType m4 =
m2;
214 m4.insertEmptyOuterVectors(
start, num);
223 bool StorageOrdersMatch =
int(DenseMatrix::IsRowMajor) ==
int(SparseMatrixType::IsRowMajor);
229 innerIndices.setLinSpaced(inner, 0, inner - 1);
230 std::random_device rd;
231 std::mt19937 g(rd());
233 std::shuffle(innerIndices.begin(), innerIndices.end(), g);
234 Index nzj = internal::random<Index>(2, inner / 2);
238 m1.coeffRefByOuterInner(StorageOrdersMatch ?
j :
i, StorageOrdersMatch ?
i :
j) =
val;
239 m2.insertByOuterInner(
j,
i) =
val;
245 m2.template sortInnerIndices<std::greater<>>();
253 m2.template sortInnerIndices<std::less<>>();
263 m2.template sortInnerIndices<std::greater<>>();
271 m2.template sortInnerIndices<std::less<>>();
292 initSparse<Scalar>(
density, refM3, m3);
293 initSparse<Scalar>(
density, refM4, m4);
295 if (internal::random<bool>())
m1.makeCompressed();
307 if (SparseMatrixType::IsRowMajor)
308 VERIFY_IS_APPROX(
m1.innerVector(0).dot(refM2.row(0)), refM1.row(0).dot(refM2.row(0)));
310 VERIFY_IS_APPROX(
m1.innerVector(0).dot(refM2.col(0)), refM1.col(0).dot(refM2.col(0)));
314 Index r = internal::random<Index>(0,
m1.rows() - 2);
315 Index c = internal::random<Index>(0,
m1.cols() - 1);
340 RealScalar(0.5) * refM4 + refM3.cwiseProduct(refM3));
435 if (
m1.isCompressed()) {
439 for (
typename SparseMatrixType::InnerIterator it(
m1,
j); it; ++it) refM1(it.row(), it.col()) += s1;
446 SpBool mb1 =
m1.real().template cast<bool>();
447 SpBool mb2 =
m2.real().template cast<bool>();
448 VERIFY_IS_EQUAL(mb1.template cast<int>().sum(), refM1.real().template cast<bool>().count());
450 (refM1.real().template cast<bool>() && refM2.real().template cast<bool>()).count());
452 (refM1.real().template cast<bool>() || refM2.real().template cast<bool>()).count());
453 SpBool mb3 = mb1 && mb2;
454 if (mb1.coeffs().all() && mb2.coeffs().all()) {
456 (refM1.real().template cast<bool>() && refM2.real().template cast<bool>()).count());
465 initSparse<Scalar>(
density, refMat2,
m2);
466 std::vector<Scalar> ref_value(
m2.innerSize());
467 std::vector<Index> ref_index(
m2.innerSize());
468 if (internal::random<bool>())
m2.makeCompressed();
470 Index count_forward = 0;
472 for (
typename SparseMatrixType::InnerIterator it(
m2,
j); it; ++it) {
473 ref_value[ref_value.size() - 1 - count_forward] = it.value();
474 ref_index[ref_index.size() - 1 - count_forward] = it.index();
477 Index count_reverse = 0;
478 for (
typename SparseMatrixType::ReverseInnerIterator it(
m2,
j); it; --it) {
481 VERIFY_IS_EQUAL(ref_index[ref_index.size() - count_forward + count_reverse], it.index());
492 initSparse<Scalar>(
density, refMat2,
m2);
508 int countFalseNonZero = 0;
509 int countTrueNonZero = 0;
510 m2.reserve(VectorXi::Constant(
m2.outerSize(),
int(
m2.innerSize())));
513 float x = internal::random<float>(0, 1);
516 }
else if (
x < 0.5f) {
526 if (internal::random<bool>())
m2.makeCompressed();
527 VERIFY(countFalseNonZero + countTrueNonZero ==
m2.nonZeros());
530 VERIFY(countTrueNonZero ==
m2.nonZeros());
539 std::vector<TripletType> triplets;
541 triplets.reserve(ntriplets);
546 for (
Index i = 0;
i < ntriplets; ++
i) {
547 StorageIndex
r = internal::random<StorageIndex>(0, StorageIndex(
rows - 1));
548 StorageIndex
c = internal::random<StorageIndex>(0, StorageIndex(
cols - 1));
549 Scalar v = internal::random<Scalar>();
550 triplets.push_back(TripletType(
r,
c,
v));
551 refMat_sum(
r,
c) +=
v;
553 refMat_prod(
r,
c) =
v;
555 refMat_prod(
r,
c) *=
v;
556 refMat_last(
r,
c) =
v;
559 std::vector<TripletType> moreTriplets;
560 moreTriplets.reserve(ntriplets);
565 for (
Index i = 0;
i < ntriplets; ++
i) {
566 StorageIndex
r = internal::random<StorageIndex>(0, StorageIndex(
rows - 1));
567 StorageIndex
c = internal::random<StorageIndex>(0, StorageIndex(
cols - 1));
568 Scalar v = internal::random<Scalar>();
569 moreTriplets.push_back(TripletType(
r,
c,
v));
570 refMat_sum_more(
r,
c) +=
v;
572 refMat_prod_more(
r,
c) =
v;
574 refMat_prod_more(
r,
c) *=
v;
575 refMat_last_more(
r,
c) =
v;
582 m.setFromTriplets(triplets.begin(), triplets.end());
586 m.insertFromTriplets(moreTriplets.begin(), moreTriplets.end());
590 m.setFromTriplets(triplets.begin(), triplets.end(), std::multiplies<Scalar>());
594 m.insertFromTriplets(moreTriplets.begin(), moreTriplets.end(), std::multiplies<Scalar>());
598 m.setFromTriplets(triplets.begin(), triplets.end(), [](
Scalar,
Scalar b) { return b; });
601 m.setFromTriplets(triplets.begin(), triplets.end(), [](
Scalar,
Scalar b) { return b; });
603 m.insertFromTriplets(moreTriplets.begin(), moreTriplets.end(), [](
Scalar,
Scalar b) { return b; });
609 VectorXi reserveSizes(
m.outerSize());
610 for (
Index i = 0;
i <
m.outerSize();
i++) reserveSizes[
i] = internal::random<int>(1, 7);
612 m.setFromTriplets(triplets.begin(), triplets.end());
613 m.reserve(reserveSizes);
615 m.insertFromTriplets(moreTriplets.begin(), moreTriplets.end());
619 m.setFromTriplets(triplets.begin(), triplets.end(), std::multiplies<Scalar>());
620 m.reserve(reserveSizes);
622 m.insertFromTriplets(moreTriplets.begin(), moreTriplets.end(), std::multiplies<Scalar>());
626 m.setFromTriplets(triplets.begin(), triplets.end(), [](
Scalar,
Scalar b) { return b; });
627 m.reserve(reserveSizes);
629 m.insertFromTriplets(moreTriplets.begin(), moreTriplets.end(), [](
Scalar,
Scalar b) { return b; });
635 struct triplet_comp {
636 inline bool operator()(
const TripletType&
a,
const TripletType&
b) {
637 return SparseMatrixType::IsRowMajor ? ((
a.row() !=
b.row()) ? (
a.row() <
b.row()) : (
a.col() <
b.col()))
646 std::stable_sort(triplets.begin(), triplets.end(), triplet_comp());
647 std::stable_sort(moreTriplets.begin(), moreTriplets.end(), triplet_comp());
649 m.setFromSortedTriplets(triplets.begin(), triplets.end());
653 m.insertFromSortedTriplets(moreTriplets.begin(), moreTriplets.end());
657 m.setFromSortedTriplets(triplets.begin(), triplets.end(), std::multiplies<Scalar>());
661 m.insertFromSortedTriplets(moreTriplets.begin(), moreTriplets.end(), std::multiplies<Scalar>());
665 m.setFromSortedTriplets(triplets.begin(), triplets.end(), [](
Scalar,
Scalar b) { return b; });
669 m.insertFromSortedTriplets(moreTriplets.begin(), moreTriplets.end(), [](
Scalar,
Scalar b) { return b; });
675 m.setFromSortedTriplets(triplets.begin(), triplets.end());
676 m.reserve(reserveSizes);
678 m.insertFromSortedTriplets(moreTriplets.begin(), moreTriplets.end());
682 m.setFromSortedTriplets(triplets.begin(), triplets.end(), std::multiplies<Scalar>());
683 m.reserve(reserveSizes);
685 m.insertFromSortedTriplets(moreTriplets.begin(), moreTriplets.end(), std::multiplies<Scalar>());
689 m.setFromSortedTriplets(triplets.begin(), triplets.end(), [](
Scalar,
Scalar b) { return b; });
690 m.reserve(reserveSizes);
692 m.insertFromSortedTriplets(moreTriplets.begin(), moreTriplets.end(), [](
Scalar,
Scalar b) { return b; });
701 initSparse<Scalar>(
density, refMat2,
m2);
702 initSparse<Scalar>(
density, refMat3, m3);
705 m2.valuePtr(),
m2.innerNonZeroPtr());
706 Map<SparseMatrixType> mapMat3(m3.rows(), m3.cols(), m3.nonZeros(), m3.outerIndexPtr(), m3.innerIndexPtr(),
707 m3.valuePtr(), m3.innerNonZeroPtr());
712 Index i = internal::random<Index>(0,
rows - 1);
713 Index j = internal::random<Index>(0,
cols - 1);
714 m2.coeffRef(
i,
j) = 123;
715 if (internal::random<bool>())
m2.makeCompressed();
717 m2.innerNonZeroPtr());
720 mapMat2.coeffRef(
i,
j) = -123;
728 initSparse<Scalar>(
density, refMat2,
m2);
729 refMat3 = refMat2.template triangularView<Lower>();
730 m3 =
m2.template triangularView<Lower>();
733 refMat3 = refMat2.template triangularView<Upper>();
734 m3 =
m2.template triangularView<Upper>();
738 refMat3 = refMat2.template triangularView<UnitUpper>();
739 m3 =
m2.template triangularView<UnitUpper>();
742 refMat3 = refMat2.template triangularView<UnitLower>();
743 m3 =
m2.template triangularView<UnitLower>();
747 refMat3 = refMat2.template triangularView<StrictlyUpper>();
748 m3 =
m2.template triangularView<StrictlyUpper>();
751 refMat3 = refMat2.template triangularView<StrictlyLower>();
752 m3 =
m2.template triangularView<StrictlyLower>();
756 refMat3 =
m2.template triangularView<StrictlyUpper>();
766 if (!SparseMatrixType::IsRowMajor) {
769 initSparse<Scalar>(
density, refMat2,
m2);
770 refMat3 = refMat2.template selfadjointView<Lower>();
771 m3 =
m2.template selfadjointView<Lower>();
774 refMat3 += refMat2.template selfadjointView<Lower>();
775 m3 +=
m2.template selfadjointView<Lower>();
778 refMat3 -= refMat2.template selfadjointView<Lower>();
779 m3 -=
m2.template selfadjointView<Lower>();
783 SparseMatrixType m4(
rows,
rows + 1);
792 initSparse<Scalar>(
density, refMat2,
m2);
806 initSparse<Scalar>(
density, refMat2,
m2);
810 d =
m2.diagonal().array();
815 m2.diagonal() += refMat2.diagonal();
816 refMat2.diagonal() += refMat2.diagonal();
827 SparseMatrixType m3(d.asDiagonal());
829 refMat2 += d.asDiagonal();
830 m2 += d.asDiagonal();
833 m2 += d.asDiagonal();
835 refMat2 += d.asDiagonal();
838 m2 -= d.asDiagonal();
840 refMat2 -= d.asDiagonal();
843 initSparse<Scalar>(
density, refMat2,
m2);
845 m2 += d.asDiagonal();
846 refMat2 += d.asDiagonal();
849 initSparse<Scalar>(
density, refMat2,
m2);
852 for (
Index i = 0; i < rows; ++i) res(i) = internal::random<int>(0, 3);
854 m2 -= d.asDiagonal();
855 refMat2 -= d.asDiagonal();
861 std::vector<std::pair<StorageIndex, StorageIndex>> inc;
862 if (
rows > 3 &&
cols > 2) inc.push_back(std::pair<StorageIndex, StorageIndex>(-3, -2));
863 inc.push_back(std::pair<StorageIndex, StorageIndex>(0, 0));
864 inc.push_back(std::pair<StorageIndex, StorageIndex>(3, 2));
865 inc.push_back(std::pair<StorageIndex, StorageIndex>(3, 0));
866 inc.push_back(std::pair<StorageIndex, StorageIndex>(0, 3));
867 inc.push_back(std::pair<StorageIndex, StorageIndex>(0, -1));
868 inc.push_back(std::pair<StorageIndex, StorageIndex>(-1, 0));
869 inc.push_back(std::pair<StorageIndex, StorageIndex>(-1, -1));
871 for (
size_t i = 0;
i < inc.size();
i++) {
872 StorageIndex incRows = inc[
i].first;
873 StorageIndex incCols = inc[
i].second;
876 initSparse<Scalar>(
density, refMat1,
m1);
878 SparseMatrixType
m2 =
m1;
881 m1.conservativeResize(
rows + incRows,
cols + incCols);
882 m2.conservativeResize(
rows + incRows,
cols + incCols);
884 if (incRows > 0) refMat1.bottomRows(incRows).
setZero();
885 if (incCols > 0) refMat1.rightCols(incCols).
setZero();
891 if (incRows > 0)
m1.insert(
m1.rows() - 1, 0) = refMat1(refMat1.
rows() - 1, 0) = 1;
892 if (incCols > 0)
m1.insert(0,
m1.cols() - 1) = refMat1(0, refMat1.
cols() - 1) = 1;
905 Index i = internal::random<Index>(0,
rows - 1);
906 Index j = internal::random<Index>(0,
rows - 1);
907 Scalar v = internal::random<Scalar>();
908 m1.coeffRef(
i,
j) =
v;
911 if (internal::random<Index>(0, 10) < 2)
m1.makeCompressed();
914 refMat1.setIdentity();
920 typedef typename SparseMatrixType::InnerIterator IteratorType;
924 initSparse<Scalar>(
density, refMat2,
m2);
925 IteratorType static_array[2];
926 static_array[0] = IteratorType(
m2, 0);
927 static_array[1] = IteratorType(
m2,
m2.outerSize() - 1);
928 VERIFY(static_array[0] ||
m2.innerVector(static_array[0].outer()).nonZeros() == 0);
929 VERIFY(static_array[1] ||
m2.innerVector(static_array[1].outer()).nonZeros() == 0);
930 if (static_array[0] && static_array[1]) {
932 static_array[1] = IteratorType(
m2, 0);
934 VERIFY(static_array[1].index() == static_array[0].index());
935 VERIFY(static_array[1].outer() == static_array[0].outer());
939 std::vector<IteratorType> iters(2);
940 iters[0] = IteratorType(
m2, 0);
941 iters[1] = IteratorType(
m2,
m2.outerSize() - 1);
946 SparseMatrixType
m1(0,
cols);
947 m1.reserve(ArrayXi::Constant(
m1.outerSize(), 1));
948 SparseMatrixType
m2(
rows, 0);
949 m2.reserve(ArrayXi::Constant(
m2.outerSize(), 1));
955 typename SparseMatrixType::StorageIndex>;
958 initSparse<Scalar>(
density, refMat1,
m1);
960 SparseMatrixType
m2(std::move(
m1));
966 TransposedType m3(std::move(
m1.transpose()));
969 m2 = std::move(m3.transpose());
Matrix< Scalar, Dynamic, Dynamic > DenseMatrix
Definition: BenchSparseUtil.h:23
Matrix< Scalar, Dynamic, 1 > DenseVector
Definition: BenchSparseUtil.h:24
Array< double, 1, 3 > e(1./3., 0.5, 2.)
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
Scalar * b
Definition: benchVecAdd.cpp:17
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
Definition: PlainObjectBase.h:217
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols)
Definition: PlainObjectBase.h:398
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:192
EIGEN_DEVICE_FUNC Derived & setZero(Index size)
Definition: CwiseNullaryOp.h:569
Derived & setRandom(Index size)
Definition: Random.h:147
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: PlainObjectBase.h:191
Expression of the transpose of a matrix.
Definition: Transpose.h:56
#define max(a, b)
Definition: datatypes.h:23
void diagonal(const MatrixType &m)
Definition: diagonal.cpp:13
Scalar * y
Definition: level1_cplx_impl.h:128
const Scalar * a
Definition: level2_cplx_impl.h:32
char char char int int * k
Definition: level2_impl.h:374
#define VERIFY_IS_CWISE_EQUAL(a, b)
Definition: main.h:375
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
#define VERIFY_IS_MUCH_SMALLER_THAN(a, b)
Definition: main.h:371
#define VERIFY_RAISES_ASSERT(a)
Definition: main.h:329
double eps
Definition: crbond_bessel.cc:24
EIGEN_STRONG_INLINE Packet2d shuffle(const Packet2d &m, const Packet2d &n, int mask)
Definition: LSX/PacketMath.h:150
squared absolute value
Definition: GlobalFunctions.h:87
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243
double Zero
Definition: pseudosolid_node_update_elements.cc:35
list x
Definition: plotDoE.py:28
@ ForceNonZeroDiag
Definition: sparse.h:32
static long g_realloc_count
Definition: sparse_basic.cpp:13
internal::nested_eval< T, 1 >::type eval(const T &xpr)
Definition: sparse_permutations.cpp:47
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2