3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-13 12:28:44 +00:00

remove dead code

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2023-03-07 13:51:56 -08:00
parent f6445891f3
commit e430f28813
8 changed files with 13 additions and 598 deletions

View file

@ -43,12 +43,6 @@ public:
stacked_vector<unsigned> m_r_columns_nz;
stacked_vector<unsigned> m_r_rows_nz;
// d - solver fields, for doubles
stacked_vector<unsigned> m_d_pushed_basis;
vector<unsigned> m_d_basis;
vector<unsigned> m_d_nbasis;
vector<int> m_d_heading;
lp_primal_core_solver<mpq, numeric_pair<mpq>> m_r_solver; // solver in rational numbers
@ -123,14 +117,6 @@ public:
void fill_not_improvable_zero_sum();
void pop_basis(unsigned k) {
m_d_basis = m_r_basis;
m_d_nbasis = m_r_nbasis;
m_d_heading = m_r_heading;
}
void push() {
lp_assert(m_r_solver.basis_heading_is_correct());
lp_assert(m_column_types.size() == m_r_A.column_count());
@ -180,7 +166,6 @@ public:
m_r_solver.m_costs.resize(m_r_A.column_count());
m_r_solver.m_d.resize(m_r_A.column_count());
pop_basis(k);
m_stacked_simplex_strategy.pop(k);
settings().set_simplex_strategy(m_stacked_simplex_strategy);
lp_assert(m_r_solver.basis_heading_is_correct());
@ -356,10 +341,6 @@ public:
return delta;
}
void init_column_row_nz_for_r_solver() {
m_r_solver.init_column_row_non_zeroes();
}
bool column_is_fixed(unsigned j) const {
return m_column_types()[j] == column_type::fixed ||
( m_column_types()[j] == column_type::boxed &&

View file

@ -245,11 +245,7 @@ namespace lp {
set.erase(j);
}
void lar_solver::shrink_inf_set_after_pop(unsigned n, u_set& set) {
clean_popped_elements(n, set);
set.resize(n);
}
void lar_solver::pop(unsigned k) {
TRACE("lar_solver", tout << "k = " << k << std::endl;);
@ -714,11 +710,6 @@ namespace lp {
detect_rows_with_changed_bounds_for_column(j);
}
void lar_solver::update_x_and_inf_costs_for_columns_with_changed_bounds() {
for (auto j : m_columns_with_changed_bounds)
update_x_and_inf_costs_for_column_with_changed_bounds(j);
}
void lar_solver::update_x_and_inf_costs_for_columns_with_changed_bounds_tableau() {
for (auto j : m_columns_with_changed_bounds)
update_x_and_inf_costs_for_column_with_changed_bounds(j);
@ -792,31 +783,6 @@ namespace lp {
}
void lar_solver::fill_last_row_of_A_r(static_matrix<mpq, numeric_pair<mpq>>& A, const lar_term* ls) {
lp_assert(A.row_count() > 0);
lp_assert(A.column_count() > 0);
unsigned last_row = A.row_count() - 1;
lp_assert(A.m_rows[last_row].size() == 0);
for (auto t : *ls) {
lp_assert(!is_zero(t.coeff()));
var_index j = t.column();
A.set(last_row, j, -t.coeff());
}
unsigned basis_j = A.column_count() - 1;
A.set(last_row, basis_j, mpq(1));
}
template <typename U, typename V>
void lar_solver::copy_from_mpq_matrix(static_matrix<U, V>& matr) {
matr.m_rows.resize(A_r().row_count());
matr.m_columns.resize(A_r().column_count());
for (unsigned i = 0; i < matr.row_count(); i++) {
for (auto& it : A_r().m_rows[i]) {
matr.set(i, it.var(), convert_struct<U, mpq>::convert(it.coeff()));
}
}
}
bool lar_solver::all_constrained_variables_are_registered(const vector<std::pair<mpq, var_index>>& left_side) {
for (auto it : left_side) {
if (!var_is_registered(it.second))

View file

@ -122,7 +122,6 @@ class lar_solver : public column_namer {
bool term_is_int(const lar_term * t) const;
bool term_is_int(const vector<std::pair<mpq, unsigned int>> & coeffs) const;
void add_non_basic_var_to_core_fields(unsigned ext_j, bool is_int);
void add_new_var_to_core_fields_for_doubles(bool register_in_basis);
void add_new_var_to_core_fields_for_mpq(bool register_in_basis);
mpq adjust_bound_for_int(lpvar j, lconstraint_kind&, const mpq&);
@ -131,7 +130,6 @@ class lar_solver : public column_namer {
var_index add_term_undecided(const vector<std::pair<mpq, var_index>> & coeffs);
bool term_coeffs_are_ok(const vector<std::pair<mpq, var_index>> & coeffs);
void push_term(lar_term* t);
void add_row_for_term(const lar_term * term, unsigned term_ext_index);
void add_row_from_term_no_constraint(const lar_term * term, unsigned term_ext_index);
void add_basic_var_to_core_fields();
bool compare_values(impq const& lhs, lconstraint_kind k, const mpq & rhs);
@ -187,7 +185,6 @@ class lar_solver : public column_namer {
analyze_new_bounds_on_row_tableau(i, bp);
}
static void clean_popped_elements(unsigned n, u_set& set);
static void shrink_inf_set_after_pop(unsigned n, u_set & set);
bool maximize_term_on_tableau(const lar_term & term,
impq &term_max);
bool costs_are_zeros_for_r_solver() const;
@ -213,17 +210,10 @@ class lar_solver : public column_namer {
void detect_rows_with_changed_bounds_for_column(unsigned j);
void detect_rows_with_changed_bounds();
void update_x_and_inf_costs_for_columns_with_changed_bounds();
void update_x_and_inf_costs_for_columns_with_changed_bounds_tableau();
void solve_with_core_solver();
numeric_pair<mpq> get_basic_var_value_from_row(unsigned i);
bool x_is_correct() const;
void fill_last_row_of_A_r(static_matrix<mpq, numeric_pair<mpq>> & A, const lar_term * ls);
template <typename U, typename V>
void create_matrix_A(static_matrix<U, V> & matr);
template <typename U, typename V>
void copy_from_mpq_matrix(static_matrix<U, V> & matr);
bool try_to_set_fixed(column_info<mpq> & ci);
bool all_constrained_variables_are_registered(const vector<std::pair<mpq, var_index>>& left_side);
bool all_constraints_hold() const;
bool constraint_holds(const lar_base_constraint & constr, std::unordered_map<var_index, mpq> & var_map) const;
@ -231,7 +221,6 @@ class lar_solver : public column_namer {
static void register_in_map(std::unordered_map<var_index, mpq> & coeffs, const lar_base_constraint & cn, const mpq & a);
static void register_monoid_in_map(std::unordered_map<var_index, mpq> & coeffs, const mpq & a, unsigned j);
bool the_left_sides_sum_to_zero(const vector<std::pair<mpq, unsigned>> & evidence) const;
bool the_right_sides_do_not_sum_to_zero(const vector<std::pair<mpq, unsigned>> & evidence);
bool explanation_is_correct(explanation&) const;
bool inf_explanation_is_correct() const;
mpq sum_of_right_sides_of_explanation(explanation &) const;
@ -251,21 +240,16 @@ class lar_solver : public column_namer {
void remove_last_column_from_tableau();
void pop_tableau();
void clean_inf_set_of_r_solver_after_pop();
void shrink_explanation_to_minimum(vector<std::pair<mpq, constraint_index>> & explanation) const;
inline bool column_value_is_integer(unsigned j) const { return get_column_value(j).is_int(); }
bool model_is_int_feasible() const;
bool bound_is_integer_for_integer_column(unsigned j, const mpq & right_side) const;
inline lar_core_solver & get_core_solver() { return m_mpq_lar_core_solver; }
void catch_up_in_updating_int_solver();
var_index to_column(unsigned ext_j) const;
void fix_terms_with_rounded_columns();
void update_delta_for_terms(const impq & delta, unsigned j, const vector<unsigned>&);
void fill_vars_to_terms(vector<vector<unsigned>> & vars_to_terms);
bool remove_from_basis(unsigned);
lar_term get_term_to_maximize(unsigned ext_j) const;
bool sum_first_coords(const lar_term& t, mpq & val) const;
void collect_rounded_rows_to_fix();
void register_normalized_term(const lar_term&, lpvar);
void deregister_normalized_term(const lar_term&);

View file

@ -80,7 +80,7 @@ public:
vector<unsigned> & m_basis;
vector<unsigned>& m_nbasis;
vector<int>& m_basis_heading;
vector<X> & m_x; // a feasible solution, the fist time set in the constructor
vector<X> & m_x; // a feasible solution, the first time set in the constructor
vector<T> & m_costs;
lp_settings & m_settings;

View file

@ -49,7 +49,6 @@ public:
indexed_vector<T> m_beta; // see Swietanowski working vector beta for column norms
T m_epsilon_of_reduced_cost;
vector<T> m_costs_backup;
T m_converted_harris_eps;
unsigned m_inf_row_index_for_tableau;
bool m_bland_mode_tableau;
u_set m_left_basis_tableau;
@ -277,13 +276,8 @@ public:
return convert_struct<X, unsigned>::convert(std::numeric_limits<unsigned>::max());
}
bool get_harris_theta(X & theta);
void zero_harris_eps() { m_converted_harris_eps = zero_of_type<T>(); }
int find_leaving_on_harris_theta(X const & harris_theta, X & t);
bool try_jump_to_another_bound_on_entering(unsigned entering, const X & theta, X & t, bool & unlimited);
bool try_jump_to_another_bound_on_entering_unlimited(unsigned entering, X & t);
int find_leaving_and_t_precise(unsigned entering, X & t);
int find_leaving_and_t_tableau(unsigned entering, X & t);
void limit_theta(const X & lim, X & theta, bool & unlimited) {
@ -317,9 +311,6 @@ public:
limit_inf_on_bound_m_pos(m, this->m_x[j], this->m_upper_bounds[j], theta, unlimited);
};
X harris_eps_for_bound(const X & bound) const { return ( convert_struct<X, int>::convert(1) + abs(bound)/10) * m_converted_harris_eps/3;
}
void get_bound_on_variable_and_update_leaving_precisely(unsigned j, vector<unsigned> & leavings, T m, X & t, T & abs_of_d_of_leaving);
vector<T> m_lower_bounds_dummy; // needed for the base class only
@ -489,20 +480,9 @@ public:
this->set_status(this->current_x_is_feasible()? lp_status::OPTIMAL: lp_status::INFEASIBLE);
}
// void limit_theta_on_basis_column_for_feas_case_m_neg(unsigned j, const T & m, X & theta) {
// lp_assert(m < 0);
// lp_assert(this->m_column_type[j] == lower_bound || this->m_column_type[j] == boxed);
// const X & eps = harris_eps_for_bound(this->m_lower_bounds[j]);
// if (this->above_bound(this->m_x[j], this->m_lower_bounds[j])) {
// theta = std::min((this->m_lower_bounds[j] -this->m_x[j] - eps) / m, theta);
// if (theta < zero_of_type<X>()) theta = zero_of_type<X>();
// }
// }
void limit_theta_on_basis_column_for_feas_case_m_neg_no_check(unsigned j, const T & m, X & theta, bool & unlimited) {
lp_assert(m < 0);
const X& eps = harris_eps_for_bound(this->m_lower_bounds[j]);
limit_theta((this->m_lower_bounds[j] - this->m_x[j] - eps) / m, theta, unlimited);
limit_theta((this->m_lower_bounds[j] - this->m_x[j]) / m, theta, unlimited);
if (theta < zero_of_type<X>()) theta = zero_of_type<X>();
}
@ -545,25 +525,21 @@ public:
void limit_inf_on_upper_bound_m_neg(const T & m, const X & x, const X & bound, X & theta, bool & unlimited) {
// x gets smaller
lp_assert(m < 0);
const X& eps = harris_eps_for_bound(bound);
if (this->above_bound(x, bound)) {
limit_theta((bound - x - eps) / m, theta, unlimited);
limit_theta((bound - x) / m, theta, unlimited);
}
}
void limit_theta_on_basis_column_for_inf_case_m_pos_boxed(unsigned j, const T & m, X & theta, bool & unlimited) {
// lp_assert(m > 0 && this->m_column_type[j] == column_type::boxed);
const X & x = this->m_x[j];
const X & lbound = this->m_lower_bounds[j];
if (this->below_bound(x, lbound)) {
const X& eps = harris_eps_for_bound(this->m_upper_bounds[j]);
limit_theta((lbound - x + eps) / m, theta, unlimited);
limit_theta((lbound - x) / m, theta, unlimited);
} else {
const X & ubound = this->m_upper_bounds[j];
if (this->below_bound(x, ubound)){
const X& eps = harris_eps_for_bound(ubound);
limit_theta((ubound - x + eps) / m, theta, unlimited);
limit_theta((ubound - x) / m, theta, unlimited);
} else if (!this->above_bound(x, ubound)) {
theta = zero_of_type<X>();
unlimited = false;
@ -576,13 +552,11 @@ public:
const X & x = this->m_x[j];
const X & ubound = this->m_upper_bounds[j];
if (this->above_bound(x, ubound)) {
const X& eps = harris_eps_for_bound(ubound);
limit_theta((ubound - x - eps) / m, theta, unlimited);
limit_theta((ubound - x) / m, theta, unlimited);
} else {
const X & lbound = this->m_lower_bounds[j];
if (this->above_bound(x, lbound)){
const X& eps = harris_eps_for_bound(lbound);
limit_theta((lbound - x - eps) / m, theta, unlimited);
limit_theta((lbound - x) / m, theta, unlimited);
} else if (!this->below_bound(x, lbound)) {
theta = zero_of_type<X>();
unlimited = false;
@ -591,9 +565,8 @@ public:
}
void limit_theta_on_basis_column_for_feas_case_m_pos(unsigned j, const T & m, X & theta, bool & unlimited) {
lp_assert(m > 0);
const T& eps = harris_eps_for_bound(this->m_upper_bounds[j]);
if (this->below_bound(this->m_x[j], this->m_upper_bounds[j])) {
limit_theta((this->m_upper_bounds[j] - this->m_x[j] + eps) / m, theta, unlimited);
limit_theta((this->m_upper_bounds[j] - this->m_x[j]) / m, theta, unlimited);
if (theta < zero_of_type<X>()) {
theta = zero_of_type<X>();
unlimited = false;
@ -603,8 +576,7 @@ public:
void limit_theta_on_basis_column_for_feas_case_m_pos_no_check(unsigned j, const T & m, X & theta, bool & unlimited ) {
lp_assert(m > 0);
const X& eps = harris_eps_for_bound(this->m_upper_bounds[j]);
limit_theta( (this->m_upper_bounds[j] - this->m_x[j] + eps) / m, theta, unlimited);
limit_theta( (this->m_upper_bounds[j] - this->m_x[j]) / m, theta, unlimited);
if (theta < zero_of_type<X>()) {
theta = zero_of_type<X>();
}
@ -612,9 +584,9 @@ public:
// j is a basic column or the entering, in any case x[j] has to stay feasible.
// m is the multiplier. updating t in a way that holds the following
// x[j] + t * m >= this->m_lower_bounds[j]- harris_feasibility_tolerance ( if m < 0 )
// x[j] + t * m >= this->m_lower_bounds[j]( if m < 0 )
// or
// x[j] + t * m <= this->m_upper_bounds[j] + harris_feasibility_tolerance ( if m > 0)
// x[j] + t * m <= this->m_upper_bounds[j] ( if m > 0)
void limit_theta_on_basis_column(unsigned j, T m, X & theta, bool & unlimited) {
switch (this->m_column_types[j]) {
case column_type::free_column: break;
@ -679,7 +651,6 @@ public:
bool column_is_benefitial_for_entering_basis(unsigned j) const;
bool column_is_benefitial_for_entering_basis_precise(unsigned j) const;
bool can_enter_basis(unsigned j);
bool done();
void init_infeasibility_costs();
void init_infeasibility_cost_for_column(unsigned j);
@ -694,90 +665,8 @@ public:
return (a > zero_of_type<L>() && m_sign_of_entering_delta > 0) || (a < zero_of_type<L>() && m_sign_of_entering_delta < 0);
}
bool lower_bounds_are_set() const override { return true; }
void print_bound_info_and_x(unsigned j, std::ostream & out);
void init_infeasibility_after_update_x_if_inf(unsigned leaving) {
if (this->using_infeas_costs()) {
init_infeasibility_costs_for_changed_basis_only();
this->m_costs[leaving] = zero_of_type<T>();
this->remove_column_from_inf_set(leaving);
}
}
void init_inf_set() {
this->clear_inf_set();
for (unsigned j = 0; j < this->m_n(); j++) {
if (this->m_basis_heading[j] < 0)
continue;
if (!this->column_is_feasible(j))
this->insert_column_into_inf_set(j);
}
}
int get_column_out_of_bounds_delta_sign(unsigned j) {
switch (this->m_column_types[j]) {
case column_type::fixed:
case column_type::boxed:
if (this->x_below_low_bound(j))
return -1;
if (this->x_above_upper_bound(j))
return 1;
break;
case column_type::lower_bound:
if (this->x_below_low_bound(j))
return -1;
break;
case column_type::upper_bound:
if (this->x_above_upper_bound(j))
return 1;
break;
case column_type::free_column:
return 0;
default:
lp_assert(false);
}
return 0;
}
void init_column_row_non_zeroes() {
this->m_columns_nz.resize(this->m_A.column_count());
this->m_rows_nz.resize(this->m_A.row_count());
for (unsigned i = 0; i < this->m_A.column_count(); i++) {
if (this->m_columns_nz[i] == 0)
this->m_columns_nz[i] = this->m_A.m_columns[i].size();
}
for (unsigned i = 0; i < this->m_A.row_count(); i++) {
if (this->m_rows_nz[i] == 0)
this->m_rows_nz[i] = this->m_A.m_rows[i].size();
}
}
int x_at_bound_sign(unsigned j) {
switch (this->m_column_types[j]) {
case column_type::fixed:
return 0;
case column_type::boxed:
if (this->x_is_at_lower_bound(j))
return 1;
return -1;
break;
case column_type::lower_bound:
return 1;
break;
case column_type::upper_bound:
return -1;
break;
default:
lp_assert(false);
}
return 0;
}
unsigned solve_with_tableau();
bool basis_column_is_set_correctly(unsigned j) const {
@ -844,10 +733,6 @@ public:
m_beta(A.row_count()),
m_epsilon_of_reduced_cost(T(1)/T(10000000)),
m_bland_mode_threshold(1000) {
m_converted_harris_eps = zero_of_type<T>();
this->set_status(lp_status::UNKNOWN);
}

View file

@ -142,53 +142,6 @@ int lp_primal_core_solver<T, X>::choose_entering_column(unsigned number_of_benef
return choose_entering_column_presize(number_of_benefitial_columns_to_go_over);
}
template <typename T, typename X> bool lp_primal_core_solver<T, X>::get_harris_theta(X & theta) {
bool unlimited = true;
for (unsigned i : this->m_ed.m_index) {
if (this->m_settings.abs_val_is_smaller_than_pivot_tolerance(this->m_ed[i])) continue;
limit_theta_on_basis_column(this->m_basis[i], - this->m_ed[i] * m_sign_of_entering_delta, theta, unlimited);
if (!unlimited && is_zero<X>(theta)) break;
}
return unlimited;
}
template <typename T, typename X> int lp_primal_core_solver<T, X>::
find_leaving_on_harris_theta(X const & harris_theta, X & t) {
int leaving = -1;
T pivot_abs_max = zero_of_type<T>();
// we know already that there is no bound flip on entering
// we also know that harris_theta is limited, so we will find a leaving
zero_harris_eps();
unsigned steps = this->m_ed.m_index.size();
unsigned k = this->m_settings.random_next() % steps;
unsigned initial_k = k;
do {
unsigned i = this->m_ed.m_index[k];
const T & ed = this->m_ed[i];
if (this->m_settings.abs_val_is_smaller_than_pivot_tolerance(ed)) {
if (++k == steps)
k = 0;
continue;
}
X ratio;
unsigned j = this->m_basis[i];
bool unlimited = true;
limit_theta_on_basis_column(j, - ed * m_sign_of_entering_delta, ratio, unlimited);
if ((!unlimited) && ratio <= harris_theta) {
if (leaving == -1 || abs(ed) > pivot_abs_max) {
t = ratio;
leaving = j;
pivot_abs_max = abs(ed);
}
}
if (++k == steps) k = 0;
} while (k != initial_k);
return leaving;
}
template <typename T, typename X> bool lp_primal_core_solver<T, X>::try_jump_to_another_bound_on_entering(unsigned entering,
const X & theta,
X & t,
@ -246,68 +199,6 @@ try_jump_to_another_bound_on_entering_unlimited(unsigned entering, X & t ) {
return true;
}
template <typename T, typename X> int lp_primal_core_solver<T, X>::find_leaving_and_t_precise(unsigned entering, X & t) {
bool unlimited = true;
unsigned steps = this->m_ed.m_index.size();
unsigned k = this->m_settings.random_next() % steps;
unsigned initial_k = k;
unsigned row_min_nz = this->m_n() + 1;
m_leaving_candidates.clear();
do {
unsigned i = this->m_ed.m_index[k];
const T & ed = this->m_ed[i];
lp_assert(!numeric_traits<T>::is_zero(ed));
unsigned j = this->m_basis[i];
limit_theta_on_basis_column(j, - ed * m_sign_of_entering_delta, t, unlimited);
if (!unlimited) {
m_leaving_candidates.push_back(j);
row_min_nz = this->m_rows_nz[i];
}
if (++k == steps) k = 0;
} while (unlimited && k != initial_k);
if (unlimited) {
if (try_jump_to_another_bound_on_entering_unlimited(entering, t))
return entering;
return -1;
}
X ratio;
while (k != initial_k) {
unsigned i = this->m_ed.m_index[k];
const T & ed = this->m_ed[i];
lp_assert(!numeric_traits<T>::is_zero(ed));
unsigned j = this->m_basis[i];
unlimited = true;
limit_theta_on_basis_column(j, -ed * m_sign_of_entering_delta, ratio, unlimited);
if (unlimited) {
if (++k == steps) k = 0;
continue;
}
unsigned i_nz = this->m_rows_nz[i];
if (ratio < t) {
t = ratio;
m_leaving_candidates.clear();
m_leaving_candidates.push_back(j);
row_min_nz = this->m_rows_nz[i];
} else if (ratio == t && i_nz < row_min_nz) {
m_leaving_candidates.clear();
m_leaving_candidates.push_back(j);
row_min_nz = this->m_rows_nz[i];
} else if (ratio == t && i_nz == row_min_nz) {
m_leaving_candidates.push_back(j);
}
if (++k == steps) k = 0;
}
ratio = t;
unlimited = false;
if (try_jump_to_another_bound_on_entering(entering, t, ratio, unlimited)) {
t = ratio;
return entering;
}
k = this->m_settings.random_next() % m_leaving_candidates.size();
return m_leaving_candidates[k];
}
@ -499,17 +390,6 @@ template <typename T, typename X> void lp_primal_core_solver<T, X>::one_iteratio
template <typename T, typename X> bool lp_primal_core_solver<T, X>::done() {
if (this->get_status() == lp_status::OPTIMAL) return true;
if (this->get_status() == lp_status::INFEASIBLE) {
return true;
}
if (this->m_iters_with_no_cost_growing >= this->m_settings.max_number_of_iterations_with_no_improvements) {
this->set_status(lp_status::CANCELLED);
return true;
}
return false;
}
template <typename T, typename X>
void lp_primal_core_solver<T, X>::init_infeasibility_costs_for_changed_basis_only() {

View file

@ -43,6 +43,7 @@ template <typename T, typename X> void lp_primal_core_solver<T, X>::advance_on_e
}
advance_on_entering_and_leaving_tableau(entering, leaving, t);
}
template <typename T, typename X> int lp_primal_core_solver<T, X>::choose_entering_column_tableau() {
//this moment m_y = cB * B(-1)
unsigned number_of_benefitial_columns_to_go_over = get_number_of_non_basic_column_to_try_for_enter();
@ -85,9 +86,6 @@ template <typename T, typename X> void lp_primal_core_solver<T, X>::advance_on_e
}
template <typename T, typename X>
unsigned lp_primal_core_solver<T, X>::solve_with_tableau() {
init_run_tableau();

View file

@ -56,7 +56,6 @@
#include "math/lp/int_cube.h"
#include "math/lp/emonics.h"
#include "math/lp/static_matrix.h"
#include "math/lp/dense_matrix.h"
bool my_white_space(const char & a) {
return a == ' ' || a == '\t';
@ -431,205 +430,8 @@ void change_basis(unsigned entering, unsigned leaving, vector<unsigned>& basis,
nbasis[place_in_non_basis] = leaving;
}
#ifdef Z3DEBUG
void test_small_lu(lp_settings & settings) {
}
#endif
void fill_long_row(static_matrix<double, double> &m, int i) {
int n = m.column_count();
for (int j = 0; j < n; j ++) {
m (i, (j + i) % n) = j * j;
}
}
void fill_long_row_exp(static_matrix<double, double> &m, int i) {
int n = m.column_count();
for (int j = 0; j < n; j ++) {
m(i, j) = my_random() % 20;
}
}
int perm_id = 0;
void init_b(vector<double> & b, static_matrix<double, double> & m, vector<double> & x) {
for (unsigned i = 0; i < m.row_count(); i++) {
b.push_back(m.dot_product_with_row(i, x));
}
}
void test_lp_0() {
std::cout << " test_lp_0 " << std::endl;
static_matrix<double, double> m_(3, 7);
m_(0, 0) = 3; m_(0, 1) = 2; m_(0, 2) = 1; m_(0, 3) = 2; m_(0, 4) = 1;
m_(1, 0) = 1; m_(1, 1) = 1; m_(1, 2) = 1; m_(1, 3) = 1; m_(1, 5) = 1;
m_(2, 0) = 4; m_(2, 1) = 3; m_(2, 2) = 3; m_(2, 3) = 4; m_(2, 6) = 1;
vector<double> x_star(7);
x_star[0] = 225; x_star[1] = 117; x_star[2] = 420;
x_star[3] = x_star[4] = x_star[5] = x_star[6] = 0;
vector<double> b;
init_b(b, m_, x_star);
vector<unsigned> basis(3);
basis[0] = 0; basis[1] = 1; basis[2] = 2;
vector<double> costs(7);
costs[0] = 19;
costs[1] = 13;
costs[2] = 12;
costs[3] = 17;
costs[4] = 0;
costs[5] = 0;
costs[6] = 0;
vector<column_type> column_types(7, column_type::lower_bound);
vector<double> upper_bound_values;
lp_settings settings;
simple_column_namer cn;
vector<unsigned> nbasis;
vector<int> heading;
lp_primal_core_solver<double, double> lpsolver(m_, b, x_star, basis, nbasis, heading, costs, column_types, upper_bound_values, settings, cn);
lpsolver.solve();
}
void test_lp_1() {
std::cout << " test_lp_1 " << std::endl;
static_matrix<double, double> m(4, 7);
m(0, 0) = 1; m(0, 1) = 3; m(0, 2) = 1; m(0, 3) = 1;
m(1, 0) = -1; m(1, 2) = 3; m(1, 4) = 1;
m(2, 0) = 2; m(2, 1) = -1; m(2, 2) = 2; m(2, 5) = 1;
m(3, 0) = 2; m(3, 1) = 3; m(3, 2) = -1; m(3, 6) = 1;
#ifdef Z3DEBUG
//print_matrix(m, std::cout);
#endif
vector<double> x_star(7);
x_star[0] = 0; x_star[1] = 0; x_star[2] = 0;
x_star[3] = 3; x_star[4] = 2; x_star[5] = 4; x_star[6] = 2;
vector<unsigned> basis(4);
basis[0] = 3; basis[1] = 4; basis[2] = 5; basis[3] = 6;
vector<double> b;
b.push_back(3);
b.push_back(2);
b.push_back(4);
b.push_back(2);
vector<double> costs(7);
costs[0] = 5;
costs[1] = 5;
costs[2] = 3;
costs[3] = 0;
costs[4] = 0;
costs[5] = 0;
costs[6] = 0;
vector<column_type> column_types(7, column_type::lower_bound);
vector<double> upper_bound_values;
std::cout << "calling lp\n";
lp_settings settings;
simple_column_namer cn;
vector<unsigned> nbasis;
vector<int> heading;
lp_primal_core_solver<double, double> lpsolver(m, b,
x_star,
basis,
nbasis, heading,
costs,
column_types, upper_bound_values, settings, cn);
lpsolver.solve();
}
void test_lp_primal_core_solver() {
test_lp_0();
test_lp_1();
}
#ifdef Z3DEBUG
void fill_uniformly(dense_matrix<double, double> & m, unsigned dim) {
int v = 0;
for (unsigned i = 0; i < dim; i++) {
for (unsigned j = 0; j < dim; j++) {
m.set_elem(i, j, v++);
}
}
}
void test_dense_matrix() {
dense_matrix<double, double> d(3, 2);
d.set_elem(0, 0, 1);
d.set_elem(1, 1, 2);
d.set_elem(2, 0, 3);
// print_matrix(d);
dense_matrix<double, double> unit(2, 2);
d.set_elem(0, 0, 1);
d.set_elem(1, 1, 1);
dense_matrix<double, double> c = d * unit;
// print_matrix(d);
dense_matrix<double, double> perm(3, 3);
perm.set_elem(0, 1, 1);
perm.set_elem(1, 0, 1);
perm.set_elem(2, 2, 1);
auto c1 = perm * d;
// print_matrix(c1);
dense_matrix<double, double> p2(2, 2);
p2.set_elem(0, 1, 1);
p2.set_elem(1, 0, 1);
auto c2 = d * p2;
}
#endif
void lp_solver_test() {
// lp_revised_solver<double> lp_revised;
// lp_revised.get_minimal_solution();
}
bool get_int_from_args_parser(const char * option, argument_parser & args_parser, unsigned & n) {
std::string s = args_parser.get_option_value(option);
if (!s.empty()) {
@ -650,9 +452,6 @@ bool get_double_from_args_parser(const char * option, argument_parser & args_par
bool values_are_one_percent_close(double a, double b);
void get_time_limit_and_max_iters_from_parser(argument_parser & args_parser, unsigned & time_limit); // forward definition
@ -939,10 +738,6 @@ void setup_args_parser(argument_parser & parser) {
parser.add_option_with_help_string("-gomory", "gomory");
parser.add_option_with_help_string("-intd", "test integer_domain");
parser.add_option_with_help_string("-xyz_sample", "run a small interactive scenario");
parser.add_option_with_after_string_with_help("--density", "the percentage of non-zeroes in the matrix below which it is not dense");
parser.add_option_with_after_string_with_help("--harris_toler", "harris tolerance");
parser.add_option_with_after_string_with_help("--checklu", "the file name for lu checking");
parser.add_option_with_after_string_with_help("--partial_pivot", "the partial pivot constant, a number somewhere between 10 and 100");
parser.add_option_with_after_string_with_help("--percent_for_enter", "which percent of columns check for entering column");
parser.add_option_with_help_string("--totalinf", "minimizes the total infeasibility instead of diminishing infeasibility of the rows");
parser.add_option_with_after_string_with_help("--rep_frq", "the report frequency, in how many iterations print the cost and other info ");
@ -1202,71 +997,6 @@ void get_matrix_dimensions(std::ifstream & f, unsigned & m, unsigned & n) {
n = atoi(r[1].c_str());
}
void read_row_cols(unsigned i, static_matrix<double, double>& A, std::ifstream & f) {
do {
std::string line;
getline(f, line);
if (line== "row_end")
break;
auto r = split_and_trim(line);
lp_assert(r.size() == 4);
unsigned j = atoi(r[1].c_str());
double v = atof(r[3].c_str());
A.set(i, j, v);
} while (true);
}
bool read_row(static_matrix<double, double> & A, std::ifstream & f) {
std::string line;
getline(f, line);
if (static_cast<int>(line.find("row")) == -1)
return false;
auto r = split_and_trim(line);
if (r[0] != "row")
std::cout << "wrong row line" << line << std::endl;
unsigned i = atoi(r[1].c_str());
read_row_cols(i, A, f);
return true;
}
void read_rows(static_matrix<double, double>& A, std::ifstream & f) {
while (read_row(A, f)) {}
}
void read_basis(vector<unsigned> & basis, std::ifstream & f) {
std::cout << "reading basis" << std::endl;
std::string line;
getline(f, line);
lp_assert(line == "basis_start");
do {
getline(f, line);
if (line == "basis_end")
break;
unsigned j = atoi(line.c_str());
basis.push_back(j);
} while (true);
}
void read_indexed_vector(indexed_vector<double> & v, std::ifstream & f) {
std::string line;
getline(f, line);
lp_assert(line == "vector_start");
do {
getline(f, line);
if (line == "vector_end") break;
auto r = split_and_trim(line);
unsigned i = atoi(r[0].c_str());
double val = atof(r[1].c_str());
v.set_value(val, i);
std::cout << "setting value " << i << " = " << val << std::endl;
} while (true);
}
void check_lu_from_file(std::string lufile_name) {
lp_assert(false);
}
void print_st(lp_status status) {
std::cout << lp_status_to_string(status) << std::endl;
@ -2298,15 +2028,6 @@ void test_lp_local(int argn, char**argv) {
test_bound_propagation();
return finalize(0);
}
std::string lufile = args_parser.get_option_value("--checklu");
if (!lufile.empty()) {
check_lu_from_file(lufile);
return finalize(0);
}
if (args_parser.option_is_used("-tbq")) {