diff options
author | 2015-04-20 14:01:35 -0400 | |
---|---|---|
committer | 2015-04-20 14:01:35 -0400 | |
commit | 0250f4a9f2f7bb54ed760cec045939a1bbe58170 (patch) | |
tree | 5e0372ddef57f51f7adb56bb9569037e6e9556ad /Eigen/src/OrderingMethods/Amd.h | |
parent | 0339502a4feb6340f1e9f6f6ca8b3ef4d263f366 (diff) | |
parent | 0eb220c00d9773c29c7d169ad0e20745b0ef21bb (diff) |
Merged default into unary-array-cwise-functors
Diffstat (limited to 'Eigen/src/OrderingMethods/Amd.h')
-rw-r--r-- | Eigen/src/OrderingMethods/Amd.h | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/Eigen/src/OrderingMethods/Amd.h b/Eigen/src/OrderingMethods/Amd.h index 3d2981f0c..63d996cb4 100644 --- a/Eigen/src/OrderingMethods/Amd.h +++ b/Eigen/src/OrderingMethods/Amd.h @@ -137,22 +137,27 @@ void minimum_degree_ordering(SparseMatrix<Scalar,ColMajor,StorageIndex>& C, Perm degree[i] = len[i]; // degree of node i } mark = internal::cs_wclear<StorageIndex>(0, 0, w, n); /* clear w */ - elen[n] = -2; /* n is a dead element */ - Cp[n] = -1; /* n is a root of assembly tree */ - w[n] = 0; /* n is a dead element */ /* --- Initialize degree lists ------------------------------------------ */ for(i = 0; i < n; i++) { + bool has_diag = false; + for(p = Cp[i]; p<Cp[i+1]; ++p) + if(Ci[p]==i) + { + has_diag = true; + break; + } + d = degree[i]; - if(d == 0) /* node i is empty */ + if(d == 1) /* node i is empty */ { elen[i] = -2; /* element i is dead */ nel++; Cp[i] = -1; /* i is a root of assembly tree */ w[i] = 0; } - else if(d > dense) /* node i is dense */ + else if(d > dense || !has_diag) /* node i is dense or has no structural diagonal element */ { nv[i] = 0; /* absorb i into element n */ elen[i] = -1; /* node i is dead */ @@ -168,6 +173,10 @@ void minimum_degree_ordering(SparseMatrix<Scalar,ColMajor,StorageIndex>& C, Perm } } + elen[n] = -2; /* n is a dead element */ + Cp[n] = -1; /* n is a root of assembly tree */ + w[n] = 0; /* n is a dead element */ + while (nel < n) /* while (selecting pivots) do */ { /* --- Select node of minimum approximate degree -------------------- */ |