(use bloom-filter) (use sha1 md5 sha2) (use extras) (use test) (define-syntax test-success (syntax-rules () ((_ ?expr) (test-assert (begin ?expr #t)) ) ((_ ?mesg ?expr) (test-assert ?mesg (begin ?expr #t)) ) ) ) (test-group "Bloom Filter" #;(define +gloss+ '()) #;(define (gloss str) (set! +gloss+ (cons str +gloss+))) #;(define (dump-gloss) (print ":Gloss:") (pp +gloss+)) (define (gloss str) (print "Gloss: " str)) (define (dump-gloss) (void)) (define word-list (read-file "bloom-filter-word-list.txt")) (define mdps (list (sha1-primitive) (md5-primitive) (sha512-primitive))) (let ((N (length word-list)) (other-word-list (map string-reverse word-list)) (MKP #f) (P 2.47E-05) (bf #f) (false-positives '()) ) (test-group "Words In List, All K" (test-assert (actual-k mdps)) (test-assert (= 3 (length (receive (desired-m P N (actual-k mdps)))))) (set! MKP (receive (desired-m P N (actual-k mdps)))) (gloss (sprintf "N = ~A, M = ~A, K = ~A, P = ~A" N (car MKP) (cadr MKP) (caddr MKP))) (test-success "Make" (set! bf (make-bloom-filter (car MKP) mdps))) (test-success "Add Bloom Filter" (for-each (cut bloom-filter-set! bf <>) word-list)) (test-assert "Exists in Bloom Filter?" (every (cut bloom-filter-exists? bf <>) word-list)) (test-success "False positives" (set! false-positives (filter (cut bloom-filter-exists? bf <>) other-word-list))) (gloss (sprintf "Palindromic words: ~A" false-positives)) (test 15 (length false-positives)) ) ) (let ((N (length word-list)) (other-word-list (map string-reverse word-list)) (MKP #f) (P 2.47E-05) (bf #f) (false-positives '()) ) (test-group "Words In List, Optimal K" (test-assert (= 3 (length (receive (desired-m P N))))) (set! MKP (receive (desired-m P N))) (gloss (sprintf "N = ~A, M = ~A, K = ~A, P = ~A" N (car MKP) (cadr MKP) (caddr MKP))) (test-success "Make" (set! bf (make-bloom-filter (car MKP) mdps (cadr MKP)))) (test-success "Add Bloom Filter" (for-each (cut bloom-filter-set! bf <>) word-list)) (test-assert "Exists in Bloom Filter?" (every (cut bloom-filter-exists? bf <>) word-list)) (test-success "False positives" (set! false-positives (filter (cut bloom-filter-exists? bf <>) other-word-list))) (gloss (sprintf "Palindromic words: ~A" false-positives)) (test 15 (length false-positives)) ) ) (dump-gloss) ) (test-exit)