sig
  type switching = Linked of int | Freed | Maintained | Erased
  type rule_internal =
      I_ANY
    | I_ANY_CHANGED of int
    | I_ANY_ERASED
    | I_VAL_CHANGED of int * int
    | I_VAL_ERASED of int
  type rule_agent = {
    ra_type : int;
    ra_erased : bool;
    ra_ports :
      ((int, int * int) Ast.link Locality.annot * LKappa.switching) array;
    ra_ints : LKappa.rule_internal array;
    ra_syntax :
      (((int, int * int) Ast.link Locality.annot * LKappa.switching) array *
       LKappa.rule_internal array)
      option;
  }
  type rule_mixture = LKappa.rule_agent list
  val forbid_modification : Locality.t -> 'a option -> unit
  val several_internal_states : Locality.t -> 'a
  val not_enough_specified :
    status:string -> side:string -> string -> string * Locality.t -> 'a
  val several_occurence_of_site : string -> string * Locality.t -> 'a
  val link_only_one_occurence : int -> Locality.t -> 'a
  val agent_to_erased : Signature.s -> LKappa.rule_agent -> LKappa.rule_agent
  val to_erased : Signature.s -> LKappa.rule_mixture -> LKappa.rule_mixture
  val to_maintained : LKappa.rule_mixture -> LKappa.rule_mixture
  val to_raw_mixture : Signature.s -> LKappa.rule_mixture -> Raw_mixture.t
  val copy_rule_agent : LKappa.rule_agent -> LKappa.rule_agent
  val print_rule_mixture :
    Signature.s ->
    ltypes:bool ->
    Raw_mixture.t -> Format.formatter -> LKappa.rule_agent list -> unit
  type 'a rule_agent_counters = {
    ra : 'a;
    ra_counters : (Ast.counter * LKappa.switching) option array;
  }
  type rule = {
    r_mix : LKappa.rule_mixture;
    r_created : Raw_mixture.t;
    r_delta_tokens :
      ((LKappa.rule_mixture, int) Alg_expr.e Locality.annot * int) list;
    r_rate : (LKappa.rule_mixture, int) Alg_expr.e Locality.annot;
    r_un_rate :
      ((LKappa.rule_mixture, int) Alg_expr.e Locality.annot *
       (LKappa.rule_mixture, int) Alg_expr.e Locality.annot option)
      option;
    r_editStyle : bool;
  }
  val print_rates :
    Signature.s ->
    (Format.formatter -> int -> unit) ->
    (Format.formatter -> int -> unit) ->
    Format.formatter -> LKappa.rule -> unit
  val print_rule :
    full:bool ->
    Signature.s ->
    (Format.formatter -> int -> unit) ->
    (Format.formatter -> int -> unit) ->
    Format.formatter -> LKappa.rule -> unit
  val rule_to_json :
    filenames:int Mods.StringMap.t -> LKappa.rule -> Yojson.Basic.json
  val rule_of_json :
    filenames:string array -> Yojson.Basic.json -> LKappa.rule
end