Server::SolutionSet Server::solve(const std::string& program, size_t max_solutions) { std::istringstream infile(program); auto listings = m_parser.parse(infile); POMAGMA_ASSERT_LE(1, listings.size()); m_return.clear(); m_nreturn.clear(); for (const auto& listing : listings) { vm::Program program = m_parser.find_program(listing); m_virtual_machine.execute(program); } POMAGMA_ASSERT(m_return.get_set().disjoint(m_nreturn.get_set()), "inconsistent query result; check programs:\n" << program); SolutionSet solutions; print_ob_set(m_return.get_set(), solutions.necessary, max_solutions); POMAGMA_ASSERT_LE(solutions.necessary.size(), max_solutions); max_solutions -= solutions.necessary.size(); if (max_solutions > 0) { // TODO only execute NRETURN programs if needed DenseSet possible(m_structure.carrier().item_dim()); possible.set_pnn(m_structure.carrier().support(), m_return.get_set(), m_nreturn.get_set()); print_ob_set(possible, solutions.possible, max_solutions); } return solutions; }
Carrier::Carrier ( size_t item_dim, void (*insert_callback) (Ob), void (*merge_callback) (Ob)) : m_support(item_dim), m_item_count(0), m_rep_count(0), m_reps(alloc_blocks<Rep>(1 + item_dim)), m_insert_callback(insert_callback), m_merge_callback(merge_callback) { POMAGMA_DEBUG("creating Carrier with " << item_dim << " items"); POMAGMA_ASSERT_LE(item_dim, MAX_ITEM_DIM); construct_blocks(m_reps, 1 + item_dim, 0); }
inline void ProgramParser::dump_continuation( Program program, const Context_<Ob, SetPtr>* context, std::string& message) { ptrdiff_t program_offset = program - m_program_data.data(); if (POMAGMA_DEBUG_LEVEL) { POMAGMA_ASSERT_LE(0, program_offset); POMAGMA_ASSERT_LT(static_cast<size_t>(program_offset), m_program_data.size()); } const std::vector<uint8_t>& obs_used = find_obs_used_by(program_offset); io::Varint32Writer writer(message, 1 + obs_used.size()); writer.write(program_offset); for (auto index : obs_used) { writer.write(context->obs[index]); } }