1function QN2JAVA(model, modelName, fid, headers)
2% QN2JAVA(MODEL, MODELNAME, FID, HEADERS)
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')
15if nargin<4 %~exist('fid','var')
24 fprintf(fid,'\tpublic static Network ex() {\n
',modelName);
26fprintf(fid,'\t\tNetwork model =
new Network(
"%s");\n
',modelName);
34fprintf(fid,
'\t\t\t\n');
40 fprintf(fid,
'\t\tSource node%d = new Source(model, "%s");\n',i,sn.nodenames{i});
43 fprintf(fid,
'\t\tDelay node%d = new Delay(model, "%s");\n',i,sn.nodenames{i});
45 fprintf(fid,
'\t\tQueue node%d = new Queue(model, "%s", SchedStrategy.%s);\n', i, sn.nodenames{i}, SchedStrategy.toProperty(SchedStrategy.toText(sn.sched(sn.nodeToStation(i)))));
46 if sn.nservers(sn.nodeToStation(i))>1
47 if isinf(sn.nservers(sn.nodeToStation(i)))
48 fprintf(fid,
'\t\tnode%d.setNumberOfServers(Integer.MAX_VALUE);\n', i);
50 fprintf(fid,
'\t\tnode%d.setNumberOfServers(%d);\n', i, sn.nservers(sn.nodeToStation(i)));
54 fprintf(fid,
'\t\tRouter node%d = new Router(model, "%s");\n',i,sn.nodenames{i});
56 fprintf(fid,
'\t\tFork node%d = new Fork(model, "%s");\n',i,sn.nodenames{i});
58 fprintf(fid,
'\t\tJoin node%d = new Join(model, "%s", node%d);\n',i,sn.nodenames{i},find(sn.fj(:,i)));
60 fprintf(fid,
'\t\tSink node%d = new Sink(model, "%s");\n',i,sn.nodenames{i});
61 case NodeType.ClassSwitch
62 % csMatrix = eye(sn.nclasses);
63 % fprintf(fid,
'\t\t\ncsMatrix%d = zeros(%d);\n',i,sn.nclasses);
64 %
for k = 1:sn.nclasses
65 %
for c = 1:sn.nclasses
67 % % routing matrix
for each class
68 % csMatrix(k,c) = csMatrix(k,c) + rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
72 %
for k = 1:sn.nclasses
73 %
for c = 1:sn.nclasses
75 % fprintf(fid,
'\t\tcsMatrix%d(%d,%d) = %f; %% %s -> %s\n',i,k,c,csMatrix(k,c),sn.classnames{k},sn.classnames{c});
79 %fprintf(fid,
'\t\tnode%d = ClassSwitch(model, "%s", csMatrix%d);\n',i,sn.nodenames{i},i);
80 fprintf(fid,
'\t\tRouter node%d = new Router(model, "%s"); // Dummy node, class switching is embedded in the routing matrix P \n',i,sn.nodenames{i});
84fprintf(fid,
'\n\t\t// Block 2: classes\n');
88 fprintf(fid,
'\t\tOpenClass jobclass%d = new OpenClass(model, "%s", %d);\n',k,sn.classnames{k},sn.classprio(k));
90 fprintf(fid,
'\t\tClosedClass jobclass%d = new ClosedClass(model, "%s", %d, node%d, %d);\n',k,sn.classnames{k},sn.njobs(k),sn.stationToNode(sn.refstat(k)),sn.classprio(k));
93 %
if the reference node
is unspecified, as in artificial
classes,
94 % set it to the first node where the rate
for this class is
98 if sum(nnz(sn.proc{i}{k}{1}))>0
103 if isinf(sn.njobs(k))
104 fprintf(fid,
'\t\tOpenClass jobclass%d = new OpenClass(model, "%s", %d);\n',k,sn.classnames{k},sn.classprio(k));
106 fprintf(fid,
'\t\tClosedClass jobclass%d = new ClosedClass(model, "%s", %d, node%d, %d);\n',k,sn.classnames{k},sn.njobs(k),iref,sn.classprio(k));
110fprintf(fid,
'\t\t\n');
111%% arrival and service processes
114 if sn.nodetype(sn.stationToNode(i)) ~= NodeType.Join
115 if isprop(model.stations{i},
'serviceProcess') && strcmp(
class(model.stations{i}.serviceProcess{k}),
'Replayer')
117 case SchedStrategy.EXT
118 fprintf(fid,'\t\tnode%d.setArrival(
jobclass%d, Replayer("%s"));
120 if sn.schedparam(i,k) ~= 1
121 fprintf(fid,'\t\tnode%d.setService(
jobclass%d, Replayer("%s"), %f);
123 fprintf(fid,'\t\tnode%d.setService(
jobclass%d, Replayer("%s"));
126 else if isprop(model.stations{i},
'serviceProcess') && strcmp(
class(model.stations{i}.serviceProcess{k}),
'Trace')
128 case SchedStrategy.EXT
129 fprintf(fid,
'\t\tnode%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});
131 if sn.schedparam(i,k) ~= 1
132 fprintf(fid,
'\t\tnode%d.setService(jobclass%d, Trace("%s"), %f); // (%s,%s)\n',sn.stationToNode(i),k,model.stations{i}.serviceProcess{k}.params{1}.paramValue,sn.schedparam(i,k),sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
134 fprintf(fid,
'\t\tnode%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});
138 SCVik = map_scv(PH{i}{k});
141 case SchedStrategy.EXT
143 meanik = map_mean(PH{i}{k});
144 if meanik < GlobalConstants.CoarseTol
145 fprintf(fid,
'\t\tnode%d.setArrival(jobclass%d, Immediate.getInstance()); // (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
147 fprintf(fid,
'\t\tnode%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});
150 fprintf(fid,
'\t\tnode%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});
154 meanik = map_mean(PH{i}{k});
155 if meanik < GlobalConstants.CoarseTol
156 fprintf(fid,
'\t\tnode%d.setService(jobclass%d, Immediate.getInstance()); // (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
158 if sn.schedparam(i,k) ~= 1
159 fprintf(fid,
'\t\tnode%d.setService(jobclass%d, Exp.fitMean(%f), %f); // (%s,%s)\n',sn.stationToNode(i),k,map_mean(PH{i}{k}),sn.schedparam(i,k),sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
161 fprintf(fid,
'\t\tnode%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});
165 if sn.schedparam(i,k) ~= 1
166 fprintf(fid,
'\t\tnode%d.setService(jobclass%d, APH.fitMeanAndSCV(%f,%f), %f); // (%s,%s)\n',sn.stationToNode(i),k,map_mean(PH{i}{k}),SCVik,sn.schedparam(i,k),sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
168 fprintf(fid,
'\t\tnode%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});
173 nPhases = max(1,round(1/SCVik));
175 case SchedStrategy.EXT
176 if isnan(PH{i}{k}{1})
177 fprintf(fid,
'\t\tnode%d.setArrival(jobclass%d, Disabled.getInstance()); // (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
179 fprintf(fid,
'\t\tnode%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});
182 if isnan(PH{i}{k}{1})
183 fprintf(fid,
'\t\tnode%d.setService(jobclass%d, Disabled.getInstance()); // (%s,%s)\n',sn.stationToNode(i),k,sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
185 if sn.schedparam(i,k) ~= 1
186 fprintf(fid,
'\t\tnode%d.setService(jobclass%d, Erlang(%f,%f), %f); // (%s,%s)\n',sn.stationToNode(i),k,nPhases/map_mean(PH{i}{k}),nPhases,sn.schedparam(i,k),sn.nodenames{sn.stationToNode(i)},sn.classnames{k});
188 fprintf(fid,
'\t\tnode%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});
198fprintf(fid,
'\n\t\t// Block 3: topology');
200 rt(sn.nstations*sn.nclasses+(1:sn.nclasses),sn.nstations*sn.nclasses+(1:sn.nclasses)) = zeros(sn.nclasses);
201 for k=find(isinf(sn.njobs))
' % for all open classes
203 % all open class transitions to ext station are re-routed to sink
204 rt((i-1)*sn.nclasses+k, sn.nstations*sn.nclasses+k) = rt((i-1)*sn.nclasses+k, (sourceID-1)*sn.nclasses+k);
205 rt((i-1)*sn.nclasses+k, (sourceID-1)*sn.nclasses+k) = 0;
211fprintf(fid,'\t\tRoutingMatrix routingMatrix = model.initRoutingMatrix(); \n
');
212% fprintf(fid,'\t\tRoutingMatrix routingMatrix =
new RoutingMatrix(model,\n
');
213% fprintf(fid,'\t\t\t Arrays.asList(
');
214% for c = 1:sn.nclasses
219% fprintf(fid,'),\n
');
222% fprintf(fid,'\t\t\t Arrays.asList(
');
224% fprintf(fid,'node%d
',i);
228% fprintf(fid,'));\n
');
235 for c = 1:sn.nclasses
238 % routing matrix for each class
239 myP{k,c}(i,m) = rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
241 % do not change %d into %f to avoid round-off errors in
242 % the total probability
243 switch sn.nodetype(i)
247 fprintf(fid,'\t\troutingMatrix.set(
jobclass%d,
jobclass%d, node%d, node%d, %f);
249 fprintf(fid,
'\t\troutingMatrix.set(jobclass%d, jobclass%d, node%d, node%d, %f); // (%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});
254 %fprintf(fid,
'\t\tP{%d,%d} = %s;\n',k,c,mat2str(myP{k,c}));
259fprintf(fid,
'\n\t\tmodel.link(routingMatrix);\n\n');
261 fprintf(fid,
'\t\treturn model;\n');
262 fprintf(fid,
'\t}\n');