LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
PH.m
1classdef PH < Markovian
2 % Abstract phase-type distribution with Markovian structure
3 %
4 % Defined by initial probabilities and transient subgenerator matrix.
5 %
6 % Copyright (c) 2012-2026, Imperial College London
7 % All rights reserved.
8
9 methods
10 function self = PH(alpha, T)
11 % PH Create a phase-type distribution instance
12 %
13 % @brief Creates a phase-type distribution with initial probabilities and subgenerator
14 % @param alpha Initial probability vector (must sum to ≤ 1)
15 % @param T Transient subgenerator matrix (must be nonsingular)
16 % @return self PH distribution instance
17 self@Markovian('PH', 2);
18 self.setParam(1, 'alpha', alpha);
19 self.setParam(2, 'T', T);
20 T = self.getSubgenerator;
21 ph = {T,-T*ones(length(T),1)*self.getInitProb};
22 self.process = ph;
23 self.nPhases = length(self.process{1});
24 end
25 end
26
27 methods
28 function alpha = getInitProb(self)
29 % ALPHA = GETINITPROB()
30
31 % Get vector of initial probabilities
32 alpha = self.getParam(1).paramValue(:);
33 alpha = reshape(alpha,1,length(alpha));
34 end
35
36 function T = getSubgenerator(self)
37 % T = GETSUBGENERATOR()
38
39 % Get subgenerator
40 T = self.getParam(2).paramValue;
41 end
42
43 function X = sample(self, n)
44 % X = SAMPLE(N)
45
46 % Get n samples from the distribution
47 if nargin<2 %~exist('n','var'),
48 n = 1;
49 end
50 X = map_sample(self.getProcess,n);
51 end
52 end
53
54 methods
55 function update(self,varargin)
56 % UPDATE(SELF,VARARGIN)
57
58 % Update parameters to match the first n central moments
59 % (n<=4)
60 MEAN = varargin{1};
61 SCV = varargin{2};
62 SKEW = varargin{3};
63 if length(varargin) > 3
64 line_warning(mfilename,'Update in %s distributions can only handle 3 moments, ignoring higher-order moments.\n',class(self));
65 end
66 e1 = MEAN;
67 e2 = (1+SCV)*e1^2;
68 e3 = -(2*e1^3-3*e1*e2-SKEW*(e2-e1^2)^(3/2));
69
70 if SCV<1
71 [alpha,T] = APHFrom3Moments([e1,e2,e3]);
72 else
73 options = kpcfit_ph_options([e1,e2,e3],'MinNumStates',2,'MaxNumStates',2,'Verbose',false);
74 ph = kpcfit_ph_auto([e1,e2,e3],options);
75 T=ph{1,1};
76 alpha=map_pie(ph{1,1});
77 end
78
79 self.setParam(1, 'alpha', alpha);
80 self.setParam(2, 'T', T);
81 self.process = {T,-T*ones(length(T),1)*alpha};
82 end
83
84 function setMean(self,MEAN)
85 % UPDATEMEAN(SELF,MEAN)
86
87 % Update parameters to match the given mean
88 ph = self.getProcess;
89 ph = map_scale(ph,MEAN);
90 self.setParam(1, 'alpha', map_pie(ph));
91 self.setParam(2, 'T', ph{1});
92 self.process = {T,-T*ones(length(T),1)*self.getInitProb};
93 end
94
95 % function setMeanAndSCV(self, MEAN, SCV)
96 % % UPDATEMEANANDSCV(MEAN, SCV)
97 %
98 % % Fit phase-type distribution with given mean and squared coefficient of
99 % % variation (SCV=variance/mean^2)
100 % e1 = MEAN;
101 % e2 = (1+SCV)*e1^2;
102 % [alpha,T] = APHFrom2Moments([e1,e2]);
103 % %options = kpcfit_ph_options([e1,e2],'MinNumStates',2,'MaxNumStates',2,'Verbose',false);
104 % %ph = kpcfit_ph_auto([e1,e2],options);
105 % %[alpha,T]=map2ph(ph{1,1});
106 % T=ph{1,1};
107 % alpha=map_pie(ph{1,1});
108 %
109 % self.setParam(1, 'alpha', alpha);
110 % self.setParam(2, 'T', T);
111 % self.process = {T,-T*ones(length(T),1)*self.getInitProb};
112 % end
113
114 end
115
116 methods (Static)
117function ex = fit(MEAN, SCV, SKEW)
118 % EX = FIT(MEAN, SCV, SKEW)
119
120 % Fit the distribution from first three standard moments (mean,
121 % SCV, skewness)
122 if MEAN <= GlobalConstants.FineTol
123 ex = PH(1.0, [1]);
124 else
125 ex = PH(1.0, [1]);
126 ex.update(MEAN, SCV, SKEW);
127 ex.immediate = false;
128 end
129 end
130
131 function ex = fitRawMoments(m1, m2, m3)
132
133 % Fit the distribution from first three moments
134 if m1 <= GlobalConstants.FineTol
135 ex = Exp(Inf);
136 else
137 ex = PH(1.0, [1]);
138 ex.updateFromRawMoments(m1, m2, m3);
139 ex.immediate = false;
140 end
141 end
142
143 function ex = fitCentral(MEAN, VAR, SKEW)
144 % EX = FITCENTRAL(MEAN, VAR, SKEW)
145
146 % Fit the distribution from first three central moments (mean,
147 % variance, skewness)
148 if MEAN <= GlobalConstants.FineTol
149 ex = Exp(Inf);
150 else
151 ex = PH(1.0, [1]);
152 ex.update(MEAN, VAR/MEAN^2, SKEW);
153 ex.immediate = false;
154 end
155 end
156
157 function ex = fitMeanAndSCV(MEAN, SCV)
158 % EX = FITMEANANDSCV(MEAN, SCV)
159
160 % Fit the distribution from first three central moments (mean,
161 % variance, skewness)
162 if MEAN <= GlobalConstants.FineTol
163 ex = Exp(Inf);
164 elseif SCV==1.0
165 ex = Exp(1/MEAN);
166 else
167 ex = PH(1.0, [1]);
168 ex.update(MEAN, SCV, SKEW);
169 ex.immediate = false;
170 end
171 end
172
173 % function ex = fromRepresentation(dep)
174 % % EX = FROMREPRESENTATION(DEP)
175 % %
176 % % Build a phase-type distribution from a cell array {D0,D1}
177 %
178 % ex = PH(map_pie(dep),dep{1});
179 % end
180 end
181
182end