mirror of
https://github.com/c-cube/sidekick.git
synced 2026-01-24 10:26:40 -05:00
[bugfix] late propagations need to be re-propagated
Indeed, the previous strategy was that late propagations didn't need to be propagated since they already have been, however that may not be the case as a conflict might arise during propagation. It manifested as a bug when the conflict did *not* depend on local hyps, and was tragically lost during popping.
This commit is contained in:
parent
0dc44b1173
commit
e3d8513286
1 changed files with 9 additions and 8 deletions
|
|
@ -383,8 +383,9 @@ module Make
|
|||
else begin
|
||||
Log.debugf 5 "Backtracking to lvl %d" (fun k -> k lvl);
|
||||
(* We set the head of the solver and theory queue to what it was. *)
|
||||
env.elt_head <- Vec.get env.elt_levels lvl;
|
||||
env.th_head <- env.elt_head;
|
||||
let head = ref (Vec.get env.elt_levels lvl) in
|
||||
env.elt_head <- !head;
|
||||
env.th_head <- !head;
|
||||
(* Now we need to cleanup the vars that are not valid anymore
|
||||
(i.e to the right of elt_head in the queue. *)
|
||||
for c = env.elt_head to Vec.size env.elt_queue - 1 do
|
||||
|
|
@ -394,8 +395,8 @@ module Make
|
|||
a level lower than [lvl], in which case we just move it back. *)
|
||||
| Lit l ->
|
||||
if l.l_level <= lvl then begin
|
||||
Vec.set env.elt_queue env.elt_head (of_lit l);
|
||||
env.elt_head <- env.elt_head + 1
|
||||
Vec.set env.elt_queue !head (of_lit l);
|
||||
head := !head + 1
|
||||
end else begin
|
||||
l.assigned <- None;
|
||||
l.l_level <- -1;
|
||||
|
|
@ -404,11 +405,11 @@ module Make
|
|||
(* A variable is not true/false anymore, one of two things can happen: *)
|
||||
| Atom a ->
|
||||
if a.var.v_level <= lvl then begin
|
||||
(* It is a semantic propagation, which can be late, and has a level
|
||||
(* It is a late propagation, which has a level
|
||||
lower than where we backtrack, so we just move it to the head
|
||||
of the queue, to be propagated again. *)
|
||||
Vec.set env.elt_queue env.elt_head (of_atom a);
|
||||
env.elt_head <- env.elt_head + 1
|
||||
Vec.set env.elt_queue !head (of_atom a);
|
||||
head := !head + 1
|
||||
end else begin
|
||||
(* it is a result of bolean propagation, or a semantic propagation
|
||||
with a level higher than the level to which we backtrack,
|
||||
|
|
@ -423,7 +424,7 @@ module Make
|
|||
(* Recover the right theory state. *)
|
||||
Plugin.backtrack (Vec.get env.th_levels lvl);
|
||||
(* Resize the vectors according to their new size. *)
|
||||
Vec.shrink env.elt_queue ((Vec.size env.elt_queue) - env.elt_head);
|
||||
Vec.shrink env.elt_queue ((Vec.size env.elt_queue) - !head);
|
||||
Vec.shrink env.elt_levels ((Vec.size env.elt_levels) - lvl);
|
||||
Vec.shrink env.th_levels ((Vec.size env.th_levels) - lvl);
|
||||
end;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue