edges
+let state_prerequisites dir auto q =
+ Hashtbl.fold (fun q' trans acc ->
+ List.fold_left (fun acc (_, phi) ->
+ let m_phi = Formula.get_states_by_move phi in
+ if StateSet.mem q (Move.get m_phi dir)
+ then StateSet.add q' acc else acc)
+ acc trans) auto.transitions StateSet.empty
let compute_rank auto =
let dependencies = compute_dependencies auto in
let upward = [ `Stay ; `Parent ; `Previous_sibling ] in
let downward = [ `Stay; `First_child; `Next_sibling ] in
let swap dir = if dir == upward then downward else upward in
- let is_satisfied q t =
- Move.for_all (fun _ set -> StateSet.(is_empty (remove q set))) t
+ let is_satisfied dir q t =
+ Move.for_all (fun d set ->
+ if List.mem d dir then
+ StateSet.(is_empty (remove q set))
+ else StateSet.is_empty set) t
in
let update_dependencies dir initacc =
let rec loop acc =
Move.set deps m (StateSet.diff (Move.get deps m) to_remove)
)
dir;
- if is_satisfied q deps then StateSet.add q acc else acc
+ if is_satisfied dir q deps then StateSet.add q acc else acc
) dependencies acc
in
if acc == new_acc then new_acc else loop new_acc
done;
let by_rank = Hashtbl.create 17 in
List.iter (fun (r,s) ->
- let r = r/2 in
let set = try Hashtbl.find by_rank r with Not_found -> StateSet.empty in
Hashtbl.replace by_rank r (StateSet.union s set)) !rank_list;
auto.ranked_states <-