#include "math/lp/monomial_bounds.h"
#include "math/lp/nla_core.h"
#include "math/lp/lar_solver.h"
#include "util/rational.h"
#include "util/rlimit.h"
namespace nla {
void test_monomial_bounds_basic() {
std::cout << "test_monomial_bounds_basic\n";
lp::lar_solver s;
reslimit rl;
params_ref p;
lpvar x = s.add_var(0, true);
lpvar y = s.add_var(1, true);
lpvar z = s.add_var(2, true);
lpvar xyz = s.add_var(3, true);
nla::core nla_solver(s, p, rl);
vector<lpvar> vars;
vars.push_back(x);
vars.push_back(y);
vars.push_back(z);
nla_solver.add_monic(xyz, vars.size(), vars.begin());
s.set_column_value_test(x, lp::impq(rational(2)));
s.set_column_value_test(y, lp::impq(rational(3)));
s.set_column_value_test(z, lp::impq(rational(4)));
s.set_column_value_test(xyz, lp::impq(rational(24)));
lbool result = nla_solver.test_check();
VERIFY(result != l_false); }
void test_monomial_bounds_propagation() {
std::cout << "test_monomial_bounds_propagation\n";
lp::lar_solver s;
reslimit rl;
params_ref p;
lpvar x = s.add_var(0, true);
lpvar y = s.add_var(1, true);
lpvar xy = s.add_var(2, true);
nla::core nla_solver(s, p, rl);
vector<lpvar> vars;
vars.push_back(x);
vars.push_back(y);
nla_solver.add_monic(xy, vars.size(), vars.begin());
s.set_column_value_test(x, lp::impq(rational(0)));
s.set_column_value_test(y, lp::impq(rational(5)));
s.set_column_value_test(xy, lp::impq(rational(0)));
lbool result = nla_solver.test_check();
VERIFY(result != l_false); }
void test_monomial_bounds_intervals() {
std::cout << "test_monomial_bounds_intervals\n";
lp::lar_solver s;
reslimit rl;
params_ref p;
lpvar a = s.add_var(0, true);
lpvar b = s.add_var(1, true);
lpvar ab = s.add_var(2, true);
nla::core nla_solver(s, p, rl);
vector<lpvar> vars;
vars.push_back(a);
vars.push_back(b);
nla_solver.add_monic(ab, vars.size(), vars.begin());
s.set_column_value_test(a, lp::impq(rational(1), rational(2))); s.set_column_value_test(b, lp::impq(rational(3), rational(2))); s.set_column_value_test(ab, lp::impq(rational(3), rational(4)));
lbool result = nla_solver.test_check();
VERIFY(result != l_false); }
void test_monomial_bounds_power() {
std::cout << "test_monomial_bounds_power\n";
lp::lar_solver s;
reslimit rl;
params_ref p;
lpvar x = s.add_var(0, true);
lpvar x_squared = s.add_var(1, true);
nla::core nla_solver(s, p, rl);
vector<lpvar> vars;
vars.push_back(x);
vars.push_back(x);
nla_solver.add_monic(x_squared, vars.size(), vars.begin());
s.set_column_value_test(x, lp::impq(rational(-3)));
s.set_column_value_test(x_squared, lp::impq(rational(9)));
lbool result = nla_solver.test_check();
VERIFY(result != l_false); }
void test_monomial_bounds_linear_case() {
std::cout << "test_monomial_bounds_linear_case\n";
lp::lar_solver s;
reslimit rl;
params_ref p;
lpvar x = s.add_var(0, true);
lpvar mx = s.add_var(1, true);
nla::core nla_solver(s, p, rl);
vector<lpvar> vars;
vars.push_back(x);
nla_solver.add_monic(mx, vars.size(), vars.begin());
s.set_column_value_test(x, lp::impq(rational(7)));
s.set_column_value_test(mx, lp::impq(rational(7)));
lbool result = nla_solver.test_check();
VERIFY(result != l_false); }
void test_monomial_bounds() {
test_monomial_bounds_basic();
test_monomial_bounds_propagation();
test_monomial_bounds_intervals();
test_monomial_bounds_power();
test_monomial_bounds_linear_case();
}
}
void tst_monomial_bounds() {
nla::test_monomial_bounds();
}