rs: Add the dynamics.
This commit is contained in:
parent
868988c966
commit
0bceb820df
2 changed files with 95 additions and 3 deletions
48
rs-tests.rkt
48
rs-tests.rkt
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
;;; Tests for dds/rs.
|
;;; Tests for dds/rs.
|
||||||
|
|
||||||
(require rackunit "rs.rkt")
|
(require rackunit graph "rs.rkt" "utils.rkt")
|
||||||
|
|
||||||
(test-case "Basic definitions"
|
(test-case "Basic definitions"
|
||||||
(let* ([r1 (reaction (set 'x) (set 'y) (set 'z))]
|
(let* ([r1 (reaction (set 'x) (set 'y) (set 'z))]
|
||||||
|
@ -23,3 +23,49 @@
|
||||||
(make-immutable-hash (list (cons 'a (reaction (set 'x 't) (set 'y) (set 'z))))))
|
(make-immutable-hash (list (cons 'a (reaction (set 'x 't) (set 'y) (set 'z))))))
|
||||||
(check-equal? (rs->ht-str-triples (make-immutable-hash (list (cons 'a (reaction (set 'x 't) (set 'y) (set 'z))))))
|
(check-equal? (rs->ht-str-triples (make-immutable-hash (list (cons 'a (reaction (set 'x 't) (set 'y) (set 'z))))))
|
||||||
#hash((a . ("t x" "y" "z")))))
|
#hash((a . ("t x" "y" "z")))))
|
||||||
|
|
||||||
|
(test-case "Dynamics of reaction systems"
|
||||||
|
(let* ([r1 (reaction (set 'x) (set 'y) (set 'z))]
|
||||||
|
[r2 (reaction (set 'x) (set) (set 'y))]
|
||||||
|
[rs (make-immutable-hash (list (cons 'a r1) (cons 'b r2)))]
|
||||||
|
[dyn (dynamics rs)]
|
||||||
|
[state1 (state (set) (list (set 'x) (set 'y) (set 'z) (set) (set 'z)))]
|
||||||
|
[sgr (dds-build-state-graph-annotated dyn (set state1))])
|
||||||
|
(check-equal? (dds-step-one-annotated dyn state1)
|
||||||
|
(set (cons
|
||||||
|
(set 'a 'b)
|
||||||
|
(state (set 'y 'z) (list (set 'y) (set 'z) (set) (set 'z))))))
|
||||||
|
(check-equal? (dds-step-one dyn state1)
|
||||||
|
(set (state (set 'y 'z) (list (set 'y) (set 'z) (set) (set 'z)))))
|
||||||
|
|
||||||
|
(check-true (has-vertex? sgr (state (set 'y 'z) (list (set 'y) (set 'z) (set) (set 'z)))))
|
||||||
|
(check-true (has-vertex? sgr (state (set) (list (set 'z) (set) (set 'z)))))
|
||||||
|
(check-true (has-vertex? sgr (state (set) (list (set) (set 'z)))))
|
||||||
|
(check-true (has-vertex? sgr (state (set) (list (set 'z)))))
|
||||||
|
(check-true (has-vertex? sgr (state (set) (list (set 'x) (set 'y) (set 'z) (set) (set 'z)))))
|
||||||
|
(check-true (has-vertex? sgr (state (set) '())))
|
||||||
|
|
||||||
|
(check-equal? (edge-weight sgr
|
||||||
|
(state (set) '())
|
||||||
|
(state (set) '()))
|
||||||
|
(set (set)))
|
||||||
|
(check-equal? (edge-weight sgr
|
||||||
|
(state (set 'y 'z) (list (set 'y) (set 'z) (set) (set 'z)))
|
||||||
|
(state (set) (list (set 'z) (set) (set 'z))))
|
||||||
|
(set (set)))
|
||||||
|
(check-equal? (edge-weight sgr
|
||||||
|
(state (set) (list (set 'z) (set) (set 'z)))
|
||||||
|
(state (set) (list (set) (set 'z))))
|
||||||
|
(set (set)))
|
||||||
|
(check-equal? (edge-weight sgr
|
||||||
|
(state (set) (list (set) (set 'z)))
|
||||||
|
(state (set) (list (set 'z))))
|
||||||
|
(set (set)))
|
||||||
|
(check-equal? (edge-weight sgr
|
||||||
|
(state (set) (list (set 'z)))
|
||||||
|
(state (set) '()))
|
||||||
|
(set (set)))
|
||||||
|
(check-equal? (edge-weight sgr
|
||||||
|
(state (set) (list (set 'x) (set 'y) (set 'z) (set) (set 'z)))
|
||||||
|
(state (set 'y 'z) (list (set 'y) (set 'z) (set) (set 'z))))
|
||||||
|
(set (set 'a 'b)))))
|
||||||
|
|
50
rs.rkt
50
rs.rkt
|
@ -4,18 +4,27 @@
|
||||||
|
|
||||||
;;; Definitions for working with reaction systems.
|
;;; Definitions for working with reaction systems.
|
||||||
|
|
||||||
(require "utils.rkt")
|
(require graph "utils.rkt" "generic.rkt")
|
||||||
|
|
||||||
(provide
|
(provide
|
||||||
;; Structures
|
;; Structures
|
||||||
(struct-out reaction)
|
(struct-out reaction)
|
||||||
|
(struct-out state)
|
||||||
|
(struct-out dynamics)
|
||||||
;; Functions
|
;; Functions
|
||||||
(contract-out [enabled? (-> reaction? (set/c symbol?) boolean?)]
|
(contract-out [enabled? (-> reaction? (set/c symbol?) boolean?)]
|
||||||
[list-enabled (-> reaction-system/c (set/c species?) (listof symbol?))]
|
[list-enabled (-> reaction-system/c (set/c species?) (listof symbol?))]
|
||||||
[union-products (-> reaction-system/c (listof symbol?) (set/c species?))]
|
[union-products (-> reaction-system/c (listof symbol?) (set/c species?))]
|
||||||
[apply-rs (-> reaction-system/c (set/c species?) (set/c species?))]
|
[apply-rs (-> reaction-system/c (set/c species?) (set/c species?))]
|
||||||
[ht-str-triples->rs (-> (hash/c symbol? (list/c string? string? string?)) reaction-system/c)]
|
[ht-str-triples->rs (-> (hash/c symbol? (list/c string? string? string?)) reaction-system/c)]
|
||||||
[rs->ht-str-triples (-> reaction-system/c (hash/c symbol? (list/c string? string? string?)))])
|
[rs->ht-str-triples (-> reaction-system/c (hash/c symbol? (list/c string? string? string?)))]
|
||||||
|
[dds-step-one (-> dynamics? state? (set/c state?))]
|
||||||
|
[dds-step-one-annotated (-> dynamics? state? (set/c (cons/c (set/c symbol?) state?)))]
|
||||||
|
[dds-step (-> dynamics? (set/c state? #:kind 'dont-care) (set/c state?))]
|
||||||
|
[dds-build-state-graph (-> dynamics? (set/c state? #:kind 'dont-care) graph?)]
|
||||||
|
[dds-build-n-step-state-graph (-> dynamics? (set/c state? #:kind 'dont-care) number? graph?)]
|
||||||
|
[dds-build-state-graph-annotated (-> dynamics? (set/c state? #:kind 'dont-care) graph?)]
|
||||||
|
[dds-build-n-step-state-graph-annotated (-> dynamics? (set/c state? #:kind 'dont-care) number? graph?)])
|
||||||
;; Predicates
|
;; Predicates
|
||||||
(contract-out [species? (-> any/c boolean?)])
|
(contract-out [species? (-> any/c boolean?)])
|
||||||
;; Contracts
|
;; Contracts
|
||||||
|
@ -115,3 +124,40 @@
|
||||||
|
|
||||||
;;; A shortcut for rs->ht-str-triples.
|
;;; A shortcut for rs->ht-str-triples.
|
||||||
(define-syntax-rule (org-rs rs) (rs->ht-str-triples rs))
|
(define-syntax-rule (org-rs rs) (rs->ht-str-triples rs))
|
||||||
|
|
||||||
|
|
||||||
|
;;; ============================
|
||||||
|
;;; Dynamics of reaction systems
|
||||||
|
;;; ============================
|
||||||
|
|
||||||
|
;;; An interactive process of a reaction system is a sequence of
|
||||||
|
;;; states driven by a sequence of contexts in the following way. The
|
||||||
|
;;; reaction system starts with the initial context. Then, at every
|
||||||
|
;;; step, the result of applying the reaction system is merged with
|
||||||
|
;;; the next element of the context sequence, and the reaction system
|
||||||
|
;;; is then applied to the result of the union.
|
||||||
|
|
||||||
|
;;; A state of a reaction system is a set of species representing the
|
||||||
|
;;; result of the application of the reactions from the previous
|
||||||
|
;;; steps, plus the rest of the context sequence.
|
||||||
|
(struct state (result rest-contexts) #:transparent)
|
||||||
|
|
||||||
|
;;; The dynamics of the reaction system only stores the reaction
|
||||||
|
;;; system itself.
|
||||||
|
(struct dynamics (rs) #:transparent
|
||||||
|
#:methods gen:dds
|
||||||
|
[;; Since reaction systems are deterministic, a singleton set is
|
||||||
|
;; always produced. It is annotated by the list of rules which
|
||||||
|
;; were enabled in the current step.
|
||||||
|
(define (dds-step-one-annotated dyn st)
|
||||||
|
(let* ([rs (dynamics-rs dyn)]
|
||||||
|
[apply-rs-annotate
|
||||||
|
(λ (s rest-ctx)
|
||||||
|
(let ([en (list-enabled rs s)])
|
||||||
|
(set (cons (list->set en)
|
||||||
|
(state (union-products rs en) rest-ctx)))))])
|
||||||
|
(match st
|
||||||
|
[(state res (cons ctx rest-ctx))
|
||||||
|
(apply-rs-annotate (set-union res ctx) rest-ctx)]
|
||||||
|
[(state res '())
|
||||||
|
(apply-rs-annotate res '())])))])
|
||||||
|
|
Loading…
Reference in a new issue