diff --git a/rs.rkt b/rs.rkt index 4305687..baaddb0 100644 --- a/rs.rkt +++ b/rs.rkt @@ -11,6 +11,7 @@ reaction->str-triple rs->ht-str-triples (struct-out state) State dynamics% Dynamics% build-interactive-process-graph + build-interactive-process-graph/simple-states ) (module+ test @@ -236,6 +237,23 @@ (define ctx : (Listof (Setof Species)) (list (set) (set) (set 'x))) (check-equal? (graphviz (build-interactive-process-graph rs ctx)) "digraph G {\n\tnode0 [label=\"(state (set) '(#))\"];\n\tnode1 [label=\"(state (set 'z) '())\"];\n\tnode2 [label=\"(state (set) '(# #))\"];\n\tnode3 [label=\"(state (set) '(# # #))\"];\n\tsubgraph U {\n\t\tedge [dir=none];\n\t}\n\tsubgraph D {\n\t\tnode0 -> node1 [label=\"'(a)\"];\n\t\tnode2 -> node0 [label=\"'()\"];\n\t\tnode3 -> node2 [label=\"'()\"];\n\t}\n}\n"))) + + (: build-interactive-process-graph/simple-states (-> ReactionSystem (Listof (Setof Species)) Graph)) + (define (build-interactive-process-graph/simple-states rs contexts) + (define sgr (build-interactive-process-graph rs contexts)) + (weighted-graph/directed + (for/list ([e (in-edges sgr)]) + (define u (assert-type (car e) State)) + (define v (assert-type (cadr e) State)) + (list (edge-weight sgr u v) (state-result u) (state-result v))))) + + (module+ test + (test-case "build-interactive-process-graph/simple-states" + (define rs (hash 'a (make-reaction '(x) '(y) '(z)) + 'b (make-reaction '(x y) '() '(x)))) + (define ctx : (Listof (Setof Species)) (list (set) (set) (set 'x))) + (check-equal? (graphviz (build-interactive-process-graph/simple-states rs ctx)) + "digraph G {\n\tnode0 [label=\"(set)\"];\n\tnode1 [label=\"(set 'z)\"];\n\tsubgraph U {\n\t\tedge [dir=none];\n\t\tnode0 -> node0 [label=\"'()\"];\n\t}\n\tsubgraph D {\n\t\tnode0 -> node1 [label=\"'(a)\"];\n\t}\n}\n"))) ) (require graph "utils.rkt" "generic.rkt") diff --git a/scribblings/rs.scrbl b/scribblings/rs.scrbl index 9dc2cc2..5a9d058 100644 --- a/scribblings/rs.scrbl +++ b/scribblings/rs.scrbl @@ -269,3 +269,25 @@ that function. [ctx : (Listof (Setof Species)) (list (set) (set) (set 'x))]) (dotit (build-interactive-process-graph rs ctx))) ]} + +@defproc[(build-interactive-process-graph/simple-states + [rs ReactionSystem] + [contexts (Listof (Setof Species))]) + Graph]{ + +Builds the state graph of the reaction system @racket[rs] driven by +the context sequence @racket[contexts], like +@racket[build-interactive-process-graph], but omits the context +sequences from the states. + +@bold{Note:} If the reaction system visits the same set of species +multiple times, all these visits will be conflated into a single node +in the resulting graph. The number or the order of visits will not be +reflected in any way. + +@ex[ +(let ([rs (hash 'a (make-reaction '(x) '(y) '(z)) + 'b (make-reaction '(x y) '() '(x)))] + [ctx : (Listof (Setof Species)) (list (set) (set) (set 'x))]) + (dotit (build-interactive-process-graph/simple-states rs ctx))) +]}