⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdag_to_dag.m.svn-base

📁 bayesian network structrue learning matlab program
💻 SVN-BASE
字号:
function G2 = pdag_to_dag(pdags)
% (also works with a cell array of pdags, returning a cell array of dags)
% dag = pdag_to_dag(pdag)
%
% cf Dor and Tarsi (1992) :
%    A simple algorithm to construct a consistent extention of a partially oriented graph.
%
% philippe.leray@insa-rouen.fr,  olivier.francois@insa-rouen.fr


if ~iscell(pdags)
    pdag=cell(1,1);
    pdag{1}=pdags;
else
    pdag=pdags;
end

for da=1:length(pdag)
    %fprintf('%d ',da)
    G=pdag{da};     
    G2 = G; A = G;
    N = size(G,1);
    empty_loop = 0;
    
    while ~isempty(find(A))
        [x x_y_undirected] = select_vertex(A);
        
        if x==0
            fprintf('pdag_to_dag error : This pdag does not admit any extension.\n');
            G2=[];
            break
        end
        G2(x,x_y_undirected) = 0; G2(x_y_undirected,x) = 1;
        
        A(x,:) = 0;
        A(:,x) = 0;
    end
    dags{da}=G2;
end
if ~iscell(pdags)
    G2=dags{1};
else
    G2=dags;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [sol, x_y] = select_vertex(G)
N = size(G,1);
sol = 0;
x = 0;
fini=0 ;
while ~fini
    
    x = x+1;
    if x>N
        fini=1;
    else
        beforex=find(G(:,x));
        afterx=find(G(x,:));
        
        if ~(isempty(beforex)&isempty(afterx))
            x_y = myintersect(beforex,afterx);
            beforex=mysetdiff(beforex,x_y);
            afterx=mysetdiff(afterx,x_y);
            
            if isempty(afterx) % x is a sink
                Ax=  myunion(x_y,beforex);
                for y=x_y
                    % Adjacents of y
                    Ay = myunion(find(G(:,y)), find(G(y,:)));
                    Ay = myunion(Ay,y);
                    if isempty(setdiff(Ax,Ay))
                        fini=fini+1; 
                    else
                        break;
                    end                    
                end
                if fini==size(x_y)
                    sol=x; fini=1;
                else
                    fini=0;
                end
            end
        end
    end
    end % while

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -