(use bloom-filter) (use sha1 md5 sha2) (use extras) (use test) (test-group "Bloom Filter" (define +gloss+ '()) (define (gloss str) (set! +gloss+ (cons str +gloss+))) (define word-list (read-file "bloom-filter-word-list.txt")) (define mdps (list (sha1-primitive) (md5-primitive) (sha512-primitive))) (test-group "Words In List, All K" (let ((N (length word-list)) (other-word-list (map string-reverse word-list)) (MKP #f) (P 2.47E-05) (bf #f) (false-positives '()) ) (test-assert (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-assert (make-bloom-filter (car MKP) mdps)) (set! bf (make-bloom-filter (car MKP) mdps)) (test-assert "Add Bloom Filter" (begin (for-each (lambda (str) (bloom-filter-set! bf str)) word-list) #t)) (test-assert "Exists in Bloom Filter?" (every (lambda (str) (bloom-filter-exists? bf str)) word-list)) (test-assert "False positives" (filter (lambda (str) (bloom-filter-exists? bf str)) other-word-list)) (set! false-positives (filter (lambda (str) (bloom-filter-exists? bf str)) other-word-list)) (gloss (sprintf "Palindromic words: ~A" false-positives)) (test 15 (length false-positives)) ) ) (test-group "Words In List, Optimal K" (let ((N (length word-list)) (other-word-list (map string-reverse word-list)) (MKP #f) (P 2.47E-05) (bf #f) (false-positives '()) ) (test-assert (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-assert (make-bloom-filter (car MKP) mdps (cadr MKP))) (set! bf (make-bloom-filter (car MKP) mdps (cadr MKP))) (test-assert "Add Bloom Filter" (begin (for-each (lambda (str) (bloom-filter-set! bf str)) word-list) #t)) (test-assert "Exists in Bloom Filter?" (every (lambda (str) (bloom-filter-exists? bf str)) word-list)) (test-assert "False positives" (filter (lambda (str) (bloom-filter-exists? bf str)) other-word-list)) (set! false-positives (filter (lambda (str) (bloom-filter-exists? bf str)) other-word-list)) (gloss (sprintf "Palindromic words: ~A" false-positives)) (test 15 (length false-positives)) ) ) (pp +gloss+) ) (unless (zero? (test-failure-count)) (exit 1))