Eigen::IncompleteLUT< Scalar_, StorageIndex_ > Class Template Reference

Incomplete LU factorization with dual-threshold strategy. More...

#include <IncompleteLUT.h>

+ Inheritance diagram for Eigen::IncompleteLUT< Scalar_, StorageIndex_ >:

Classes

struct  keep_diag
 

Public Types

enum  { ColsAtCompileTime = Dynamic , MaxColsAtCompileTime = Dynamic }
 
typedef Scalar_ Scalar
 
typedef StorageIndex_ StorageIndex
 
typedef NumTraits< Scalar >::Real RealScalar
 
typedef Matrix< Scalar, Dynamic, 1 > Vector
 
typedef Matrix< StorageIndex, Dynamic, 1 > VectorI
 
typedef SparseMatrix< Scalar, RowMajor, StorageIndexFactorType
 

Public Member Functions

 IncompleteLUT ()
 
template<typename MatrixType >
 IncompleteLUT (const MatrixType &mat, const RealScalar &droptol=NumTraits< Scalar >::dummy_precision(), int fillfactor=10)
 
EIGEN_CONSTEXPR Index rows () const EIGEN_NOEXCEPT
 
EIGEN_CONSTEXPR Index cols () const EIGEN_NOEXCEPT
 
ComputationInfo info () const
 Reports whether previous computation was successful. More...
 
template<typename MatrixType >
void analyzePattern (const MatrixType &amat)
 
template<typename MatrixType >
void factorize (const MatrixType &amat)
 
template<typename MatrixType >
IncompleteLUTcompute (const MatrixType &amat)
 
void setDroptol (const RealScalar &droptol)
 
void setFillfactor (int fillfactor)
 
template<typename Rhs , typename Dest >
void _solve_impl (const Rhs &b, Dest &x) const
 
template<typename MatrixType_ >
void analyzePattern (const MatrixType_ &amat)
 
template<typename MatrixType_ >
void factorize (const MatrixType_ &amat)
 
- Public Member Functions inherited from Eigen::SparseSolverBase< IncompleteLUT< Scalar_, int > >
 SparseSolverBase ()
 
 SparseSolverBase (SparseSolverBase &&other)
 
 ~SparseSolverBase ()
 
IncompleteLUT< Scalar_, int > & derived ()
 
const IncompleteLUT< Scalar_, int > & derived () const
 
const Solve< IncompleteLUT< Scalar_, int >, Rhs > solve (const MatrixBase< Rhs > &b) const
 
const Solve< IncompleteLUT< Scalar_, int >, Rhs > solve (const SparseMatrixBase< Rhs > &b) const
 
void _solve_impl (const SparseMatrixBase< Rhs > &b, SparseMatrixBase< Dest > &dest) const
 

Protected Types

typedef SparseSolverBase< IncompleteLUTBase
 

Protected Attributes

FactorType m_lu
 
RealScalar m_droptol
 
int m_fillfactor
 
bool m_analysisIsOk
 
bool m_factorizationIsOk
 
ComputationInfo m_info
 
PermutationMatrix< Dynamic, Dynamic, StorageIndexm_P
 
PermutationMatrix< Dynamic, Dynamic, StorageIndexm_Pinv
 
bool m_isInitialized
 
- Protected Attributes inherited from Eigen::SparseSolverBase< IncompleteLUT< Scalar_, int > >
bool m_isInitialized
 

Detailed Description

template<typename Scalar_, typename StorageIndex_ = int>
class Eigen::IncompleteLUT< Scalar_, StorageIndex_ >

Incomplete LU factorization with dual-threshold strategy.

\implsparsesolverconcept

During the numerical factorization, two dropping rules are used : 1) any element whose magnitude is less than some tolerance is dropped. This tolerance is obtained by multiplying the input tolerance droptol by the average magnitude of all the original elements in the current row. 2) After the elimination of the row, only the fill largest elements in the L part and the fill largest elements in the U part are kept (in addition to the diagonal element ). Note that fill is computed from the input parameter fillfactor which is used the ratio to control the fill_in relatively to the initial number of nonzero elements.

The two extreme cases are when droptol=0 (to keep all the fill*2 largest elements) and when fill=n/2 with droptol being different to zero.

References : Yousef Saad, ILUT: A dual threshold incomplete LU factorization, Numerical Linear Algebra with Applications, 1(4), pp 387-402, 1994.

NOTE : The following implementation is derived from the ILUT implementation in the SPARSKIT package, Copyright (C) 2005, the Regents of the University of Minnesota released under the terms of the GNU LGPL: http://www-users.cs.umn.edu/~saad/software/SPARSKIT/README However, Yousef Saad gave us permission to relicense his ILUT code to MPL2. See the Eigen mailing list archive, thread: ILUT, date: July 8, 2012: http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html alternatively, on GMANE: http://comments.gmane.org/gmane.comp.lib.eigen/3302

Member Typedef Documentation

◆ Base

template<typename Scalar_ , typename StorageIndex_ = int>
typedef SparseSolverBase<IncompleteLUT> Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::Base
protected

◆ FactorType

template<typename Scalar_ , typename StorageIndex_ = int>
typedef SparseMatrix<Scalar, RowMajor, StorageIndex> Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::FactorType

◆ RealScalar

template<typename Scalar_ , typename StorageIndex_ = int>
typedef NumTraits<Scalar>::Real Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::RealScalar

◆ Scalar

template<typename Scalar_ , typename StorageIndex_ = int>
typedef Scalar_ Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::Scalar

◆ StorageIndex

template<typename Scalar_ , typename StorageIndex_ = int>
typedef StorageIndex_ Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::StorageIndex

◆ Vector

template<typename Scalar_ , typename StorageIndex_ = int>
typedef Matrix<Scalar, Dynamic, 1> Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::Vector

◆ VectorI

template<typename Scalar_ , typename StorageIndex_ = int>
typedef Matrix<StorageIndex, Dynamic, 1> Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::VectorI

Member Enumeration Documentation

◆ anonymous enum

template<typename Scalar_ , typename StorageIndex_ = int>
anonymous enum
Enumerator
ColsAtCompileTime 
MaxColsAtCompileTime 
@ ColsAtCompileTime
Definition: IncompleteLUT.h:115
@ MaxColsAtCompileTime
Definition: IncompleteLUT.h:115
const int Dynamic
Definition: Constants.h:25

Constructor & Destructor Documentation

◆ IncompleteLUT() [1/2]

template<typename Scalar_ , typename StorageIndex_ = int>
Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::IncompleteLUT ( )
inline
119  : m_droptol(NumTraits<Scalar>::dummy_precision()),
120  m_fillfactor(10),
121  m_analysisIsOk(false),
122  m_factorizationIsOk(false) {}
RealScalar m_droptol
Definition: IncompleteLUT.h:183
int m_fillfactor
Definition: IncompleteLUT.h:184
bool m_factorizationIsOk
Definition: IncompleteLUT.h:186
bool m_analysisIsOk
Definition: IncompleteLUT.h:185

◆ IncompleteLUT() [2/2]

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename MatrixType >
Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::IncompleteLUT ( const MatrixType mat,
const RealScalar droptol = NumTraits<Scalar>::dummy_precision(),
int  fillfactor = 10 
)
inlineexplicit
127  : m_droptol(droptol), m_fillfactor(fillfactor), m_analysisIsOk(false), m_factorizationIsOk(false) {
128  eigen_assert(fillfactor != 0);
129  compute(mat);
130  }
#define eigen_assert(x)
Definition: Macros.h:910
IncompleteLUT & compute(const MatrixType &amat)
Definition: IncompleteLUT.h:158

References Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::compute(), and eigen_assert.

Member Function Documentation

◆ _solve_impl()

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename Rhs , typename Dest >
void Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::_solve_impl ( const Rhs &  b,
Dest &  x 
) const
inline
168  {
169  x = m_Pinv * b;
170  x = m_lu.template triangularView<UnitLower>().solve(x);
171  x = m_lu.template triangularView<Upper>().solve(x);
172  x = m_P * x;
173  }
Scalar * b
Definition: benchVecAdd.cpp:17
PermutationMatrix< Dynamic, Dynamic, StorageIndex > m_Pinv
Definition: IncompleteLUT.h:189
FactorType m_lu
Definition: IncompleteLUT.h:182
PermutationMatrix< Dynamic, Dynamic, StorageIndex > m_P
Definition: IncompleteLUT.h:188
list x
Definition: plotDoE.py:28

References b, Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_lu, Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_P, Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_Pinv, and plotDoE::x.

◆ analyzePattern() [1/2]

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename MatrixType >
void Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::analyzePattern ( const MatrixType amat)

◆ analyzePattern() [2/2]

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename MatrixType_ >
void Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::analyzePattern ( const MatrixType_ &  amat)
212  {
213  // Compute the Fill-reducing permutation
214  // Since ILUT does not perform any numerical pivoting,
215  // it is highly preferable to keep the diagonal through symmetric permutations.
216  // To this end, let's symmetrize the pattern and perform AMD on it.
217  SparseMatrix<Scalar, ColMajor, StorageIndex> mat1 = amat;
218  SparseMatrix<Scalar, ColMajor, StorageIndex> mat2 = amat.transpose();
219  // FIXME for a matrix with nearly symmetric pattern, mat2+mat1 is the appropriate choice.
220  // on the other hand for a really non-symmetric pattern, mat2*mat1 should be preferred...
221  SparseMatrix<Scalar, ColMajor, StorageIndex> AtA = mat2 + mat1;
222  AMDOrdering<StorageIndex> ordering;
223  ordering(AtA, m_P);
224  m_Pinv = m_P.inverse(); // cache the inverse permutation
225  m_analysisIsOk = true;
226  m_factorizationIsOk = false;
227  m_isInitialized = true;
228 }
MatrixXd mat1(size, size)
bool m_isInitialized
Definition: SparseSolverBase.h:110
InverseReturnType inverse() const
Definition: PermutationMatrix.h:172

References mat1(), and Eigen::SparseMatrixBase< Derived >::transpose().

◆ cols()

◆ compute()

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename MatrixType >
IncompleteLUT& Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::compute ( const MatrixType amat)
inline

Compute an incomplete LU factorization with dual threshold on the matrix mat No pivoting is done in this version

158  {
159  analyzePattern(amat);
160  factorize(amat);
161  return *this;
162  }
void analyzePattern(const MatrixType &amat)
void factorize(const MatrixType &amat)

References Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::analyzePattern(), and Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::factorize().

Referenced by Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::IncompleteLUT().

◆ factorize() [1/2]

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename MatrixType >
void Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::factorize ( const MatrixType amat)

◆ factorize() [2/2]

template<typename Scalar_ , typename StorageIndex_ = int>
template<typename MatrixType_ >
void Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::factorize ( const MatrixType_ &  amat)
232  {
234  using std::abs;
235  using std::sqrt;
236  using std::swap;
237 
238  eigen_assert((amat.rows() == amat.cols()) && "The factorization should be done on a square matrix");
239  Index n = amat.cols(); // Size of the matrix
240  m_lu.resize(n, n);
241  // Declare Working vectors and variables
242  Vector u(n); // real values of the row -- maximum size is n --
243  VectorI ju(n); // column position of the values in u -- maximum size is n
244  VectorI jr(n); // Indicate the position of the nonzero elements in the vector u -- A zero location is indicated by -1
245 
246  // Apply the fill-reducing permutation
247  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
248  SparseMatrix<Scalar, RowMajor, StorageIndex> mat;
249  mat = amat.twistedBy(m_Pinv);
250 
251  // Initialization
252  jr.fill(-1);
253  ju.fill(0);
254  u.fill(0);
255 
256  // number of largest elements to keep in each row:
257  Index fill_in = (amat.nonZeros() * m_fillfactor) / n + 1;
258  if (fill_in > n) fill_in = n;
259 
260  // number of largest nonzero elements to keep in the L and the U part of the current row:
261  Index nnzL = fill_in / 2;
262  Index nnzU = nnzL;
263  m_lu.reserve(n * (nnzL + nnzU + 1));
264 
265  // global loop over the rows of the sparse matrix
266  for (Index ii = 0; ii < n; ii++) {
267  // 1 - copy the lower and the upper part of the row i of mat in the working vector u
268 
269  Index sizeu = 1; // number of nonzero elements in the upper part of the current row
270  Index sizel = 0; // number of nonzero elements in the lower part of the current row
271  ju(ii) = convert_index<StorageIndex>(ii);
272  u(ii) = 0;
273  jr(ii) = convert_index<StorageIndex>(ii);
274  RealScalar rownorm = 0;
275 
276  typename FactorType::InnerIterator j_it(mat, ii); // Iterate through the current row ii
277  for (; j_it; ++j_it) {
278  Index k = j_it.index();
279  if (k < ii) {
280  // copy the lower part
281  ju(sizel) = convert_index<StorageIndex>(k);
282  u(sizel) = j_it.value();
283  jr(k) = convert_index<StorageIndex>(sizel);
284  ++sizel;
285  } else if (k == ii) {
286  u(ii) = j_it.value();
287  } else {
288  // copy the upper part
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);
293  ++sizeu;
294  }
295  rownorm += numext::abs2(j_it.value());
296  }
297 
298  // 2 - detect possible zero row
299  if (rownorm == 0) {
301  return;
302  }
303  // Take the 2-norm of the current row as a relative tolerance
304  rownorm = sqrt(rownorm);
305 
306  // 3 - eliminate the previous nonzero rows
307  Index jj = 0;
308  Index len = 0;
309  while (jj < sizel) {
310  // In order to eliminate in the correct order,
311  // we must select first the smallest column index among ju(jj:sizel)
312  Index k;
313  Index minrow = ju.segment(jj, sizel - jj).minCoeff(&k); // k is relative to the segment
314  k += jj;
315  if (minrow != ju(jj)) {
316  // swap the two locations
317  Index j = ju(jj);
318  swap(ju(jj), ju(k));
319  jr(minrow) = convert_index<StorageIndex>(jj);
320  jr(j) = convert_index<StorageIndex>(k);
321  swap(u(jj), u(k));
322  }
323  // Reset this location
324  jr(minrow) = -1;
325 
326  // Start elimination
327  typename FactorType::InnerIterator ki_it(m_lu, minrow);
328  while (ki_it && ki_it.index() < minrow) ++ki_it;
329  eigen_internal_assert(ki_it && ki_it.col() == minrow);
330  Scalar fact = u(jj) / ki_it.value();
331 
332  // drop too small elements
333  if (abs(fact) <= m_droptol) {
334  jj++;
335  continue;
336  }
337 
338  // linear combination of the current row ii and the row minrow
339  ++ki_it;
340  for (; ki_it; ++ki_it) {
341  Scalar prod = fact * ki_it.value();
342  Index j = ki_it.index();
343  Index jpos = jr(j);
344  if (jpos == -1) // fill-in element
345  {
346  Index newpos;
347  if (j >= ii) // dealing with the upper part
348  {
349  newpos = ii + sizeu;
350  sizeu++;
351  eigen_internal_assert(sizeu <= n);
352  } else // dealing with the lower part
353  {
354  newpos = sizel;
355  sizel++;
356  eigen_internal_assert(sizel <= ii);
357  }
358  ju(newpos) = convert_index<StorageIndex>(j);
359  u(newpos) = -prod;
360  jr(j) = convert_index<StorageIndex>(newpos);
361  } else
362  u(jpos) -= prod;
363  }
364  // store the pivot element
365  u(len) = fact;
366  ju(len) = convert_index<StorageIndex>(minrow);
367  ++len;
368 
369  jj++;
370  } // end of the elimination on the row ii
371 
372  // reset the upper part of the pointer jr to zero
373  for (Index k = 0; k < sizeu; k++) jr(ju(ii + k)) = -1;
374 
375  // 4 - partially sort and insert the elements in the m_lu matrix
376 
377  // sort the L-part of the row
378  sizel = len;
379  len = (std::min)(sizel, nnzL);
380  typename Vector::SegmentReturnType ul(u.segment(0, sizel));
381  typename VectorI::SegmentReturnType jul(ju.segment(0, sizel));
382  internal::QuickSplit(ul, jul, len);
383 
384  // store the largest m_fill elements of the L part
385  m_lu.startVec(ii);
386  for (Index k = 0; k < len; k++) m_lu.insertBackByOuterInnerUnordered(ii, ju(k)) = u(k);
387 
388  // store the diagonal element
389  // apply a shifting rule to avoid zero pivots (we are doing an incomplete factorization)
390  if (u(ii) == Scalar(0)) u(ii) = sqrt(m_droptol) * rownorm;
391  m_lu.insertBackByOuterInnerUnordered(ii, ii) = u(ii);
392 
393  // sort the U-part of the row
394  // apply the dropping rule first
395  len = 0;
396  for (Index k = 1; k < sizeu; k++) {
397  if (abs(u(ii + k)) > m_droptol * rownorm) {
398  ++len;
399  u(ii + len) = u(ii + k);
400  ju(ii + len) = ju(ii + k);
401  }
402  }
403  sizeu = len + 1; // +1 to take into account the diagonal element
404  len = (std::min)(sizeu, nnzU);
405  typename Vector::SegmentReturnType uu(u.segment(ii + 1, sizeu - 1));
406  typename VectorI::SegmentReturnType juu(ju.segment(ii + 1, sizeu - 1));
407  internal::QuickSplit(uu, juu, len);
408 
409  // store the largest elements of the U part
410  for (Index k = ii + 1; k < ii + len; k++) m_lu.insertBackByOuterInnerUnordered(ii, ju(k)) = u(k);
411  }
412  m_lu.finalize();
414 
415  m_factorizationIsOk = true;
416  m_info = Success;
417 }
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
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
ComputationInfo m_info
Definition: IncompleteLUT.h:187
Matrix< StorageIndex, Dynamic, 1 > VectorI
Definition: IncompleteLUT.h:112
Matrix< Scalar, Dynamic, 1 > Vector
Definition: IncompleteLUT.h:111
Scalar_ Scalar
Definition: IncompleteLUT.h:108
SparseSymmetricPermutationProduct< Derived, Upper|Lower > twistedBy(const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
Definition: SparseMatrixBase.h:325
void startVec(Index outer)
Definition: SparseMatrix.h:451
void finalize()
Definition: SparseMatrix.h:461
void makeCompressed()
Definition: SparseMatrix.h:589
void resize(Index rows, Index cols)
Definition: SparseMatrix.h:734
Base::InnerIterator InnerIterator
Definition: SparseMatrix.h:138
void reserve(Index reserveSize)
Definition: SparseMatrix.h:315
Scalar & insertBackByOuterInnerUnordered(Index outer, Index inner)
Definition: SparseMatrix.h:442
#define min(a, b)
Definition: datatypes.h:22
@ 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
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
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
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
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References abs(), Eigen::numext::abs2(), Eigen::internal::convert_index(), eigen_assert, eigen_internal_assert, j, k, min, n, Eigen::NumericalIssue, Eigen::prod(), Eigen::internal::QuickSplit(), sqrt(), Eigen::Success, Eigen::swap(), swap(), and Eigen::SparseMatrixBase< Derived >::twistedBy().

◆ info()

template<typename Scalar_ , typename StorageIndex_ = int>
ComputationInfo Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::info ( ) const
inline

Reports whether previous computation was successful.

Returns
Success if computation was successful, NumericalIssue if the matrix.appears to be negative.
141  {
142  eigen_assert(m_isInitialized && "IncompleteLUT is not initialized.");
143  return m_info;
144  }

References eigen_assert, Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_info, and Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_isInitialized.

◆ rows()

◆ setDroptol()

template<typename Scalar , typename StorageIndex >
void Eigen::IncompleteLUT< Scalar, StorageIndex >::setDroptol ( const RealScalar droptol)

Set control parameter droptol

Parameters
droptolDrop any element whose magnitude is less than this tolerance
197  {
198  this->m_droptol = droptol;
199 }

◆ setFillfactor()

template<typename Scalar , typename StorageIndex >
void Eigen::IncompleteLUT< Scalar, StorageIndex >::setFillfactor ( int  fillfactor)

Set control parameter fillfactor

Parameters
fillfactorThis is used to compute the number fill_in of largest elements to keep on each row.
206  {
207  this->m_fillfactor = fillfactor;
208 }

Member Data Documentation

◆ m_analysisIsOk

template<typename Scalar_ , typename StorageIndex_ = int>
bool Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_analysisIsOk
protected

◆ m_droptol

template<typename Scalar_ , typename StorageIndex_ = int>
RealScalar Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_droptol
protected

◆ m_factorizationIsOk

template<typename Scalar_ , typename StorageIndex_ = int>
bool Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_factorizationIsOk
protected

◆ m_fillfactor

template<typename Scalar_ , typename StorageIndex_ = int>
int Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_fillfactor
protected

◆ m_info

template<typename Scalar_ , typename StorageIndex_ = int>
ComputationInfo Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_info
protected

◆ m_isInitialized

template<typename Scalar_ , typename StorageIndex_ = int>
bool Eigen::SparseSolverBase< Derived >::m_isInitialized
mutableprotected

◆ m_lu

◆ m_P

template<typename Scalar_ , typename StorageIndex_ = int>
PermutationMatrix<Dynamic, Dynamic, StorageIndex> Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_P
protected

◆ m_Pinv

template<typename Scalar_ , typename StorageIndex_ = int>
PermutationMatrix<Dynamic, Dynamic, StorageIndex> Eigen::IncompleteLUT< Scalar_, StorageIndex_ >::m_Pinv
protected

The documentation for this class was generated from the following file: