Type dynamics%.
This commit is contained in:
parent
b2bc06646e
commit
c667f75c0e
2 changed files with 83 additions and 2 deletions
48
rs.rkt
48
rs.rkt
|
@ -10,7 +10,7 @@
|
||||||
str-triple->reaction ht-str-triples->rs read-org-rs read-context-sequence
|
str-triple->reaction ht-str-triples->rs read-org-rs read-context-sequence
|
||||||
reaction->str-triple rs->ht-str-triples
|
reaction->str-triple rs->ht-str-triples
|
||||||
|
|
||||||
(struct-out state) State
|
(struct-out state) State dynamics% Dynamics%
|
||||||
)
|
)
|
||||||
|
|
||||||
(module+ test
|
(module+ test
|
||||||
|
@ -176,6 +176,52 @@
|
||||||
[rest-contexts : (Listof (Setof Species))])
|
[rest-contexts : (Listof (Setof Species))])
|
||||||
#:transparent
|
#:transparent
|
||||||
#:type-name State)
|
#:type-name State)
|
||||||
|
|
||||||
|
(define dynamics%
|
||||||
|
(class (inst dds% State (Listof ReactionName))
|
||||||
|
(super-new)
|
||||||
|
(init-field [rs : ReactionSystem])
|
||||||
|
(: step/annotated (-> State (Listof (Pairof (Listof ReactionName) State))))
|
||||||
|
(define/override (step/annotated s)
|
||||||
|
(match s
|
||||||
|
[(state res (cons ctx rest-ctx))
|
||||||
|
(define full-s (set-union ctx res))
|
||||||
|
(define en (list-enabled rs full-s))
|
||||||
|
(list (cons en (state (union-products rs en) rest-ctx)))]
|
||||||
|
[(state _'()) '()]))))
|
||||||
|
|
||||||
|
(define-type Dynamics%
|
||||||
|
(Instance (Class
|
||||||
|
(init (rs ReactionSystem))
|
||||||
|
(field (rs ReactionSystem))
|
||||||
|
(build-state-graph (-> (Listof State) Graph))
|
||||||
|
(build-state-graph*
|
||||||
|
(-> (Listof State) (U 'full Exact-Positive-Integer) Graph))
|
||||||
|
(build-state-graph*/annotated
|
||||||
|
(-> (Listof State) (U 'full Exact-Positive-Integer) Graph))
|
||||||
|
(build-state-graph/annotated (-> (Listof State) Graph))
|
||||||
|
(step (-> State (Listof State)))
|
||||||
|
(step* (-> (Listof State) (Listof State)))
|
||||||
|
(step/annotated (-> State (Listof (Pairof (Listof Variable) State)))))))
|
||||||
|
|
||||||
|
(module+ test
|
||||||
|
(test-case "dynamics%:step/annotated"
|
||||||
|
(define rs (hash 'a (make-reaction '(x) '(y) '(z))
|
||||||
|
'b (make-reaction '(x y) '() '(x))))
|
||||||
|
(define dyn (new dynamics% [rs rs]))
|
||||||
|
(define s0 (state (set 'x 'y)
|
||||||
|
(list (set) (set) (set 'x))))
|
||||||
|
(define-values (_ 3-steps)
|
||||||
|
(for/fold ([last-s : State s0]
|
||||||
|
[trace : (Listof (Pairof (Listof ReactionName) State)) '()])
|
||||||
|
([_ (in-range 1 4)])
|
||||||
|
(define trans (send dyn step/annotated last-s))
|
||||||
|
(values (cdar trans) (append trace trans))))
|
||||||
|
(check-equal? 3-steps
|
||||||
|
(list
|
||||||
|
(cons '(b) (state (set 'x) (list (set) (set 'x))))
|
||||||
|
(cons '(a) (state (set 'z) (list (set 'x))))
|
||||||
|
(cons '(a) (state (set 'z) '()))))))
|
||||||
)
|
)
|
||||||
|
|
||||||
(require graph "utils.rkt" "generic.rkt")
|
(require graph "utils.rkt" "generic.rkt")
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
#lang scribble/manual
|
#lang scribble/manual
|
||||||
@(require scribble/example racket/sandbox
|
@(require scribble/example racket/sandbox
|
||||||
(for-label typed/racket/base
|
(for-label typed/racket/base
|
||||||
(submod "../rs.rkt" typed)))
|
(submod "../rs.rkt" typed)
|
||||||
|
"../dynamics.rkt"))
|
||||||
|
|
||||||
@(define rs-evaluator
|
@(define rs-evaluator
|
||||||
(parameterize ([sandbox-output 'string]
|
(parameterize ([sandbox-output 'string]
|
||||||
|
@ -214,3 +215,37 @@ be applied.
|
||||||
The type of the instances of @racket[state].
|
The type of the instances of @racket[state].
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@defclass[dynamics% dds% ()]{
|
||||||
|
|
||||||
|
A model of dynamics of a @racket[ReactionSystem].
|
||||||
|
|
||||||
|
@defconstructor[([rs ReactionSystem])]{
|
||||||
|
|
||||||
|
Constructs a model of dynamics for @racket[rs].
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@defmethod[(step/annotated [s State]) (Listof (Pairof (Listof ReactionName) State))]{
|
||||||
|
|
||||||
|
Runs the @racket[ReactionSystem] stored in this class on the given
|
||||||
|
state and produces a list containing one pair, indicated the reactions
|
||||||
|
enabled on @racket[s] and the @racket[State] resulting after applying
|
||||||
|
these reactions.
|
||||||
|
|
||||||
|
@ex[
|
||||||
|
(let* ([rs (hash 'a (make-reaction '(x) '(y) '(z))
|
||||||
|
'b (make-reaction '(x y) '() '(x)))]
|
||||||
|
[dyn (new dynamics% [rs rs])]
|
||||||
|
[s0 (state (set 'x 'y)
|
||||||
|
(list (set) (set) (set 'x)))])
|
||||||
|
(send dyn step/annotated s0))
|
||||||
|
]}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@deftype[Dynamics%]{
|
||||||
|
|
||||||
|
The type of an instance of @racket[dynamics%].
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue