1function QN2SCRIPT(model, modelName, fid)
2% QN2SCRIPT(MODEL, MODELNAME, FID)
4% Copyright (c) 2012-2026, Imperial College London
7%global GlobalConstants.CoarseTol; % Tolerance
for distribution fitting
9if nargin<2%~exist(
'modelName',
'var')
12if nargin<3%~exist('fid','var')
20fprintf(fid,'model = Network(''%s'');\n',modelName);
21fprintf(fid,'\n%%%% Block 1:
nodes');
34 fprintf(fid,'node{%d} = Source(model,
''%s
'');\n
',i,sn.nodenames{i});
37 fprintf(fid,'node{%d} = DelayStation(model,
''%s
'');\n
',i,sn.nodenames{i});
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)));
44 fprintf(fid,'node{%d} = Router(model,
''%s
'');\n
',i,sn.nodenames{i});
46 fprintf(fid,'node{%d} = Fork(model,
''%s
'');\n
',i,sn.nodenames{i});
48 fprintf(fid,'node{%d} = Join(model,
''%s
'', node{%d});\n
',i,sn.nodenames{i},find(sn.fj(:,i)));
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
57 % % routing matrix for each class
58 % csMatrix(k,c) = csMatrix(k,c) + rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
62 % for k = 1:sn.nclasses
63 % for c = 1:sn.nclasses
65 % fprintf(fid,'csMatrix%d(%d,%d) = %f; %% %s -> %s\n
',i,k,c,csMatrix(k,c),sn.classnames{k},sn.classnames{c});
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});
74fprintf(fid,'\n%%%% Block 2: classes\n
');
78 fprintf(fid,'jobclass{%d} = OpenClass(model,
''%s
'', %d);\n
',k,sn.classnames{k},sn.classprio(k));
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));
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
88 if sum(nnz(sn.proc{i}{k}{1}))>0
94 fprintf(fid,'jobclass{%d} = OpenClass(model,
''%s
'', %d);\n
',k,sn.classnames{k},sn.classprio(k));
96 fprintf(fid,'jobclass{%d} = ClosedClass(model,
''%s
'', %d, node{%d}, %d);\n
',k,sn.classnames{k},sn.njobs(k),iref,sn.classprio(k));
101%% arrival and service processes
104 if sn.nodetype(sn.stationToNode(i)) ~= NodeType.Join
105 if isprop(model.stations{i},'serviceProcess
') && strcmp(class(model.stations{i}.serviceProcess{k}),'Replayer
')
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});
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});
112 elseif isprop(model.stations{i},'serviceProcess
') && strcmp(class(model.stations{i}.serviceProcess{k}),'Trace
')
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});
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});
120 SCVik = map_scv(PH{i}{k});
123 case SchedStrategy.EXT
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});
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});
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});
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});
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});
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});
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));
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});
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});
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});
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});
170fprintf(fid,'\n%%%% Block 3: topology
');
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
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;
183fprintf(fid,
'P = model.initRoutingMatrix(); %% initialize routing matrix \n',sn.nclasses,sn.nclasses,sn.nnodes,sn.nnodes);
185 for c = 1:sn.nclasses
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});
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});
201 %fprintf(fid,
'P{%d,%d} = %s;\n',k,c,mat2str(myP{k,c}));
205fprintf(fid,
'model.link(P);\n');