classdef Dag < DirectedGraph
properties
topoOrder;
end
methods
function obj = Dag(varargin)
if nargin == 0
obj.adjMat = [];
return;
end
if ~ischar(varargin{1})
obj.adjMat = varargin{1};
else
[type, nnodes, maxFanIn, edgeProb] = process_options(...
varargin, 'type', [], 'nnodes', [], 'maxFanIn', [], 'edgeProb', []);
switch type
case 'chain',
obj.adjMat = diag(ones(1,nnodes-1),1);
case 'rndDAGFanIn'
obj.adjMat = mkRndDAGFanIn(nnodes, maxFanIn);
case 'rndDAGEdgeProb'
obj.adjMat = mkRndDAGEdgeProb(nnodes, edgeProb);
otherwise
error(['unrecognized arg ' varargin{1}])
end
end
[d, pre, post, cycle, f, pred] = dfs(obj.adjMat, [], 1);
if cycle
warning('PMTK:Dag', 'not acyclic')
end
obj.topoOrder = post(end:-1:1);
end
function objs = mkAllDags(dummy, nnodes, order, loadFromFile)
if nargin < 3, order = []; end
if nargin < 4, loadFromFile = false; end
if ~isempty(order), loadFromFile = false; end
Gs = mk_all_dags(nnodes, order, loadFromFile);
for i=1:length(Gs)
objs{i} = Dag(Gs{i});
end
end
function [M, moral_edges] = moralize(obj)
M = obj.adjMat;
n = length(M);
for i=1:n
fam = family(obj,i);
M(fam,fam)=1;
end
M = setdiag(M,0);
moral_edges = sparse(triu(max(0,M-obj.adjMat),1));
M = UndirectedGraph(M);
end
end
end