Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
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]);
    }
}