diff --git a/functions.rkt b/functions.rkt index 5ba88d2..4ab12c2 100644 --- a/functions.rkt +++ b/functions.rkt @@ -32,8 +32,8 @@ [tbf-w (-> tbf? (vectorof number?))] [tbf-θ (-> tbf? number?)] [vector-boolean->01 (-> (vectorof boolean?) (vectorof (or/c 0 1)))] - [apply-tbf (->* (tbf?) #:rest (listof (or/c 0 1)) (or/c 0 1))] - [apply-tbf/boolean (->* (tbf?) #:rest (listof boolean?) boolean?)])) + [apply-tbf (-> tbf? (vectorof (or/c 0 1)) (or/c 0 1))] + [apply-tbf/boolean (-> tbf? (vectorof boolean?) boolean?)])) (module+ test (require rackunit)) @@ -253,11 +253,12 @@ ;;; Applying a TBF consists in multiplying the weights by the ;;; corresponding inputs and comparing the sum of the products to the ;;; threshold. -(define (apply-tbf tbf . inputs) +(define/contract (apply-tbf tbf inputs) + (-> tbf? (vectorof (or/c 0 1)) (or/c 0 1)) (any->01 (> ;; The scalar product between the inputs and the weights - (for/sum ([x (in-list inputs)] + (for/sum ([x (in-vector inputs)] [w (in-vector (tbf-w tbf))]) (* x w)) (tbf-θ tbf)))) @@ -265,15 +266,15 @@ (module+ test (test-case "apply-tbf" (define f1 (tbf #(2 -2) 1)) - (check-equal? (tabulate/01 (λ (x y) (apply-tbf f1 x y))) + (check-equal? (tabulate/01 (λ (x y) (apply-tbf f1 (vector x y)))) '((0 0 0) (0 1 0) (1 0 1) (1 1 0))))) ;;; Like apply-tbf, but takes Boolean values as inputs and outputs a ;;; boolean value. -(define (apply-tbf/boolean tbf . inputs) - (01->boolean (apply ((curry apply-tbf) tbf) (map any->01 inputs)))) +(define (apply-tbf/boolean tbf inputs) + (01->boolean (apply-tbf tbf (vector-map any->01 inputs)))) (module+ test (define f1 (tbf #(2 -2) 1)) - (check-equal? (tabulate/boolean (λ (x y) (apply-tbf/boolean f1 x y))) + (check-equal? (tabulate/boolean (λ (x y) (apply-tbf/boolean f1 (vector x y)))) '((#f #f #f) (#f #t #f) (#t #f #t) (#t #t #f))))