3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-03-09 23:00:30 +00:00
z3/src/math/simplex/model_based_opt.h
Nikolaj Bjorner 339cd6e537 mbo
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2016-05-20 13:45:50 -07:00

136 lines
3.7 KiB
C++

/*++
Copyright (c) 2016 Microsoft Corporation
Module Name:
model_based_opt.h
Abstract:
Model-based optimization for linear real arithmetic.
Author:
Nikolaj Bjorner (nbjorner) 2016-27-4
Revision History:
--*/
#ifndef __MODEL_BASED_OPT_H__
#define __MODEL_BASED_OPT_H__
#include "util.h"
#include "rational.h"
#include"inf_eps_rational.h"
namespace opt {
enum ineq_type {
t_eq,
t_lt,
t_le
};
typedef inf_eps_rational<inf_rational> inf_eps;
class model_based_opt {
public:
struct var {
unsigned m_id;
rational m_coeff;
var(unsigned id, rational const& c): m_id(id), m_coeff(c) {}
struct compare {
bool operator()(var x, var y) {
return x.m_id < y.m_id;
}
};
};
struct row {
row(): m_type(t_le), m_value(0), m_alive(false) {}
vector<var> m_vars; // variables with coefficients
rational m_coeff; // constant in inequality
ineq_type m_type; // inequality type
rational m_value; // value of m_vars + m_coeff under interpretation of m_var2value.
bool m_alive; // rows can be marked dead if they have been processed.
};
private:
vector<row> m_rows;
static const unsigned m_objective_id = 0;
vector<unsigned_vector> m_var2row_ids;
vector<rational> m_var2value;
vector<var> m_new_vars;
unsigned_vector m_lub, m_glb;
bool invariant();
bool invariant(unsigned index, row const& r);
row& objective() { return m_rows[0]; }
bool find_bound(unsigned x, unsigned& bound_index, rational& bound_coeff, unsigned_vector& other, bool is_pos);
rational get_coefficient(unsigned row_id, unsigned var_id);
void resolve(unsigned row_src, rational const& a1, unsigned row_dst, unsigned x);
void mul_add(bool same_sign, unsigned row_id1, rational const& c, unsigned row_id2);
void set_row(unsigned row_id, vector<var> const& coeffs, rational const& c, ineq_type rel);
void update_values(unsigned_vector const& bound_vars, unsigned_vector const& bound_trail);
void project(unsigned var);
void solve_for(unsigned row_id, unsigned x);
public:
model_based_opt();
// add a fresh variable with value 'value'.
unsigned add_var(rational const& value);
// retrieve updated value of variable.
rational get_value(unsigned var_id);
// add a constraint. We assume that the constraint is
// satisfied under the values provided to the variables.
void add_constraint(vector<var> const& coeffs, rational const& c, ineq_type r);
// Set the objective function (linear).
void set_objective(vector<var> const& coeffs, rational const& c);
//
// find a maximal value for the objective function over the current values.
// in other words, the returned maximal value may not be globally optimal,
// but the current evaluation of variables are used to select a local
// optimal.
//
inf_eps maximize();
//
// Project set of variables from inequalities.
//
void project(unsigned num_vars, unsigned const* vars);
//
// Extract current rows (after projection).
//
void get_live_rows(vector<row>& rows);
void display(std::ostream& out) const;
void display(std::ostream& out, row const& r) const;
};
}
std::ostream& operator<<(std::ostream& out, opt::ineq_type ie);
#endif