sig
  module Tool :
    sig
      module Definition :
        sig
          type t = { name : string; version : string option; }
          val create :
            ?version:string ->
            string -> Biokepi_run_environment.Machine.Tool.Definition.t
          val to_opam_name :
            Biokepi_run_environment.Machine.Tool.Definition.t -> string
          val to_string :
            Biokepi_run_environment.Machine.Tool.Definition.t -> string
          val to_directory_name :
            Biokepi_run_environment.Machine.Tool.Definition.t -> string
        end
      module Default :
        sig
          val bwa : Biokepi_run_environment.Machine.Tool.Definition.t
          val samtools : Biokepi_run_environment.Machine.Tool.Definition.t
          val vcftools : Biokepi_run_environment.Machine.Tool.Definition.t
          val bedtools : Biokepi_run_environment.Machine.Tool.Definition.t
          val somaticsniper :
            Biokepi_run_environment.Machine.Tool.Definition.t
          val varscan : Biokepi_run_environment.Machine.Tool.Definition.t
          val picard : Biokepi_run_environment.Machine.Tool.Definition.t
          val mutect : Biokepi_run_environment.Machine.Tool.Definition.t
          val gatk : Biokepi_run_environment.Machine.Tool.Definition.t
          val strelka : Biokepi_run_environment.Machine.Tool.Definition.t
          val virmid : Biokepi_run_environment.Machine.Tool.Definition.t
          val muse : Biokepi_run_environment.Machine.Tool.Definition.t
          val star : Biokepi_run_environment.Machine.Tool.Definition.t
          val stringtie : Biokepi_run_environment.Machine.Tool.Definition.t
          val cufflinks : Biokepi_run_environment.Machine.Tool.Definition.t
          val hisat : Biokepi_run_environment.Machine.Tool.Definition.t
          val hisat2 : Biokepi_run_environment.Machine.Tool.Definition.t
          val mosaik : Biokepi_run_environment.Machine.Tool.Definition.t
          val kallisto : Biokepi_run_environment.Machine.Tool.Definition.t
          val bowtie : Biokepi_run_environment.Machine.Tool.Definition.t
          val optitype : Biokepi_run_environment.Machine.Tool.Definition.t
          val seq2hla : Biokepi_run_environment.Machine.Tool.Definition.t
        end
      type t = {
        definition : Biokepi_run_environment.Machine.Tool.Definition.t;
        init : Common.KEDSL.Program.t;
        ensure : Biokepi_run_environment.Common.KEDSL.phony_workflow;
      }
      val create :
        ?init:Common.KEDSL.Program.t ->
        ?ensure:< is_done : Common.KEDSL.Condition.t option; .. >
                Biokepi_run_environment.Common.KEDSL.workflow_node ->
        Biokepi_run_environment.Machine.Tool.Definition.t ->
        Biokepi_run_environment.Machine.Tool.t
      val init :
        Biokepi_run_environment.Machine.Tool.t -> Common.KEDSL.Program.t
      val ensure :
        Biokepi_run_environment.Machine.Tool.t ->
        Biokepi_run_environment.Common.KEDSL.phony_workflow
      module Kit :
        sig
          type tool = Biokepi_run_environment.Machine.Tool.t
          type t =
              Biokepi_run_environment.Machine.Tool.Definition.t ->
              Biokepi_run_environment.Machine.Tool.Kit.tool option
          val concat :
            Biokepi_run_environment.Machine.Tool.Kit.t list ->
            Biokepi_run_environment.Machine.Tool.Kit.t
          val of_list :
            Biokepi_run_environment.Machine.Tool.Kit.tool list ->
            Biokepi_run_environment.Machine.Tool.Kit.t
          val get_exn :
            (Biokepi_run_environment.Machine.Tool.Definition.t -> 'a option) ->
            Biokepi_run_environment.Machine.Tool.Definition.t -> 'a
        end
    end
  module Make_fun :
    sig
      module Requirement :
        sig
          type t =
              [ `Custom of string
              | `Internet_access
              | `Memory of [ `Big | `GB of float | `Small ]
              | `Processors of int
              | `Quick_run
              | `Self_identification of string list
              | `Spark of string list ]
          val to_yojson :
            Biokepi_run_environment.Machine.Make_fun.Requirement.t ->
            Yojson.Safe.json
          val of_yojson :
            Yojson.Safe.json ->
            [ `Error of string
            | `Ok of Biokepi_run_environment.Machine.Make_fun.Requirement.t ]
          val pp :
            Format.formatter ->
            Biokepi_run_environment.Machine.Make_fun.Requirement.t ->
            Ppx_deriving_runtime.unit
          val show :
            Biokepi_run_environment.Machine.Make_fun.Requirement.t ->
            Ppx_deriving_runtime.string
        end
      type t =
          ?name:string ->
          ?requirements:Biokepi_run_environment.Machine.Make_fun.Requirement.t
                        list ->
          Common.KEDSL.Program.t -> Common.KEDSL.Build_process.t
      val stream_processor :
        ([> `Memory of [> `Small ] | `Processors of int ] as 'a) list ->
        'a list
      val quick : ([> `Quick_run ] as 'a) list -> 'a list
      val downloading :
        ([> `Internet_access | `Memory of [> `Small ] | `Processors of int ]
         as 'a)
        list -> 'a list
      val with_self_ids :
        ?self_ids:'->
        ([> `Self_identification of 'a ] as 'b) list -> 'b list
      val with_requirements :
        Biokepi_run_environment.Machine.Make_fun.t ->
        Biokepi_run_environment.Machine.Make_fun.Requirement.t list ->
        Biokepi_run_environment.Machine.Make_fun.t
    end
  type t = {
    name : string;
    host : Common.KEDSL.Host.t;
    get_reference_genome : string -> Reference_genome.t;
    toolkit : Biokepi_run_environment.Machine.Tool.Kit.t;
    run_program : Biokepi_run_environment.Machine.Make_fun.t;
    work_dir : string;
    max_processors : int;
  }
  val create :
    host:Common.KEDSL.Host.t ->
    get_reference_genome:(string -> Reference_genome.t) ->
    toolkit:Biokepi_run_environment.Machine.Tool.Kit.t ->
    run_program:Biokepi_run_environment.Machine.Make_fun.t ->
    work_dir:string ->
    max_processors:int -> string -> Biokepi_run_environment.Machine.t
  val name : Biokepi_run_environment.Machine.t -> string
  val as_host : Biokepi_run_environment.Machine.t -> Common.KEDSL.Host.t
  val get_reference_genome :
    Biokepi_run_environment.Machine.t -> string -> Reference_genome.t
  val get_tool :
    Biokepi_run_environment.Machine.t ->
    Biokepi_run_environment.Machine.Tool.Definition.t ->
    Biokepi_run_environment.Machine.Tool.Kit.tool
  val run_program :
    Biokepi_run_environment.Machine.t ->
    Biokepi_run_environment.Machine.Make_fun.t
  val max_processors : Biokepi_run_environment.Machine.t -> int
  val quick_run_program :
    Biokepi_run_environment.Machine.t ->
    Biokepi_run_environment.Machine.Make_fun.t
  val run_stream_processor :
    ?self_ids:string list ->
    Biokepi_run_environment.Machine.t ->
    Biokepi_run_environment.Machine.Make_fun.t
  val run_download_program :
    Biokepi_run_environment.Machine.t ->
    Biokepi_run_environment.Machine.Make_fun.t
  val run_big_program :
    Biokepi_run_environment.Machine.t ->
    ?processors:int ->
    ?self_ids:string list -> Biokepi_run_environment.Machine.Make_fun.t
  val work_dir : Biokepi_run_environment.Machine.t -> string
end