method private select =
let (ready_list,n) =
List.fold_left
(fun (l,k) (w,s) -> if s.source#is_ready then (s,w)::l,(k+w) else l,k)
([],0) children
in
if n = 0 then None else
try
let sel = if strict then (pos+1) mod n else Random.int n in
pos <- sel ;
ignore (List.fold_left
(fun k (s,w) ->
if k+w > sel then raise (Found s) else (k+w))
0 ready_list) ;
assert false
with
| Found s -> Some s