logo       
Google Custom Search
    AddThis Social Bookmark Button

r9815 - trunk/examples/shootout: msg#00019

Subject: r9815 - trunk/examples/shootout
Author: andreas
Date: Sun Mar 20 15:55:11 2005
New Revision: 9815

Added:
   trunk/examples/shootout/k-nucleotide.dylan
Log:
bug: 7045

Another benchmark by luc.


Added: trunk/examples/shootout/k-nucleotide.dylan
==============================================================================
--- (empty file)
+++ trunk/examples/shootout/k-nucleotide.dylan  Sun Mar 20 15:55:11 2005
@@ -0,0 +1,111 @@
+module: k-nucleotide
+use-libraries: common-dylan, io
+use-modules: common-dylan, standard-io, streams, format-out
+
+define sealed class <key-value-pair> (<object>)
+    constant slot key :: <byte-string>, required-init-keyword: key:;
+    slot val :: <integer>, required-init-keyword: value:;
+end class <key-value-pair>;
+
+define sealed inline method make (class == <key-value-pair>,
+                                  #rest all-keys, #key)
+ => (res)
+    next-method();
+end method make;
+
+define function kfrequency
+    (sequence :: <byte-string>,
+     freq :: <string-table>,
+     k :: <integer>,
+     frame :: <integer>)
+  let n :: <integer> = size(sequence) - k + 1;
+  for (i :: <integer> from frame below n by k)
+    let sub :: <byte-string> = copy-sequence(sequence, start: i, end: i + k);
+    let record :: false-or(<key-value-pair>) = element(freq, sub, default: #f);
+    if (record)
+      let tmp :: <key-value-pair> = record;
+      tmp.val := tmp.val + 1;
+    else
+      freq[sub] := make(<key-value-pair>, key: sub, value: 1);
+    end if;
+  end for;
+end function kfrequency;
+
+define constant <kv-vector> = limited(<vector>, of: <key-value-pair>);
+define constant $null-kv = make(<key-value-pair>, key: "", value: 0);
+
+define function frequency(sequence :: <byte-string>, k :: <integer>)
+  let freq :: <string-table> = make(<string-table>);
+  for (i from 0 below k)
+    kfrequency(sequence,freq,k,i);
+  end for;
+  let sorted :: <kv-vector> = 
+    make(<kv-vector>, size: size(freq), fill: $null-kv);
+  let sum :: <double-float> = 0.0d0;
+  for (tmp :: <key-value-pair> in freq,
+       i from 0 below size(freq))
+    sorted[i] := tmp;
+    sum := sum + as(<double-float>,tmp.val);
+  end for;
+  sorted := sort(sorted,
+                 test: method (a :: <key-value-pair>,
+                               b :: <key-value-pair>) b.val < a.val end);
+  for (i :: <key-value-pair> in sorted)
+    let percent :: <double-float> = as(<double-float>,i.val) * 100.0d0 / sum;
+    format-out("%s %d\n",i.key,percent);
+  end for;
+  format-out("\n");
+end function frequency;
+
+define function count (sequence :: <byte-string>, fragment :: <byte-string>)
+  let freq :: <string-table> = make(<string-table>);
+  let k = size(fragment);
+  for (i from 0 below k)
+    kfrequency(sequence,freq,k,i);
+  end for;
+  let record :: false-or(<key-value-pair>) =
+    element(freq,fragment,default: #f);
+  if (record)
+    let tmp :: <key-value-pair> = record;
+    format-out("%d\t%s\n",tmp.val,fragment);
+  else
+    format-out("0\t%s\n",fragment);
+  end if;
+end function count;
+
+define function main ()
+  let line :: false-or(<byte-string>) =
+    read-line(*standard-input*,on-end-of-stream: #f);
+  let needed-part :: <boolean> = #f;
+  let still-reading :: <boolean> = #t;
+  let sequence :: <byte-string> = "";
+  while(line & still-reading)
+    if (copy-sequence(line,start: 0, end: 6) = ">THREE")
+      needed-part := #t;
+      line := read-line(*standard-input*,on-end-of-stream: #f);
+    end if;
+    if (needed-part & line)
+      if (line[0] = '>')
+        still-reading := #f;
+      elseif (line[0] ~= ';')
+        sequence := concatenate(sequence,line);
+      end if;
+    end if;
+    line := read-line(*standard-input*,on-end-of-stream: #f);
+  end while;
+
+  sequence := as-uppercase(sequence);
+  
+  frequency(sequence,1);
+  frequency(sequence,2);
+
+  count(sequence,"GGT");
+  count(sequence,"GGTA");
+  count(sequence,"GGTATT");
+  count(sequence,"GGTATTTTAATT");
+  count(sequence,"GGTATTTTAATTTATAGT");
+end function main;
+
+begin
+  main();
+end;
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://gauss.gwydiondylan.org/mailman/listinfo/gd-chatter




Try Searching:
servers, voip, java, networking, microsoft ...
<Prev in Thread] Current Thread [Next in Thread>