breed [markers marker] globals [ star-color j-color visited-star-color marked-color link-color traversed-link-color ] turtles-own [topTick bottomTick] to layout layout-radial turtles links (turtle 0) display ;; for smooth animation end to manual if mouse-down? [ let t closest-xy mouse-xcor mouse-ycor turtles with [breed != links] while [mouse-down?] [ ask t [setxy mouse-xcor mouse-ycor] ] ] end to reset ask links [ set color link-color ] ask turtles with [shape = "star"] [ set size 0.4 set color star-color ] ask turtles with [color = marked-color] [die] end to-report closest-xy [x y agent-set] ; Return closest agent to x, y report min-one-of agent-set [distancexy-nowrap x y] end to setup clear-all set star-color red set j-color 97 set visited-star-color black set link-color lime set traversed-link-color black set marked-color violet ask patches [ set pcolor white ] crt number-nodes [ set size 1 set shape "circle" set color 46 ] let J-set (n-of number-J-nodes turtles) ask J-set [ set color j-color ] make-connections layout end to make-my-nodes setup ask links [ die ] end to make-my-links let s 0 let d 0 set s grab-node set d grab-node while [s = d] [ set d grab-node ] ask s [ create-link-to (d) [set color link-color] ] end to-report grab-node let trigger true let node nobody while [trigger] [ if mouse-down? [ set node closest-xy mouse-xcor mouse-ycor turtles with [breed != links] set trigger false ] ] report node end to get-evidence let hatchling 0 ask turtles with [shape = "star"] [die] let K-set (n-of number-K-nodes turtles with [breed != links]) ask K-set [ hatch 1 [ set size 0.4 set color star-color set shape "star" set xcor ([xcor] of myself) set ycor ([ycor] of myself) create-link-to myself [tie] set hatchling self ] create-link-to hatchling [tie] ] end to set-evidence let hatchling 0 let trigger true while [trigger] [ if mouse-down? [ let t closest-xy mouse-xcor mouse-ycor turtles with [breed != links] ask t [ ifelse count (turtles-here with [shape = "star"]) > 0 [ ask (turtles-here with [shape = "star"]) [die] ] [ hatch 1 [ set size 0.4 set color star-color set shape "star" set xcor ([xcor] of myself) set ycor ([ycor] of myself) create-link-to myself [tie] set hatchling self ] create-link-to hatchling [tie] ] ] set trigger false ] ] end to go ask turtles with [breed != links] [ if color = j-color ;this node is in J [ ifelse (count turtles-here with [shape = "star"]) > 0 [ ask turtles-here with [shape = "star"] [ set size 0.6 set color visited-star-color ] stop ] [ send-to-parents self print (word who " done sending to parents") send-to-children self print (word who " done sending to children") ] ] ] end to send-to-parents [thisNode] print (word who " sending to parent") if top-marked? thisNode [ stop] mark-top thisNode print (word who " marked top") without-interruption [ ask thisNode [ foreach [self] of in-link-neighbors [ if (not (member? ? [self] of out-link-neighbors)) [ ask links with [(end1 = ?) and (end2 = thisNode) ] [ set color traversed-link-color ] pass-ball thisNode ? ] ] ] ] end to send-to-children [thisNode] print (word who " sending to parent") if bottom-marked? thisNode [ stop] mark-bottom thisNode without-interruption [ ask thisNode [ foreach [self] of out-link-neighbors [ if (not (member? ? [self] of in-link-neighbors)) [ ask links with [(end1 = thisNode) and (end2 = ?) ] [ set color traversed-link-color ] pass-ball thisNode ? ] ] ] ] end to mark-top [node] let hatchling 0 ask node [ hatch 1 [ set size 0.4 set color marked-color set shape "circle" set xcor ([xcor] of myself) set ycor ([ycor] of myself) + 0.4 set hatchling self create-link-to myself ] create-link-to hatchling [tie] set topTick hatchling ] end to-report top-marked? [node] let bool false ask node [ if (is-turtle? topTick) and ([color] of topTick = marked-color) [ set bool true ] ] report bool end to mark-bottom [node] let hatchling 0 ask node [ hatch 1 [ set size 0.4 set color marked-color set shape "circle" set xcor ([xcor] of myself) set ycor ([ycor] of myself) - 0.4 set hatchling self create-link-to myself [tie] ] create-link-to hatchling [tie] set bottomTick hatchling ] end to-report bottom-marked? [node] let bool false ask node [ if (is-turtle? bottomTick) and ([color] of topTick = marked-color) [ set bool true ] ] report bool end to receive-ball [fromNode] ifelse (member? fromNode out-link-neighbors) ;sent from child [ ifelse (count turtles-here with [shape = "star"]) > 0 [ ask turtles-here with [shape = "star"] ;receiving node is evidenced [ set size 0.6 set color visited-star-color ] stop ] [ send-to-parents self ;receiving node is not evidenced send-to-children self ] ] [ ifelse (count turtles-here with [shape = "star"]) > 0 ;sent from parent [ ask turtles-here with [shape = "star"] ;receiving node is evidenced [ set size 0.6 set color visited-star-color ] send-to-parents self ] ;receiving node is evidenced [ send-to-children self ] ] end to pass-ball [fromNode toNode] ask toNode [ receive-ball fromNode ] end to make-connections let unconnectedList [who] of turtles let oldNode (one-of unconnectedList) set unconnectedList (remove oldNode unconnectedList) let newNode (one-of unconnectedList) set unconnectedList (remove newNode unconnectedList) let connectedList (list oldNode newNode) ask turtle oldNode [ create-link-to (turtle newNode) [set color link-color] ] while [not empty? unconnectedList] [ set oldNode (one-of connectedList) set newNode (one-of unconnectedList) set unconnectedList (remove newNode unconnectedList) set connectedList (lput newNode connectedList) ask turtle oldNode [ create-link-to (turtle newNode) [set color link-color] ] ] end @#$#@#$#@ GRAPHICS-WINDOW 513 10 967 485 10 10 21.143 1 10 1 1 1 0 0 0 1 -10 10 -10 10 0 0 1 ticks CC-WINDOW 5 499 976 594 Command Center 0 BUTTON 21 171 132 204 setup network setup NIL 1 T OBSERVER NIL NIL NIL NIL SLIDER 56 225 183 258 number-nodes number-nodes 2 20 11 1 1 NIL HORIZONTAL TEXTBOX 523 47 728 92 J set = query nodes = blue nodes\nK set = evidenced nodes = starred nodes\nProbabilistic nodes = yellow nodes 13 0.0 0 BUTTON 142 172 213 205 NIL manual T 1 T OBSERVER NIL NIL NIL NIL SLIDER 190 225 318 258 number-J-nodes number-J-nodes 1 20 3 1 1 NIL HORIZONTAL SLIDER 323 225 450 258 number-K-nodes number-K-nodes 1 20 5 1 1 NIL HORIZONTAL BUTTON 151 428 375 485 EXECUTE BAYES-BALL ALGORITHM go\n NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 48 276 241 309 randomly set evidence get-evidence NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 258 326 415 383 NIL reset NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 246 276 459 309 manually set or remove evidence set-evidence NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 279 172 355 205 make nodes make-my-nodes NIL 1 T OBSERVER NIL NIL NIL NIL BUTTON 95 326 252 383 clear ca\nask patches [ set pcolor white ] NIL 1 T OBSERVER NIL NIL NIL NIL TEXTBOX 279 40 496 164 CREATE YOUR OWN NETWORK:\n1) click \"make nodes\" to create the number of nodes specified by number-nodes and number-J-nodes\n2) click on \"make connections\" and then click on source node followed by destination node, creating a link from source to destination; repeat step 2 until all network connections are created. 13 0.0 0 BUTTON 361 173 490 206 make connections make-my-links NIL 1 T OBSERVER NIL NIL NIL NIL TEXTBOX 141 20 323 41 2 WAYS TO CREATE NETWORK: 13 0.0 0 TEXTBOX 20 40 225 152 AUTOMATIC NETWORK GENERATION:\n1) click \"setup network\" to automatically create nodes and connections of a network specified by number-nodes and number-J-nodes\n2) use the \"manual\" button to manually move nodes around to form a more visually expressive network 13 0.0 0 TEXTBOX 95 385 260 424 Clears any currently viewed network from screen 13 0.0 0 TEXTBOX 262 384 412 412 Resets execution, preserving currently viewed network 13 0.0 0 @#$#@#$#@ WHAT IS IT? ----------- This model implements the Bayes-Ball algorithm. The purpose to this simulation is to provide a visualization that readers of Shachter's article can explore in order to better understand the process of the algorithm as well as the results it elicits. HOW IT WORKS ------------ This model is an implementation of the algorithm described by Ross D. Shachter in his 1998 article "Bayes-Ball: The Rational Pastime (for Deteriming Irrelevance and Requisite Information in Belief Networks and Influence Diagrams)." The algorithm describes a mechanism for identifing irrelevant nodes, requisite probability nodes, and requisite observation nodes when querying for a specified node given a set of evidence nodes. The input to the algorithm is a belief network, a node on which the query is oriented, and a set of nodes for which evidence is given. Query nodes comprise the set of nodes J. These nodes are tinted light blue. Nodes that have evidence on them comprise the set of nodes K and have a red star in the middle. All other nodes are probabilistic nodes tinted yellow. This implementation disregards deterministic nodes. The algorithm will start the "bouncind ball" at the query node(s) comprising the set of nodes J (tinted blue in the simulation), and then pass the ball around in the following manner: * An unobserved (no evidence) probabilistic node will pass the ball through to its parents if the ball was sent from a child, and through to its children if the ball was sent from a parent. When the ball is passed to an unobserved node from a child, the ball will also be bounce back to its children. * An observed node bounces back balls passed to it from a parent, but blocks any ball passed to it from a child. BUTTON DESCRIPTION ------------------ SETUP NETWORK - this sets up a network characterized by the following parameters configurable by the user via sliders: number-nodes and number-J-nodes MANUAL - this allows the user to manually move the nodes around in order to arrange them in a more visually appealling or expressive manner MAKE NODES - this will create the number of nodes specified by number-nodes with a subset of these nobes colored blue to identify them as J nodes. The number of J nodes is specified by number-J-nodes. MAKE CONNECTIONS - After clicking on this button, click on the source node of a connection followed by a destination node. Once the destination node is clicked, a link from source to destination will be created. RANDOMLY SET EVIDENCE - this button will randomly choose a subset of nodes to be considered evidence nodes. The number of nodes chosen is specified by number-K-nodes. Evidence nodes are designated by red stars on the yellow nodes. MANUALLY SET OR REMOVE EVIDENCE - the user can set evidence nodes themselves, or remove evidence from a node that has been starred as an evidence node. To do this, click this button and then click a node. If the node is starred (has evidence), the star will be removed (no evidence). If the node is not starred, a star will be added to this node. CLEAR - clears view of any existing network to reveal a clear white view; useful if user wants to create her/his own network RESET - resets the execution while preserving the currently viewed network. This allows for repeating executions on the same network with different evidence specified. NUMBER-NODES - the number of nodes in the network NUMBER-J-NODES - the number of nodes in the network that are being queried upon NUMBER-K-NODES - the number of nodes that have evidence on them. This is used by the "get evidence" button. CREDITS ------- Title: Bayes-Ball Algorithm Author: Alicia Ruvinsky Description: An implementation of the Bayes-Ball algorithm for determining irrelevant and requisite information in Bayesian Networks.