void generateMT ( int stripe ) { // Randomly estimate the best pair of sub-patches boost::mt19937 rng(abs(stripe+1) * std::time(NULL)); if (Sample::generateSplit(m_samples, &rng, m_patch_size, m_splits[stripe])) { // Process each patch with the selected R1 and R2 std::vector<IntIndex> val_set(m_samples.size()); for (unsigned int i=0; i < m_samples.size(); ++i) { val_set[i].first = m_samples[i]->evalTest(m_splits[stripe]); val_set[i].second = i; } std::sort(val_set.begin(), val_set.end()); // sort by f_theta findThreshold(m_samples, val_set, m_splits[stripe], &rng); m_splits[stripe].oob = 0; } else { m_splits[stripe].threshold = 0; m_splits[stripe].info = boost::numeric::bounds<double>::lowest(); m_splits[stripe].oob = boost::numeric::bounds<double>::highest(); } };
SetId Approximator::function_lhs_rhs(const Function& fun, SetId lhs, SetId rhs, Parity parity) const { POMAGMA_ASSERT1(lhs, "lhs is undefined"); POMAGMA_ASSERT1(rhs, "rhs is undefined"); POMAGMA_ASSERT1(parity == ABOVE or parity == BELOW, "invalid parity"); const bool upward = (parity == ABOVE); const DenseSet lhs_set = m_sets.load(lhs); // positive const DenseSet rhs_set = m_sets.load(rhs); // positive DenseSet val_set(m_item_dim); // positive const Ob optimum = upward ? m_top : m_bot; POMAGMA_ASSERT1(lhs_set.contains(optimum), "invalid lhs set"); POMAGMA_ASSERT1(rhs_set.contains(optimum), "invalid rhs set"); val_set.insert(optimum); DenseSet temp_set(m_item_dim); for (auto iter = lhs_set.iter(); iter.ok(); iter.next()) { Ob lhs = *iter; // optimize for constant functions if (Ob lhs_top = fun.find(lhs, m_top)) { if (Ob lhs_bot = fun.find(lhs, m_bot)) { if (lhs_top == lhs_bot) { convex_insert(val_set, lhs_top, upward); continue; } } } temp_set.set_insn(rhs_set, fun.get_Lx_set(lhs)); for (auto iter = temp_set.iter(); iter.ok(); iter.next()) { Ob rhs = *iter; Ob val = fun.find(lhs, rhs); convex_insert(val_set, val, upward); } } return m_sets.store(std::move(val_set)); }