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)
(*
        print_string ((string_of_int i)^"^(string_of_int_list territory.(i))^"^(string_of_int nest_level.(i))^");
*)

    done;
    for i = 0 to size - 1 do
        f.(i) <- { f.(i) with nest_level = nest_level.(i) }
    done