sig
  module Transformation :
    sig
      type 'a t =
          Agent of 'a
        | Freed of 'Instantiation.site
        | Linked of 'Instantiation.site * 'Instantiation.site
        | NegativeWhatEver of 'Instantiation.site
        | PositiveInternalized of 'a * Instantiation.site_name *
            Instantiation.internal_state
        | NegativeInternalized of 'Instantiation.site
      val rename :
        int ->
        Renaming.t ->
        Instantiation.abstract Primitives.Transformation.t ->
        Instantiation.abstract Primitives.Transformation.t
      val concretize :
        Matching.t * int Mods.IntMap.t ->
        Instantiation.abstract Primitives.Transformation.t ->
        Instantiation.concrete Primitives.Transformation.t
      val print :
        ?sigs:Signature.s ->
        Format.formatter ->
        Instantiation.abstract Primitives.Transformation.t -> unit
      val negative_transformations_of_actions :
        Signature.s ->
        (Instantiation.concrete Instantiation.site ->
         Instantiation.concrete Instantiation.site option) ->
        Instantiation.concrete Instantiation.action list ->
        Instantiation.concrete Primitives.Transformation.t list
      val positive_transformations_of_actions :
        Signature.s ->
        Instantiation.concrete Instantiation.site list ->
        Instantiation.concrete Instantiation.action list ->
        Instantiation.concrete Primitives.Transformation.t list
    end
  type alg_expr = (Pattern.id array list, int) Alg_expr.e
  type elementary_rule = {
    rate : Primitives.alg_expr Locality.annot;
    unary_rate :
      (Primitives.alg_expr Locality.annot * Primitives.alg_expr option)
      option;
    connected_components : Pattern.id array;
    removed : Instantiation.abstract Primitives.Transformation.t list;
    inserted : Instantiation.abstract Primitives.Transformation.t list;
    delta_tokens : (Primitives.alg_expr Locality.annot * int) list;
    syntactic_rule : int;
    instantiations : Instantiation.abstract Instantiation.event;
  }
  val extract_cc_ids : Primitives.elementary_rule -> Pattern.id array
  val extract_abstract_event :
    Primitives.elementary_rule -> Instantiation.abstract Instantiation.event
  val rule_to_yojson :
    filenames:int Mods.StringMap.t ->
    Primitives.elementary_rule -> Yojson.Basic.json
  val rule_of_yojson :
    filenames:string array -> Yojson.Basic.json -> Primitives.elementary_rule
  type 'alg_expr print_expr =
      Str_pexpr of string Locality.annot
    | Alg_pexpr of 'alg_expr Locality.annot
  val print_expr_to_yojson :
    filenames:int Mods.StringMap.t ->
    ('-> Yojson.Basic.json) ->
    ('-> Yojson.Basic.json) ->
    ('a, 'b) Alg_expr.e Primitives.print_expr -> Yojson.Basic.json
  val print_expr_of_yojson :
    filenames:string array ->
    (Yojson.Basic.json -> 'a) ->
    (Yojson.Basic.json -> 'b) ->
    Yojson.Basic.json -> ('a, 'b) Alg_expr.e Primitives.print_expr
  type din_kind = ABSOLUTE | RELATIVE | PROBABILITY
  val din_kind_to_yojson : Primitives.din_kind -> Yojson.Basic.json
  val din_kind_of_yojson : Yojson.Basic.json -> Primitives.din_kind
  val write_din_kind : Bi_outbuf.t -> Primitives.din_kind -> unit
  val string_of_din_kind : ?len:int -> Primitives.din_kind -> string
  val read_din_kind :
    Yojson.Safe.lexer_state -> Lexing.lexbuf -> Primitives.din_kind
  val din_kind_of_string : string -> Primitives.din_kind
  type modification =
      ITER_RULE of Primitives.alg_expr Locality.annot *
        Primitives.elementary_rule
    | UPDATE of int * Primitives.alg_expr Locality.annot
    | SNAPSHOT of Primitives.alg_expr Primitives.print_expr list
    | STOP of Primitives.alg_expr Primitives.print_expr list
    | CFLOW of string option * Pattern.id array *
        Instantiation.abstract Instantiation.test list list
    | DIN of Primitives.din_kind *
        Primitives.alg_expr Primitives.print_expr list
    | DINOFF of Primitives.alg_expr Primitives.print_expr list
    | CFLOWOFF of string option * Pattern.id array
    | PLOTENTRY
    | PRINT of Primitives.alg_expr Primitives.print_expr list *
        Primitives.alg_expr Primitives.print_expr list
    | SPECIES of Primitives.alg_expr Primitives.print_expr list *
        Pattern.id array *
        Instantiation.abstract Instantiation.test list list
    | SPECIES_OFF of Primitives.alg_expr Primitives.print_expr list
  type perturbation = {
    alarm : Nbr.t option;
    precondition : (Pattern.id array list, int) Alg_expr.bool Locality.annot;
    effect : Primitives.modification list;
    repeat : (Pattern.id array list, int) Alg_expr.bool Locality.annot;
    needs_backtrack : bool;
  }
  val perturbation_to_yojson :
    filenames:int Mods.StringMap.t ->
    Primitives.perturbation -> Yojson.Basic.json
  val perturbation_of_yojson :
    filenames:string array -> Yojson.Basic.json -> Primitives.perturbation
  val exists_modification :
    (Primitives.modification -> bool) ->
    Primitives.perturbation array -> bool
  val extract_connected_components_modifications :
    Primitives.modification list -> Pattern.id list
  val extract_connected_components_bool :
    (Pattern.id array list, int) Alg_expr.bool Locality.annot ->
    Pattern.id list
  val map_expr_rule :
    (Primitives.alg_expr Locality.annot -> Primitives.alg_expr Locality.annot) ->
    Primitives.elementary_rule -> Primitives.elementary_rule
  val map_expr_perturbation :
    (Primitives.alg_expr Locality.annot -> Primitives.alg_expr Locality.annot) ->
    ((Pattern.id array list, int) Alg_expr.bool Locality.annot ->
     (Pattern.id array list, int) Alg_expr.bool Locality.annot) ->
    Primitives.perturbation -> Primitives.perturbation
  val stops_of_perturbation :
    Operator.DepSet.t * Operator.DepSet.t * Operator.DepSet.t array *
    Operator.DepSet.t array ->
    Primitives.perturbation -> (Nbr.t option * Nbr.t) list
end