- in
- run.redo <- loop (T.root tree);
- run.pass <- run.pass + 1
-
-(*
- let stats run =
- let count = ref 0 in
- let len = Bitvector.length run.unstable in
- for i = 0 to len - 1 do
- if not (Bitvector.unsafe_get run.unstable i) then
- incr count
- done;
- Logger.msg `STATS
- "%i nodes over %i were skipped in iteration %i (%.2f %%), redo is: %b"
- !count len run.pass (100. *. (float !count /. float len))
- run.redo
-
-
- let eval auto tree node =
- let len = T.size tree in
- let run = { config = Array.create len Ata.dummy_config;
- unstable = Bitvector.create ~init:true len;
- redo = true;
- pass = 0
+ and loop_td_only node =
+ if node == T.nil then () else begin
+ let node_id = T.preorder tree node in
+ let parent = T.parent tree node in
+ let fc = T.first_child tree node in
+ let fc_id = T.preorder tree fc in
+ let ns = T.next_sibling tree node in
+ let ns_id = T.preorder tree ns in
+ let tag = T.tag tree node in
+ (* We enter the node from its parent *)
+ let status0 =
+ let c = unsafe_get_status status node_id in
+ if c.NodeStatus.node.rank < i then
+ (* first time we visit the node during this run *)
+ NodeStatus.make
+ { rank = i;
+ sat = c.NodeStatus.node.sat;
+ todo = td_todo;
+ summary =
+ let summary = c.NodeStatus.node.summary in
+ if summary != NodeSummary.dummy then summary
+ else
+ NodeSummary.make
+ (node != T.next_sibling tree parent)
+ (fc != T.nil) (* has_left *)
+ (ns != T.nil) (* has_right *)
+ (T.kind tree node) (* kind *)