sig
  module Abstract :
    sig
      type t
      and d
      and interf
      and interf_direction = Acceptor | Expressor
      and interf_type = IFBool | IFInt | IFString | IFMatcher
      and conn_value =
          C_Bool of bool
        | C_Int of int
        | C_String of string
        | C_Matcher of Ligand.Matcher.matcher
      and interf_character =
        Protein.Abstract.interf_direction * Protein.Abstract.interf_type
      module type DOMDEF =
        sig
          type interfid
          val input_defaults :
            Protein.Abstract.DOMDEF.interfid -> Protein.Abstract.conn_value
          val get_interf_character :
            Protein.Abstract.DOMDEF.interfid ->
            Protein.Abstract.interf_character
          type initstate
          and state
          val initmap :
            Protein.Abstract.DOMDEF.initstate ->
            Protein.Abstract.DOMDEF.state
          type config
          and cons =
            Protein.Abstract.DOMDEF.initstate *
            Protein.Abstract.DOMDEF.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      module SLBD :
        sig
          type interfid = Repress | Matcher | Bound
          val get_interf_character :
            Protein.Abstract.SLBD.interfid ->
            Protein.Abstract.interf_character
          type initstate = ActiveInitState | RepressedInitState
          and state = ActiveState | RepressedState | BoundState
          and config = unit
          and cons =
            Protein.Abstract.SLBD.initstate * Protein.Abstract.SLBD.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      module BMD :
        sig
          type interfid = Input | Output of int
          val get_interf_character :
            Protein.Abstract.BMD.interfid ->
            Protein.Abstract.interf_character
          type initstate = unit
          and state = unit
          and config = int
          and cons =
            Protein.Abstract.BMD.initstate * Protein.Abstract.BMD.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      module LID :
        sig
          type interfid = Input of int | Output
          val get_interf_character :
            Protein.Abstract.LID.interfid ->
            Protein.Abstract.interf_character
          type initstate = unit
          and state = unit
          and lidfunc = LIDNot | LIDAnd | LIDOr | LIDXor
          and config = {
            num_inputs : int;
            lidfunc : Protein.Abstract.LID.lidfunc;
          } 
          and cons =
            Protein.Abstract.LID.initstate * Protein.Abstract.LID.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      module PDMatcher :
        sig
          type interfid = Matcher
          val get_interf_character :
            Protein.Abstract.PDMatcher.interfid ->
            Protein.Abstract.interf_character
          type initstate = unit
          and state = unit
          and config = Ligand.Matcher.matcher
          and cons =
            Protein.Abstract.PDMatcher.initstate *
            Protein.Abstract.PDMatcher.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      module LBDR :
        sig
          type interfid =
              Matcher of int
            | Repress1
            | Repress2
            | Bound1
            | Bound2
            | PermuteIn
            | PermuteOut
          val get_interf_character :
            Protein.Abstract.LBDR.interfid ->
            Protein.Abstract.interf_character
          type singleinitstate = ActiveInitState | RepressedInitState
          and initstate =
            Protein.Abstract.LBDR.singleinitstate *
            Protein.Abstract.LBDR.singleinitstate
          and singlestate =
              ActiveState
            | RepressedState
            | BoundState of string
          and state = {
            permutestate : bool;
            proj1state : Protein.Abstract.LBDR.singlestate;
            proj2state : Protein.Abstract.LBDR.singlestate;
          } 
          and permstate = { proj1 : int array; proj2 : int array; } 
          and extremity_arrangement = AABB | ABBA
          and config = {
            num_matchers : int;
            permon : Protein.Abstract.LBDR.permstate;
            permoff : Protein.Abstract.LBDR.permstate;
            exarr : Protein.Abstract.LBDR.extremity_arrangement;
          } 
          and cons =
            Protein.Abstract.LBDR.initstate * Protein.Abstract.LBDR.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      module LBDE :
        sig
          type interfid = Matcher of int | Repress | Bound
          val get_interf_character :
            Protein.Abstract.LBDE.interfid ->
            Protein.Abstract.interf_character
          type initstate = ActiveInitState | RepressedInitState
          and state = ActiveState | RepressedState | BoundState of string
          and extraction = int array
          and config = {
            num_matchers : int;
            extraction : Protein.Abstract.LBDE.extraction;
          } 
          and cons =
            Protein.Abstract.LBDE.initstate * Protein.Abstract.LBDE.config
          val num_lbprojs : int
          val num_sbprojs : int
        end
      val make : unit -> Protein.Abstract.t
      type domaincons =
          D_SLBD of Protein.Abstract.SLBD.cons
        | D_PDMatcher of Protein.Abstract.PDMatcher.cons
        | D_BMD of Protein.Abstract.BMD.cons
        | D_LID of Protein.Abstract.LID.cons
        | D_LBDR of Protein.Abstract.LBDR.cons
        | D_LBDE of Protein.Abstract.LBDE.cons
      val add_domain :
        Protein.Abstract.domaincons ->
        Protein.Abstract.t -> Protein.Abstract.d
      exception Wrong_domain_type
      type interfid =
          I_SLBD of Protein.Abstract.SLBD.interfid
        | I_PDMatcher of Protein.Abstract.PDMatcher.interfid
        | I_BMD of Protein.Abstract.BMD.interfid
        | I_LID of Protein.Abstract.LID.interfid
        | I_LBDR of Protein.Abstract.LBDR.interfid
        | I_LBDE of Protein.Abstract.LBDE.interfid
      val get_interf :
        Protein.Abstract.d ->
        Protein.Abstract.interfid -> Protein.Abstract.interf
      exception Interface_already_set
      exception Wrong_type
      exception Wrong_direction
      exception Different_proteins
      val add_connection :
        Protein.Abstract.interf ->
        Protein.Abstract.interf -> Protein.Abstract.conn_value -> unit
    end
  module Wizard :
    sig
      type domain_cons =
          WPDMatcher of string
        | WSLBD of Protein.Abstract.SLBD.initstate
        | WLID of Protein.Abstract.LID.lidfunc * int
        | WBMD of int
        | WLBDR of int * Protein.Abstract.LBDR.initstate *
            Protein.Abstract.LBDR.extremity_arrangement *
            ((int array * int array) * (int array * int array))
        | WLBDE of int * Protein.Abstract.LBDE.initstate *
            Protein.Abstract.LBDE.extraction
      and domain_config = string * Protein.Wizard.domain_cons
      and ifident =
          WRepress
        | WRepress1
        | WRepress2
        | WMatcher
        | WMatcherMult of int
        | WBound
        | WBound1
        | WBound2
        | WPermuteIn
        | WPermuteOut
        | WInput
        | WOutput
        | WInputMult of int
        | WOutputMult of int
      and conn_link =
        (string * Protein.Wizard.ifident) * (string * Protein.Wizard.ifident)
      and conn_value =
          WIBool of bool
        | WIInt of int
        | WIString of string
        | WIMatcher of string
      and connection_config =
        Protein.Wizard.conn_link * Protein.Wizard.conn_value
      and config = {
        domains : Protein.Wizard.domain_config list;
        connections : Protein.Wizard.connection_config list;
      } 
      val make : Protein.Wizard.config -> Protein.Abstract.t
    end
  module Optimized :
    sig
      type t
      exception Misformed_protein
      val compile : Protein.Abstract.t -> Protein.Optimized.t
    end
  type t
  val make : ?stats:bool -> Protein.Optimized.t -> Protein.t
  type globalstats = {
    mutable click_count : int;
    mutable lb_unimate_count : int;
    mutable sb_unimate_count : int;
  } 
  exception No_statistical_collection
  val get_stats : Protein.t -> Protein.globalstats
  val to_pu : Protein.t -> Incubator.Procunit.t
end