networks: build-interaction-graph → build-syntactic-interaction-graph.
The interaction graph is *not* usually defined in this way.
This commit is contained in:
parent
af581f91df
commit
cde6ee30fa
2 changed files with 29 additions and 10 deletions
|
@ -356,7 +356,7 @@ tab
|
||||||
Some functions in =dds= build graphs:
|
Some functions in =dds= build graphs:
|
||||||
|
|
||||||
#+BEGIN_SRC racket :results output drawer :var bf=munch-sexp(another-test-table)
|
#+BEGIN_SRC racket :results output drawer :var bf=munch-sexp(another-test-table)
|
||||||
(build-interaction-graph (unorgv bf))
|
(build-syntactic-interaction-graph (unorgv bf))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS:
|
#+RESULTS:
|
||||||
|
@ -372,7 +372,7 @@ tab
|
||||||
|
|
||||||
#+NAME: igraph
|
#+NAME: igraph
|
||||||
#+BEGIN_SRC racket :results output drawer :var bf=munch-sexp(another-test-table)
|
#+BEGIN_SRC racket :results output drawer :var bf=munch-sexp(another-test-table)
|
||||||
(display (graphviz (build-interaction-graph (unorgv bf))))
|
(display (graphviz (build-syntactic-interaction-graph (unorgv bf))))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS: igraph
|
#+RESULTS: igraph
|
||||||
|
@ -433,10 +433,10 @@ tab
|
||||||
because 0 is not #f. For example, =(if 0 1 2)= evaluates to 1, and
|
because 0 is not #f. For example, =(if 0 1 2)= evaluates to 1, and
|
||||||
not to 2.
|
not to 2.
|
||||||
|
|
||||||
Here's the unsigned interaction graph of this network:
|
Here's the unsigned syntactic interaction graph of this network:
|
||||||
#+NAME: simple-bn-ig
|
#+NAME: simple-bn-ig
|
||||||
#+BEGIN_SRC racket :results silent :var simple-bn=munch-sexp(simple-bn)
|
#+BEGIN_SRC racket :results silent :var simple-bn=munch-sexp(simple-bn)
|
||||||
(dotit (build-interaction-graph (unorgv simple-bn)))
|
(dotit (build-syntactic-interaction-graph (unorgv simple-bn)))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+BEGIN_SRC dot :file dots/examplejTo8XT.svg :results raw drawer :cmd sfdp :noweb yes
|
#+BEGIN_SRC dot :file dots/examplejTo8XT.svg :results raw drawer :cmd sfdp :noweb yes
|
||||||
|
@ -448,6 +448,15 @@ tab
|
||||||
[[file:dots/examplejTo8XT.svg]]
|
[[file:dots/examplejTo8XT.svg]]
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
|
Note that, while this definition is an easy one to check
|
||||||
|
structurally, this is *not* how interaction graphs are typically
|
||||||
|
defined. An interaction graph is usually defined based on the
|
||||||
|
dynamics of the network: an arrow from a variable x to a variable
|
||||||
|
y means that varying x and only x may have an influence on the
|
||||||
|
value of y. It is easy to imagine a situation in which the
|
||||||
|
syntactic interaction graph does not in fact agree with this
|
||||||
|
criterion, the simplest example being the network y = x \wedge \neg x.
|
||||||
|
|
||||||
Here's the signed interaction graph of this network:
|
Here's the signed interaction graph of this network:
|
||||||
|
|
||||||
#+NAME: simple-bn-sig
|
#+NAME: simple-bn-sig
|
||||||
|
|
22
networks.rkt
22
networks.rkt
|
@ -29,7 +29,7 @@
|
||||||
[make-network-from-forms (-> (listof (cons/c symbol? update-function-form?))
|
[make-network-from-forms (-> (listof (cons/c symbol? update-function-form?))
|
||||||
network?)]
|
network?)]
|
||||||
[list-interactions (-> network-form? variable? (listof variable?))]
|
[list-interactions (-> network-form? variable? (listof variable?))]
|
||||||
[build-interaction-graph (-> network-form? graph?)]
|
[build-syntactic-interaction-graph (-> network-form? graph?)]
|
||||||
[build-all-states (-> domain-mapping/c (listof state?))]
|
[build-all-states (-> domain-mapping/c (listof state?))]
|
||||||
[make-same-domains (-> (listof variable?) generic-set? domain-mapping/c)]
|
[make-same-domains (-> (listof variable?) generic-set? domain-mapping/c)]
|
||||||
[make-boolean-domains (-> (listof variable?) (hash/c variable? (list/c #f #t)))]
|
[make-boolean-domains (-> (listof variable?) (hash/c variable? (list/c #f #t)))]
|
||||||
|
@ -304,16 +304,26 @@
|
||||||
;;; Builds the graph in which the vertices are the variables of a
|
;;; Builds the graph in which the vertices are the variables of a
|
||||||
;;; given network, and which contains an arrow from a to b whenever a
|
;;; given network, and which contains an arrow from a to b whenever a
|
||||||
;;; appears in (list-interactions a).
|
;;; appears in (list-interactions a).
|
||||||
(define (build-interaction-graph n)
|
;;;
|
||||||
|
;;; Note that, while this definition is an easy one to check
|
||||||
|
;;; structurally, this is *not* how interaction graphs are typically
|
||||||
|
;;; defined. An interaction graph is usually defined based on the
|
||||||
|
;;; dynamics of the network: an arrow from a variable x to a variable
|
||||||
|
;;; y means that varying x and only x may have an influence on the
|
||||||
|
;;; value of y. It is easy to imagine a situation in which the
|
||||||
|
;;; syntactic interaction graph does not in fact agree with this
|
||||||
|
;;; criterion, the simplest example being the network y = x AND (NOT
|
||||||
|
;;; x).
|
||||||
|
(define (build-syntactic-interaction-graph n)
|
||||||
(transpose
|
(transpose
|
||||||
(unweighted-graph/adj
|
(unweighted-graph/adj
|
||||||
(for/list ([(var _) n]) (cons var (list-interactions n var))))))
|
(for/list ([(var _) n]) (cons var (list-interactions n var))))))
|
||||||
|
|
||||||
(module+ test
|
(module+ test
|
||||||
(test-case "build-interaction-graph"
|
(test-case "build-syntactic-interaction-graph"
|
||||||
(define n #hash((a . (+ a b c))
|
(define n #hash((a . (+ a b c))
|
||||||
(b . (- b c))))
|
(b . (- b c))))
|
||||||
(define ig (build-interaction-graph n))
|
(define ig (build-syntactic-interaction-graph n))
|
||||||
(check-true (has-vertex? ig 'a))
|
(check-true (has-vertex? ig 'a))
|
||||||
(check-true (has-vertex? ig 'b))
|
(check-true (has-vertex? ig 'b))
|
||||||
(check-false (has-vertex? ig 'c))
|
(check-false (has-vertex? ig 'c))
|
||||||
|
@ -456,7 +466,7 @@
|
||||||
;;; network for every arrow in the unsigned interaction graph, so its
|
;;; network for every arrow in the unsigned interaction graph, so its
|
||||||
;;; performance decreases very quickly with the size of the network.
|
;;; performance decreases very quickly with the size of the network.
|
||||||
(define (build-signed-interaction-graph/form network-form doms)
|
(define (build-signed-interaction-graph/form network-form doms)
|
||||||
(let ([ig (build-interaction-graph network-form)]
|
(let ([ig (build-syntactic-interaction-graph network-form)]
|
||||||
[network (network-form->network network-form)])
|
[network (network-form->network network-form)])
|
||||||
;; Label every edge of the interaction graph with the sign.
|
;; Label every edge of the interaction graph with the sign.
|
||||||
(define sig
|
(define sig
|
||||||
|
@ -567,7 +577,7 @@
|
||||||
(module+ test
|
(module+ test
|
||||||
(test-case "Interaction must graphs always contain all nodes."
|
(test-case "Interaction must graphs always contain all nodes."
|
||||||
(define n #hash((a . #t) (b . #t)))
|
(define n #hash((a . #t) (b . #t)))
|
||||||
(define ig (build-interaction-graph n))
|
(define ig (build-syntactic-interaction-graph n))
|
||||||
(define sig-nf (build-boolean-signed-interaction-graph/form n))
|
(define sig-nf (build-boolean-signed-interaction-graph/form n))
|
||||||
(define sig (build-boolean-signed-interaction-graph (network-form->network n)))
|
(define sig (build-boolean-signed-interaction-graph (network-form->network n)))
|
||||||
(check-equal? (get-vertices ig) '(b a))
|
(check-equal? (get-vertices ig) '(b a))
|
||||||
|
|
Loading…
Reference in a new issue