86 template <
class Matrix,
class Vector>
89 const ptrdiff_t n = backend::nbRow(A);
104 ptrdiff_t initialNode = 0;
105 ptrdiff_t maxDegree = 0;
107 std::vector<ptrdiff_t> degree(n);
108 std::vector<ptrdiff_t> levelSet(n, 0);
109 std::vector<ptrdiff_t> nextSameDegree(n, -1);
113 for (ptrdiff_t i = begin; i < (begin + size); ++i) {
114 ptrdiff_t row_width = 0;
115 for (
auto a = backend::row_begin(A, i); a; ++a, ++row_width)
117 degree[i] = row_width;
118 maxd = std::max(maxd, degree[i]);
123 std::vector<ptrdiff_t> firstWithDegree(maxDegree + 1, -1);
124 std::vector<ptrdiff_t> nFirstWithDegree(maxDegree + 1);
127 perm[0] = initialNode;
128 ptrdiff_t currentLevelSet = 1;
129 levelSet[initialNode] = currentLevelSet;
130 ptrdiff_t maxDegreeInCurrentLevelSet = degree[initialNode];
131 firstWithDegree[maxDegreeInCurrentLevelSet] = initialNode;
134 for (ptrdiff_t next = 1; next < n;) {
135 ptrdiff_t nMDICLS = 0;
136 std::fill(nFirstWithDegree.begin(), nFirstWithDegree.end(), -1);
139 ptrdiff_t firstVal = reverse ? maxDegreeInCurrentLevelSet : 0;
140 ptrdiff_t finalVal = reverse ? -1 : maxDegreeInCurrentLevelSet + 1;
141 ptrdiff_t increment = reverse ? -1 : 1;
143 for (ptrdiff_t soughtDegree = firstVal; soughtDegree != finalVal; soughtDegree += increment) {
144 ptrdiff_t node = firstWithDegree[soughtDegree];
147 for (
auto a = backend::row_begin(A, node); a; ++a) {
148 ptrdiff_t c = a.col();
149 if (levelSet[c] == 0) {
150 levelSet[c] = currentLevelSet + 1;
154 nextSameDegree[c] = nFirstWithDegree[degree[c]];
155 nFirstWithDegree[degree[c]] = c;
156 nMDICLS = std::max(nMDICLS, degree[c]);
159 node = nextSameDegree[node];
164 maxDegreeInCurrentLevelSet = nMDICLS;
165 for (ptrdiff_t i = 0; i <= nMDICLS; ++i)
166 firstWithDegree[i] = nFirstWithDegree[i];
173 for (ptrdiff_t i = 0; i < n; ++i) {
174 if (levelSet[i] == 0) {
177 levelSet[i] = currentLevelSet;
178 maxDegreeInCurrentLevelSet = degree[i];
179 firstWithDegree[maxDegreeInCurrentLevelSet] = i;
184 precondition(found,
"Internal consistency error at skyline_lu");
void arccoreParallelFor(const ComplexForLoopRanges< RankValue > &loop_ranges, const ForLoopRunInfo &run_info, const LambdaType &lambda_function, const ReducerArgs &... reducer_args)
Applique en concurrence la fonction lambda lambda_function sur l'intervalle d'itération donné par loo...