Source file nucleotide_process.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
open Linear_algebra

module RM = Rate_matrix.Nucleotide

type t =
  | JC69
  | K80 of float
  | HKY85 of {
      equilibrium_frequencies : Nucleotide.vector ;
      transition_rate : float ;
      transversion_rate : float ;
    }
  | GTR of {
      equilibrium_frequencies : Nucleotide.vector ;
      exchangeabilities : Linear_algebra.vec
    }

let rate_matrix = function
  | JC69 -> RM.jc69 ()
  | K80 kappa -> RM.k80 kappa
  | HKY85 { equilibrium_frequencies ; transversion_rate ; transition_rate } ->
    RM.hky85 ~equilibrium_frequencies ~transition_rate ~transversion_rate
  | GTR { equilibrium_frequencies ; exchangeabilities } ->
    RM.gtr ~equilibrium_frequencies ~transition_rates:exchangeabilities

let stationary_distribution = function
  | JC69
  | K80 _ -> Nucleotide.Vector.init (fun _ -> 0.25)
  | HKY85 { equilibrium_frequencies ; _ }
  | GTR { equilibrium_frequencies ; _ } -> equilibrium_frequencies

module Random = struct
  let gtr rng ~alpha =
    let equilibrium_frequencies = Nucleotide.random_profile rng alpha in
    let exchangeabilities = Vector.init 6 ~f:(fun _ -> Gsl.Randist.gamma rng ~a:1. ~b:1.) in
    GTR { equilibrium_frequencies ; exchangeabilities }

  let hky85 rng ~alpha =
    let equilibrium_frequencies = Nucleotide.random_profile rng alpha in
    let transition_rate = Gsl.Randist.gamma rng ~a:1. ~b:1. in
    let transversion_rate = Gsl.Randist.gamma rng ~a:1. ~b:1. in
    HKY85 { equilibrium_frequencies ; transversion_rate ; transition_rate }
end