1function [KPC_PH,score,x] = kpcfit_ph_search(E,J,options,x0,max_aph_order)
2% Not
for direct call, auxiliary function. Optimization-based search.
5%optimoptions = optimset(
'Algorithm',
'active-set', ...
6%optimoptions = optimset(
'Algorithm',
'trust-region-reflective', ...
7optimoptions = optimset(
'Algorithm',
'interior-point', ...
8 'LargeScale',
'off', ...
10 'MaxFunEvals',1e10, ...
12 'TolCon',kpcfit_tol, ...
14 'OutputFcn',@(x,optimValues,state) kpcfit_ph_outfun(x,optimValues,state));
17 SCV = (E(2)-E(1)^2)/E(1)^2;
18 max_aph_order = ceil(1/SCV);
25order = 2*ones(1,J); % Current version assumes all PH(2)s
27J = length(order); % number of PHs to compose
28if nargin < 4 || length(x0) == 0
29 x0 = zeros(sum(2*order-1),1); % each PH has 2n-1 degrees of freedom
31w = (log(E(end)).^(1/length(E))).^-(1:length(E));
32lgkx = x0; % last good known x
34%reg = regress(log10(E(:)), [1:length(E)]'); % regression of growth trend of empirical moments
36 PH{j} = map_feasblock(rand,1000*rand,-1,0); % hyperexponential
38K = max([2*max(order)-1,length(E)]);
40logEtable = zeros(J,K);
43 logEtable(j,k) = log(map_moment(PH{j},k));
46if ~(nargin < 4 || length(x0) == 0)
50[x,score] = fmincon(@objfun,x0,[],[],[],[],-200*ones(size(x0)),200*ones(size(x0)),@nnlcon,optimoptions); % 200 avoids exp(x) to overflow/underflow
51logEtable = reshape(x,J,K);
55 PH{1} = map_scale(aph_fit(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),max_aph_order),exp(logEtable(j,1)));
57 PH{1}=map_feasblock(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),0);
60 PH{j}=map_feasblock(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),0);
64 KPC_PH = map_kpc(KPC_PH,PH{j});
69 function [c,ceq]=nnlcon(x)
70 logEtable = reshape(x,J,K);
71 logEcur = sum(logEtable,1) - (J-1)*log(F);
77 PH{1} = map_scale(aph_fit(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),max_aph_order),exp(logEtable(j,1)));
78 logEtable(j,1:K) = log(map_moment(PH{j},1:K));
80 PH{j}=map_scale(map_feasblock(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),0),exp(logEtable(j,1)));
81 logEtable(j,1:K) = log(map_moment(PH{j},1:K));
84 % APH moment constraints
85 % log e3 - log e1 -log e2 >= log e2 - 2*log e1 + log (n+1) -log n
86 % log n2 >= log n - log (n-1)
87 c(end+1) = -(logEtable(j,2) - log(max_aph_order) + log(max_aph_order-1));
88 c(end+1) = -(logEtable(j,3) - 2*logEtable(j,2) +logEtable(j,1) - log(max_aph_order+1) + log(max_aph_order));
90 c(end+1) = -(logEtable(j,2) - 2*logEtable(j,1) - log(2)) - 10*kpcfit_tol; % SCV > 1
91 c(end+1) = -(logEtable(j,3) - (log(3/2) + 2*logEtable(j,2) - logEtable(j,1))); % E3 > (3/2)*E2^2/E1
94 for j=2:J % for hyper-exponential PHs
95 c(end+1) = -(logEtable(j,2) - 2*logEtable(j,1) - log(2)) - 10*kpcfit_tol; % SCV > 1
96 c(end+1) = -(logEtable(j,3) - (log(3/2) + 2*logEtable(j,2) - logEtable(j,1))); % E3 > (3/2)*E2^2/E1
99 ceq = w(1:options.MinExactMom) .* ( log(E(1:options.MinExactMom)) - logEcur(1:options.MinExactMom)) ;
102 c = 1e10*ones(size(c));
106 ceq = 1e10*ones(size(ceq));
112 logEtable = reshape(x,J,K);
120 PH{1} = map_scale(aph_fit(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),max_aph_order),exp(logEtable(j,1)));
121 logEtable(j,1:K) = log(map_moment(PH{j},1:K));
123 PH{j}=map_scale(map_feasblock(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),0),exp(logEtable(j,1)));
124 logEtable(j,1:K) = log(map_moment(PH{j},1:K));
127 % determine moments
using characteristic polynomial method
129 m{j} = kpcfit_hyper_charpoly(exp(logEtable(j,:))./F,2)
';
130 if sum(isnan(m{j})) > 0 % if the result is NaN most likely we hit the exponential distribution
131 for k = 4:K % recursively compute moments of order 4 or more
132 idxs = (k-1):-1:(k-(2*order(j)-2));
133 Ej = map_moment({[-1],[1]},idxs);
134 logEtable(j,k) = log(-F(k)*m{j}(2:end)*(Ej./F(idxs))');
137 for k = 4:K % recursively compute moments of order 4 or more
138 idxs = (k-1):-1:(k-(2*order(j)-2));
139 Ej = exp(logEtable(j,idxs));
140 if isnan(Ej) % reset
this PH to exponential
141 Ej = map_moment({[-1],[1]},idxs);
143 logEtable(j,k) = log(-F(k)*m{j}(2:end)*(Ej./F(idxs))
');
148 logEcur = sum(logEtable,1) - (J-1)*log(F);
149 f= w * abs( log(E) - logEcur )';
157function [MAP]=map_rand(K)
161%D1=abs(sprandn(K,K,0.5));
168MAP=map_normalize(MAP);