implement missing bm

svn: r5496
This commit is contained in:
Matthew Flatt 2007-01-29 12:57:08 +00:00
parent 495ec85d97
commit 052e2c3896
2 changed files with 85 additions and 7 deletions

View File

@ -5,7 +5,7 @@
("ary.ss" "9000")
("binarytrees.ss" "16")
("chameneos.ss")
("cheapconcurrency.ss")
("cheapconcurrency.ss" "15000")
("echo.ss" "150000")
("except.ss" "2500000")
("fannkuch.ss" "10")
@ -15,10 +15,10 @@
("hash2.ss" "200")
("heapsort.ss" "100000")
("lists.ss" "18")
("mandelbrot.ss")
("mandelbrot.ss" "3000")
("matrix.ss" "600")
("moments.ss") ; 200 somethings...
("nbody.ss")
("nbody.ss" "20000000")
("nestedloop.ss" "18")
("nsieve.ss")
("nsievebits.ss")
@ -42,16 +42,22 @@
(define (dynreq f)
(dynamic-require `(lib ,f "tests" "mzscheme" "benchmarks" "shootout") #f))
(define (mk-revcomp-input)
(let ([f (build-path (find-system-path 'temp-dir) "fasta-2m5")])
(define (mk-fasta n suffix)
(let ([f (build-path (find-system-path 'temp-dir) (string-append "fasta-" suffix))])
(unless (file-exists? f)
(printf "Building FASTA 2,500,000 output for input: ~a\n" f)
(printf "Building FASTA ~a output for input: ~a\n" n f)
(with-output-to-file f
(lambda ()
(parameterize ([current-command-line-arguments (vector "2500000")])
(parameterize ([current-command-line-arguments (vector n)])
(dynreq "fasta.ss")))))
f))
(define (mk-revcomp-input)
(mk-fasta "2500000" "2m5"))
(define (mk-knuc-input)
(mk-fasta "1000000" "1m"))
(define (mk-sumcol-input)
(let ([f (build-path (find-system-path 'temp-dir) "sumcol-21k")])
(unless (file-exists? f)

View File

@ -0,0 +1,72 @@
;; The Computer Language Shootout
;; http://shootout.alioth.debian.org/
;;
;; Based on the Ruby version:
#|
# http://shootout.alioth.debian.org
#
# contributed by jose fco. gonzalez
# modified by Sokolov Yura
|#
(module spectralnorm mzscheme
(require (lib "list.ss")
(lib "string.ss")
(only (lib "13.ss" "srfi") string-pad-right))
(define (all-counts len dna)
(let ([table (make-hash-table)]
[seq (make-string len)])
(let loop ([s (- (string-length dna) len)])
(string-copy! seq 0 dna s (+ s len))
(let ([key (string->symbol seq)])
(let ([cnt (hash-table-get table key 0)])
(hash-table-put! table key (add1 cnt))))
(unless (zero? s)
(loop (sub1 s))))
table))
(define (write-freqs table)
(let* ([content (hash-table-map table cons)]
[total (exact->inexact (apply + (map cdr content)))])
(for-each
(lambda (a)
(printf "~a ~a\n"
(car a)
(real->decimal-string (* 100 (/ (cdr a) total)) 3)))
(sort content (lambda (a b) (> (cdr a) (cdr b)))))))
(define (write-one-freq table key)
(let ([cnt (hash-table-get table key 0)])
(printf "~a\t~a\n" cnt key)))
(define dna
(begin
;; Skip to ">THREE ..."
(regexp-match #rx#"(?m:^>THREE.*$)" (current-input-port))
(let ([s (open-output-string)])
;; Copy everything but newlines to s:
(let loop ()
(when (regexp-match #rx#"\n" (current-input-port) 0 #f s)
(loop)))
;; Extract the string from s:
(string-upcase (get-output-string s)))))
;; 1-nucleotide counts:
(write-freqs (all-counts 1 dna))
(newline)
;; 2-nucleotide counts:
(write-freqs (all-counts 2 dna))
(newline)
;; Specific sequences:
(for-each (lambda (seq)
(write-one-freq (all-counts (string-length seq) dna)
(string->symbol seq)))
'("GGT" "GGTA" "GGTATT" "GGTATTTTAATT" "GGTATTTTAATTTATAGT"))
)