sig
  type equivalence_classes = int Symmetries_sig.site_partition array
  type symmetries = {
    rules : Symmetries.equivalence_classes;
    rules_and_initial_states : Symmetries.equivalence_classes option;
    rules_and_alg_expr : Symmetries.equivalence_classes option;
  }
  type reduction =
      Ground
    | Forward of Symmetries.equivalence_classes
    | Backward of Symmetries.equivalence_classes
  val refine_partitioned_contact_map_in_lkappa_representation :
    '->
    ('-> int -> '-> '-> 'a * bool) ->
    ('-> int -> '-> '-> 'a * bool) ->
    ('-> int -> '-> '-> 'a * bool) ->
    'Symmetries_sig.site_partition array ->
    'a * 'Symmetries_sig.site_partition array
  val detect_symmetries :
    Remanent_parameters_sig.parameters ->
    Model.t ->
    LKappa_auto.cache ->
    Remanent_parameters_sig.rate_convention ->
    Pattern.cc list ->
    Primitives.elementary_rule list ->
    Public_data.contact_map -> LKappa_auto.cache * Symmetries.symmetries
  val print_symmetries :
    Remanent_parameters_sig.parameters ->
    Model.t -> Symmetries.symmetries -> unit
  type cache
  val empty_cache : unit -> Symmetries.cache
  val representative :
    ?parameters:Remanent_parameters_sig.parameters ->
    sigs:Signature.s ->
    Symmetries.cache ->
    LKappa_auto.cache ->
    Pattern.PreEnv.t ->
    Symmetries.reduction ->
    Pattern.cc ->
    Symmetries.cache * LKappa_auto.cache * Pattern.PreEnv.t * Pattern.cc
  val equiv_class :
    ?parameters:Remanent_parameters_sig.parameters ->
    Model.t ->
    bool Mods.DynArray.t ->
    Symmetries.cache ->
    LKappa_auto.cache ->
    Pattern.PreEnv.t ->
    Symmetries.reduction ->
    Pattern.id ->
    Symmetries.cache * LKappa_auto.cache * Pattern.PreEnv.t *
    bool Mods.DynArray.t * (int * (Pattern.id * int) list)
end