diff --git a/networks.rkt b/networks.rkt index d8842ff..20b84d9 100644 --- a/networks.rkt +++ b/networks.rkt @@ -15,7 +15,7 @@ make-same-domains make-boolean-domains make-boolean-network make-01-domains make-01-network update - UpdateFunctionForm + UpdateFunctionForm (struct-out network-form) NetworkForm ) (define-type (State a) (VariableMapping a)) @@ -118,6 +118,11 @@ #hash((x1 . #f) (x2 . #t))))) (define-type UpdateFunctionForm Any) + + (struct (a) network-form ([forms : (VariableMapping UpdateFunctionForm)] + [domains : (DomainMapping a)]) + #:transparent + #:type-name NetworkForm) ) (require 'typed) @@ -132,11 +137,7 @@ (contract-out [struct tbf/state ([weights (hash/c variable? number?)] [threshold number?])] [struct dynamics ([network network?] - [mode mode?])] - [struct network ([functions (hash/c variable? procedure?)] - [domains domain-mapping/c])] - [struct network-form ([forms variable-mapping?] - [domains domain-mapping/c])]) + [mode mode?])]) ;; Functions (contract-out [update-function-form->update-function (-> update-function-form? update-function/c)] [network-form->network (-> network-form? network?)] @@ -288,15 +289,6 @@ (define update-function-form? any/c) -;;; A network form consists of a mapping from variables to the forms -;;; of their update functions, together with a mapping from its -;;; variables to its update functions. -;;; -;;; The domain mapping does not have to assign domains to all -;;; variables (e.g., it may be empty), but in this case the functions -;;; which need to know the domains will not work. -(struct network-form (forms domains) #:transparent) - ;;; Build an update function from an update function form. (define (update-function-form->update-function form) (λ (s) (eval1-with s form))) diff --git a/scribblings/networks.scrbl b/scribblings/networks.scrbl index 8fe92f1..678fab0 100644 --- a/scribblings/networks.scrbl +++ b/scribblings/networks.scrbl @@ -208,6 +208,29 @@ and which can be evaluated with @racket[eval]. } +@defstruct*[network-form ([functions (VariableMapping NetworkForm)] + [domains (DomainMapping a)])]{ + +A network form consists of a mapping from variables to the forms of their +update functions, together with a mapping from its variables to its +update functions. + +The domain mapping does not have to assign domains to all variables (e.g., it +may be empty), but in this case the functions which need to know the domains +will not work. + +Instances of @racket[network-form] have the type @racket[NetworkForm]. + +} + +@deftypeform[(NetworkForm a)]{ + +The type of instances of @racket[network-form]. + +@ex[ +(network-form (hash 'a '(and a b) 'b '(or a b)) + (hash 'a '(#f #t) 'b '(#f #t))) +]} @section{Inferring interaction graphs}