#include "math/lp/nla_intervals.h"
#include "math/lp/nla_core.h"
#include "math/lp/lar_solver.h"
#include "util/rational.h"
#include "util/rlimit.h"
#include <iostream>
namespace nla {
void test_nla_intervals_basic() {
std::cout << "test_nla_intervals_basic\n";
reslimit rl;
params_ref p;
lp::lar_solver s;
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.add_var_bound(x, lp::lconstraint_kind::GE, rational(1));
s.add_var_bound(x, lp::lconstraint_kind::LE, rational(3));
s.add_var_bound(y, lp::lconstraint_kind::GE, rational(2));
s.add_var_bound(y, lp::lconstraint_kind::LE, rational(4));
VERIFY(true); }
void test_nla_intervals_negative() {
std::cout << "test_nla_intervals_negative\n";
reslimit rl;
params_ref p;
lp::lar_solver s;
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.add_var_bound(x, lp::lconstraint_kind::GE, rational(-3));
s.add_var_bound(x, lp::lconstraint_kind::LE, rational(-1));
s.add_var_bound(y, lp::lconstraint_kind::GE, rational(2));
s.add_var_bound(y, lp::lconstraint_kind::LE, rational(4));
VERIFY(true); }
void test_nla_intervals_zero_crossing() {
std::cout << "test_nla_intervals_zero_crossing\n";
reslimit rl;
params_ref p;
lp::lar_solver s;
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.add_var_bound(x, lp::lconstraint_kind::GE, rational(-2));
s.add_var_bound(x, lp::lconstraint_kind::LE, rational(3));
s.add_var_bound(y, lp::lconstraint_kind::GE, rational(1));
s.add_var_bound(y, lp::lconstraint_kind::LE, rational(4));
VERIFY(true); }
void test_nla_intervals_power() {
std::cout << "test_nla_intervals_power\n";
reslimit rl;
params_ref p;
lp::lar_solver s;
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.add_var_bound(x, lp::lconstraint_kind::GE, rational(-3));
s.add_var_bound(x, lp::lconstraint_kind::LE, rational(2));
VERIFY(true); }
void test_nla_intervals_mixed_signs() {
std::cout << "test_nla_intervals_mixed_signs\n";
reslimit rl;
params_ref p;
lp::lar_solver s;
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.add_var_bound(x, lp::lconstraint_kind::GE, rational(-1));
s.add_var_bound(x, lp::lconstraint_kind::LE, rational(1));
s.add_var_bound(y, lp::lconstraint_kind::GE, rational(-2));
s.add_var_bound(y, lp::lconstraint_kind::LE, rational(2));
s.add_var_bound(z, lp::lconstraint_kind::GE, rational(1));
s.add_var_bound(z, lp::lconstraint_kind::LE, rational(3));
VERIFY(true); }
void test_nla_intervals_fractional() {
std::cout << "test_nla_intervals_fractional\n";
reslimit rl;
params_ref p;
lp::lar_solver s;
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.add_var_bound(x, lp::lconstraint_kind::GE, rational(1, 2));
s.add_var_bound(x, lp::lconstraint_kind::LE, rational(3, 2));
s.add_var_bound(y, lp::lconstraint_kind::GE, rational(5, 2));
s.add_var_bound(y, lp::lconstraint_kind::LE, rational(7, 2));
VERIFY(true); }
void test_nla_intervals() {
test_nla_intervals_basic();
test_nla_intervals_negative();
test_nla_intervals_zero_crossing();
test_nla_intervals_power();
test_nla_intervals_mixed_signs();
test_nla_intervals_fractional();
}
}
void tst_nla_intervals() {
nla::test_nla_intervals();
}