+ let new_s =
+ eval_trans_aux trans_list node_summary f_set n_set p_set old_s
+ in
+ if new_s == old_s then old_s else loop new_s
+ in
+ loop s_set
+
+ let get_trans run tag set =
+ let i = (tag.QName.id :> int) in
+ let j = (set.StateSet.id :> int) in
+ let res = Cache.N2.find run.Run.trans_cache i j in
+ if res == dummy_trans_list then begin
+ let res = Ata.get_trans run.Run.auto tag set in
+ Cache.N2.add run.Run.trans_cache i j res;
+ res
+ end
+ else
+ res
+
+ let eval_trans run cache set tag node_summary f_set n_set p_set s_set =
+ let i = node_summary in
+ let j = (tag.QName.id :> int) in
+ let k = (f_set.StateSet.id :> int) in
+ let l = (n_set.StateSet.id :> int) in
+ let m = (p_set.StateSet.id :> int) in
+ let n = (s_set.StateSet.id :> int) in
+ let res = Cache.N6.find cache i j k l m n in
+ if res == dummy_set then begin
+ let trans_list = get_trans run tag set in
+ let res = eval_trans trans_list node_summary f_set n_set p_set s_set in
+ Cache.N6.add cache i j k l m n res;
+ res
+ end
+ else res
+
+ let auto_run run tree prev_nodes td_states bu_states exit_states _i =
+ let exit_id = (exit_states.StateSet.id :> int) in
+ let empty_sets = StateSet.(empty,empty,empty) in
+
+ let mark_node front res node set f_set n_set =
+ let i = (set.StateSet.id :> int) in
+ let j = (f_set.StateSet.id :> int) in
+ let k = (n_set.StateSet.id :> int) in
+ let (mstates, _, _) as block =
+ Cache.N4.find run.Run.mark_cache exit_id i j k
+ in
+
+ let mstates, ll, rr =
+ if mstates == dummy_set then begin
+ let r1 = StateSet.inter set exit_states in
+ let r2 = StateSet.inter f_set exit_states in
+ let r3 = StateSet.inter n_set exit_states in
+ let r = r1,r2,r3 in
+ Cache.N4.add run.Run.mark_cache exit_id i j k r;
+ r
+ end
+ else block
+ in
+ if mstates != StateSet.empty then
+ let block = mstates, ll, rr, node in
+ if front then Sequence.push_front block res
+ else Sequence.push_back block res