Skip to content

Commit 60dde9f

Browse files
unit test for #2650
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 8125fb1 commit 60dde9f

File tree

2 files changed

+72
-8
lines changed

2 files changed

+72
-8
lines changed

src/nlsat/nlsat_explain.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -707,15 +707,14 @@ namespace nlsat {
707707
m_result = nullptr;
708708
}
709709

710+
710711
void add_root_literal(atom::kind k, var y, unsigned i, poly * p) {
711712
polynomial_ref pr(p, m_pm);
712713
TRACE("nlsat_explain",
713714
display(tout << "x" << y << " " << k << "[" << i << "](", pr); tout << ")\n";);
714-
715+
715716
if (!mk_linear_root(k, y, i, p) &&
716-
//!mk_plinear_root(k, y, i, p) &&
717-
!mk_quadratic_root(k, y, i, p)&&
718-
true) {
717+
!mk_quadratic_root(k, y, i, p)) {
719718
bool_var b = m_solver.mk_root_atom(k, y, i, p);
720719
literal l(b, true);
721720
TRACE("nlsat_explain", tout << "adding literal\n"; display(tout, l); tout << "\n";);
@@ -726,7 +725,7 @@ namespace nlsat {
726725
/**
727726
* literal can be expressed using a linear ineq_atom
728727
*/
729-
bool mk_linear_root(atom::kind k, var y, unsigned i, poly * p) {
728+
bool mk_linear_root(atom::kind k, var y, unsigned i, poly * p) {
730729
scoped_mpz c(m_pm.m());
731730
if (m_pm.degree(p, y) == 1 && m_pm.const_coeff(p, y, 1, c)) {
732731
SASSERT(!m_pm.m().is_zero(c));
@@ -949,11 +948,9 @@ namespace nlsat {
949948
}
950949

951950
if (!lower_inf) {
952-
TRACE("nlsat_explain", tout << "lower_inf: " << lower_inf << " upper_inf: " << upper_inf << " " << p_lower << "\n";);
953951
add_root_literal(m_full_dimensional ? atom::ROOT_GE : atom::ROOT_GT, y, i_lower, p_lower);
954952
}
955953
if (!upper_inf) {
956-
TRACE("nlsat_explain", tout << "lower_inf: " << lower_inf << " upper_inf: " << upper_inf << " " << p_upper << "\n";);
957954
add_root_literal(m_full_dimensional ? atom::ROOT_LE : atom::ROOT_LT, y, i_upper, p_upper);
958955
}
959956
}
@@ -1475,7 +1472,11 @@ namespace nlsat {
14751472
void operator()(unsigned num, literal const * ls, scoped_literal_vector & result) {
14761473
SASSERT(check_already_added());
14771474
SASSERT(num > 0);
1478-
TRACE("nlsat_explain", tout << "[explain] set of literals is infeasible in the current interpretation\n"; display(tout, num, ls) << "\n";);
1475+
TRACE("nlsat_explain",
1476+
tout << "[explain] set of literals is infeasible in the current interpretation\n";
1477+
display(tout, num, ls) << "\n";
1478+
m_assignment.display(tout);
1479+
);
14791480
m_result = &result;
14801481
process(num, ls);
14811482
reset_already_added();

src/test/nlsat.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,20 @@ static void project(nlsat::solver& s, nlsat::explain& ex, nlsat::var x, unsigned
315315
std::cout << "\n";
316316
}
317317

318+
static void project_fa(nlsat::solver& s, nlsat::explain& ex, nlsat::var x, unsigned num, nlsat::literal const* lits) {
319+
std::cout << "Project ";
320+
nlsat::scoped_literal_vector result(s);
321+
ex(num, lits, result);
322+
std::cout << "(or";
323+
for (auto l : result) {
324+
s.display(std::cout << " ", l);
325+
}
326+
for (unsigned i = 0; i < num; ++i) {
327+
s.display(std::cout << " ", ~lits[i]);
328+
}
329+
std::cout << ")\n";
330+
}
331+
318332
static nlsat::literal mk_gt(nlsat::solver& s, nlsat::poly* p) {
319333
nlsat::poly * _p[1] = { p };
320334
bool is_even[1] = { false };
@@ -695,7 +709,56 @@ static void tst10() {
695709
std::cout << "\n";
696710
}
697711

712+
static void tst11() {
713+
params_ref ps;
714+
reslimit rlim;
715+
nlsat::solver s(rlim, ps, false);
716+
anum_manager & am = s.am();
717+
nlsat::pmanager & pm = s.pm();
718+
nlsat::assignment as(am);
719+
nlsat::explain& ex = s.get_explain();
720+
nlsat::var x, y, z;
721+
y = s.mk_var(false);
722+
z = s.mk_var(false);
723+
x = s.mk_var(false);
724+
polynomial_ref p1(pm), p2(pm), _x(pm), _y(pm), _z(pm);
725+
_x = pm.mk_polynomial(x);
726+
_y = pm.mk_polynomial(y);
727+
_z = pm.mk_polynomial(z);
728+
729+
nlsat::scoped_literal_vector lits(s);
730+
scoped_anum zero(am), one(am), five(am);
731+
am.set(zero, 0);
732+
am.set(one, 1);
733+
am.set(five, 5);
734+
as.set(z, zero);
735+
as.set(y, five);
736+
as.set(x, five);
737+
s.set_rvalues(as);
738+
739+
740+
p1 = (_x - _y);
741+
p2 = ((_x*_x) - (_x*_y) - _z);
742+
lits.reset();
743+
lits.push_back(mk_gt(s, p1));
744+
lits.push_back(mk_eq(s, p2));
745+
project_fa(s, ex, x, 2, lits.c_ptr());
746+
return;
747+
748+
p1 = (_x - _y);
749+
p2 = ((_x*_x) - (_x*_y));
750+
lits.reset();
751+
lits.push_back(mk_gt(s, p1));
752+
lits.push_back(mk_eq(s, p2));
753+
project_fa(s, ex, x, 2, lits.c_ptr());
754+
755+
756+
}
757+
698758
void tst_nlsat() {
759+
tst11();
760+
std::cout << "------------------\n";
761+
return;
699762
tst10();
700763
std::cout << "------------------\n";
701764
tst9();

0 commit comments

Comments
 (0)