! Based on http://shootout.alioth.debian.org/gp4/benchmark.php?test=fasta&lang=java&id=2
-USING: alien.c-types math kernel io io.files locals multiline
-assocs sequences sequences.private benchmark.reverse-complement
-hints io.encodings.ascii byte-arrays specialized-arrays ;
-SPECIALIZED-ARRAY: double
+USING: alien.data assocs benchmark.reverse-complement
+byte-arrays io io.encodings.ascii io.files kernel math sequences
+sequences.private specialized-arrays strings typed ;
+QUALIFIED-WITH: alien.c-types c
+SPECIALIZED-ARRAY: c:double
IN: benchmark.fasta
CONSTANT: IM 139968
CONSTANT: initial-seed 42
CONSTANT: line-length 60
-: random ( seed -- n seed )
- >float IA * IC + IM mod [ IM /f ] keep ; inline
-
-HINTS: random fixnum ;
+: next-fasta-random ( seed -- seed n )
+ IA * IC + IM mod dup IM /f ; inline
CONSTANT: ALU "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
{ CHAR: t 0.3015094502008 }
}
-: make-cumulative ( freq -- chars floats )
+TYPED: make-cumulative ( freq -- chars: byte-array floats: double-array )
[ keys >byte-array ]
- [ values >double-array ] bi unclip [ + ] accumulate swap suffix ;
+ [ values c:double >c-array 0.0 [ + ] accumulate* ] bi ;
:: select-random ( seed chars floats -- seed elt )
- floats seed random -rot
- [ >= ] curry find drop
- chars nth-unsafe ; inline
+ seed next-fasta-random floats [ <= ] with find drop chars nth-unsafe ; inline
-: make-random-fasta ( seed len chars floats -- seed )
- [ rot drop select-random ] 2curry "" map-as print ; inline
+TYPED: make-random-fasta ( seed: float len: fixnum chars: byte-array floats: double-array -- seed: float )
+ '[ _ _ select-random ] "" replicate-as print ;
: write-description ( desc id -- )
- ">" write write bl print ; inline
+ ">" write write bl print ;
-:: split-lines ( n quot -- )
+:: n-split-lines ( n quot -- )
n line-length /mod
[ [ line-length quot call ] times ] dip
quot unless-zero ; inline
-: write-random-fasta ( seed n chars floats desc id -- seed )
+TYPED: write-random-fasta ( seed: float n: fixnum chars: byte-array floats: double-array desc id -- seed: float )
write-description
- [ make-random-fasta ] 2curry split-lines ; inline
+ '[ _ _ make-random-fasta ] n-split-lines ;
-:: make-repeat-fasta ( k len alu -- k' )
+TYPED:: make-repeat-fasta ( k: fixnum len: fixnum alu: string -- k': fixnum )
alu length :> kn
- len [ k + kn mod alu nth-unsafe ] "" map-as print
- k len + ; inline
+ len <iota> [ k + kn mod alu nth-unsafe ] "" map-as print
+ k len + ;
: write-repeat-fasta ( n alu desc id -- )
write-description
[let
:> alu
0 :> k!
- [| len | k len alu make-repeat-fasta k! ] split-lines
- ] ; inline
+ [| len | k len alu make-repeat-fasta k! ] n-split-lines
+ ] ;
: fasta ( n out -- )
homo-sapiens make-cumulative
n 2 * ALU "Homo sapiens alu" "ONE" write-repeat-fasta
initial-seed
+
n 3 * homo-sapiens-chars homo-sapiens-floats
"IUB ambiguity codes" "TWO" write-random-fasta
+
n 5 * IUB-chars IUB-floats
"Homo sapiens frequency" "THREE" write-random-fasta
+
drop
] with-file-writer
] ;
-: run-fasta ( -- ) 2500000 reverse-complement-in fasta ;
+: fasta-benchmark ( -- ) 2500000 reverse-complement-in fasta ;
-MAIN: run-fasta
+MAIN: fasta-benchmark