Skip to content

Commit e2d0349

Browse files
committed
fixed trail class
1 parent 570616e commit e2d0349

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

code/src/trail.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,14 @@ class Trail {
110110

111111
bool backtrack() {
112112
if (!trail_lim.empty()) {
113-
for (int i = trail.size()-1; i > trail_lim.back(); i--) {
113+
if (verb) std::cout << "Backtracking to position " << trail_lim.back() << std::endl;
114+
for (int i = trail.size()-1; i >= (int)trail_lim.back(); i--) {
115+
if (verb) std::cout << "Unassigning " << trail[i] << " at position " << i << std::endl;
114116
val[trail[i].var()] = UNASSIGNED;
115117
}
116118
trail.resize(trail_lim.back());
117119
trail_lim.pop_back();
120+
head = trail.size();
118121
return true;
119122
}
120123
return false;

code/tests/trailtest.cc

+18
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,22 @@ TEST_CASE("Trail") {
2626
CHECK(trail.init(f));
2727
CHECK(trail.propagate());
2828
}
29+
30+
SUBCASE("backtrack") {
31+
CNFFormula f;
32+
f.readClause({ Lit(1, true), Lit(2) });
33+
f.readClause({ Lit(2, true), Lit(3) });
34+
Trail trail {};
35+
CHECK(trail.init(f));
36+
CHECK(trail.push(Lit(1, false)));
37+
CHECK(trail.propagate());
38+
CHECK(trail[0] == Lit(1, false));
39+
CHECK(trail[1] == Lit(2, false));
40+
CHECK(trail[2] == Lit(3, false));
41+
CHECK(trail.backtrack());
42+
CHECK(trail.push(Lit(2, true)));
43+
CHECK(trail.propagate());
44+
CHECK(trail[0] == Lit(2, true));
45+
CHECK(trail[1] == Lit(1, true));
46+
}
2947
}

0 commit comments

Comments
 (0)