let clean tree =
let graph = graph_from_tree tree
in let graph_beginnings = findBeginnings (nodelist graph)
in let nodes = IdtMap.fold (fun _ x y -> x::y) tree.treeNodes []
in let rec clean_nodes node_list tre =
match node_list with
x::tail -> let old_children = List.filter (fun y -> has_edge_id x.node.id y tre) x.children
in let out_edges = DG.nodefoldoutedges graph (fun y a -> y::a) x.node []
in let targets = List.map (fun (_,tt,_) -> tt.id) out_edges
in let new_children = List.filter (fun y -> not (List.mem y old_children)) targets
in let node_children = List.concat [old_children;new_children]
in clean_nodes tail {tre with treeNodes = IdtMap.add x.node.id {x with allDone = false; number = NodeNumber.invalid_num; children = node_children} (IdtMap.remove x.node.id tre.treeNodes)}
| _ -> tre
in let tree2 = clean_nodes nodes tree
in let edges = IdtMap.fold (fun _ x y -> x::y) tree.treeEdges []
in let rec clean_edges edge_list tre =
match edge_list with
x::tail -> let (c,_,_) = x.edge
in clean_edges tail {tre with treeEdges =IdtMap.add c.nameforudg {x with used = false; edgeway = Unknown} (IdtMap.remove c.nameforudg tre.treeEdges)}
| _ -> tre
in let tree3 = clean_edges edges tree2
in let old_starting = List.filter (fun x -> List.mem x graph_beginnings) tree.starting_places
in let new_starting = List.filter (fun x -> not (List.mem x tree.starting_places)) graph_beginnings
in {tree3 with starting_places = List.concat [old_starting;new_starting]}