11 #ifndef EIGEN_INCOMPLETE_LUT_H
12 #define EIGEN_INCOMPLETE_LUT_H
30 template <
typename VectorV,
typename VectorI>
42 if (ncut < first || ncut >
last)
return 0;
62 }
while (mid != ncut);
101 template <
typename Scalar_,
typename StorageIndex_ =
int>
124 template <
typename MatrixType>
146 template <
typename MatrixType>
149 template <
typename MatrixType>
157 template <
typename MatrixType>
167 template <
typename Rhs,
typename Dest>
170 x =
m_lu.template triangularView<UnitLower>().solve(
x);
171 x =
m_lu.template triangularView<Upper>().solve(
x);
196 template <
typename Scalar,
typename StorageIndex>
198 this->m_droptol = droptol;
205 template <
typename Scalar,
typename StorageIndex>
207 this->m_fillfactor = fillfactor;
210 template <
typename Scalar,
typename StorageIndex>
211 template <
typename MatrixType_>
224 m_Pinv = m_P.inverse();
225 m_analysisIsOk =
true;
226 m_factorizationIsOk =
false;
227 m_isInitialized =
true;
230 template <
typename Scalar,
typename StorageIndex>
231 template <
typename MatrixType_>
238 eigen_assert((amat.rows() == amat.cols()) &&
"The factorization should be done on a square matrix");
247 eigen_assert(m_analysisIsOk &&
"You must first call analyzePattern()");
257 Index fill_in = (amat.nonZeros() * m_fillfactor) /
n + 1;
258 if (fill_in >
n) fill_in =
n;
261 Index nnzL = fill_in / 2;
263 m_lu.reserve(
n * (nnzL + nnzU + 1));
266 for (
Index ii = 0; ii <
n; ii++) {
271 ju(ii) = convert_index<StorageIndex>(ii);
273 jr(ii) = convert_index<StorageIndex>(ii);
277 for (; j_it; ++j_it) {
281 ju(sizel) = convert_index<StorageIndex>(
k);
282 u(sizel) = j_it.value();
283 jr(
k) = convert_index<StorageIndex>(sizel);
285 }
else if (
k == ii) {
286 u(ii) = j_it.value();
289 Index jpos = ii + sizeu;
290 ju(jpos) = convert_index<StorageIndex>(
k);
291 u(jpos) = j_it.value();
292 jr(
k) = convert_index<StorageIndex>(jpos);
304 rownorm =
sqrt(rownorm);
313 Index minrow = ju.segment(jj, sizel - jj).minCoeff(&
k);
315 if (minrow != ju(jj)) {
319 jr(minrow) = convert_index<StorageIndex>(jj);
320 jr(
j) = convert_index<StorageIndex>(
k);
328 while (ki_it && ki_it.index() < minrow) ++ki_it;
330 Scalar fact = u(jj) / ki_it.value();
333 if (
abs(fact) <= m_droptol) {
340 for (; ki_it; ++ki_it) {
358 ju(newpos) = convert_index<StorageIndex>(
j);
360 jr(
j) = convert_index<StorageIndex>(newpos);
366 ju(len) = convert_index<StorageIndex>(minrow);
373 for (
Index k = 0;
k < sizeu;
k++) jr(ju(ii +
k)) = -1;
380 typename Vector::SegmentReturnType ul(u.segment(0, sizel));
381 typename VectorI::SegmentReturnType jul(ju.segment(0, sizel));
386 for (
Index k = 0;
k < len;
k++) m_lu.insertBackByOuterInnerUnordered(ii, ju(
k)) = u(
k);
390 if (u(ii) ==
Scalar(0)) u(ii) =
sqrt(m_droptol) * rownorm;
391 m_lu.insertBackByOuterInnerUnordered(ii, ii) = u(ii);
397 if (
abs(u(ii +
k)) > m_droptol * rownorm) {
399 u(ii + len) = u(ii +
k);
400 ju(ii + len) = ju(ii +
k);
405 typename Vector::SegmentReturnType uu(u.segment(ii + 1, sizeu - 1));
406 typename VectorI::SegmentReturnType juu(ju.segment(ii + 1, sizeu - 1));
410 for (
Index k = ii + 1;
k < ii + len;
k++) m_lu.insertBackByOuterInnerUnordered(ii, ju(
k)) = u(
k);
413 m_lu.makeCompressed();
415 m_factorizationIsOk =
true;
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Eigen::SparseMatrix< double > mat
Definition: EigenUnitTest.cpp:10
#define eigen_internal_assert(x)
Definition: Macros.h:916
#define EIGEN_NOEXCEPT
Definition: Macros.h:1267
#define EIGEN_CONSTEXPR
Definition: Macros.h:758
#define eigen_assert(x)
Definition: Macros.h:910
std::vector< int > ind
Definition: Slicing_stdvector_cxx11.cpp:1
MatrixXd mat1(size, size)
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Definition: Ordering.h:50
Incomplete LU factorization with dual-threshold strategy.
Definition: IncompleteLUT.h:102
ComputationInfo m_info
Definition: IncompleteLUT.h:187
PermutationMatrix< Dynamic, Dynamic, StorageIndex > m_Pinv
Definition: IncompleteLUT.h:189
RealScalar m_droptol
Definition: IncompleteLUT.h:183
void analyzePattern(const MatrixType &amat)
EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: IncompleteLUT.h:132
void setFillfactor(int fillfactor)
Definition: IncompleteLUT.h:206
void factorize(const MatrixType &amat)
EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: IncompleteLUT.h:134
IncompleteLUT()
Definition: IncompleteLUT.h:118
FactorType m_lu
Definition: IncompleteLUT.h:182
PermutationMatrix< Dynamic, Dynamic, StorageIndex > m_P
Definition: IncompleteLUT.h:188
NumTraits< Scalar >::Real RealScalar
Definition: IncompleteLUT.h:110
@ ColsAtCompileTime
Definition: IncompleteLUT.h:115
@ MaxColsAtCompileTime
Definition: IncompleteLUT.h:115
IncompleteLUT & compute(const MatrixType &amat)
Definition: IncompleteLUT.h:158
void _solve_impl(const Rhs &b, Dest &x) const
Definition: IncompleteLUT.h:168
int m_fillfactor
Definition: IncompleteLUT.h:184
void setDroptol(const RealScalar &droptol)
Definition: IncompleteLUT.h:197
bool m_factorizationIsOk
Definition: IncompleteLUT.h:186
SparseSolverBase< IncompleteLUT > Base
Definition: IncompleteLUT.h:104
SparseMatrix< Scalar, RowMajor, StorageIndex > FactorType
Definition: IncompleteLUT.h:113
StorageIndex_ StorageIndex
Definition: IncompleteLUT.h:109
Matrix< StorageIndex, Dynamic, 1 > VectorI
Definition: IncompleteLUT.h:112
bool m_analysisIsOk
Definition: IncompleteLUT.h:185
bool m_isInitialized
Definition: SparseSolverBase.h:110
Matrix< Scalar, Dynamic, 1 > Vector
Definition: IncompleteLUT.h:111
IncompleteLUT(const MatrixType &mat, const RealScalar &droptol=NumTraits< Scalar >::dummy_precision(), int fillfactor=10)
Definition: IncompleteLUT.h:125
ComputationInfo info() const
Reports whether previous computation was successful.
Definition: IncompleteLUT.h:141
Scalar_ Scalar
Definition: IncompleteLUT.h:108
SparseSymmetricPermutationProduct< Derived, Upper|Lower > twistedBy(const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
Definition: SparseMatrixBase.h:325
TransposeReturnType transpose()
Definition: SparseMatrixBase.h:358
Index cols() const
Definition: SparseMatrix.h:161
Index rows() const
Definition: SparseMatrix.h:159
Base::InnerIterator InnerIterator
Definition: SparseMatrix.h:138
A base class for sparse solvers.
Definition: SparseSolverBase.h:67
bool m_isInitialized
Definition: SparseSolverBase.h:110
#define min(a, b)
Definition: datatypes.h:22
static constexpr const last_t last
Definition: IndexedViewHelper.h:48
ComputationInfo
Definition: Constants.h:438
@ NumericalIssue
Definition: Constants.h:442
@ Success
Definition: Constants.h:440
EIGEN_BLAS_FUNC() swap(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:117
char char char int int * k
Definition: level2_impl.h:374
@ Rhs
Definition: TensorContractionMapper.h:20
EIGEN_DEVICE_FUNC IndexDest convert_index(const IndexSrc &idx)
Definition: XprHelper.h:63
Index QuickSplit(VectorV &row, VectorI &ind, Index ncut)
Definition: IncompleteLUT.h:31
void swap(scoped_array< T > &a, scoped_array< T > &b)
Definition: Memory.h:734
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE std::enable_if_t< std::is_base_of< DenseBase< std::decay_t< DerivedA > >, std::decay_t< DerivedA > >::value &&std::is_base_of< DenseBase< std::decay_t< DerivedB > >, std::decay_t< DerivedB > >::value, void > swap(DerivedA &&a, DerivedB &&b)
Definition: DenseBase.h:655
const Product< Lhs, Rhs > prod(const Lhs &lhs, const Rhs &rhs)
Definition: evaluators.cpp:7
Definition: Eigen_Colamd.h:49
list x
Definition: plotDoE.py:28
Definition: IncompleteLUT.h:177
bool operator()(const Index &row, const Index &col, const Scalar &) const
Definition: IncompleteLUT.h:178
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2