LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
getCdfRespT.m
1function RD = getCdfRespT(self, R)
2% RD = GETCDFRESPT(R)
3
4if GlobalConstants.DummyMode
5 RD = cell(1,R);
6 return
7end
8
9if nargin<2 %~exist('R','var')
10 R = getAvgRespTHandles(self);
11end
12sn = self.getStruct;
13RD = cell(sn.nstations, sn.nclasses);
14M = sn.nstations;
15K = sn.nclasses;
16N = sn.njobs;
17if any(isinf(N))
18 line_error(mfilename,'getCdfRespT is presently supported only for closed models.')
19end
20for c=1:sn.nchains
21 inchain = sn.inchain{c};
22 s = inchain(N(inchain)>0); % tag a class that has non-zero jobs.
23 jobclass = self.model.getClassByIndex(s);
24 chain = self.model.getClassChain(jobclass);
25 [taggedModel, taggedJob] = ModelAdapter.tagChain(chain,jobclass); % diminish jobclass population by 1
26 %taggedModel.stations{:}
27 [Q,F,ev] = SolverCTMC(taggedModel,self.options).getGenerator(); % Q: generator, F: filtration, ev: events
28 tsn = taggedModel.getStruct;
29 tinchain = cell2mat(taggedJob.index);
30
31 for ist=1:M
32 for ir=1:length(tinchain)
33 r = tinchain(ir);
34 A1 = sparse(zeros(size(F{s})));
35 for r=tinchain % filter tagged job
36 if taggedModel.classes{r}.completes
37 for v=1:length(ev)
38 if ev{v}.passive{1}.event == EventType.ARV && ev{v}.passive{1}.class == r && ev{v}.passive{1}.node == ist
39 A1 = A1 + sparse(F{v});
40 end
41 end
42 end
43 end
44
45 D1 = sparse(zeros(size(F{s})));
46 for r=tinchain % filter tagged job
47 if taggedModel.classes{r}.completes
48 for v=1:length(ev)
49 if ev{v}.active{1}.event == EventType.DEP && ev{v}.active{1}.class == r && ev{v}.active{1}.node == ist
50 D1 = D1 + sparse(F{v});
51 end
52 end
53 end
54 end
55
56 A = map_normalize({Q-A1, A1});
57 pie_arv = map_pie(A); % state seen upon arrival of a class-r job
58 D = map_normalize({Q-D1, D1});
59
60 nonZeroRates = abs(Q(Q~=0));
61 nonZeroRates = nonZeroRates( nonZeroRates > GlobalConstants.FineTol );
62 T = abs(100/min(nonZeroRates)); % solve ode until T = 100 events with the slowest rate
63 dT = T/100000; % solve ode until T = 100 events with the slowest rate
64 tset = 0:dT:T;
65
66 rorig = chain.index{ir};
67 RD{ist,rorig} = zeros(length(tset),2);
68 tic
69 if year(matlabRelease.Date)>2023 || strcmpi(matlabRelease.Release,"R2023b")
70 % use exmpmv
71 RD{ist,rorig}(1:length(tset),1) = 1-sum(expmv(D{1}',pie_arv',tset)' ,2);
72 RD{ist,rorig}(1:length(tset),2) = tset;
73 for t=1:length(tset)
74 if RD{ist,rorig}(t,1)>1-GlobalConstants.CoarseTol
75 RD{ist,rorig}(t+1:end,:)=[];
76 break
77 end
78 end
79 else % no expmv function available
80 for t=1:length(tset)
81 RD{ist,rorig}(t,2) = tset(t);
82 RD{ist,rorig}(t,1) = 1-pie_arv * expm(D{1}*tset(t)) * ones(length(D{1}),1);
83 if RD{ist,rorig}(t,1)>1-GlobalConstants.CoarseTol
84 RD{ist,rorig}(t+1:end,:)=[];
85 break
86 end
87 end
88 end
89 toc
90 end
91 end
92end
93end