LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
findPaths.m
1% Finds the response times along each path leading out of start until endNode
2function ri = findPaths(sn, P, start, endNode, r, toMerge, QN, TN, currentTime, fjclassmap, fjforkmap, nonfjmodel)
3 if start == endNode
4 % Add the current response time of the parallel branch to the list, but subtract the synchronisation time
5 qLen = sum(QN(sn.nodeToStation(start), toMerge));
6 tput = sum(TN(sn.nodeToStation(start), toMerge));
7 ri = currentTime - qLen / tput;
8 return
9 end
10 ri = [];
11 for i=find(P(start, :))
12 qLen = 0;
13 tput = 1;
14 if ~isnan(sn.nodeToStation(i))
15 qLen = sum(QN(sn.nodeToStation(i), toMerge));
16 tput = sum(TN(sn.nodeToStation(i), toMerge));
17 end
18 if sn.nodetype(i) == NodeType.Fork
19 joinIdx = find(sn.fj(i,:));
20 s = find(fjforkmap == i & fjclassmap == r);
21 paths = ModelAdapter.findPaths(sn, P, i, joinIdx, r, [toMerge,s], QN, TN, 0, fjclassmap, fjforkmap, nonfjmodel);
22 lambdai = 1./paths;
23 d0 = 0;
24 parallel_branches = length(paths);
25 for pow=0:(parallel_branches - 1)
26 current_sum = sum(1./sum(nchoosek(lambdai, pow + 1),2));
27 d0 = d0 + (-1)^pow * current_sum;
28 end
29 for cls=[toMerge,s]
30 nonfjmodel.nodes{joinIdx}.setService(nonfjmodel.classes{cls}, Exp.fitMean(d0 - mean(paths)));
31 end
32 ri = [ri, ModelAdapter.findPaths(sn, P, joinIdx, endNode, r, toMerge, QN, TN, currentTime + d0, fjclassmap, fjforkmap, nonfjmodel)];
33 else
34 ri = [ri, ModelAdapter.findPaths(sn, P, i, endNode, r, toMerge, QN, TN, currentTime + qLen/tput, fjclassmap, fjforkmap, nonfjmodel)];
35 end
36 end
37end