dds/bn.rkt
2020-02-18 12:52:20 +01:00

118 lines
4.0 KiB
Racket
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#lang typed/racket
;;; dds/bn
;;; This module provides some quick definitions for running Boolean
;;; networks. A Boolean network is a set of Boolean variables which
;;; are updated according to their corresponding update functions.
;;; The variables to be updated at each step are given by the mode.
(require "utils.rkt")
(provide
;; Types
Variable State UpdateFunc Network
;; Functions
update make-state make-bn-funcs update-func-form->update-func
bn-form->bn make-bn-forms
;; Syntax
st bn)
;;; =================
;;; Basic definitions
;;; =================
(define-type Variable Symbol)
;;; A state of a Boolean network is a mapping from the variables of the
;;; network to their Boolean values.
(define-type State (HashTable Variable Boolean))
;;; An update function is a Boolean function computing a Boolean value
;;; from the given state.
(define-type UpdateFunc (-> State Boolean))
;;; A Boolean network is a mapping from its variables to its update
;;; functions.
(define-type Network (HashTable Variable UpdateFunc))
;;; Given a state s updates all the variables from xs. This
;;; corresponds to a parallel mode.
(: update (-> Network State (Listof Variable) State))
(define (update bn ; the Boolean network
s ; the state to operate on
xs) ; the variables to update
(let ([new-s : State (hash-copy s)])
(for ([x xs])
(let ([f (hash-ref bn x)])
(hash-set! new-s x (f s))))
new-s))
;;; A version of make-hash restricted to creating Boolean states.
(: make-state (-> (Listof (Pairof Variable Boolean)) State))
(define (make-state mappings)
(make-hash mappings))
;;; A shortcut for make-state.
(define-syntax-rule (st mappings) (make-state mappings))
;;; A version of make-hash restricted to creating Boolean networks.
(: make-bn-funcs (-> (Listof (Pairof Variable UpdateFunc)) Network))
(define (make-bn-funcs funcs)
(make-hash funcs))
;;; =========================================
;;; Syntactic description of Boolean networks
;;; =========================================
;;; An UpdateFuncForm is any form which can appear as a body of a
;;; Boolean function and which can be evaluated with eval. For
;;; example, '(and x y (not z)).
(define-type UpdateFuncForm Any)
;;; A Boolean network form is a mapping from its variables to the
;;; forms of their update functions.
(define-type NetworkForm (HashTable Variable UpdateFuncForm))
;;; Build an update function from an update function form.
#;(: update-func-form->update-func (-> UpdateFuncForm UpdateFunc))
(define (update-func-form->update-func form)
(lambda ([s : State])
(cast (eval-with1 (cast s (HashTable Variable Any)) form) Boolean)))
;;; Build a Network from a Network form.
(: bn-form->bn (-> NetworkForm Network))
(define (bn-form->bn bnf)
(make-hash
(hash-map bnf (lambda ([x : Variable] [form : UpdateFuncForm])
(cons x (update-func-form->update-func form))))))
;;; Build a network from a list of pairs of forms of update functions.
(: make-bn-forms (-> (Listof (Pairof Variable UpdateFuncForm)) Network))
(define (make-bn-forms forms)
(bn-form->bn (make-hash forms)))
;;; A shortcut for make-bn-forms.
(define-syntax-rule (bn forms) (make-bn-forms forms))
;;; ============================
;;; Inferring interaction graphs
;;; ============================
;;; I allow any syntactic forms in definitions of Boolean functions.
;;; I can still find out which Boolean variables appear in those
;;; syntactic form, but I have no reliable syntactic means of finding
;;; out what kind of action do they have (inhibition or activation)
;;; since I cannot do Boolean minimisation (e.g., I cannot rely on not
;;; appearing before a variable, since (not (not a)) is equivalent
;;; to a). On the other hand, going through all Boolean states is
;;; quite resource-consuming and thus not always useful.
;;;
;;; In this section I provide inference of both unsigned and signed
;;; interaction graphs, but since the inference of signed interaction
;;; graphs is based on analysing the dynamics of the networks, it may
;;; be quite resource-consuming.