Fuzion Logo
flang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

benchmarks_game/fasta.fz


# https://benchmarksgame-team.pages.debian.net/benchmarksgame/description/fasta.html#fasta
# this is a port of https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/fasta-java-2.html
# thus it is still rough around the edges

fasta =>
  IM := f64 139968
  IA := f64 3877
  IC := f64 29573
  last := mut f64 42
  LINE_LENGTH := 60

  random(max f64) =>
    last <- (last.get * IA + IC) % IM
    max * last.get / IM

  ALU := ("GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" +
    "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" +
    "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" +
    "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" +
    "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" +
    "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"+
    "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA")

  frequency(c string, p f64) is

  IUB := [
             frequency("a", 0.27),
             frequency("c", 0.12),
             frequency("g", 0.12),
             frequency("t", 0.27),

             frequency("B", 0.02),
             frequency("D", 0.02),
             frequency("H", 0.02),
             frequency("K", 0.02),
             frequency("M", 0.02),
             frequency("N", 0.02),
             frequency("R", 0.02),
             frequency("S", 0.02),
             frequency("V", 0.02),
             frequency("W", 0.02),
             frequency("Y", 0.02)
    ]

  HomoSapiens := [
             frequency("a", 0.3029549426680),
             frequency("c", 0.1979883004921),
             frequency("g", 0.1975473066391),
             frequency("t", 0.3015094502008)
    ]

  makeCumulative(a array frequency) =>
    a.map frequency (freq ->
      cp := a.takeWhile(f -> !(freq.c == f.c))
        .map f64 (f -> f.p)
        .fold(f64s.sum) + freq.p
      frequency freq.c cp)

  selectRandom(a array frequency) =>
    r := random 1.0
    for i := 0, i+1
    while i < a.length
    until r < a[i].p
      a[i].c
    else
      a.last().c

  randomFasta(id, desc string, a array frequency, n i32) =>
    m := 0
    say (">" + id + " " + desc)
    (1..LINE_LENGTH)
      .for_each(_ ->
        b := (0..LINE_LENGTH-1)
          .map string (_ -> selectRandom(a))
          .fold(strings.concat)
        say b
        )

  repeatFasta(id, desc, alu string, n i32) =>
    m := 0
    k := mut 0
    kn := ALU.byteLength()
    say (">" + id + " " + desc)
    (1..LINE_LENGTH)
      .for_each(_ ->
        (0..LINE_LENGTH-1)
          .for_each(_ ->
            if (k.get = kn) then k <- 0
            yak ALU.substring(k.get, k.get+1)
            k <- k.get + 1
            )
        say
        )

  homo := makeCumulative HomoSapiens
  iub := makeCumulative IUB

  n := 2500000

  repeatFasta "ONE" "Homo sapiens alu" ALU (n * 2)
  randomFasta "TWO" "IUB ambiguity codes" iub (n * 3)
  randomFasta "THREE" "Homo sapiens frequency" homo (n * 5)