Give the instances of tbf the type TBF.

This commit is contained in:
Sergiu Ivanov 2022-04-27 19:00:13 +02:00
parent 86d52eed3b
commit 4927c0ec8c
2 changed files with 39 additions and 28 deletions

View File

@ -28,7 +28,7 @@
enumerate-boolean-functions/pv enumerate-boolean-functions/list enumerate-boolean-functions/pv enumerate-boolean-functions/list
random-boolean-table random-boolean-function random-boolean-function/list random-boolean-table random-boolean-function random-boolean-function/list
(struct-out tbf) tbf-w tbf-θ boolean->01/vector apply-tbf apply-tbf/boolean (struct-out tbf) TBF tbf-w tbf-θ boolean->01/vector apply-tbf apply-tbf/boolean
list->tbf lists->tbfs read-org-tbfs tbf-tabulate* tbf-tabulate list->tbf lists->tbfs read-org-tbfs tbf-tabulate* tbf-tabulate
tbf-tabulate*/boolean sbf? sbf list->sbf read-org-sbfs) tbf-tabulate*/boolean sbf? sbf list->sbf read-org-sbfs)
@ -434,7 +434,8 @@
(check-false (random-bool-f/list '(#t #f))) (check-false (random-bool-f/list '(#t #f)))
(check-true (random-bool-f/list '(#t #t))))) (check-true (random-bool-f/list '(#t #t)))))
(struct tbf ([weights : (Vectorof Real)] [threshold : Real]) #:transparent) (struct tbf ([weights : (Vectorof Real)] [threshold : Real])
#:transparent #:type-name TBF)
(define tbf-w tbf-weights) (define tbf-w tbf-weights)
(define tbf-θ tbf-threshold) (define tbf-θ tbf-threshold)
@ -446,7 +447,7 @@
(test-case "boolean->01/vector" (test-case "boolean->01/vector"
(check-equal? (boolean->01/vector #(#t #f #f)) #(1 0 0)))) (check-equal? (boolean->01/vector #(#t #f #f)) #(1 0 0))))
(: apply-tbf (-> tbf (Vectorof (U Zero One)) (U Zero One))) (: apply-tbf (-> TBF (Vectorof (U Zero One)) (U Zero One)))
(define (apply-tbf tbf inputs) (define (apply-tbf tbf inputs)
(any->01 (any->01
(> (>
@ -462,7 +463,7 @@
(check-equal? (tabulate/pv/01 2 (pvλ (x y) (apply-tbf f1 (vector x y)))) (check-equal? (tabulate/pv/01 2 (pvλ (x y) (apply-tbf f1 (vector x y))))
'((0 0 0) (0 1 0) (1 0 1) (1 1 0))))) '((0 0 0) (0 1 0) (1 0 1) (1 1 0)))))
(: apply-tbf/boolean (-> tbf (Vectorof Boolean) Boolean)) (: apply-tbf/boolean (-> TBF (Vectorof Boolean) Boolean))
(define (apply-tbf/boolean tbf inputs) (define (apply-tbf/boolean tbf inputs)
(01->boolean (apply-tbf tbf (boolean->01/vector inputs)))) (01->boolean (apply-tbf tbf (boolean->01/vector inputs))))
@ -472,7 +473,7 @@
(check-equal? (tabulate/pv/boolean 2 (pvλ (x y) (apply-tbf/boolean f1 (vector x y)))) (check-equal? (tabulate/pv/boolean 2 (pvλ (x y) (apply-tbf/boolean f1 (vector x y))))
'((#f #f #f) (#f #t #f) (#t #f #t) (#t #t #f))))) '((#f #f #f) (#f #t #f) (#t #f #t) (#t #t #f)))))
(: list->tbf (-> (Listof Real) tbf)) (: list->tbf (-> (Listof Real) TBF))
(define (list->tbf lst) (define (list->tbf lst)
(define-values (w θ) (split-at-right lst 1)) (define-values (w θ) (split-at-right lst 1))
(tbf (list->vector w) (car θ))) (tbf (list->vector w) (car θ)))
@ -481,7 +482,7 @@
(test-case "list->tbf" (test-case "list->tbf"
(check-equal? (list->tbf '(1 2 3)) (tbf #(1 2) 3)))) (check-equal? (list->tbf '(1 2 3)) (tbf #(1 2) 3))))
(: lists->tbfs (-> (Listof (Listof Real)) (Listof tbf))) (: lists->tbfs (-> (Listof (Listof Real)) (Listof TBF)))
(define (lists->tbfs lsts) (define (lists->tbfs lsts)
(map list->tbf lsts)) (map list->tbf lsts))
@ -490,7 +491,7 @@
(check-equal? (lists->tbfs '((1 2 3) (2 3 4))) (check-equal? (lists->tbfs '((1 2 3) (2 3 4)))
(list (tbf '#(1 2) 3) (tbf '#(2 3) 4))))) (list (tbf '#(1 2) 3) (tbf '#(2 3) 4)))))
(: read-org-tbfs (->* (String) (#:headers Boolean) (Listof tbf))) (: read-org-tbfs (->* (String) (#:headers Boolean) (Listof TBF)))
(define (read-org-tbfs str #:headers [headers #f]) (define (read-org-tbfs str #:headers [headers #f])
(define sexp (assert-type (read-org-sexp str) (Listof Any))) (define sexp (assert-type (read-org-sexp str) (Listof Any)))
(define sexp-clean (cond [headers (cdr sexp)] [else sexp])) (define sexp-clean (cond [headers (cdr sexp)] [else sexp]))
@ -501,7 +502,7 @@
(check-equal? (read-org-tbfs "((1 2 1) (1 0 1))") (check-equal? (read-org-tbfs "((1 2 1) (1 0 1))")
(list (tbf '#(1 2) 1) (tbf '#(1 0) 1))))) (list (tbf '#(1 2) 1) (tbf '#(1 0) 1)))))
(: tbf-tabulate* (-> (Listof tbf) (Listof (Listof (U Zero One))))) (: tbf-tabulate* (-> (Listof TBF) (Listof (Listof (U Zero One)))))
(define (tbf-tabulate* tbfs) (define (tbf-tabulate* tbfs)
(define funcs (for/list ([tbf tbfs]) (define funcs (for/list ([tbf tbfs])
: (Listof (-> (Listof (U Zero One)) (U Zero One))) : (Listof (-> (Listof (U Zero One)) (U Zero One)))
@ -515,7 +516,7 @@
(check-equal? (tbf-tabulate* (list (tbf #(2 2) 1) (tbf #(1 1) 1))) (check-equal? (tbf-tabulate* (list (tbf #(2 2) 1) (tbf #(1 1) 1)))
'((0 0 0 0) (0 1 1 0) (1 0 1 0) (1 1 1 1))))) '((0 0 0 0) (0 1 1 0) (1 0 1 0) (1 1 1 1)))))
(: tbf-tabulate (-> tbf (Listof (Listof (U Zero One))))) (: tbf-tabulate (-> TBF (Listof (Listof (U Zero One)))))
(define (tbf-tabulate t) (define (tbf-tabulate t)
(tbf-tabulate* (list t))) (tbf-tabulate* (list t)))
@ -524,7 +525,7 @@
(check-equal? (tbf-tabulate (tbf #(1 2) 1)) (check-equal? (tbf-tabulate (tbf #(1 2) 1))
'((0 0 0) (0 1 1) (1 0 0) (1 1 1))))) '((0 0 0) (0 1 1) (1 0 0) (1 1 1)))))
(: tbf-tabulate*/boolean (-> (Listof tbf) (Listof (Listof Boolean)))) (: tbf-tabulate*/boolean (-> (Listof TBF) (Listof (Listof Boolean))))
(define (tbf-tabulate*/boolean tbfs) (define (tbf-tabulate*/boolean tbfs)
(define funcs (for/list ([tbf tbfs]) (define funcs (for/list ([tbf tbfs])
: (Listof (-> (Listof Boolean) Boolean)) : (Listof (-> (Listof Boolean) Boolean))
@ -538,7 +539,7 @@
(check-equal? (tbf-tabulate*/boolean (list (tbf #(1 2) 1))) (check-equal? (tbf-tabulate*/boolean (list (tbf #(1 2) 1)))
'((#f #f #f) (#f #t #t) (#t #f #f) (#t #t #t))))) '((#f #f #f) (#f #t #t) (#t #f #f) (#t #t #t)))))
(: sbf? (-> tbf Boolean)) (: sbf? (-> TBF Boolean))
(define (sbf? t) (define (sbf? t)
(= 0 (tbf-θ t))) (= 0 (tbf-θ t)))
@ -547,7 +548,7 @@
(check-false (sbf? (tbf #(1 2) 3))) (check-false (sbf? (tbf #(1 2) 3)))
(check-true (sbf? (tbf #(1 2) 0))))) (check-true (sbf? (tbf #(1 2) 0)))))
(: sbf (-> (Vectorof Real) tbf)) (: sbf (-> (Vectorof Real) TBF))
(define (sbf w) (define (sbf w)
(tbf w 0)) (tbf w 0))
@ -555,14 +556,14 @@
(test-case "sbf" (test-case "sbf"
(check-equal? (sbf #(1 -1)) (tbf '#(1 -1) 0)))) (check-equal? (sbf #(1 -1)) (tbf '#(1 -1) 0))))
(: list->sbf (-> (Listof Real) tbf)) (: list->sbf (-> (Listof Real) TBF))
(define (list->sbf lst) (sbf (list->vector lst))) (define (list->sbf lst) (sbf (list->vector lst)))
(module+ test (module+ test
(test-case "list->sbf" (test-case "list->sbf"
(check-equal? (list->sbf '(1 -1)) (tbf '#(1 -1) 0)))) (check-equal? (list->sbf '(1 -1)) (tbf '#(1 -1) 0))))
(: read-org-sbfs (->* (String) (#:headers Boolean) (Listof tbf))) (: read-org-sbfs (->* (String) (#:headers Boolean) (Listof TBF)))
(define (read-org-sbfs str #:headers [headers #f]) (define (read-org-sbfs str #:headers [headers #f])
(define sexp (assert-type (read-org-sexp str) (Listof Any))) (define sexp (assert-type (read-org-sexp str) (Listof Any)))
(define sexp-clean (cond [headers (cdr sexp)] [else sexp])) (define sexp-clean (cond [headers (cdr sexp)] [else sexp]))

View File

@ -453,10 +453,20 @@ a list of arguments.
A threshold Boolean function (TBF) is a pair @tt{(w, θ)}, where @tt{w} is A threshold Boolean function (TBF) is a pair @tt{(w, θ)}, where @tt{w} is
a vector of weights and @tt{θ} is the threshold. a vector of weights and @tt{θ} is the threshold.
Instances of @racket[tbf] have the type @racket[TBF].
} }
@deftogether[(@defproc[(tbf-w [t tbf]) (Vectorof Real)] @defidform[TBF]{
@defproc[(tbf-θ [t tbf]) Real])]{
The type of the instances of @racket[tbf]:
@ex[
(tbf #(1 2) 3)
]}
@deftogether[(@defproc[(tbf-w [t TBF]) (Vectorof Real)]
@defproc[(tbf-θ [t TBF]) Real])]{
Shortcuts for @racket[tbf-weights] and @racket[tbf-threshold]. Shortcuts for @racket[tbf-weights] and @racket[tbf-threshold].
@ -471,7 +481,7 @@ Converts a Boolean vector to a vector of zeros and ones.
(boolean->01/vector #(#t #f #f)) (boolean->01/vector #(#t #f #f))
]} ]}
@defproc[(apply-tbf [t tbf] [inputs (Vectorof (U Zero One))]) (U Zero One)]{ @defproc[(apply-tbf [t TBF] [inputs (Vectorof (U Zero One))]) (U Zero One)]{
Applies the TBF to its inputs. Applies the TBF to its inputs.
@ -484,7 +494,7 @@ above the threshold, the function is 1, otherwise it is 0.
(tabulate/pv/01 2 (pvλ (x y) (apply-tbf simple-tbf (vector x y)))) (tabulate/pv/01 2 (pvλ (x y) (apply-tbf simple-tbf (vector x y))))
]} ]}
@defproc[(apply-tbf/boolean [t tbf] [inputs (Vectorof Boolean)]) Boolean]{ @defproc[(apply-tbf/boolean [t TBF] [inputs (Vectorof Boolean)]) Boolean]{
Like @racket[apply-tbf], but takes Boolean values as inputs and outputs Like @racket[apply-tbf], but takes Boolean values as inputs and outputs
a Boolean value. a Boolean value.
@ -494,7 +504,7 @@ a Boolean value.
(tabulate/pv/boolean 2 (pvλ (x y) (apply-tbf/boolean simple-tbf (vector x y)))) (tabulate/pv/boolean 2 (pvλ (x y) (apply-tbf/boolean simple-tbf (vector x y))))
]} ]}
@defproc[(list->tbf [lst (Listof Real)]) tbf]{ @defproc[(list->tbf [lst (Listof Real)]) TBF]{
Converts a list of numbers to a TBF. The last element of the list is taken to Converts a list of numbers to a TBF. The last element of the list is taken to
be the threshold, while the other elements are taken to be the weights. be the threshold, while the other elements are taken to be the weights.
@ -503,7 +513,7 @@ be the threshold, while the other elements are taken to be the weights.
(list->tbf '(1 2 3)) (list->tbf '(1 2 3))
]} ]}
@defproc[(lists->tbfs [lsts (Listof (Listof Real))]) (Listof tbf)]{ @defproc[(lists->tbfs [lsts (Listof (Listof Real))]) (Listof TBF)]{
Converts multiple lists of numbers to a list of TBFs. Converts multiple lists of numbers to a list of TBFs.
@ -515,7 +525,7 @@ The main use is for reading TBFs from Org-mode tables read by
]} ]}
@defproc[(read-org-tbfs [str String] [#:headers headers Boolean #f]) @defproc[(read-org-tbfs [str String] [#:headers headers Boolean #f])
(Listof tbf)]{ (Listof TBF)]{
Reads a list of TBF from an Org-mode string containing a sexp, containing Reads a list of TBF from an Org-mode string containing a sexp, containing
a list of lists of numbers. If headers is @racket[#t], drops the first list, a list of lists of numbers. If headers is @racket[#t], drops the first list,
@ -528,7 +538,7 @@ The input is typically what @racket[read-org-sexp] reads.
(read-org-tbfs "((x y f) (1 2 1) (1 0 1))" #:headers #t) (read-org-tbfs "((x y f) (1 2 1) (1 0 1))" #:headers #t)
]} ]}
@defproc[(tbf-tabulate* [tbfs (Listof tbf)]) @defproc[(tbf-tabulate* [tbfs (Listof TBF)])
(Listof (Listof (U Zero One)))]{ (Listof (Listof (U Zero One)))]{
Tabulates a list of TBFs. Tabulates a list of TBFs.
@ -544,7 +554,7 @@ TBF in the list.
(tbf-tabulate* (list (tbf #(2 2) 1) (tbf #(1 1) 1))) (tbf-tabulate* (list (tbf #(2 2) 1) (tbf #(1 1) 1)))
]} ]}
@defproc[(tbf-tabulate [t tbf]) @defproc[(tbf-tabulate [t TBF])
(Listof (Listof (U Zero One)))]{ (Listof (Listof (U Zero One)))]{
Tabulates a single TBF. Tabulates a single TBF.
@ -553,7 +563,7 @@ Tabulates a single TBF.
(tbf-tabulate (tbf #(1 2) 1)) (tbf-tabulate (tbf #(1 2) 1))
]} ]}
@defproc[(tbf-tabulate*/boolean [tbfs (Listof tbf)]) @defproc[(tbf-tabulate*/boolean [tbfs (Listof TBF)])
(Listof (Listof Boolean))]{ (Listof (Listof Boolean))]{
Tabulates a list of TBFs like @racket[tbf-tabulate*], but uses Boolean values Tabulates a list of TBFs like @racket[tbf-tabulate*], but uses Boolean values
@ -566,7 +576,7 @@ TBF in the list.
(tbf-tabulate*/boolean (list (tbf #(1 2) 1))) (tbf-tabulate*/boolean (list (tbf #(1 2) 1)))
]} ]}
@defproc[(sbf? [t tbf]) Boolean]{ @defproc[(sbf? [t TBF]) Boolean]{
A sign Boolean function (SBF) is a TBF whose threshold is 0. A sign Boolean function (SBF) is a TBF whose threshold is 0.
@ -575,7 +585,7 @@ A sign Boolean function (SBF) is a TBF whose threshold is 0.
(sbf? (tbf #(1 2) 0)) (sbf? (tbf #(1 2) 0))
]} ]}
@defproc[(sbf [w (Vectorof Real)]) tbf]{ @defproc[(sbf [w (Vectorof Real)]) TBF]{
Creates a TBF which is an SBF from a vector of weights. Creates a TBF which is an SBF from a vector of weights.
@ -584,7 +594,7 @@ Creates a TBF which is an SBF from a vector of weights.
]} ]}
@defproc[(list->sbf [lst (Listof Real)]) @defproc[(list->sbf [lst (Listof Real)])
tbf]{ TBF]{
Converts a list of numbers to an SBF. The elements of the list are taken to be Converts a list of numbers to an SBF. The elements of the list are taken to be
the weights of the SBF. the weights of the SBF.
@ -594,7 +604,7 @@ the weights of the SBF.
]} ]}
@defproc[(read-org-sbfs [str String] [#:headers headers Boolean #f]) @defproc[(read-org-sbfs [str String] [#:headers headers Boolean #f])
(Listof tbf)]{ (Listof TBF)]{
Reads a list of SBF from an Org-mode string containing a sexp, containing Reads a list of SBF from an Org-mode string containing a sexp, containing
a list of lists of numbers. If headers is @racket[#t], drops the first list, a list of lists of numbers. If headers is @racket[#t], drops the first list,