mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-27 07:29:52 +08:00
Fix bug #672: use exceptions in SuperLU if they are enabled only
(grafted from 90b5d303db
)
This commit is contained in:
parent
0a44b5249c
commit
8ea9e762d6
@ -77,16 +77,23 @@ Index SparseLUImpl<Scalar,Index>::expand(VectorType& vec, Index& length, Index
|
|||||||
old_vec = vec.segment(0,nbElts);
|
old_vec = vec.segment(0,nbElts);
|
||||||
|
|
||||||
//Allocate or expand the current vector
|
//Allocate or expand the current vector
|
||||||
try
|
#ifdef EIGEN_EXCEPTIONS
|
||||||
|
try
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
vec.resize(new_len);
|
vec.resize(new_len);
|
||||||
}
|
}
|
||||||
|
#ifdef EIGEN_EXCEPTIONS
|
||||||
catch(std::bad_alloc& )
|
catch(std::bad_alloc& )
|
||||||
|
#else
|
||||||
|
if(!vec.size())
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if ( !num_expansions )
|
if (!num_expansions)
|
||||||
{
|
{
|
||||||
// First time to allocate from LUMemInit()
|
// First time to allocate from LUMemInit()
|
||||||
throw; // Pass the exception to LUMemInit() which has a try... catch block
|
// Let LUMemInit() deals with it.
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
if (keep_prev)
|
if (keep_prev)
|
||||||
{
|
{
|
||||||
@ -101,11 +108,17 @@ Index SparseLUImpl<Scalar,Index>::expand(VectorType& vec, Index& length, Index
|
|||||||
{
|
{
|
||||||
alpha = (alpha + 1)/2;
|
alpha = (alpha + 1)/2;
|
||||||
new_len = Index(alpha * length);
|
new_len = Index(alpha * length);
|
||||||
|
#ifdef EIGEN_EXCEPTIONS
|
||||||
try
|
try
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
vec.resize(new_len);
|
vec.resize(new_len);
|
||||||
}
|
}
|
||||||
|
#ifdef EIGEN_EXCEPTIONS
|
||||||
catch(std::bad_alloc& )
|
catch(std::bad_alloc& )
|
||||||
|
#else
|
||||||
|
if (!vec.size())
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
tries += 1;
|
tries += 1;
|
||||||
if ( tries > 10) return new_len;
|
if ( tries > 10) return new_len;
|
||||||
@ -166,14 +179,10 @@ Index SparseLUImpl<Scalar,Index>::memInit(Index m, Index n, Index annz, Index lw
|
|||||||
// Reserve memory for L/U factors
|
// Reserve memory for L/U factors
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
try
|
if( (!expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions))
|
||||||
{
|
|| (!expand<ScalarVector>(glu.ucol, glu.nzumax, 0, 0, num_expansions))
|
||||||
expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions);
|
|| (!expand<IndexVector> (glu.lsub, glu.nzlmax, 0, 0, num_expansions))
|
||||||
expand<ScalarVector>(glu.ucol,glu.nzumax, 0, 0, num_expansions);
|
|| (!expand<IndexVector> (glu.usub, glu.nzumax, 0, 1, num_expansions)) )
|
||||||
expand<IndexVector>(glu.lsub,glu.nzlmax, 0, 0, num_expansions);
|
|
||||||
expand<IndexVector>(glu.usub,glu.nzumax, 0, 1, num_expansions);
|
|
||||||
}
|
|
||||||
catch(std::bad_alloc& )
|
|
||||||
{
|
{
|
||||||
//Reduce the estimated size and retry
|
//Reduce the estimated size and retry
|
||||||
glu.nzlumax /= 2;
|
glu.nzlumax /= 2;
|
||||||
@ -181,10 +190,7 @@ Index SparseLUImpl<Scalar,Index>::memInit(Index m, Index n, Index annz, Index lw
|
|||||||
glu.nzlmax /= 2;
|
glu.nzlmax /= 2;
|
||||||
if (glu.nzlumax < annz ) return glu.nzlumax;
|
if (glu.nzlumax < annz ) return glu.nzlumax;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (!glu.lusup.size() || !glu.ucol.size() || !glu.lsub.size() || !glu.usub.size());
|
} while (!glu.lusup.size() || !glu.ucol.size() || !glu.lsub.size() || !glu.usub.size());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
++num_expansions;
|
++num_expansions;
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user