mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 03:05:31 -05:00
feat(cdsat): add basic VMTF Vars_to_decide to track undecided vars
This commit is contained in:
parent
6374fd7d5f
commit
299acc184c
2 changed files with 93 additions and 0 deletions
74
src/cdsat/vars_to_decide.ml
Normal file
74
src/cdsat/vars_to_decide.ml
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
module V = TVar
|
||||||
|
|
||||||
|
type node = { var: V.t; mutable next: node; mutable prev: node }
|
||||||
|
type t = { vars: node V.Tbl.t; mutable first: node option }
|
||||||
|
|
||||||
|
let create () : t = { vars = V.Tbl.create 32; first = None }
|
||||||
|
let[@inline] size (self : t) : int = V.Tbl.length self.vars
|
||||||
|
let[@inline] mem (self : t) (v : V.t) : bool = V.Tbl.mem self.vars v
|
||||||
|
|
||||||
|
let add (self : t) (v : V.t) : unit =
|
||||||
|
if not (V.Tbl.mem self.vars v) then (
|
||||||
|
let rec node = { var = v; prev = node; next = node } in
|
||||||
|
V.Tbl.add self.vars v node;
|
||||||
|
match self.first with
|
||||||
|
| None -> self.first <- Some node
|
||||||
|
| Some n_first ->
|
||||||
|
(* insert at the end *)
|
||||||
|
n_first.prev.next <- node;
|
||||||
|
n_first.prev <- node;
|
||||||
|
node.prev <- n_first.prev;
|
||||||
|
node.next <- n_first
|
||||||
|
)
|
||||||
|
|
||||||
|
let pop_next (self : t) : _ option =
|
||||||
|
match self.first with
|
||||||
|
| None -> None
|
||||||
|
| Some n ->
|
||||||
|
let next = n.next in
|
||||||
|
(* remove [n] from the list *)
|
||||||
|
next.prev <- n.prev;
|
||||||
|
n.prev.next <- next;
|
||||||
|
|
||||||
|
(* point to the next *)
|
||||||
|
if next != n then
|
||||||
|
self.first <- Some next
|
||||||
|
else
|
||||||
|
self.first <- None;
|
||||||
|
|
||||||
|
Some n.var
|
||||||
|
|
||||||
|
let bump (self : t) (v : V.t) : unit =
|
||||||
|
match V.Tbl.find_opt self.vars v with
|
||||||
|
| None -> ()
|
||||||
|
| Some node ->
|
||||||
|
(* move node to front *)
|
||||||
|
node.next.prev <- node.prev;
|
||||||
|
node.prev.next <- node.next;
|
||||||
|
|
||||||
|
let first =
|
||||||
|
match self.first with
|
||||||
|
| Some n -> n
|
||||||
|
| None -> assert false
|
||||||
|
in
|
||||||
|
|
||||||
|
node.prev <- first.prev;
|
||||||
|
node.next <- first;
|
||||||
|
first.prev <- node;
|
||||||
|
first.next.prev <- node;
|
||||||
|
self.first <- Some node
|
||||||
|
|
||||||
|
let remove (self : t) (v : V.t) : unit =
|
||||||
|
match V.Tbl.find_opt self.vars v with
|
||||||
|
| None -> ()
|
||||||
|
| Some node ->
|
||||||
|
(* remove from list *)
|
||||||
|
node.prev.next <- node.next;
|
||||||
|
node.next.prev <- node.prev;
|
||||||
|
|
||||||
|
(match self.first with
|
||||||
|
| Some n when n == node -> self.first <- Some node.next
|
||||||
|
| _ -> ());
|
||||||
|
|
||||||
|
(* remove from table *)
|
||||||
|
V.Tbl.remove self.vars v
|
||||||
19
src/cdsat/vars_to_decide.mli
Normal file
19
src/cdsat/vars_to_decide.mli
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
(** Set of variables yet to decide *)
|
||||||
|
|
||||||
|
type t
|
||||||
|
|
||||||
|
val create : unit -> t
|
||||||
|
val mem : t -> TVar.t -> bool
|
||||||
|
val size : t -> int
|
||||||
|
|
||||||
|
val add : t -> TVar.t -> unit
|
||||||
|
(** Add a variable to the set *)
|
||||||
|
|
||||||
|
val bump : t -> TVar.t -> unit
|
||||||
|
(** [bump set v] makes [v] more likely to be decided sooner than later. *)
|
||||||
|
|
||||||
|
val pop_next : t -> TVar.t option
|
||||||
|
(** Pop next variable *)
|
||||||
|
|
||||||
|
val remove : t -> TVar.t -> unit
|
||||||
|
(** Remove the variable from the set *)
|
||||||
Loading…
Add table
Reference in a new issue