Beispiel #1
0
ibex::SystemFactory * contractor_ibex_polytope::build_system_factory(
    vector<Enode *> const & vars, vector<shared_ptr<nonlinear_constraint>> const & ctrs) {
    DREAL_LOG_DEBUG << "build_system_factory:";
    ibex::SystemFactory * sf = new ibex::SystemFactory();
    map<string, ibex::ExprSymbol const *> var_map;  // Needed for translateEnodeToExprCtr

    // Construct System: add Variables
    for (Enode * e : vars) {
        string const & name = e->getCar()->getNameFull();
        DREAL_LOG_INFO << "build_system_factory: Add Variable " << name;
        auto var_it = m_var_cache.find(e);
        ibex::ExprSymbol const * var = nullptr;
        if (var_it == m_var_cache.end()) {
            // Not found
            var = &ibex::ExprSymbol::new_(name.c_str(), ibex::Dim::scalar());
            DREAL_LOG_INFO << "Added: var " << var << endl;
            m_var_cache.emplace(e, var);
        } else {
            // Found
            var = var_it->second;
        }
        var_map.emplace(name, var);
        sf->add_var(*var);
    }
    DREAL_LOG_DEBUG << "build_system_factory: Add Variable: DONE";

    // Construct System: add constraints
    for (shared_ptr<nonlinear_constraint> const ctr : ctrs) {
        if (ctr->is_neq()) {
            continue;
        }
        DREAL_LOG_INFO << "build_system_factory: Add Constraint: " << *ctr;
        Enode * e = ctr->get_enode();
        auto p = e->getPolarity();
        assert(p == l_True || p == l_False);
        auto & m_exprctr_cache = (p == l_True) ? m_exprctr_cache_pos : m_exprctr_cache_neg;
        auto exprctr_it = m_exprctr_cache.find(e);
        ibex::ExprCtr const * exprctr = nullptr;
        if (exprctr_it == m_exprctr_cache.end()) {
            // Not found
            exprctr = translate_enode_to_exprctr(var_map, e);
            m_exprctr_cache.emplace(e, exprctr);
            DREAL_LOG_INFO << "Added: exprctr " << p << " " << *exprctr << endl;
        } else {
            // Found
            exprctr = exprctr_it->second;
        }
        if (exprctr) {
            DREAL_LOG_INFO << "build_system_factory: Add Constraint: expr: " << *exprctr;
            sf->add_ctr(*exprctr);
        }
    }
    DREAL_LOG_DEBUG << "build_system_factory: Add Constraint: "
                    << "DONE";
    DREAL_LOG_DEBUG << "build_system_factory: DONE";
    return sf;
}
Beispiel #2
0
void nonlinear_constraint::build_maps() const {
    std::thread::id const tid = std::this_thread::get_id();
    assert(m_numctr_map.find(tid) == m_numctr_map.cend());
    assert(m_var_array_map.find(tid) == m_var_array_map.cend());
    // Build var_array_map
    map<string, ibex::ExprSymbol const *> var_map = build_var_map(m_domain_vars);
    ibex::Array<ibex::ExprSymbol const> & var_array = m_var_array_map[tid];
    var_array.resize(var_map.size());
    int i = 0;
    for (auto const item : var_map) {
        var_array.set_ref(i++, *(item.second));
    }
    // The use of unique_ptr is to free the returned exprctr* from translate_enode_to_exprctr
    unique_ptr<ibex::ExprCtr const> exprctr(
        translate_enode_to_exprctr(var_map, get_enode(), m_polarity, m_subst));
    m_numctr_map[tid].reset(new ibex::NumConstraint(var_array, *exprctr));
}
Beispiel #3
0
// ====================================================
// Nonlinear constraint
// ====================================================
nonlinear_constraint::nonlinear_constraint(Enode * const e,
                                           unordered_set<Enode*> const & var_set,
                                           lbool const p, unordered_map<Enode*, ibex::Interval> const & subst)
    : constraint(constraint_type::Nonlinear, e), m_is_neq(p == l_False && e->isEq()),
      m_numctr(nullptr), m_var_array(var_set.size()) {
    // Build var_map and var_array
    // Need to pass a fresh copy of var_array everytime it builds NumConstraint
    auto var_map = build_var_map(var_set);
    m_var_array.resize(var_map.size());
    unsigned i = 0;
    for (auto const item : var_map) {
        m_var_array.set_ref(i++, item.second);
    }
    unique_ptr<ibex::ExprCtr const> exprctr(translate_enode_to_exprctr(var_map, e, p, subst));
    m_numctr.reset(new ibex::NumConstraint(m_var_array, *exprctr));
    DREAL_LOG_INFO << "nonlinear_constraint: "<< *this;
}
Beispiel #4
0
// ====================================================
// Nonlinear constraint
// ====================================================
nonlinear_constraint::nonlinear_constraint(Enode * const e, lbool p, std::unordered_map<Enode*, ibex::Interval> const & subst)
    : constraint(constraint_type::Nonlinear, e), m_exprctr(nullptr), m_numctr(nullptr), m_numctr_ineq(nullptr), m_subst(subst) {
    unordered_map<string, ibex::Variable const> var_map;
    bool is_ineq = (p == l_False && e->isEq());
    p = is_ineq ? true : p;

    m_exprctr = translate_enode_to_exprctr(var_map, e, p, m_subst);
    assert(m_exprctr);

    m_var_array.resize(var_map.size());
    unsigned i = 0;
    for (auto const p : var_map) {
        m_var_array.set_ref(i, p.second);
        i++;
    }

    if (is_ineq) {
        m_numctr_ineq = new ibex::NumConstraint(m_var_array, *m_exprctr);
    } else {
        m_numctr = new ibex::NumConstraint(m_var_array, *m_exprctr);
    }
    DREAL_LOG_INFO << "nonlinear_constraint: "<< *this;
}