sig
  val parallel_toss : (int * string) Pervasives.ref
  type ('a, 'b) abstract_game_tree =
      Terminal of Arena.game_state * int * 'b
    | Leaf of Arena.game_state * int * 'a
    | Node of Arena.game_state * int * 'a *
        (Arena.move * ('a, 'b) GameTree.abstract_game_tree) array
  val str_abstract :
    ?upto:int ->
    ?struc:bool ->
    ?depth:int ->
    ('-> string) ->
    ('-> string) -> ('a, 'b) GameTree.abstract_game_tree -> string
  val size : ('a, 'b) GameTree.abstract_game_tree -> int
  val player : ('a, 'b) GameTree.abstract_game_tree -> int
  val state : ('a, 'b) GameTree.abstract_game_tree -> Arena.game_state
  val init_abstract :
    Arena.game ->
    Arena.game_state ->
    (Arena.game -> Arena.game_state -> int -> 'a) ->
    ('a, 'b) GameTree.abstract_game_tree
  val unfold_abstract :
    ?timeout:(unit -> bool) ->
    ?depth:int ->
    Arena.game ->
    info_terminal:(int -> Arena.game -> Arena.game_state -> int -> '-> 'b) ->
    info_leaf:(int -> Arena.game -> Arena.game_state -> int -> int -> 'a) ->
    info_node:(int ->
               Arena.game ->
               Arena.game_state ->
               int ->
               (Arena.move * ('a, 'b) GameTree.abstract_game_tree) array ->
               'a) ->
    choice:(int ->
            Arena.game ->
            Arena.game_state ->
            int ->
            '->
            (Arena.move * ('a, 'b) GameTree.abstract_game_tree) array -> int) ->
    ('a, 'b) GameTree.abstract_game_tree ->
    ('a, 'b) GameTree.abstract_game_tree
  val cPAYOFF_AS_HEUR : float Pervasives.ref
  type 'a node_info = {
    heurs : float array;
    heurs_are_exact : bool;
    info : 'a;
  }
  type 'a terminal_info = {
    payoffs : float array;
    heurs_t : float array;
    info_t : 'a;
  }
  type 'a game_tree =
      ('GameTree.node_info, 'GameTree.terminal_info)
      GameTree.abstract_game_tree
  val str :
    ('-> string) ->
    ?upto:int -> ?struc:bool -> ?depth:int -> 'GameTree.game_tree -> string
  val node_values : 'GameTree.game_tree -> float array
  val node_info : 'GameTree.game_tree -> 'a
  val choose_moves :
    Arena.game ->
    'GameTree.game_tree -> (Arena.move * Arena.game_state) list
  val init :
    Arena.game ->
    Arena.game_state ->
    (int -> Arena.game -> Arena.game_state -> 'a) ->
    Formula.real_expr array array -> 'GameTree.game_tree
  val unfold :
    ?timeout:(unit -> bool) ->
    ?ab:bool ->
    Arena.game ->
    Formula.real_expr array array ->
    info_leaf:(int -> Arena.game -> Arena.game_state -> 'a) ->
    info_node:(int ->
               int ->
               float array ->
               (Arena.move * 'GameTree.game_tree) array -> 'a) ->
    choice:(float array option Pervasives.ref ->
            int ->
            Arena.game ->
            Arena.game_state ->
            int ->
            'GameTree.node_info ->
            (Arena.move * 'GameTree.game_tree) array -> int) ->
    'GameTree.game_tree -> 'GameTree.game_tree
end