void Carrier::unsafe_remove (const Ob ob) { UniqueLock lock(m_mutex); POMAGMA_ASSERT2(m_support.contains(ob), "double removal: " << ob); Ob rep = ob; while (not m_reps[rep].compare_exchange_strong(rep, rep)) {} POMAGMA_ASSERT2(rep, "double removal: " << ob); if (rep == ob) { for (Ob other = ob + 1, end = item_dim(); other <= end; ++other) { POMAGMA_ASSERT2(m_reps[other].load() != ob, "removed rep " << ob << " before dep " << other); } --m_rep_count; } else { for (Ob other = ob + 1, end = item_dim(); other <= end; ++other) { Ob expected = ob; m_reps[other].compare_exchange_strong(expected, rep); } } m_support.remove(ob); m_reps[ob].store(0); --m_item_count; POMAGMA_DEBUG1(m_item_count.load() << " obs after remove()"); }
void Approximator::close(Approximation& approx, DenseSet& temp_set) { POMAGMA_ASSERT_EQ(temp_set.item_dim(), m_item_dim); for (size_t iter = 0;; ++iter) { POMAGMA_DEBUG1("close step " << iter); if (try_close(approx, temp_set)) { return; } } }