You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
br-parser-tools/collects/mrspidey/Sba/devel.ss

1082 lines
40 KiB
Scheme

;; devel.ss
;; Development helper file
; ----------------------------------------------------------------------
; Copyright (C) 1995-97 Cormac Flanagan
;
; This program is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; version 2 as published by the Free Software Foundation.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
; ----------------------------------------------------------------------
;; ----------------------------------------------------------------------
;; Timing
(defmacro trace-time args
(match args
[(fn)
(let* ([c (box 0)]
[f (gensym)])
`(begin
(define ,f ,fn)
(define ,fn (lambda args
(record-time ,c
(lambda () (apply ,f args)))))
,c))]))
(define counter-fns
'(
st:
analyze-program
zodiac:read*
top-level-parse-defs
top-level-parse-exp
top-level-traverse-defs
open-code-file
system-expand-port
expand-zexp->port
minimize-constraints
find-nonempty-tvars
copy-live-constraints
copy-live-constraints-noe
copy-live-constraints-few-e
minimize-constraints-dfa-min
minimize-constraints-dfa-min-inv
minimize-constraints-dfa-min-1
minimize-constraints-dfa-min-2
copy-constraints-equiv!
find-nonempty-nts-rhs-nts
calc-live-tvars-nts
;; copy-constraint-set
Hopcroft-calc-equivalences
read-za
write-za
calc-checks
calc-productions!
Tvar-in-type?
resize-hash-table
save-kernel-state
restore-kernel-state!
free-kernel-state!
zodiac:zero!
;atenv:extend
;atenv:lookup
;atenv:change-binding
;atenv:capture-locs
;atenv:unflush
;atenv:flush!
;zodiac:free-vars
;chema->con
initialize-analysis!
get-default-bindings
))
(define counter-nonfns
'( ;;live-data
))
(define counters
(append
(map
(lambda (fn)
(let ([c (cons 0 0)]
[f (gensym)])
(eval
`(begin
(define ,f (if (defined? ',fn) ,fn (lambda (x) x)))
(define ,fn (lambda args
(record-time ',c
(lambda () (apply ,f args)))))))
(list fn c)))
counter-fns)
(map
(lambda (name)
(let ([c (cons 0 0)])
(eval `(define ,(symbol-append name '-counter) (quote ,c)))
(list name c)))
counter-nonfns)))
(define (show-counters)
(printf "COUNTERS:~n")
(for-each
(match-lambda
[(f (n . t))
(unless (zero? t)
(printf " ~a ~a ~a ms~n" (padr f 35) (padl n 5) (padl t 7)))])
counters)
(printf " ~a ~a ~a ms~n"
(padr "ANALYSIS TIME" 35)
(padl 1 5)
(padl (apply -
(map get-counter
'(
analyze-program
zodiac:read*
top-level-parse-defs
top-level-parse-exp
open-code-file
expand-zexp->port
initialize-analysis!
get-default-bindings
)))
7)))
(define (clear-counters!)
(initialize-analysis!)
(set! hash-table '())
(set! global-defs-parsed '())
(set! global-def-env '())
;;((collect-request-handler) (collect-maximum-generation))
(for-each
(match-lambda
[(f c) (set-car! c 0) (set-cdr! c 0)])
counters))
(define (get-counter c)
(ormap
(match-lambda
[(f (n . t))
(if (eq? f c) t #f)])
counters))
;(collect-notify #t)
(define (with-counters f args)
(clear-counters!)
(apply f args)
(show-counters)
(show-stats))
;; ======================================================================
;; Setup live-data-counter
'(define base-data-live 0)
'(define my-collect
(lambda args
(apply #%collect args)
;;(#%collect 4)
(set-car! live-data-counter (add1 (car live-data-counter)))
(let ([live (truncate (/ (- (bytes-allocated) base-data-live) 1000))])
(set-cdr! live-data-counter (max (cdr live-data-counter) live))
(when (collect-notify)
(printf "GC: HWM ~sK + ~sK~n"
(truncate (/ base-data-live 1000))
live)
(show-stat-small)))))
;;(collect-request-handler my-collect)
;; ======================================================================
;; Compare counters under different strategies
(define (diff-counters th1 th2)
(th1)
;;((collect-request-handler) (collect-maximum-generation))
(show-stat)
(let ([t* (map cdadr counters)])
(th2)
;;((collect-request-handler) (collect-maximum-generation))
(show-stat)
(printf "DIFFERENCE IN TIMES:~n")
(for-each
(match-lambda*
[((f (n . t2)) t)
(unless (and (zero? t) (zero? t2))
(printf " ~a ~a vs ~a, extra ~a ms~n"
(padr f 35) (padl t 7) (padl t2 7) (padl (- t2 t) 7)))])
counters t*)))
(define (diff-times files)
(diff-counters
(lambda ()
(dynamic-let ([st:analysis 'sba]) (tsal files)))
(lambda ()
(dynamic-let ([st:analysis 'za-reanalyze]) (tsal files)))))
(define (diff-times2 files)
(diff-counters
(lambda ()
(dynamic-let ([st:unit-simplify 'live]) (tsal files)))
(lambda ()
(dynamic-let ([st:unit-simplify 'dfa-min]) (tsal files)))))
;; ======================================================================
;; Check correctness of seperate analysis
(define ord-types '())
(define sep-types '())
(define (test-seperate-same files)
(dynamic-let
([st:type-compression '(basic-types . tidy)]
[st:primitive-types 'inferred])
(let ([def-types
(lambda ()
(printf "Calculating types ...")
(begin0
(filter
(match-lambda
[($ sym-def sym def) (symbol? sym)])
global-out-env)
(printf " done~n")))])
(diff-counters
(lambda ()
(dynamic-let ([st:analysis 'sba])
(tsal files)
(set! ord-types (def-types))))
(lambda ()
(dynamic-let ([st:analysis 'za-reanalyze])
(tsal files)
(set! sep-types (def-types)))))
(printf "Comparing types ... ~n")
(unless (= (length ord-types) (length sep-types))
(error 'test-seperate-same
"Different lengths"))
(for-each
(match-lambda*
[(($ sym-def sym1 def1)
($ sym-def sym2 def2))
(unless (eq? sym1 sym2)
(error 'test-seperate-same "Different symbols defined"))
(unless (and (Tvar? def1) (ftype? def2))
(error 'test-seperate-same "Definition not Tvar"))
(unless (and (Tvar-containment? def1 def1)
(Tvar-containment? def2 def2))
(error 'test-seperate-same "Tvar-containment? bad"))
(unless (and (Tvar-containment? def1 def2)
(Tvar-containment? def2 def1))
(dynamic-let ([st:type-compression '(first-order . none)])
(printf "Ordinary type~n")
(pretty-print (Tvar->SDL def1))
(printf "Seperate type~n")
(pretty-print (Tvar->SDL def2)))dev
(error 'test-seperate-same "Definitions of ~s differ" sym1))])
ord-types sep-types)
(printf "Types are identical~n"))))
;; ======================================================================
;; Results File
(define results-file "/home/cormac/Spidey/results/results")
(define (clear-results)
(system (format "\\rm ~s" results-file)))
(define (write-results title size)
(let ([p (open-output-file results-file 'append)]
[o `(RESULTS
,title
(size ,size)
(num-ftype ,num-Atype)
(num-AV ,num-AV)
(num-con ,num-con)
(num-edge ,num-edge)
(num-AV-a ,num-AV-in-Tvar)
(entries ,entries-in-table)
,counters
,(mrspidey:control-fn))])
(pretty-print o p)
(close-output-port p)
o))
(define (analyze-and-write-results files)
(tsal files)
(write-results files (apply + (map calc-AST-size global-defs-parsed))))
;; ======================================================================
;; Scaling of (st:analysis 'sba)
(define (test-scaling-file files)
(printf "TEST-SCALING-FILE ~s~n" files)
(dynamic-let
([st:analysis 'sba])
(analyze-and-write-results files)))
(define (test-scaling)
(cd "/home/cormac/Spidey")
(clear-results)
(map test-scaling-file (map list benchmark-files))
(test-scaling-file sba-kernel-spj)
(test-scaling-file TC-spj)
(test-scaling-file t11-spj)
(test-scaling-file sba-zodiac-spj)
(test-scaling-file sba-small-spj)
;;(test-scaling-file sba-spj)
)
(define (test-scaling-sba)
;; Add on extra sba files one-by-one
(recur loop ([f '()]
[r (append
sba-small-spj
(filter
(lambda (x) (not (member x sba-small-spj)))
sba-spj))])
(unless (null? r)
(let ([f (append f (list (car r)))])
(test-scaling-file f)
(loop f (cdr r))))))
(define matlab-scaling-file "/home/cormac/Spidey/results/scaling.m")
(define get-results-file
(case-lambda
[() (get-results-file results-file)]
[(file)
(match-let*
([l '()]
[_ (with-input-from-file file
(lambda ()
(recur loop ()
(let ([x (read)])
(unless (eof-object? x)
(match x
[('quote . _) (void)]
[_ (set! l (append l (list x)))])
(loop))))))]
;; Group l together by filename
;; grouped-l: (listof (listof info))
[grouped-l (recur loop ([l l])
(match l
[() '()]
[(('RESULTS files . _) . _)
(let-values
([(info* rest)
(filter-map-split
(match-lambda
[(and x ('RESULTS files2 . _))
(and (equal? files files2) x)])
l)])
(cons (reverse info*) (loop rest)))]))]
[name->ndx
(lambda (filename)
(recur loop ([i 0])
(cond
[(= i (length wright-files))
(printf "Warning: not found~n")
i]
[(string=? filename (nth wright-files i)) i]
[else (loop (add1 i))])))]
[grouped-l (sort
(match-lambda*
[((and a (('RESULTS f1 ('size s1) . _) . _))
(('RESULTS f2 ('size s2) . _) . _))
(< s1 s2)
(< (name->ndx f1) (name->ndx f2))])
grouped-l)]
[_ (assert (= (length l) (apply + (map length grouped-l))))]
[_ (pretty-print
(map
(match-lambda
[(('RESULTS files ('size s1) . _) . _)
(list files s1)])
grouped-l))]
[cnth (lambda (n) (lambda (x) (cadr (nth x n))))]
[get-counters (lambda (x) (nth x 9))]
[get-control (lambda (x) (nth x 10))]
[get-time
(lambda (f)
(lambda (x) (cdr (cadr (assq f (get-counters x))))))]
[ctrl-eq?
(lambda (para val)
(lambda (x)
(eq? (cadr (assq para (get-control x))) val)))]
[select
(lambda (pred)
(map
(lambda (group)
(match (filter pred group)
[() #f]
[(x) x]
[m (pretty-print m)
(error 'get-results-file "Multiple matches")]))
grouped-l))]
[split
(lambda (preds)
(map select preds))])
(list l cnth get-counters get-control get-time ctrl-eq?
select split))]))
(define (scaling->matlab)
(system (format "\\rm ~s" matlab-scaling-file))
(match-let*
([(l cnth get-counters get-control get-time l-filter-ctrl split)
(get-results-file)]
[l-p (lambda (p) (select (l-filter-ctrl 'st:analysis p)))]
[l-sba (l-p 'sba)]
[l-precompress (l-p 'precompress)]
[l-za (l-p 'za-reanalyze)]
[l-nc (l-p 'no-combine)])
;;(pretty-print (map cadr l))
(with-output-to-file matlab-scaling-file
(lambda ()
(for-each
(match-lambda
[(name fn)
(printf "~s = [ " name)
(for-each (lambda (x) (printf "~s " (if x (fn x) 0)))
l-sba)
(add-zeros l-sba)
(printf "; ")
(for-each (lambda (x) (printf "~s " (fn x)))
l-precompress)
(add-zeros l-precompress)
(printf "; ")
(for-each (lambda (x) (printf "~s " (fn x)))
l-za)
(add-zeros l-za)
(printf "; ")
(for-each (lambda (x) (printf "~s " (fn x)))
l-nc)
(add-zeros l-nc)
(printf "]~n")])
`((ast_size ,(cnth 2))
(num_Tvar ,(cnth 3))
(num_AV ,(cnth 4))
(num_con ,(cnth 5))
(num_edges ,(cnth 6))
(num_AV_a ,(cnth 7))
(entries ,(cnth 8))
(ttl_time ,(get-time 'seperately-analyze-and-load-files))
(local_time ,(get-time 'sba-analyze-file))
(parse_time ,(get-time 'load-parse-expand))
(traverse_time ,(get-time 'traverse-def))
(combine_time ,(get-time 'top-level-combine))
(live_data ,(get-time 'live-data))
(min_time ,(get-time 'minimize-constraints-live))
(resize_time ,(get-time 'resize-hash-table))
))))))
;; ======================================================================
;; Comparison of st:analysis 'za-reanalyze and #f
(define (compare-analyzes-files files)
(let ([size
(dynamic-let
([st:analysis 'sba])
(printf "~nCOMPARE-ANALYZES 'sba ~s~n" files)
(tsal files)
(let ([size (apply + (map calc-AST-size seperate-defs))])
(write-results files size)
size))])
(for-each
(lambda (a)
(printf "~nCOMPARE-ANALYZES '~s ~s~n" a files)
(dynamic-let
([st:analysis a])
(if (memq a '(precompress za-reanalyze))
(for-each (lambda (c)
(dynamic-let
([st:unit-simplify c])
(tsal files)
(write-results files size)))
'(live-few-e
dfa-min))
(begin
(tsal files)
(write-results files size)))))
'(precompress za-reanalyze no-combine))))
(define (compare-analyzes)
(cd "/home/cormac/Spidey")
(clear-results)
(compare-analyzes-files tp-spj)
(compare-analyzes-files sba-kernel-spj)
(compare-analyzes-files TC-spj)
(compare-analyzes-files t11-spj)
(compare-analyzes-files sba-zodiac-spj)
(compare-analyzes-files sba-small-spj)
;;(test-scaling-file sba-spj)
(compare-analyzes-sba)
)
(define (compare-analyzes-sba . rest)
;; Add on extra sba files one-by-one
(recur loop ([f '()]
[r sba-spj]
[n (match rest
[() 0]
[(n) n])])
(unless (null? r)
(let ([f (append f (list (car r)))])
(when (<= n 0)
(compare-analyzes-files f))
(loop f (cdr r) (sub1 n))))))
(define matlab-seperate-file "/home/cormac/Spidey/results/seperate.m")
;; ======================================================================
(define (ts file)
(seperately-analyze-file-thunk* (files->file-thunk* file) "test/out.za")
(read-constraint-set "test/out.za"))
(define (tsal files)
(clear-counters!)
(seperately-analyze-and-load-files files)
(show-counters)
(void))
;; ======================================================================
;; Some benchmarks
(define tp-spj (list "mod/part1.ss" "mod/part2.ss"))
(define mod-spj (list "mod/mod1.ss" "mod/mod2.ss" "mod/mod3.ss"))
(define TC-spj (list "mod/TC/env.ss"
"mod/TC/parse.ss"
"mod/TC/type.ss"
"mod/TC/eval.ss"
"mod/TC/go.ss"
;;"mod/TC/test.ss"
))
(define t11-spj (list "mod/11/FrontEnd.ss"
"mod/11/Registers.ss"
"mod/11/Memory.ss"
"mod/11/Machine.ss"
"mod/11/go.ss"
))
(define (tp) (tsal tp-spj))
(define (mod) (tsal mod-spj))
(define (TC) (tsal TC-spj))
(define (t11) (tsal t11-spj))
;; ======================================================================
;; SBA benchmarks
(define sba-files
(list "library"
"env"
"config"
"driver"
"sba"
"zodiac"
"compat"
"loadexpand"
"bind"
"traverse"
"global-env"
"prototype"
"hash"
"kernel"
"toplevelenv"
"templates"
"languages-abstract"
"sdl"
"results"
"calc-checks"
"hyper"
"seperate"
"type-con"
"contained"
"gram"
"min"
"min2"
"dfa-min"
))
(define sba-spj
(map (lambda (s) (string-append "/home/cormac/Spidey/mod/sba/" s ".ss"))
sba-files))
(define (sba-spj-until x)
(recur loop ([l sba-spj])
(cons (car l)
(if (substring? x (car l))
'()
(loop (cdr l))))))
(define sba-small-spj (sba-spj-until "kernel"))
(define sba-medium-spj (sba-spj-until "calc-checks"))
(define sba-kernel-spj
(map (lambda (s) (string-append "/home/cormac/Spidey/mod/sba/" s ".ss"))
(list "hash" "kernel" "test-kernel")))
(define sba-zodiac-spj
(map (lambda (s) (string-append "/home/cormac/Spidey/mod/sba/" s ".ss"))
(list "bind" "compat" "env" "zodiac" "test-zodiac")))
;; ----------------------------------------------------------------------
(define (separate-expt)
(st:polymorphism 'compress)
(st:type-compression-poly 'live-few-e)
(st:library-prims #f)
(st:topo-sort #f)
(st:use-module #t)
(for-each
(lambda (p)
(printf "~n========================================~n")
(printf "SIMPL STRATEGY: ~s~n" p)
(st:unit-simplify p)
(st:analysis 'za-reanalyze)
(tsal sba-kernel-spj)
(write-results sba-kernel-spj 0)
(st:analysis 'za)
(for-each
(lambda (file)
(printf "~n========================================~n")
(printf "FILES: ~s~n" file)
(system (format "touch ~a" file))
(tsal sba-kernel-spj)
(write-results file 0))
sba-kernel-spj))
'(live live-few-e dfa-min-AV)))
(define (tsba) (tsal sba-spj))
(define (tker) (tsal sba-kernel-spj))
(define (tzod) (tsal sba-zodiac-spj))
(define (tker2)
(clear-counters!)
(initialize-analysis!)
(read-constraint-set-to-global-env "~/Spidey/mod/sba/hash.ss")
(read-constraint-set-to-global-env "~/Spidey/mod/sba/test-kernel.ss")
(hyper (sba-analyze-file (files->file-thunk* "~/Spidey/mod/sba/kernel.ss")))
(report-unbound-vars)
(show-counters))
;; ======================================================================
(define (test-seperate)
(for-each
(lambda (thunk)
(for-each
(lambda (c)
(for-each
(lambda (b)
(st:unit-simplify c)
(st:add-hyper-links b)
(printf "==============================~n")
(printf "Type-compression ~s Hyper-links ~s~n" c b)
(thunk)
(show-stat))
(list #f )))
(list 'live 'dfa-min)))
(list ;;(lambda () (tp))
(lambda () (TC) (system "ls -l mod/TC*.za"))
;;(lambda () (tsba) (system "ls -l sba/*.za"))
)))
;; ======================================================================
(define (st:tybe . args)
(dynamic-let
([st:type-compression '(higher-order . live-few-e)])
(pretty-print (apply st:type-fn args)))
(dynamic-let
([st:type-compression '(higher-order . dfa-min)])
(apply st:type-fn args)))
;; ======================================================================
(define (compare-poly-file file)
(printf "~n========================================~nFile: ~s~n" files)
(for-each-parameter
st:polymorphism
(lambda (p)
(printf "~n==============================~nPOLY STRATEGY: ~s~n" p)
(if (eq? p 'compress)
(for-each-parameter
st:type-compression-poly
(lambda (c)
(when (memq c '(live live-few-e))
(compare-poly-files-one files))))
(compare-poly-file-one file)))))
(define (compare-poly-file-one file)
(printf "~n========================================~n")
(printf "FILE: ~s~n" file)
(printf "POLY STRATEGY: ~s ~s~n"
(st:polymorphism) (st:type-compression-poly))
(clear-counters!)
(st:analyze files)
(show-counters)
(show-stat)
(let ([size (calc-AST-size defs-ordered)])
(write-results files size)))
(define (make-compare-poly-file files)
`(dynamic-let
([st:topo-sort #t]
[st:library-prims #t])
(begin
,@(map
(lambda (p)
`(begin
(st:polymorphism (quote ,p))
,(if (eq? p 'compress)
`(begin
,@(map
(lambda (c)
`(begin
(st:type-compression-poly (quote ,c))
(compare-poly-file-one ,files)))
'(live live-few-e dfa-min-AV)))
`(compare-poly-file-one ,files))))
(map car (st:polymorphism '?))))))
(define (all-compare-poly) (for-each compare-poly-file benchmark-files))
(define (wright-compare-poly) (for-each compare-poly-file wright-files))
(define wright-ok
`(begin ,@(map make-compare-poly-file wright-files)))
(define wright-ok
'(begin (dynamic-let ([st:topo-sort #t]
[st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/boyer.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/boyer.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/boyer.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/boyer.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/boyer.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/boyer.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/graphs.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/graphs.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/graphs.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/graphs.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/graphs.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/graphs.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/lattice.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/lattice.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/lattice.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/lattice.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/lattice.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/lattice.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/matrix.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/matrix.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/matrix.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/matrix.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/matrix.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/matrix.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/maze.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/maze.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/maze.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/maze.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/maze.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/maze.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/nbody.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/nbody.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/nbody.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/nbody.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/nbody.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/nbody.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/splay.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/splay.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/splay.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/splay.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/splay.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/splay.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/browse.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/browse.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/browse.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/browse.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/browse.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/browse.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/check.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/check.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/check.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/check.scm"))))
(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/check.scm"))
(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/check.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/nucleic.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/nucleic.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/nucleic.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/nucleic.scm"))))
'(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/nucleic.scm"))
'(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/nucleic.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin '(begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/nucleic-2.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/nucleic-2.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/nucleic-2.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/nucleic-2.scm"))))
'(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/nucleic-2.scm"))
'(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/nucleic-2.scm"))))
(dynamic-let ([st:topo-sort #t] [st:library-prims #t])
(begin (begin (st:polymorphism 'none)
(compare-poly-file-one "~/Spidey/wright/dynamic.scm"))
(begin (st:polymorphism 'compress)
(begin (begin (st:type-compression-poly 'live)
(compare-poly-file-one "~/Spidey/wright/dynamic.scm"))
(begin (st:type-compression-poly 'live-few-e)
(compare-poly-file-one "~/Spidey/wright/dynamic.scm"))
(begin (st:type-compression-poly 'dfa-min-AV)
(compare-poly-file-one "~/Spidey/wright/dynamic.scm"))))
'(begin (st:polymorphism 'copy-con)
(compare-poly-file-one "~/Spidey/wright/dynamic.scm"))
'(begin (st:polymorphism 'reanalyze)
(compare-poly-file-one "~/Spidey/wright/dynamic.scm"))))))
;; ======================================================================
(define (poly->matlab . files)
(match-let*
([f "/home/cormac/papers/popl95/ Spidey/results/poly.m"]
[(l cnth get-counters get-control get-time ctrl-eq? select split)
(apply get-results-file files)]
[l-p (lambda (p) (select (ctrl-eq? 'st:polymorphism p)))]
[l-none (l-p 'none)]
[l-copy (l-p 'copy-con)]
[l-reanalyze (l-p 'reanalyze)]
[l-compress-alg
(lambda (alg)
(select
(lambda (x)
(and
(eq? (cadr (assq 'st:polymorphism (get-control x))) 'compress)
(eq? (cadr (assq 'st:type-compression-poly (get-control x)))
alg)))))]
[l-compress-live (l-compress-alg 'live)]
[l-compress-live-noe (l-compress-alg 'live-few-e)]
[lists (list l-reanalyze
l-copy
l-compress-live
l-compress-live-noe
(l-compress-alg 'dfa-min-AV)
l-none)]
[show-pairs `((ast_size ,(cnth 2))
(num_Tvar ,(cnth 3))
(num_AV ,(cnth 4))
(num_con ,(cnth 5))
(num_edges ,(cnth 6))
(num_AV_a ,(cnth 7))
(entries ,(cnth 8))
(ttl_time ,(get-time 'st:analyze))
(local_time ,(get-time 'sba-analyze-file))
(parse_time ,(get-time 'load-parse-expand))
(traverse_time ,(get-time 'traverse-def))
(combine_time ,(get-time 'top-level-combine))
(live_data ,(get-time 'live-data))
(min_time ,(get-time 'minimize-constraints))
(resize_time ,(get-time 'resize-hash-table))
(topo ,(get-time 'topological-sort))
(inst ,(get-time 'instantiate-polymorphic-def))
)])
(if (file-exists? f) (delete-file f))
;;(pretty-print (map cadr l))
(for-each
(match-lambda
[(name fn)
(printf "==============~n~s~n" name)
(for i 0 (apply max (map length lists))
(printf "~a: "
(let* ([none (nth l-none i)]
[f (if none (cadr none) "-")])
(if (string? f)
(padr f 30)
f)))
(for-each
(lambda (l)
(let ([x (nth l i)])
(printf "~a " (if x (padl (fn x) 7) " -"))))
lists)
(newline))])
show-pairs)
(with-output-to-file f
(lambda ()
(for-each
(match-lambda
[(name fn)
(printf "~s = [ " name)
(for-each
(lambda (l)
(for-each (lambda (x) (printf "~s " (if x (fn x) 0))) l)
(if (eq? l l-none)
(printf "]~n~n")
(printf "; ")))
lists)])
show-pairs)))))
(define (poly->fig . files)
(match-let*
([f "/home/cormac/papers/popl97/analysis-times.tex"]
[(l cnth get-counters get-control get-time ctrl-eq? select split)
(apply get-results-file files)]
[l-p (lambda (p) (select (ctrl-eq? 'st:polymorphism p)))]
[l-none (l-p 'none)]
[l-copy (l-p 'copy-con)]
[l-reanalyze (l-p 'reanalyze)]
[l-compress-alg
(lambda (alg)
(select
(lambda (x)
(and
(eq? (cadr (assq 'st:polymorphism (get-control x))) 'compress)
(eq? (cadr (assq 'st:type-compression-poly (get-control x)))
alg)))))]
[l-compress-live (l-compress-alg 'live)]
[l-compress-live-noe (l-compress-alg 'live-few-e)]
[l-compress-dfa (l-compress-alg 'dfa-min-AV)]
[lists (list )]
[atime
(lambda (x)
(if x
(- ((get-time 'st:analyze) x)
((get-time 'load-parse-expand) x))
0))]
[doit
(lambda ()
(for-each
(lambda (name lines none copy reanalyze live live-noe dfa)
(printf " {\\tt ~a } & ~s & ~ss "
name lines
(/ (round (/ (atime none) 10.0)) 100))
(for-each
(lambda (x)
(printf " & ~a "
(if (zero? (atime x))
'*
(/ (round (/ (atime x) (atime none) 0.010))
100))))
(list copy reanalyze live live-noe dfa))
(printf " \\\\ ~n"))
'(lattice browse splay check graph boyer
matrix maze nbody nucleic)
'(215 233 265 281 621 624 744 857 880 3335)
l-none
l-copy
l-reanalyze
l-compress-live
l-compress-live-noe
l-compress-dfa))]
)
(pretty-print (map length (list
l-none
l-copy
l-reanalyze
l-compress-live
l-compress-live-noe
l-compress-dfa)))
(doit)
(if (file-exists? f) (delete-file f))
(with-output-to-file f doit)))
;; ======================================================================
(define (fixup x)
(let ([y (recur loop ([x x])
(if (null? x)
'()
(cons (caddr x) (loop (cddddr x)))))])
(apply + y)))