// policy: callback whenever i~k but not j~k void BinaryRelation::unsafe_merge (Ob i) { Ob j = carrier().find(i); POMAGMA_ASSERT4(j < i, "BinaryRelation tried to merge item with self"); DenseSet diff(item_dim()); DenseSet rep(item_dim(), nullptr); DenseSet dep(item_dim(), nullptr); // merge rows (i, _) into (j, _) dep.init(m_lines.Lx(i)); _remove_Rx(i, dep); rep.init(m_lines.Lx(j)); if (rep.merge(dep, diff)) { for (auto k = diff.iter(); k.ok(); k.next()) { _insert_Rx(j, *k); } } // merge cols (_, i) into (_, j) dep.init(m_lines.Rx(i)); _remove_Lx(dep, i); rep.init(m_lines.Rx(j)); if (rep.merge(dep, diff)) { for (auto k = diff.iter(); k.ok(); k.next()) { _insert_Lx(*k, j); } } }
void BinaryRelation::insert(Ob i, const DenseSet& js) { DenseSet diff(item_dim()); DenseSet dest(item_dim(), m_lines.Lx(i)); if (dest.ensure(js, diff)) { for (auto k = diff.iter(); k.ok(); k.next()) { _insert_Rx(i, *k); } } }
inline void BinaryRelation::insert_Lx(Ob i, Ob j) { if (not m_lines.Lx(i, j).fetch_one()) { _insert_Rx(i, j); m_insert_callback(i, j); } }
void _insert(Ob i, Ob j) { _insert_Lx(i, j); _insert_Rx(i, j); }