table->network → table+vars->network
This commit is contained in:
parent
9175a98a2a
commit
a6321c932a
2 changed files with 25 additions and 27 deletions
24
networks.rkt
24
networks.rkt
|
@ -48,7 +48,7 @@
|
|||
tabulate-state+headers tabulate-state+headers/boolean
|
||||
tabulate-network tabulate-network+headers
|
||||
|
||||
table->network
|
||||
table+vars->network
|
||||
)
|
||||
|
||||
(define-type (State a) (VariableMapping a))
|
||||
|
@ -931,15 +931,10 @@
|
|||
(#t #f #f #f)
|
||||
(#t #t #f #t)))))
|
||||
|
||||
(: table->network (All (a) (-> (Listof (Listof a)) (Network a))))
|
||||
(define (table->network table)
|
||||
(: table+vars->network (All (a) (-> (Listof Variable) (Listof (Listof a))
|
||||
(Network a))))
|
||||
(define (table+vars->network var-names table)
|
||||
(define n : Integer (quotient (length (car table)) 2))
|
||||
;; Get the variable names from the table or generate them, if
|
||||
;; necessary.
|
||||
(define var-names : (Listof Variable)
|
||||
(for/list : (Listof Variable)
|
||||
([i (in-range 1 (add1 n))])
|
||||
(format-symbol "x~a" i)))
|
||||
;; Split the table into the inputs and the outputs of the functions.
|
||||
(define-values (ins outs) (multi-split-at table n))
|
||||
;; Transpose outs to have functions define by lines instead of by
|
||||
|
@ -969,11 +964,12 @@
|
|||
domains))
|
||||
|
||||
(module+ test
|
||||
(test-case "table->network"
|
||||
(define n (table->network '((#f #f #f #f)
|
||||
(#f #t #f #t)
|
||||
(#t #f #t #f)
|
||||
(#t #t #t #t))))
|
||||
(test-case "table+vars->network"
|
||||
(define n (table+vars->network '(x1 x2)
|
||||
'((#f #f #f #f)
|
||||
(#f #t #f #t)
|
||||
(#t #f #t #f)
|
||||
(#t #t #t #t))))
|
||||
(define f1 (hash-ref (network-functions n) 'x1))
|
||||
(define f2 (hash-ref (network-functions n) 'x2))
|
||||
|
||||
|
|
|
@ -832,17 +832,18 @@ function names in the corresponding column headers are of the form
|
|||
|
||||
@section{Constructing functions and networks}
|
||||
|
||||
@defproc[(table->network [table (Listof (Listof a))])
|
||||
(Network a)]{
|
||||
@defproc[(table+vars->network [var-names (Listof Variable)]
|
||||
[table (Listof (Listof a))])
|
||||
(Network a)]{
|
||||
|
||||
Given a table like the one produced by @racket[tabulate-network],
|
||||
constructs a network having this behaviour.
|
||||
Given a @racket[table] like the one produced by
|
||||
@racket[tabulate-network] and the list of variable names
|
||||
@racket[var-names], constructs a network having this behaviour.
|
||||
|
||||
Variable names are generated as @tt{xi}, where 1 ≤ @tt{i} ≤ number of
|
||||
variables. The columns defining the functions are taken to be in the
|
||||
same order as the columns defining the variables. The domains of the
|
||||
network are a mapping assigning to each variable the set of values
|
||||
which can appear in the corresponding column in the table.
|
||||
The columns defining the functions are taken to be in the same order
|
||||
as the columns defining the variables. The domains of the network are
|
||||
a mapping assigning to each variable the set of values which can
|
||||
appear in the corresponding column in the table.
|
||||
|
||||
This function relies on @racket[table->unary-function], so the same
|
||||
performance caveats apply.
|
||||
|
@ -850,10 +851,11 @@ performance caveats apply.
|
|||
This function does not check whether the table is complete.
|
||||
|
||||
@ex[
|
||||
(let ([n (table->network '((#f #f #f #f)
|
||||
(#f #t #f #t)
|
||||
(#t #f #t #f)
|
||||
(#t #t #t #t)))])
|
||||
(let ([n (table+vars->network '(a b)
|
||||
'((#f #f #f #f)
|
||||
(#f #t #f #t)
|
||||
(#t #f #t #f)
|
||||
(#t #t #t #t)))])
|
||||
(tabulate-network n))
|
||||
]}
|
||||
|
||||
|
|
Loading…
Reference in a new issue