function [pE,gE,pC,gC] = spm_phase_priors(DCM,fb,dipfit,freq_prior)
% Prior moments of DCM for phase coupling
% FORMAT [pE,gE,pC,gC] = spm_phase_priors(DCM,fb,dipfit,freq_prior)
%
% freq_prior   Priors on frequency: 'hard_freq' (default),'soft_freq'
% 
% Fields of DCM:
%
% As,Bs{m},Ac,Bc{m} - binary constraints (first two mandatory)
% dipfit       - prior forward model structure
%
% pE - prior expectation - f(x,u,P,M)
% gE - prior expectation - g(x,u,G,M)
%
% connectivity parameters
%--------------------------------------------------------------------------
%    pE.As    - trial-invariant
%    pE.Bs{m} - trial-dependent
%    pE.Ac    - trial-invariant
%    pE.Bc{m} - trial-dependent
%
%__________________________________________________________________________
 
% Will Penny
% Copyright (C) 2005-2022 Wellcome Centre for Human Neuroimaging

 
if nargin < 4 || isempty(freq_prior)
    freq_prior = 'hard_freq';
end

As = DCM.As;
Bs = DCM.Bs;

if isfield(DCM,'Ac')
    Ac = DCM.Ac;
end
if isfield(DCM,'Bc')
    Bc = DCM.Bc;
end

% orders
%--------------------------------------------------------------------------
n    = size(As,1);                                 % number of sources 

% parameters for electromagnetic forward model
%==========================================================================
G.L  = sparse(1,n);  
U.L  = ones(1,n);

p_exceed=0.001;
z_exceed=abs(spm_invNcdf(0.5*p_exceed,0,1));

% Prior variance of connectivity parameters
prior_sd=fb/z_exceed;
prior_var=prior_sd^2;

% intrinsic connectivity 
%--------------------------------------------------------------------------
E.As  = zeros(size(As));
V.As  = prior_var*As;
 
if isfield(DCM,'Ac')
    E.Ac  = zeros(size(Ac));
    V.Ac  = prior_var*Ac;
end

% Frequency priors
E.df=zeros(n,1);
switch freq_prior
    case 'hard_freq'
        V.df=1e-6*ones(n,1);
    case 'soft_freq'
        new_df=(DCM.options.Fdcm(2)-DCM.options.Fdcm(1))/2;
        new_sig=new_df/3;
        V.df=new_sig*ones(n,1);
    otherwise
        disp('Unknown prior on frequencies');
        return
end

% input-dependent
%--------------------------------------------------------------------------
for i = 1:length(Bs)
    E.Bs{i} = zeros(size(Bs{i}));
    V.Bs{i} = prior_var*Bs{i} & V.As;

end
if isfield(DCM,'Bc')
    for i = 1:length(Bc)
        E.Bc{i} = zeros(size(Bc{i}));
        V.Bc{i} = prior_var*Bc{i} & V.Ac;
    end
end

% prior moments
%--------------------------------------------------------------------------
pE   = E;
gE   = G;
pC   = diag(sparse(spm_vec(V)));
gC   = diag(sparse(spm_vec(U)));
