sig
  module Apply_optimization_framework :
    functor (Input : Semantics.Bioinformatics_base->
      sig
        module Transformation_types :
          sig
            type 'a from = 'Input.repr
            type 'a term =
                Unknown :
                  'a
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.from -> 
                  'a
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | Apply :
                  ('-> 'b)
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term *
                  'a
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term -> 
                  'b
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | Lambda :
                  ('a
                   Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
                   'b
                   Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term) -> 
                  ('-> 'b)
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | List_make :
                  'a
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
                  list -> 'a list
                          Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | List_map :
                  ('a list
                   Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term *
                   ('-> 'b)
                   Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term) -> 
                  'b list
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | Pair :
                  'a
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term *
                  'b
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term -> 
                  ('a * 'b)
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | Fst :
                  ('a * 'b)
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term -> 
                  'a
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              | Snd :
                  ('a * 'b)
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term -> 
                  'b
                  Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val fwd :
              'a
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.from ->
              'a
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val bwd : 'a term -> 'a from
          end
        module Transformation :
          sig
            type 'a from = 'Transformation_types.from
            type 'a term = 'Transformation_types.term
            val fwd : 'a from -> 'a term
            val bwd : 'a term -> 'a from
            val fmap : ('a from -> 'b from) -> 'a term -> 'b term
            val fmap2 :
              ('a from -> 'b from -> 'c from) ->
              'a term -> 'b term -> 'c term
          end
        module Language_delta :
          sig
            val apply :
              ('-> 'b)
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              'a
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              'b
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val lambda :
              ('a
               Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
               'b
               Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term) ->
              ('-> 'b)
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val list :
              'a
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
              list ->
              'a list
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val list_map :
              'a list
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              f:('-> 'b)
                Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              'b list
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val pair :
              'a
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              'b
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              ('a * 'b)
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val pair_first :
              ('a * 'b)
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              'a
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
            val pair_second :
              ('a * 'b)
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term ->
              'b
              Biokepi_pipeline_edsl.Transform_applications.Apply_optimization_framework.Transformation_types.term
          end
      end
  module Apply :
    functor (Input : Semantics.Bioinformatics_base->
      sig
        module The_pass :
          sig
            module Transformation_types :
              sig
                type 'a from = 'Input.repr
                type 'a term =
                  'a
                  Apply_optimization_framework(Input).Transformation_types.term =
                    Unknown : 'a from -> 'a term
                  | Apply : ('-> 'b) term * 'a term -> 'b term
                  | Lambda : ('a term -> 'b term) -> ('-> 'b) term
                  | List_make : 'a term list -> 'a list term
                  | List_map :
                      ('a list term * ('-> 'b) term) -> 'b list term
                  | Pair : 'a term * 'b term -> ('a * 'b) term
                  | Fst : ('a * 'b) term -> 'a term
                  | Snd : ('a * 'b) term -> 'b term
                val fwd : 'a from -> 'a term
                val bwd : 'a term -> 'a from
              end
            module Transformation :
              sig
                type 'a from = 'Transformation_types.from
                type 'a term = 'Transformation_types.term
                val fwd : 'a from -> 'a term
                val bwd : 'a term -> 'a from
                val fmap : ('a from -> 'b from) -> 'a term -> 'b term
                val fmap2 :
                  ('a from -> 'b from -> 'c from) ->
                  'a term -> 'b term -> 'c term
              end
            module Language_delta :
              sig
                val apply :
                  ('-> 'b) Transformation_types.term ->
                  'Transformation_types.term ->
                  'Transformation_types.term
                val lambda :
                  ('Transformation_types.term ->
                   'Transformation_types.term) ->
                  ('-> 'b) Transformation_types.term
                val list :
                  'Transformation_types.term list ->
                  'a list Transformation_types.term
                val list_map :
                  'a list Transformation_types.term ->
                  f:('-> 'b) Transformation_types.term ->
                  'b list Transformation_types.term
                val pair :
                  'Transformation_types.term ->
                  'Transformation_types.term ->
                  ('a * 'b) Transformation_types.term
                val pair_first :
                  ('a * 'b) Transformation_types.term ->
                  'Transformation_types.term
                val pair_second :
                  ('a * 'b) Transformation_types.term ->
                  'Transformation_types.term
              end
          end
        type 'a repr = 'The_pass.Transformation.term
        type 'a observation = 'Input.observation
        val observe : (unit -> 'a repr) -> 'a observation
        val to_unit : 'a repr -> unit repr
        val fastq :
          sample_name:string ->
          ?fragment_id:string ->
          r1:string -> ?r2:string -> unit -> [ `Fastq ] repr
        val fastq_gz :
          sample_name:string ->
          ?fragment_id:string ->
          r1:string -> ?r2:string -> unit -> [ `Gz of [ `Fastq ] ] repr
        val bam :
          path:string ->
          ?sorting:[ `Coordinate | `Read_name ] ->
          reference_build:string -> unit -> [ `Bam ] repr
        val gunzip : [ `Gz of 'a ] repr -> 'a repr
        val gunzip_concat : [ `Gz of 'a ] list repr -> 'a repr
        val concat : 'a list repr -> 'a repr
        val merge_bams : [ `Bam ] list repr -> [ `Bam ] repr
        val bam_to_fastq :
          sample_name:string ->
          ?fragment_id:string ->
          [ `PE | `SE ] -> [ `Bam ] repr -> [ `Fastq ] repr
        val bwa_aln :
          ?configuration:Biokepi_bfx_tools.Bwa.Configuration.Aln.t ->
          reference_build:Biokepi_run_environment.Reference_genome.name ->
          [ `Fastq ] repr -> [ `Bam ] repr
        val bwa_mem :
          ?configuration:Biokepi_bfx_tools.Bwa.Configuration.Mem.t ->
          reference_build:Biokepi_run_environment.Reference_genome.name ->
          [ `Fastq ] repr -> [ `Bam ] repr
        val star :
          ?configuration:Biokepi_bfx_tools.Star.Configuration.Align.t ->
          reference_build:Biokepi_run_environment.Reference_genome.name ->
          [ `Fastq ] repr -> [ `Bam ] repr
        val hisat :
          ?configuration:Biokepi_bfx_tools.Hisat.Configuration.t ->
          reference_build:Biokepi_run_environment.Reference_genome.name ->
          [ `Fastq ] repr -> [ `Bam ] repr
        val mosaik :
          reference_build:Biokepi_run_environment.Reference_genome.name ->
          [ `Fastq ] repr -> [ `Bam ] repr
        val stringtie :
          ?configuration:Biokepi_bfx_tools.Stringtie.Configuration.t ->
          [ `Bam ] repr -> [ `Gtf ] repr
        val gatk_indel_realigner :
          ?configuration:Biokepi_bfx_tools.Gatk.Configuration.indel_realigner ->
          [ `Bam ] repr -> [ `Bam ] repr
        val gatk_indel_realigner_joint :
          ?configuration:Biokepi_bfx_tools.Gatk.Configuration.indel_realigner ->
          ([ `Bam ] * [ `Bam ]) repr -> ([ `Bam ] * [ `Bam ]) repr
        val picard_mark_duplicates :
          ?configuration:Biokepi_bfx_tools.Picard.Mark_duplicates_settings.t ->
          [ `Bam ] repr -> [ `Bam ] repr
        val gatk_bqsr :
          ?configuration:Biokepi_bfx_tools.Gatk.Configuration.bqsr ->
          [ `Bam ] repr -> [ `Bam ] repr
        val seq2hla : [ `Fastq ] repr -> [ `Seq2hla_result ] repr
        val optitype :
          [ `DNA | `RNA ] -> [ `Fastq ] repr -> [ `Optitype_result ] repr
        val gatk_haplotype_caller : [ `Bam ] repr -> [ `Vcf ] repr
        val mutect :
          ?configuration:Biokepi_bfx_tools.Mutect.Configuration.t ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val mutect2 :
          ?configuration:Biokepi_bfx_tools.Gatk.Configuration.Mutect2.t ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val somaticsniper :
          ?configuration:Biokepi_bfx_tools.Somaticsniper.Configuration.t ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val varscan_somatic :
          ?adjust_mapq:int ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val strelka :
          ?configuration:Biokepi_bfx_tools.Strelka.Configuration.t ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val virmid :
          ?configuration:Biokepi_bfx_tools.Virmid.Configuration.t ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val muse :
          ?configuration:Biokepi_bfx_tools.Muse.Configuration.t ->
          normal:[ `Bam ] repr ->
          tumor:[ `Bam ] repr -> unit -> [ `Vcf ] repr
        val apply :
          ('-> 'b) The_pass.Transformation_types.term ->
          'The_pass.Transformation_types.term ->
          'The_pass.Transformation_types.term
        val lambda :
          ('The_pass.Transformation_types.term ->
           'The_pass.Transformation_types.term) ->
          ('-> 'b) The_pass.Transformation_types.term
        val list :
          'The_pass.Transformation_types.term list ->
          'a list The_pass.Transformation_types.term
        val list_map :
          'a list The_pass.Transformation_types.term ->
          f:('-> 'b) The_pass.Transformation_types.term ->
          'b list The_pass.Transformation_types.term
        val pair :
          'The_pass.Transformation_types.term ->
          'The_pass.Transformation_types.term ->
          ('a * 'b) The_pass.Transformation_types.term
        val pair_first :
          ('a * 'b) The_pass.Transformation_types.term ->
          'The_pass.Transformation_types.term
        val pair_second :
          ('a * 'b) The_pass.Transformation_types.term ->
          'The_pass.Transformation_types.term
      end
end