/* ************************************************************************* */ Ordering Ordering::ColamdConstrainedLast(const VariableIndex& variableIndex, const std::vector<Key>& constrainLast, bool forceOrder) { gttic(Ordering_COLAMDConstrainedLast); size_t n = variableIndex.size(); std::vector<int> cmember(n, 0); // Build a mapping to look up sorted Key indices by Key // TODO(frank): think of a way to not build this FastMap<Key, size_t> keyIndices; size_t j = 0; for (auto key_factors: variableIndex) keyIndices.insert(keyIndices.end(), make_pair(key_factors.first, j++)); // If at least some variables are not constrained to be last, constrain the // ones that should be constrained. int group = (constrainLast.size() != n ? 1 : 0); for (Key key: constrainLast) { cmember[keyIndices.at(key)] = group; if (forceOrder) ++group; } return Ordering::ColamdConstrained(variableIndex, cmember); }
/* ************************************************************************* */ Ordering Ordering::ColamdConstrainedFirst(const VariableIndex& variableIndex, const std::vector<Key>& constrainFirst, bool forceOrder) { gttic(Ordering_COLAMDConstrainedFirst); const int none = -1; size_t n = variableIndex.size(); std::vector<int> cmember(n, none); // Build a mapping to look up sorted Key indices by Key FastMap<Key, size_t> keyIndices; size_t j = 0; for (auto key_factors: variableIndex) keyIndices.insert(keyIndices.end(), make_pair(key_factors.first, j++)); // If at least some variables are not constrained to be last, constrain the // ones that should be constrained. int group = 0; for (Key key: constrainFirst) { cmember[keyIndices.at(key)] = group; if (forceOrder) ++group; } if (!forceOrder && !constrainFirst.empty()) ++group; for(int& c: cmember) if (c == none) c = group; return Ordering::ColamdConstrained(variableIndex, cmember); }
/* ************************************************************************* */ Ordering Ordering::ColamdConstrained(const VariableIndex& variableIndex, const FastMap<Key, int>& groups) { gttic(Ordering_COLAMDConstrained); size_t n = variableIndex.size(); std::vector<int> cmember(n, 0); // Build a mapping to look up sorted Key indices by Key FastMap<Key, size_t> keyIndices; size_t j = 0; for (auto key_factors: variableIndex) keyIndices.insert(keyIndices.end(), make_pair(key_factors.first, j++)); // Assign groups typedef FastMap<Key, int>::value_type key_group; for(const key_group& p: groups) { // FIXME: check that no groups are skipped cmember[keyIndices.at(p.first)] = p.second; } return Ordering::ColamdConstrained(variableIndex, cmember); }
/* ************************************************************************* */ Ordering Ordering::ColamdConstrainedLast(const VariableIndex& variableIndex, const std::vector<Key>& constrainLast, bool forceOrder) { gttic(Ordering_COLAMDConstrainedLast); size_t n = variableIndex.size(); std::vector<int> cmember(n, 0); // Build a mapping to look up sorted Key indices by Key FastMap<Key, size_t> keyIndices; size_t j = 0; BOOST_FOREACH(const VariableIndex::value_type key_factors, variableIndex) keyIndices.insert(keyIndices.end(), make_pair(key_factors.first, j++)); // If at least some variables are not constrained to be last, constrain the // ones that should be constrained. int group = (constrainLast.size() != n ? 1 : 0); BOOST_FOREACH(Key key, constrainLast) { cmember[keyIndices.at(key)] = group; if (forceOrder) ++group; }