let find_loop f =
let size = Array.length f in
let rec continue i =
let rec find = function
[] -> continue (i + 1)
| j::l ->
if j <= i && dominate f j i then
( j, i )::find l
else
find l
in
if i >= size then
[]
else
find f.(i).successor
in
let header_list = continue 0 in
let territory = Array.create size [] in
let rec visit( i, j ) =
if i <> j && not (List.mem i territory.(j)) then begin
territory.(j) <- i::territory.(j);
List.iter (function j -> visit( i, j )) f.(j).predecessor
end
in
List.iter visit header_list;
let nest_level = Array.create size 0 in
List.iter (function( i, _ ) -> nest_level.(i) <- 1) header_list;
for i = 0 to size - 1 do
nest_level.(i) <- nest_level.(i) + List.length territory.(i)
done;
for i = 0 to size - 1 do
f.(i) <- { f.(i) with nest_level = nest_level.(i) }
done