comparison toolboxes/FullBNT-1.0.7/graph/dag_to_essential_graph.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:e9a9cd732c1e
1
2 function [eg] = dag_to_essential_graph(dag)
3 cpdag = dag_to_cpdag(dag);
4 eg = dag + dag .* (cpdag + cpdag');
5
6 return;
7
8
9
10
11 % Coverts a DAG into Essential Graph where edges are coded by 2 and 3, 2 is
12 % directed edge and 3 is bidirected edge and is at one (the same as the original DAG) of the two
13 % symetrical places.
14
15 % Is implemented by the algorithm of Max Chickering in D.M.Chickering (1995).
16 % A transformational characterization of equivalent Bayesian network structures.
17 % In Proceedings of Eleventh Conference on Uncertainty in Artificial Intelligence, Montreal, QU,
18 % pages 87-98. Morgan Kaufmann
19 % http://research.microsoft.com/~dmax/publications/uai95.pdf
20
21 % Implemented by Tomas Kocka, AAU.
22
23 function [eg] = dag_to_essential_graph(dagx)
24
25 %print_dag(dagx); % Just checking input
26
27 order = topological_sort(dagx); % get the topological order of nodes and their number
28
29 % fprintf('the topological order is: %d',order);
30 % fprintf('\n');
31
32 [nx,ny] = size(dagx); % gets the number of nodes, note that nx == ny
33 [I,J] = find(dagx); % finds all nonzero elements in the adjacency matrix, i.e. arcs in the DAG - however we will overwrite it in a special order
34 % we will sort the arcs from lowest possible y and highest possible x, arcs are x->y
35 e = 1;
36 for y = 1:ny
37 for x = nx:-1:1
38 %fprintf('x %d ',order(x)); fprintf('y %d ',order(y));
39 if dagx(order(x),order(y)) == 1
40 I(e) = order(x);
41 J(e) = order(y);
42 e = e + 1;
43 %fprintf('x order %d',x);
44 %fprintf('y order %d',y);
45 %fprintf('\n');
46 end
47 end
48 end
49
50
51 % fprintf('the arcs are: %d',I);
52 % fprintf('\n');
53 % fprintf('the arcs are: %d',J);
54 % fprintf('\n');
55
56
57 % Now we have to decide which arcs are part of the essential graph and
58 % which are undirected edges in the essential graph.
59 % Undecided arc in the DAG are 1, directed in EG are 2 and undirected in EG
60 % are 3.
61
62
63 for e = 1:length(I)
64 if dagx(I(e),J(e)) == 1
65 cont = true;
66 for w = 1:nx
67 if dagx(w,I(e)) == 2
68 if dagx(w,J(e)) ~= 0
69 dagx(w,J(e)) = 2;
70 else
71 for ww = 1:nx
72 if dagx(ww,J(e)) ~= 0
73 dagx(ww,J(e)) = 2;
74 end
75 end % and now skip the rest and start with another arc from the list
76 w = nx;
77 cont = false;
78 end
79 end
80 end
81 if cont
82 exists = false;
83 for z = 1:nx
84 %fprintf('test %d',dagx(z,J(e)));
85 if dagx(z,J(e)) ~= 0 & z ~= I(e) & dagx(z,I(e)) == 0
86 exists = true;
87 for ww = 1:nx
88 if dagx(ww,J(e)) == 1
89 dagx(ww,J(e)) = 2;
90 end
91 end
92 end
93 end
94 if ~ exists
95 for ww = 1:nx
96 if dagx(ww,J(e)) == 1
97 dagx(ww,J(e)) = 3;
98 end
99 end
100 end
101 end
102 end
103 end
104
105 %print_dag(dagx); % Just checking output
106
107
108
109
110
111
112