LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
kpcfit_ph_search.m
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.
3%% initialization
4warning off
5%optimoptions = optimset('Algorithm','active-set', ...
6%optimoptions = optimset('Algorithm','trust-region-reflective', ...
7optimoptions = optimset('Algorithm','interior-point', ...
8 'LargeScale','off', ...
9 'MaxIter',200, ...
10 'MaxFunEvals',1e10, ...
11 'MaxSQPIter',50, ...
12 'TolCon',kpcfit_tol, ...
13 'Display','off', ...
14 'OutputFcn',@(x,optimValues,state) kpcfit_ph_outfun(x,optimValues,state));
15
16if nargin < 5
17 SCV = (E(2)-E(1)^2)/E(1)^2;
18 max_aph_order = ceil(1/SCV);
19end
20global lgkx;
21global stagnval;
22global stagniter;
23stagnval = 0;
24stagniter = 0;
25order = 2*ones(1,J); % Current version assumes all PH(2)s
26%% x0 initial point
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
30end
31w = (log(E(end)).^(1/length(E))).^-(1:length(E));
32lgkx = x0; % last good known x
33
34%reg = regress(log10(E(:)), [1:length(E)]'); % regression of growth trend of empirical moments
35for j = 1:J
36 PH{j} = map_feasblock(rand,1000*rand,-1,0); % hyperexponential
37end
38K = max([2*max(order)-1,length(E)]);
39F = factorial(1:K);
40logEtable = zeros(J,K);
41for k = 1:K
42 for j = 1:J
43 logEtable(j,k) = log(map_moment(PH{j},k));
44 end
45end
46if ~(nargin < 4 || length(x0) == 0)
47 x0 = logEtable(:);
48end
49%%
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);
52[c,ceq]=nnlcon(x);
53j=1;
54if SCV<1
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)));
56else
57 PH{1}=map_feasblock(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),0);
58end
59for j=2:J
60 PH{j}=map_feasblock(exp(logEtable(j,1)),exp(logEtable(j,2)),exp(logEtable(j,3)),0);
61end
62KPC_PH = PH{1};
63for j=2:J
64 KPC_PH = map_kpc(KPC_PH,PH{j});
65end
66%keyboard
67return
68
69 function [c,ceq]=nnlcon(x)
70 logEtable = reshape(x,J,K);
71 logEcur = sum(logEtable,1) - (J-1)*log(F);
72 c=[];
73
74 j = 1;
75 if SCV < 1
76 j = 1;
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));
79 for j=2:J
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));
82 end
83
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));
89 else
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
92 end
93
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
97 end
98
99 ceq = w(1:options.MinExactMom) .* ( log(E(1:options.MinExactMom)) - logEcur(1:options.MinExactMom)) ;
100
101 if sum(isnan(c))>0
102 c = 1e10*ones(size(c));
103 end
104
105 if sum(isnan(ceq))>0
106 ceq = 1e10*ones(size(ceq));
107 end
108
109 end
110
111 function f=objfun(x)
112 logEtable = reshape(x,J,K);
113 if isnan(x)
114 f = 1e10;
115 return
116 end
117
118 if SCV < 1
119 j = 1;
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));
122 for j=2:J
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));
125 end
126 else
127 % determine moments using characteristic polynomial method
128 for j=2:J
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))');
135 end
136 else
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);
142 end
143 logEtable(j,k) = log(-F(k)*m{j}(2:end)*(Ej./F(idxs))');
144 end
145 end
146 end
147 end
148 logEcur = sum(logEtable,1) - (J-1)*log(F);
149 f= w * abs( log(E) - logEcur )';
150 if isnan(f)
151 f = 1e10;
152 end
153 end
154
155end
156
157function [MAP]=map_rand(K)
158if nargin<1
159 K=2;
160end
161%D1=abs(sprandn(K,K,0.5));
162D1=rand(K,K);
163D0=rand(K,K);
164
165MAP=cell(1,2);
166MAP{1}=D0;
167MAP{2}=D1;
168MAP=map_normalize(MAP);
169end