factor/extra/benchmark/fasta/fasta.factor

108 lines
3.2 KiB
Factor
Raw Normal View History

2008-02-12 16:51:34 -05:00
! Based on http://shootout.alioth.debian.org/gp4/benchmark.php?test=fasta&lang=java&id=2
USING: assocs benchmark.reverse-complement byte-arrays fry io
io.encodings.ascii io.files locals kernel math sequences
sequences.private specialized-arrays strings typed alien.data ;
QUALIFIED-WITH: alien.c-types c
SPECIALIZED-ARRAY: c:double
2008-02-12 16:51:34 -05:00
IN: benchmark.fasta
2009-02-22 20:08:45 -05:00
CONSTANT: IM 139968
CONSTANT: IA 3877
CONSTANT: IC 29573
CONSTANT: initial-seed 42
CONSTANT: line-length 60
2008-02-12 16:51:34 -05:00
2015-07-30 00:04:31 -04:00
: next-fasta-random ( seed -- seed n )
2010-04-15 18:19:20 -04:00
IA * IC + IM mod dup IM /f ; inline
2008-02-12 16:51:34 -05:00
2009-02-22 20:08:45 -05:00
CONSTANT: ALU "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
2008-02-12 16:51:34 -05:00
CONSTANT: IUB
2008-02-12 16:51:34 -05:00
{
{ CHAR: a 0.27 }
{ CHAR: c 0.12 }
{ CHAR: g 0.12 }
{ CHAR: t 0.27 }
{ CHAR: B 0.02 }
{ CHAR: D 0.02 }
{ CHAR: H 0.02 }
{ CHAR: K 0.02 }
{ CHAR: M 0.02 }
{ CHAR: N 0.02 }
{ CHAR: R 0.02 }
{ CHAR: S 0.02 }
{ CHAR: V 0.02 }
{ CHAR: W 0.02 }
{ CHAR: Y 0.02 }
}
2008-02-12 16:51:34 -05:00
CONSTANT: homo-sapiens
2008-02-12 16:51:34 -05:00
{
{ CHAR: a 0.3029549426680 }
{ CHAR: c 0.1979883004921 }
{ CHAR: g 0.1975473066391 }
{ CHAR: t 0.3015094502008 }
}
2008-02-12 16:51:34 -05:00
TYPED: make-cumulative ( freq -- chars: byte-array floats: double-array )
2009-04-26 01:45:03 -04:00
[ keys >byte-array ]
[ values c:double >c-array 0.0 [ + ] accumulate* ] bi ;
2008-02-12 16:51:34 -05:00
2008-03-13 04:38:01 -04:00
:: select-random ( seed chars floats -- seed elt )
2015-07-30 00:04:31 -04:00
seed next-fasta-random floats [ <= ] with find drop chars nth-unsafe ; inline
2008-02-12 16:51:34 -05:00
2010-04-15 18:19:20 -04:00
TYPED: make-random-fasta ( seed: float len: fixnum chars: byte-array floats: double-array -- seed: float )
'[ _ _ select-random ] "" replicate-as print ;
2008-02-12 16:51:34 -05:00
: write-description ( desc id -- )
">" write write bl print ;
2008-02-12 16:51:34 -05:00
2008-02-26 19:40:32 -05:00
:: split-lines ( n quot -- )
2008-02-12 16:51:34 -05:00
n line-length /mod
[ [ line-length quot call ] times ] dip
2009-08-11 19:15:53 -04:00
quot unless-zero ; inline
2008-02-12 16:51:34 -05:00
2010-04-15 18:19:20 -04:00
TYPED: write-random-fasta ( seed: float n: fixnum chars: byte-array floats: double-array desc id -- seed: float )
2008-02-12 16:51:34 -05:00
write-description
'[ _ _ make-random-fasta ] split-lines ;
2008-02-12 16:51:34 -05:00
TYPED:: make-repeat-fasta ( k: fixnum len: fixnum alu: string -- k': fixnum )
2009-10-27 22:50:31 -04:00
alu length :> kn
2010-01-14 13:08:22 -05:00
len iota [ k + kn mod alu nth-unsafe ] "" map-as print
k len + ;
2008-02-12 16:51:34 -05:00
: write-repeat-fasta ( n alu desc id -- )
write-description
2009-10-28 14:56:15 -04:00
[let
:> alu
0 :> k!
2009-10-28 14:56:15 -04:00
[| len | k len alu make-repeat-fasta k! ] split-lines
] ;
2008-02-12 16:51:34 -05:00
: fasta ( n out -- )
homo-sapiens make-cumulative
IUB make-cumulative
2009-10-28 14:56:15 -04:00
[let
:> ( n out IUB-chars IUB-floats homo-sapiens-chars homo-sapiens-floats )
2009-10-28 14:56:15 -04:00
initial-seed :> seed
out ascii [
n 2 * ALU "Homo sapiens alu" "ONE" write-repeat-fasta
initial-seed
2010-04-19 02:13:49 -04:00
2009-10-28 14:56:15 -04:00
n 3 * homo-sapiens-chars homo-sapiens-floats
"IUB ambiguity codes" "TWO" write-random-fasta
2010-04-19 02:13:49 -04:00
2009-10-28 14:56:15 -04:00
n 5 * IUB-chars IUB-floats
"Homo sapiens frequency" "THREE" write-random-fasta
2010-04-19 02:13:49 -04:00
2009-10-28 14:56:15 -04:00
drop
] with-file-writer
] ;
2008-02-12 16:51:34 -05:00
: fasta-benchmark ( -- ) 2500000 reverse-complement-in fasta ;
2008-02-12 16:51:34 -05:00
MAIN: fasta-benchmark