LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
pfqn_nc_sanitize.m
1%{
2%{
3 % @file pfqn_nc_sanitize.m
4 % @brief Sanitize and preprocess network parameters for NC solvers.
5%}
6%}
7
8%{
9%{
10 % @brief Sanitize and preprocess network parameters for NC solvers.
11 % @fn pfqn_nc_sanitize(lambda, L, N, Z, atol)
12 % @param lambda Arrival rate vector.
13 % @param L Service demand matrix.
14 % @param N Population vector.
15 % @param Z Think time vector.
16 % @param atol Absolute tolerance.
17 % @return lambda Sanitized arrival rates.
18 % @return L Sanitized service demands (rescaled).
19 % @return N Sanitized populations.
20 % @return Z Sanitized think times (rescaled).
21 % @return lGremaind Log normalization factor from removed classes.
22%}
23%}
24function [lambda,L,N,Z,lGremaind] = pfqn_nc_sanitize(lambda,L,N,Z,atol)
25% erase empty classes
26L(isnan(L)) = 0;
27Z(isnan(Z)) = 0;
28nnzclasses=find(N);
29L=L(:,nnzclasses);
30N=N(:,nnzclasses);
31Z=Z(:,nnzclasses);
32lambda=lambda(:,nnzclasses);
33% erase ill-defined classes
34zeroclasses=find((sum(L,1)+sum(Z,1))<atol);
35L(:,zeroclasses)=[];
36N(:,zeroclasses)=[];
37Z(:,zeroclasses)=[];
38lambda(:,zeroclasses)=[];
39%
40lGremaind= 0;
41% find zero demand classes
42zerodemands=find(L<atol);
43if ~isempty(zerodemands)
44 lGremaind = lGremaind + N(zerodemands) * log(Z(zerodemands))' - sum(log(N(zerodemands)));
45 L(:,zerodemands)=[];
46 Z(:,zerodemands)=[];
47 N(:,zerodemands)=[];
48end
49% rescale demands
50Lmax = max(L,[],1); % use L, which has been santized to always be ~=0
51if isempty(Lmax)
52 Lmax = ones(1,size(Z,2));
53end
54L = L./repmat(Lmax,size(L,1),1);
55Z = Z./repmat(Lmax,size(Z,1),1);
56lGremaind = lGremaind + N*log(Lmax)';
57% sort from smallest to largest think time
58if ~isempty(Z)
59 [~,rsort] = sort(sum(Z,1),'ascend');
60 if ~isempty(L)
61 L=L(:,rsort);
62 end
63 Z=Z(:,rsort);
64 N=N(:,rsort);
65end
66% ensure zero think time classes are anyway frist
67zerothinktimes=find(Z<atol);
68nonzerothinktimes = setdiff(1:size(L,2),zerothinktimes);
69L=L(:,[zerothinktimes,nonzerothinktimes]);
70N=N(:,[zerothinktimes,nonzerothinktimes]);
71Z=Z(:,[zerothinktimes,nonzerothinktimes]);
72end