X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Feval.ml;fp=src%2Feval.ml;h=5eb7e292b0f2b5f55826aa26693f3a59f6447a4c;hb=3e06951df10cfe1db40edbd980e1f7c2e73962f7;hp=22a3b5f483cdff0c0e7bc3140c8d8a2dbfce703c;hpb=556c8805fcfd27f485bdd63cd704e4df7eac8a06;p=tatoo.git diff --git a/src/eval.ml b/src/eval.ml index 22a3b5f..5eb7e29 100644 --- a/src/eval.ml +++ b/src/eval.ml @@ -14,7 +14,7 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) INCLUDE "utils.ml" @@ -54,9 +54,8 @@ END let top_down_run auto tree node cache _i = - let redo = ref false in let rec loop node = - if node != T.nil then begin + if node == T.nil then false else begin let parent = T.parent tree node in let fc = T.first_child tree node in let ns = T.next_sibling tree node in @@ -87,29 +86,30 @@ END TRACE(html tree node _i config1 "Updating transitions"); if config0 != config1 then set cache tree node config1 _i; - let () = loop fc in + let unstable_left = loop fc in let fcs1 = get cache tree fc in let config2 = Ata.eval_trans auto fcs1 nss ps config1 in TRACE(html tree node _i config2 "Updating transitions (after first-child)"); if config1 != config2 then set cache tree node config2 _i; - let () = loop ns in + let unstable_right = loop ns in let config3 = Ata.eval_trans auto fcs1 (get cache tree ns) ps config2 in TRACE(html tree node _i config3 "Updating transitions (after next-sibling)"); if config2 != config3 then set cache tree node config3 _i; - (* We do set the redo flat if : *) - if not ( - config0 == config3 (* did not gain any new information *) - || !redo (* already set *) - || Ata.TransList.nil == config3.Ata.Config.node.Ata.todo ) (* no more transition to check *) - then redo := true + let unstable = + unstable_left + || unstable_right + || (config0 != config3 && Ata.(TransList.nil != config3.Config.node.todo)) + in + if Ata.(unstable && not config3.Config.node.unstable_subtree) then + Ata.(config3.Config.node.unstable_subtree <- unstable); + unstable end in - loop node; - !redo + loop node let get_results auto tree node cache = let rec loop node acc = @@ -127,11 +127,12 @@ END let eval auto tree node = let cache = Cache.N1.create - (Ata.Config.make { Ata.sat = StateSet.empty; - Ata.unsat = StateSet.empty; - Ata.todo = Ata.TransList.nil; - Ata.summary = Ata.dummy_summary; - Ata.round = ~-1; + Ata.(Config.make { sat = StateSet.empty; + unsat = StateSet.empty; + todo = TransList.nil; + summary = dummy_summary; + round = ~-1; + unstable_subtree = true; }) in let redo = ref true in