inline void lowdegreesweep(DMat& m, size_t i, DynamicVector<NodeEliminationStatus>& status) { bool hasLowDegreeNeighbour = false; /* Cerco vicini low-degree*/ for (size_t j = 0; j < m.rows(); ++j) { if (j != i && status[j] == LOW_DEGREE) { hasLowDegreeNeighbour = true; status[i] = NOT_ELIMINATED; break; } } /* Se non aveva un vicino low_degree allora è lui il nodo low_degree!*/ if (!hasLowDegreeNeighbour) { status[i] = LOW_DEGREE; for (size_t j = 0; j < m.rows(); ++j) { if (j != i) status[j] = NOT_ELIMINATED; } } }
inline void eliminationOperators(DMat& A, DynamicVector<size_t>& Cset, size_t fnode, DynamicVector<double>& q, SpMat& P, size_t& P_col, size_t P_row) { double scalingFactor = 1.0; P.reserve(P_row, A.nonZeros(fnode) - 1); DynamicVector<size_t>::Iterator ccol = Cset.begin(); for (size_t frow = 0; frow < A.rows(); ++frow) { if (frow == fnode) { //Elemento sulla diagonale q[P_row] = (1.0 / A(frow, fnode)); scalingFactor = -(q[P_row]); } else if (ccol != Cset.end()) { break; //Non ha senso andare avanti se abbiamo finito i ccol } else if (frow == (*ccol)) { P.append(P_row, P_col, A(frow, fnode)); P_col++; ccol++; } } P.finalize(P_row); for (SpMat::Iterator it = P.begin(P_row); it != P.end(P_row); it++) it->value() *= -scalingFactor; }