LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
QN2SCRIPT.m
1function QN2SCRIPT(model, modelName, fid)
2% QN2SCRIPT(MODEL, MODELNAME, FID)
3
4% Copyright (c) 2012-2026, Imperial College London
5% All rights reserved.
6
7%global GlobalConstants.CoarseTol; % Tolerance for distribution fitting
8
9if nargin<2%~exist('modelName','var')
10 modelName='myModel';
11end
12if nargin<3%~exist('fid','var')
13 fid=1;
14end
15if ischar(fid)
16 fid = fopen(fid,'w');
17end
18sn = model.getStruct;
19%% initialization
20fprintf(fid,'model = Network(''%s'');\n',modelName);
21fprintf(fid,'\n%%%% Block 1: nodes');
22rt = sn.rt;
23rtnodes = sn.rtnodes;
24hasSink = 0;
25sourceID = 0;
26PH = sn.proc;
27
28fprintf(fid,'\n');
29%% write nodes
30for i= 1:sn.nnodes
31 switch sn.nodetype(i)
32 case NodeType.Source
33 sourceID = i;
34 fprintf(fid,'node{%d} = Source(model, ''%s'');\n',i,sn.nodenames{i});
35 hasSink = 1;
36 case NodeType.Delay
37 fprintf(fid,'node{%d} = DelayStation(model, ''%s'');\n',i,sn.nodenames{i});
38 case NodeType.Queue
39 fprintf(fid,'node{%d} = Queue(model, ''%s'', SchedStrategy.%s);\n', i, sn.nodenames{i}, SchedStrategy.toProperty(sn.sched(sn.nodeToStation(i))));
40 if sn.nservers(sn.nodeToStation(i))>1
41 fprintf(fid,'node{%d}.setNumServers(%d);\n', i, sn.nservers(sn.nodeToStation(i)));
42 end
43 case NodeType.Router
44 fprintf(fid,'node{%d} = Router(model, ''%s'');\n',i,sn.nodenames{i});
45 case NodeType.Fork
46 fprintf(fid,'node{%d} = Fork(model, ''%s'');\n',i,sn.nodenames{i});
47 case NodeType.Join
48 fprintf(fid,'node{%d} = Join(model, ''%s'', node{%d});\n',i,sn.nodenames{i},find(sn.fj(:,i)));
49 case NodeType.Sink
50 fprintf(fid,'node{%d} = Sink(model, ''%s'');\n',i,sn.nodenames{i});
51 case NodeType.ClassSwitch
52 % csMatrix = eye(sn.nclasses);
53 % fprintf(fid,'\ncsMatrix%d = zeros(%d);\n',i,sn.nclasses);
54 % for k = 1:sn.nclasses
55 % for c = 1:sn.nclasses
56 % for m=1:sn.nnodes
57 % % routing matrix for each class
58 % csMatrix(k,c) = csMatrix(k,c) + rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
59 % end
60 % end
61 % end
62 % for k = 1:sn.nclasses
63 % for c = 1:sn.nclasses
64 % if csMatrix(k,c)>0
65 % fprintf(fid,'csMatrix%d(%d,%d) = %f; %% %s -> %s\n',i,k,c,csMatrix(k,c),sn.classnames{k},sn.classnames{c});
66 % end
67 % end
68 % end
69 %fprintf(fid,'node{%d} = ClassSwitch(model, ''%s'', csMatrix%d);\n',i,sn.nodenames{i},i);
70 fprintf(fid,'node{%d} = Router(model, ''%s''); %% Class switching is embedded in the routing matrix \n',i,sn.nodenames{i});
71 end
72end
73%% write classes
74fprintf(fid,'\n%%%% Block 2: classes\n');
75for k = 1:sn.nclasses
76 if sn.njobs(k)>0
77 if isinf(sn.njobs(k))
78 fprintf(fid,'jobclass{%d} = OpenClass(model, ''%s'', %d);\n',k,sn.classnames{k},sn.classprio(k));
79 else
80 fprintf(fid,'jobclass{%d} = ClosedClass(model, ''%s'', %d, node{%d}, %d);\n',k,sn.classnames{k},sn.njobs(k),sn.stationToNode(sn.refstat(k)),sn.classprio(k));
81 end
82 else
83 % if the reference node is unspecified, as in artificial classes,
84 % set it to the first node where the rate for this class is
85 % non-null
86 iref = 0;
87 for i=1:sn.nstations
88 if sum(nnz(sn.proc{i}{k}{1}))>0
89 iref = i;
90 break
91 end
92 end
93 if isinf(sn.njobs(k))
94 fprintf(fid,'jobclass{%d} = OpenClass(model, ''%s'', %d);\n',k,sn.classnames{k},sn.classprio(k));
95 else
96 fprintf(fid,'jobclass{%d} = ClosedClass(model, ''%s'', %d, node{%d}, %d);\n',k,sn.classnames{k},sn.njobs(k),iref,sn.classprio(k));
97 end
98 end
99end
100fprintf(fid,'\n');
101%% arrival and service processes
102for i=1:sn.nstations
103 for k=1:sn.nclasses
104 if sn.nodetype(sn.stationToNode(i)) ~= NodeType.Join
105 if isprop(model.stations{i},'serviceProcess') && strcmp(class(model.stations{i}.serviceProcess{k}),'Replayer')
106 switch sn.sched(i)
107 case SchedStrategy.EXT
108 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, Replayer(''%s'')); %% (%s,%s)\n',sn.stationToNode(i),k,model.stations{i}.serviceProcess{k}.params{1}.paramValue,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
109 otherwise
110 fprintf(fid,'node{%d}.setService(jobclass{%d}, Replayer(''%s'')); %% (%s,%s)\n',sn.stationToNode(i),k,model.stations{i}.serviceProcess{k}.params{1}.paramValue,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
111 end
112 elseif isprop(model.stations{i},'serviceProcess') && strcmp(class(model.stations{i}.serviceProcess{k}),'Trace')
113 switch sn.sched(i)
114 case SchedStrategy.EXT
115 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, Trace(''%s'')); %% (%s,%s)\n',sn.stationToNode(i),k,model.stations{i}.serviceProcess{k}.params{1}.paramValue,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
116 otherwise
117 fprintf(fid,'node{%d}.setService(jobclass{%d}, Trace(''%s'')); %% (%s,%s)\n',sn.stationToNode(i),k,model.stations{i}.serviceProcess{k}.params{1}.paramValue,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
118 end
119 else
120 SCVik = map_scv(PH{i}{k});
121 if SCVik >= 0.5
122 switch sn.sched(i)
123 case SchedStrategy.EXT
124 if SCVik == 1
125 meanik = map_mean(PH{i}{k});
126 if meanik < GlobalConstants.CoarseTol
127 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, Immediate()); %% (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
128 else
129 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, Exp.fitMean(%f)); %% (%s,%s)\n',sn.stationToNode(i),k,map_mean(PH{i}{k}),sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
130 end
131 else
132 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, APH.fitMeanAndSCV(%f,%f)); %% (%s,%s)\n',sn.stationToNode(i),k,map_mean(PH{i}{k}),SCVik,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
133 end
134 otherwise
135 if SCVik == 1
136 meanik = map_mean(PH{i}{k});
137 if meanik < GlobalConstants.CoarseTol
138 fprintf(fid,'node{%d}.setService(jobclass{%d}, Immediate()); %% (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
139 else
140 fprintf(fid,'node{%d}.setService(jobclass{%d}, Exp.fitMean(%f)); %% (%s,%s)\n',sn.stationToNode(i),k,map_mean(PH{i}{k}),sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
141 end
142 else
143 fprintf(fid,'node{%d}.setService(jobclass{%d}, APH.fitMeanAndSCV(%f,%f)); %% (%s,%s)\n',sn.stationToNode(i),k,map_mean(PH{i}{k}),SCVik,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
144 end
145 end
146 else
147 % this could be made more precised by fitting into a 2-state
148 % APH, especially if SCV in [0.5,0.1]
149 nPhases = max(1,round(1/SCVik));
150 switch sn.sched(i)
151 case SchedStrategy.EXT
152 if isnan(PH{i}{k}{1})
153 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, Disabled.getInstance()); %% (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
154 else
155 fprintf(fid,'node{%d}.setArrival(jobclass{%d}, Erlang(%f,%f)); %% (%s,%s)\n',sn.stationToNode(i),k,nPhases/map_mean(PH{i}{k}),nPhases,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
156 end
157 otherwise
158 if isnan(PH{i}{k}{1})
159 fprintf(fid,'node{%d}.setService(jobclass{%d}, Disabled.getInstance()); %% (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
160 else
161 fprintf(fid,'node{%d}.setService(jobclass{%d}, Erlang(%f,%f)); %% (%s,%s)\n',sn.stationToNode(i),k,nPhases/map_mean(PH{i}{k}),nPhases,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
162 end
163 end
164 end
165 end
166 end
167 end
168end
169
170fprintf(fid,'\n%%%% Block 3: topology');
171if hasSink
172 rt(sn.nstations*sn.nclasses+(1:sn.nclasses),sn.nstations*sn.nclasses+(1:sn.nclasses)) = zeros(sn.nclasses);
173 for k=find(isinf(sn.njobs))' % for all open classes
174 for i=1:sn.nstations
175 % all open class transitions to ext station are re-routed to sink
176 rt((i-1)*sn.nclasses+k, sn.nstations*sn.nclasses+k) = rt((i-1)*sn.nclasses+k, (sourceID-1)*sn.nclasses+k);
177 rt((i-1)*sn.nclasses+k, (sourceID-1)*sn.nclasses+k) = 0;
178 end
179 end
180end
181
182fprintf(fid,'\n');
183fprintf(fid,'P = model.initRoutingMatrix(); %% initialize routing matrix \n',sn.nclasses,sn.nclasses,sn.nnodes,sn.nnodes);
184for k = 1:sn.nclasses
185 for c = 1:sn.nclasses
186 for i=1:sn.nnodes
187 for m=1:sn.nnodes
188 % routing matrix for each class
189 myP{k,c}(i,m) = rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
190 if myP{k,c}(i,m) > 0 && sn.nodetype(i) ~= NodeType.Sink
191 % do not change %d into %f to avoid round-off errors in
192 % the total probability
193 if sn.nodetype(i)==NodeType.Fork
194 fprintf(fid,'P{%d,%d}(%d,%d) = 1.0; %% (%s,%s) -> (%s,%s)\n',k,c,i,m,sn.nodenames{i},sn.classnames{k},sn.nodenames{m},sn.classnames{c});
195 else
196 fprintf(fid,'P{%d,%d}(%d,%d) = %d; %% (%s,%s) -> (%s,%s)\n',k,c,i,m,myP{k,c}(i,m),sn.nodenames{i},sn.classnames{k},sn.nodenames{m},sn.classnames{c});
197 end
198 end
199 end
200 end
201 %fprintf(fid,'P{%d,%d} = %s;\n',k,c,mat2str(myP{k,c}));
202 end
203end
204
205fprintf(fid,'model.link(P);\n');
206%if fid~=1
207% fclose(fid);
208%end
209end
Definition mmt.m:92