]> gitweb.factorcode.org Git - factor.git/blob - extra/benchmark/fasta/fasta.factor
c1d554a5a3919dc7ddd3631a7abbcee6a3250460
[factor.git] / extra / benchmark / fasta / fasta.factor
1 ! Based on http://shootout.alioth.debian.org/gp4/benchmark.php?test=fasta&lang=java&id=2
2 USING: math kernel io io.files locals multiline assocs sequences
3 sequences.private benchmark.reverse-complement hints io.encodings.ascii
4 byte-arrays specialized-arrays.double ;
5 IN: benchmark.fasta
6
7 CONSTANT: IM 139968
8 CONSTANT: IA 3877
9 CONSTANT: IC 29573
10 CONSTANT: initial-seed 42
11 CONSTANT: line-length 60
12
13 : random ( seed -- n seed )
14     >float IA * IC + IM mod [ IM /f ] keep ; inline
15
16 HINTS: random fixnum ;
17
18 CONSTANT: ALU "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
19
20 CONSTANT: IUB
21     {
22         { CHAR: a 0.27 }
23         { CHAR: c 0.12 }
24         { CHAR: g 0.12 }
25         { CHAR: t 0.27 }
26
27         { CHAR: B 0.02 }
28         { CHAR: D 0.02 }
29         { CHAR: H 0.02 }
30         { CHAR: K 0.02 }
31         { CHAR: M 0.02 }
32         { CHAR: N 0.02 }
33         { CHAR: R 0.02 }
34         { CHAR: S 0.02 }
35         { CHAR: V 0.02 }
36         { CHAR: W 0.02 }
37         { CHAR: Y 0.02 }
38     }
39
40 CONSTANT: homo-sapiens
41     {
42         { CHAR: a 0.3029549426680 }
43         { CHAR: c 0.1979883004921 }
44         { CHAR: g 0.1975473066391 }
45         { CHAR: t 0.3015094502008 }
46     }
47
48 : make-cumulative ( freq -- chars floats )
49     [ keys >byte-array ]
50     [ values >double-array ] bi unclip [ + ] accumulate swap suffix ;
51
52 :: select-random ( seed chars floats -- seed elt )
53     floats seed random -rot
54     [ >= ] curry find drop
55     chars nth-unsafe ; inline
56
57 : make-random-fasta ( seed len chars floats -- seed )
58     [ rot drop select-random ] 2curry "" map-as print ; inline
59
60 : write-description ( desc id -- )
61     ">" write write bl print ; inline
62
63 :: split-lines ( n quot -- )
64     n line-length /mod
65     [ [ line-length quot call ] times ] dip
66     quot unless-zero ; inline
67
68 : write-random-fasta ( seed n chars floats desc id -- seed )
69     write-description
70     [ make-random-fasta ] 2curry split-lines ; inline
71
72 :: make-repeat-fasta ( k len alu -- k' )
73     [let | kn [ alu length ] |
74         len [ k + kn mod alu nth-unsafe ] "" map-as print
75         k len +
76     ] ; inline
77
78 : write-repeat-fasta ( n alu desc id -- )
79     write-description
80     [let | k! [ 0 ] alu [ ] |
81         [| len | k len alu make-repeat-fasta k! ] split-lines
82     ] ; inline
83
84 : fasta ( n out -- )
85     homo-sapiens make-cumulative
86     IUB make-cumulative
87     [let | homo-sapiens-floats [ ]
88            homo-sapiens-chars [ ]
89            IUB-floats [ ]
90            IUB-chars [ ]
91            out [ ]
92            n [ ]
93            seed [ initial-seed ] |
94
95         out ascii [
96             n 2 * ALU "Homo sapiens alu" "ONE" write-repeat-fasta
97
98             initial-seed
99             n 3 * homo-sapiens-chars homo-sapiens-floats "IUB ambiguity codes" "TWO" write-random-fasta
100             n 5 * IUB-chars IUB-floats "Homo sapiens frequency" "THREE" write-random-fasta
101             drop
102         ] with-file-writer
103
104     ] ;
105
106 : run-fasta ( -- ) 2500000 reverse-complement-in fasta ;
107
108 MAIN: run-fasta