sig
  type t
  val empty :
    with_delta_activities:bool ->
    Model.t -> (Nbr.t option * Nbr.t * int) list -> State_interpreter.t
  val initialize :
    bind:('-> (bool * Rule_interpreter.t * State_interpreter.t -> 'a) -> 'a) ->
    return:(bool * Rule_interpreter.t * State_interpreter.t -> 'a) ->
    outputs:(Data.t -> unit) ->
    Model.t ->
    Counter.t ->
    Rule_interpreter.t ->
    State_interpreter.t ->
    (Primitives.alg_expr * Primitives.elementary_rule) list -> 'a
  val observables_values :
    Model.t -> Rule_interpreter.t -> Counter.t -> Nbr.t array
  val do_modifications :
    outputs:(Data.t -> unit) ->
    Model.t ->
    Counter.t ->
    Rule_interpreter.t ->
    State_interpreter.t ->
    Primitives.modification list ->
    bool * Rule_interpreter.t * State_interpreter.t
  val a_loop :
    outputs:(Data.t -> unit) ->
    dumpIfDeadlocked:bool ->
    maxConsecutiveClash:int ->
    Model.t ->
    Counter.t ->
    Rule_interpreter.t ->
    State_interpreter.t -> bool * Rule_interpreter.t * State_interpreter.t
  val end_of_simulation :
    outputs:(Data.t -> unit) ->
    Format.formatter ->
    Model.t -> Counter.t -> Rule_interpreter.t -> State_interpreter.t -> unit
end