Give the instances of tbf the type TBF.
This commit is contained in:
parent
86d52eed3b
commit
4927c0ec8c
2 changed files with 39 additions and 28 deletions
|
@ -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]))
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue