sig
  module Host = Ketrew.EDSL.Host
  module Program = Ketrew.EDSL.Program
  module Condition = Ketrew.EDSL.Condition
  module Build_process = Ketrew.EDSL.Build_process
  val daemonize :
    ?starting_timeout:float ->
    ?call_script:(string -> string list) ->
    ?using:[ `Nohup_setsid | `Python_daemon ] ->
    ?host:Host.t -> ?no_log_is_ok:bool -> Program.t -> Build_process.t
  val lsf :
    ?host:Host.t ->
    ?queue:string ->
    ?name:string ->
    ?wall_limit:string ->
    ?processors:[ `Min of int | `Min_max of int * int ] ->
    ?project:string ->
    ?request_memory:[ `GB of int | `MB of int ] ->
    ?raw_options:string list -> Program.t -> Build_process.t
  val pbs :
    ?host:Host.t ->
    ?queue:string ->
    ?name:string ->
    ?wall_limit:[ `Hours of float ] ->
    ?processors:int ->
    ?email_user:[ `Always of string | `Never ] ->
    ?shell:string -> Program.t -> Build_process.t
  val yarn_application :
    ?host:Host.t ->
    ?daemonize_using:[ `Nohup_setsid | `Python_daemon ] ->
    ?daemon_start_timeout:float -> Program.t -> Build_process.t
  val yarn_distributed_shell :
    ?host:Host.t ->
    ?daemonize_using:[ `Nohup_setsid | `Python_daemon ] ->
    ?daemon_start_timeout:float ->
    ?hadoop_bin:string ->
    ?distributed_shell_shell_jar:string ->
    ?container_vcores:int ->
    container_memory:[ `GB of int | `MB of int | `Raw of string ] ->
    timeout:[ `Raw of string | `Seconds of int ] ->
    application_name:string -> Program.t -> Build_process.t
  module Internal_representation = Ketrew.EDSL.Internal_representation
  type 'a product = 'constraint 'a = < is_done : Condition.t option; .. >
  type 'a workflow_node =
      < product : 'a product; render : Internal_representation.t >
    constraint 'a = < is_done : Condition.t option; .. >
  type workflow_edge = Ketrew.EDSL.workflow_edge
  val depends_on :
    < is_done : Condition.t option; .. > workflow_node -> workflow_edge
  val on_success_activate :
    < is_done : Condition.t option; .. > workflow_node -> workflow_edge
  val on_failure_activate :
    < is_done : Condition.t option; .. > workflow_node -> workflow_edge
  type done_when_option =
      [ `Dependencies_are | `Is_verified of Condition.t | `Product_is ]
  val workflow_node :
    ?name:string ->
    ?active:bool ->
    ?make:Build_process.t ->
    ?done_when:done_when_option ->
    ?metadata:[ `String of string ] ->
    ?equivalence:Ketrew_pure.Target.Equivalence.t ->
    ?tags:string list ->
    ?edges:workflow_edge list ->
    (< is_done : Condition.t option; .. > as 'a) product -> 'a workflow_node
  type not_already_done = < is_done : Condition.t option >
  val without_product : not_already_done
  type single_file =
      < exists : Ketrew_pure.Target.Condition.t;
        is_bigger_than : int -> Ketrew_pure.Target.Condition.t;
        is_done : Ketrew_pure.Target.Condition.t option; path : string >
  val single_file : ?host:Host.t -> string -> single_file product
  type list_of_files =
      < is_done : Ketrew_pure.Target.Condition.t option;
        paths : string list >
  val list_of_files : ?host:Host.t -> string list -> list_of_files product
  type unknown_product = < is_done : Condition.t option >
  val forget_product :
    < is_done : Condition.t option; .. > workflow_node ->
    unknown_product workflow_node
  val workflow_to_string :
    ?ansi_colors:bool ->
    ?indentation:int ->
    < is_done : Condition.t option; .. > workflow_node -> string
  val add_tags :
    ?recursive:bool ->
    < is_done : Condition.t option; .. > workflow_node -> string list -> unit
  val node_id : < is_done : Condition.t option; .. > workflow_node -> string
  val node_name :
    < is_done : Condition.t option; .. > workflow_node -> string
  class type user_artifact =
    object
      method exists : Ketrew_pure.Target.Condition.t
      method is_bigger_than : int -> Ketrew_pure.Target.Condition.t
      method path : string
    end
  val file : ?host:Host.t -> string -> user_artifact
  val unit : user_artifact
  class type user_target =
    object
      method activate : unit
      method add_recursive_tags : string list -> unit
      method add_tags : string list -> unit
      method depends_on : user_target list
      method get_recursive_tags : string list
      method id : Ketrew_pure.Internal_pervasives.Unique_id.t
      method is_active : bool
      method metadata : [ `String of string ] option
      method name : string
      method on_failure_activate : user_target list
      method on_success_activate : user_target list
      method product : user_artifact
      method render : Ketrew_pure.Target.t
    end
  val to_display_string :
    ?ansi_colors:bool -> ?indentation:int -> user_target -> string
  module Command = Ketrew_pure.Target.Command
  type nothing = < is_done : Condition.t option >
  val nothing : < is_done : 'a option >
  val target : '-> [> `Please_KEDSL_workflow ]
  val file_target : '-> [> `Please_KEDSL_workflow ]
  type file_workflow = single_file workflow_node
  type phony_workflow =
      Biokepi_run_environment.Common.KEDSL.nothing workflow_node
  type fastq_reads =
      < escaped_sample_name : string; fragment_id : string option;
        fragment_id_forced : string;
        is_done : Ketrew_pure.Target.Condition.t option;
        paths : string * string option; r1 : single_file workflow_node;
        r2 : single_file workflow_node option; sample_name : string >
  val fastq_reads :
    ?host:Host.t ->
    ?name:string ->
    ?fragment_id:string ->
    string ->
    string option -> Biokepi_run_environment.Common.KEDSL.fastq_reads
  val fastq_node_of_single_file_nodes :
    host:Host.t ->
    name:string ->
    ?fragment_id:string ->
    < is_done : Condition.t option; path : string; .. > product workflow_node ->
    < is_done : Condition.t option; path : string; .. > workflow_node option ->
    < escaped_sample_name : string; fragment_id : string option;
      fragment_id_forced : string; is_done : Condition.t option;
      paths : string * string option; r1 : single_file workflow_node;
      r2 : single_file workflow_node option; sample_name : string >
    workflow_node
  type bam_file =
      < host : Host.t; is_done : Ketrew_pure.Target.Condition.t option;
        path : string; reference_build : string;
        sorting : [ `Coordinate | `Read_name ] option >
  val bam_file :
    host:Host.t ->
    ?sorting:[ `Coordinate | `Read_name ] ->
    reference_build:string ->
    string -> Biokepi_run_environment.Common.KEDSL.bam_file
  val transform_bam :
    ?change_sorting:[ `Coordinate | `Read_name ] ->
    Biokepi_run_environment.Common.KEDSL.bam_file ->
    path:string -> Biokepi_run_environment.Common.KEDSL.bam_file
  type bam_list =
      < bams : Biokepi_run_environment.Common.KEDSL.bam_file list;
        is_done : Ketrew_pure.Target.Condition.t option >
  val bam_list :
    Biokepi_run_environment.Common.KEDSL.bam_file list ->
    Biokepi_run_environment.Common.KEDSL.bam_list
  val explode_bam_list_node :
    Biokepi_run_environment.Common.KEDSL.bam_list workflow_node ->
    < host : Host.t; is_done : Condition.t option; path : string;
      reference_build : string;
      sorting : [ `Coordinate | `Read_name ] option >
    workflow_node list
  type _ bam_or_bams =
      Single_bam :
        Biokepi_run_environment.Common.KEDSL.bam_file workflow_node -> 
        Biokepi_run_environment.Common.KEDSL.bam_file workflow_node
        Biokepi_run_environment.Common.KEDSL.bam_or_bams
    | Bam_workflow_list :
        Biokepi_run_environment.Common.KEDSL.bam_file workflow_node list -> 
        Biokepi_run_environment.Common.KEDSL.bam_list workflow_node
        Biokepi_run_environment.Common.KEDSL.bam_or_bams
  val submit :
    < is_done : Ketrew.EDSL.Condition.t option; .. > Ketrew.EDSL.product
    Ketrew.EDSL.workflow_node -> unit
end