[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / fasta.pir
blobd4169f049a23bd1bd6ee957cd56be71af8a3925a
1 #!./parrot -R cgp
2 # Copyright (C) 2005-2009, Parrot Foundation.
3 # $Id$
5 # fasta.pir N         (N = 2500000 for shootout)
6 # by Joshua Isom
7 # modified by karl : fixed bug in default value (N=1000) assignment
10 # 48.2 sec on AMD@2000/512K cache
12 .sub makeCumulative
13         .param pmc genelist
14         .param int count
15         .local num cp
16         .local int i
17         cp = 0.0
18         i = 0
19 beginfor:
20         unless i < count goto endfor
21         $N0 = genelist[i;1]
22         cp += $N0
23         genelist[i;1] = cp
24         inc i
25         goto beginfor
26 endfor:
27 .end
29 .sub selectRandom
30         .param pmc genelist
31         .param int count
32         .local num r
33         r = gen_random(1.0)
34         .local int i, lo, hi
36         $N0 = genelist[0;1]
37         unless r < $N0 goto endif
38         $S0 = genelist[0;0]
39         .return($S0)
40 endif:
41         lo = 0
42         hi = count - 1
43 beginwhile:
44         $I0 = lo + 1
45         unless hi > $I0 goto endwhile
46         i = hi + lo
47         i /= 2
48         $N0 = genelist[i;1]
49         unless r < $N0 goto else_1
50         hi = i
51         goto endif_1
52 else_1:
53         lo = i
54 endif_1:
55         goto beginwhile
56 endwhile:
57         $S0 = genelist[hi;0]
58         .return($S0)
59 .end
61 .const int LINE_LENGTH = 60
63 .sub makeRandomFasta
64         .param string id
65         .param string desc
66         .param pmc genelist
67         .param int count
68         .param int n
69         .local int todo, i, m
70         todo = n
72         print ">"
73         print id
74         print " "
75         print desc
76         print "\n"
78         .local string pick
79 beginfor:
80         unless todo > 0 goto endfor
82         unless todo < LINE_LENGTH goto else
83                 m = todo
84         goto endif
85         else:
86                 m = LINE_LENGTH
87         endif:
89         i = 0
90 beginfor_1:
91         unless i < m goto endfor_1
92         $S0 = selectRandom(genelist, count)
93         pick .= $S0
94         inc i
95         goto beginfor_1
96 endfor_1:
97         print pick
98         print "\n"
99         pick = ''
101         todo -= LINE_LENGTH
102         goto beginfor
103 endfor:
104 .end
106 .sub makeRepeatFasta
107         .param string id
108         .param string desc
109         .param string s
110         .param int n
111         .local int todo, k, kn, m
112         todo = n
113         k = 0
114         kn = length s
116         print ">"
117         print id
118         print " "
119         print desc
120         print "\n"
122 beginfor:
123         unless todo > 0 goto endfor
125         unless todo < LINE_LENGTH goto else
126                 m = todo
127         goto endif
128         else:
129                 m = LINE_LENGTH
130         endif:
132 beginwhile:
133         $I0 = kn - k
134         unless m >= $I0 goto endwhile
135         $S0 = substr s, k
136         print $S0
137         $I0 = kn - k
138         m -= $I0
139         k = 0
140         goto beginwhile
141 endwhile:
143         $S0 = substr s, k, m
144         print $S0
145         print "\n"
146         k += m
148         todo -= LINE_LENGTH
149         goto beginfor
150 endfor:
151 .end
153 .macro InitStruct (iub, i, char, num)
154         $P0 = new 'FixedPMCArray'
155         $P0 = 2
156         .iub[.i] = $P0
157         .iub[.i;0] = .char
158         .iub[.i;1] = .num
159 .endm
161 .sub main :main
162         .param pmc argv
163         .local pmc stdout
164         .local int n
165         # stdout is linebuffered per default - make it block buffered
166         stdout = getstdout
167         stdout.'buffer_size'(40960)
168         $I0 = argv
169         if $I0 > 1 goto argsok
170         n = 1000
171         goto argsdone
172 argsok:
173         $S0 = argv[1]
174         n = $S0
175 argsdone:
176         .local pmc iub
177         iub = new 'FixedPMCArray'
178         iub = 15
179         .InitStruct(iub, 0, "a", 0.27)
180         .InitStruct(iub, 1, "c", 0.12)
181         .InitStruct(iub, 2, "g", 0.12)
182         .InitStruct(iub, 3, "t", 0.27)
184         .InitStruct(iub, 4, "B", 0.02)
185         .InitStruct(iub, 5, "D", 0.02)
186         .InitStruct(iub, 6, "H", 0.02)
187         .InitStruct(iub, 7, "K", 0.02)
188         .InitStruct(iub, 8, "M", 0.02)
189         .InitStruct(iub, 9, "N", 0.02)
190         .InitStruct(iub, 10, "R", 0.02)
191         .InitStruct(iub, 11, "S", 0.02)
192         .InitStruct(iub, 12, "V", 0.02)
193         .InitStruct(iub, 13, "W", 0.02)
194         .InitStruct(iub, 14, "Y", 0.02)
196         .local pmc homosapiens
197         homosapiens = new 'FixedPMCArray'
198         homosapiens = 4
199         .InitStruct(homosapiens, 0, "a", 0.3029549426680)
200         .InitStruct(homosapiens, 1, "c", 0.1979883004921)
201         .InitStruct(homosapiens, 2, "g", 0.1975473066391)
202         .InitStruct(homosapiens, 3, "t", 0.3015094502008)
204         .local string alu
205         alu = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
207         makeCumulative(iub, 15)
208         makeCumulative(homosapiens, 4)
210         $I0 = n * 2
211         makeRepeatFasta("ONE", "Homo sapiens alu", alu, $I0)
212         $I0 = n * 3
213         makeRandomFasta ("TWO", "IUB ambiguity codes", iub, 15, $I0)
214         $I0 = n * 5
215         makeRandomFasta ("THREE", "Homo sapiens frequency", homosapiens, 4, $I0)
216 .end
218 .const num IM = 139968.0
219 .const num IA = 3877.0
220 .const num IC = 29573.0
222 .sub gen_random
223         .param num max
224         .local num last
225         last = 42.0
226 loop:
227         $N0 = last
228         $N0 *= IA
229         $N0 += IC
230         $N0 %= IM
231         $N1 = max
232         $N1 *= $N0
233         $N1 /= IM
234         last = $N0
235         .yield($N1)
236         get_params "0", max
237         goto loop
238 .end
241 # Local Variables:
242 #   mode: pir
243 #   fill-column: 100
244 # End:
245 # vim: expandtab shiftwidth=4 ft=pir: