LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
QN2JAVA.m
1function QN2JAVA(model, modelName, fid, headers)
2% QN2JAVA(MODEL, MODELNAME, FID, HEADERS)
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 nargin<4 %~exist('fid','var')
16 headers=true;
17end
18if ischar(fid)
19 fid = fopen(fid,'w');
20end
21sn = model.getStruct;
22%% initialization
23if headers
24 fprintf(fid,'\tpublic static Network ex() {\n',modelName);
25end
26fprintf(fid,'\t\tNetwork model = new Network("%s");\n',modelName);
27fprintf(fid,'\n\t\t// Block 1: nodes');
28rt = sn.rt;
29rtnodes = sn.rtnodes;
30hasSink = 0;
31sourceID = 0;
32PH = sn.proc;
33
34fprintf(fid,'\t\t\t\n');
35%% write nodes
36for i= 1:sn.nnodes
37 switch sn.nodetype(i)
38 case NodeType.Source
39 sourceID = i;
40 fprintf(fid,'\t\tSource node%d = new Source(model, "%s");\n',i,sn.nodenames{i});
41 hasSink = 1;
42 case NodeType.Delay
43 fprintf(fid,'\t\tDelay node%d = new Delay(model, "%s");\n',i,sn.nodenames{i});
44 case NodeType.Queue
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);
49 else
50 fprintf(fid,'\t\tnode%d.setNumberOfServers(%d);\n', i, sn.nservers(sn.nodeToStation(i)));
51 end
52 end
53 case NodeType.Router
54 fprintf(fid,'\t\tRouter node%d = new Router(model, "%s");\n',i,sn.nodenames{i});
55 case NodeType.Fork
56 fprintf(fid,'\t\tFork node%d = new Fork(model, "%s");\n',i,sn.nodenames{i});
57 case NodeType.Join
58 fprintf(fid,'\t\tJoin node%d = new Join(model, "%s", node%d);\n',i,sn.nodenames{i},find(sn.fj(:,i)));
59 case NodeType.Sink
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
66 % for m=1:sn.nnodes
67 % % routing matrix for each class
68 % csMatrix(k,c) = csMatrix(k,c) + rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
69 % end
70 % end
71 % end
72 % for k = 1:sn.nclasses
73 % for c = 1:sn.nclasses
74 % if csMatrix(k,c)>0
75 % fprintf(fid,'\t\tcsMatrix%d(%d,%d) = %f; %% %s -> %s\n',i,k,c,csMatrix(k,c),sn.classnames{k},sn.classnames{c});
76 % end
77 % end
78 % end
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});
81 end
82end
83%% write classes
84fprintf(fid,'\n\t\t// Block 2: classes\n');
85for k = 1:sn.nclasses
86 if sn.njobs(k)>0
87 if isinf(sn.njobs(k))
88 fprintf(fid,'\t\tOpenClass jobclass%d = new OpenClass(model, "%s", %d);\n',k,sn.classnames{k},sn.classprio(k));
89 else
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));
91 end
92 else
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
95 % non-null
96 iref = 0;
97 for i=1:sn.nstations
98 if sum(nnz(sn.proc{i}{k}{1}))>0
99 iref = i;
100 break
101 end
102 end
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));
105 else
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));
107 end
108 end
109end
110fprintf(fid,'\t\t\n');
111%% arrival and service processes
112for i=1:sn.nstations
113 for k=1:sn.nclasses
114 if sn.nodetype(sn.stationToNode(i)) ~= NodeType.Join
115 if isprop(model.stations{i},'serviceProcess') && strcmp(class(model.stations{i}.serviceProcess{k}),'Replayer')
116 switch sn.sched(i)
117 case SchedStrategy.EXT
118 fprintf(fid,'\t\tnode%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});
119 otherwise
120 if sn.schedparam(i,k) ~= 1
121 fprintf(fid,'\t\tnode%d.setService(jobclass%d, Replayer("%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});
122 else
123 fprintf(fid,'\t\tnode%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});
124 end
125 end
126 else if isprop(model.stations{i},'serviceProcess') && strcmp(class(model.stations{i}.serviceProcess{k}),'Trace')
127 switch sn.sched(i)
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});
130 otherwise
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});
133 else
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});
135 end
136 end
137 else
138 SCVik = map_scv(PH{i}{k});
139 if SCVik >= 0.5
140 switch sn.sched(i)
141 case SchedStrategy.EXT
142 if SCVik == 1
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});
146 else
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});
148 end
149 else
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});
151 end
152 otherwise
153 if SCVik == 1
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});
157 else
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});
160 else
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});
162 end
163 end
164 else
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});
167 else
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});
169 end
170 end
171 end
172 else
173 nPhases = max(1,round(1/SCVik));
174 switch sn.sched(i)
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});
178 else
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});
180 end
181 otherwise
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});
184 else
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});
187 else
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});
189 end
190 end
191 end
192 end
193 end
194 end
195 end
196 end
197end
198fprintf(fid,'\n\t\t// Block 3: topology');
199if hasSink
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
202 for i=1:sn.nstations
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;
206 end
207 end
208end
209
210fprintf(fid,'\t\n');
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
215% fprintf(fid,'jobclass%d',c);
216% if c<sn.nclasses
217% fprintf(fid,', ');
218% else
219% fprintf(fid,'),\n');
220% end
221% end
222% fprintf(fid,'\t\t\t Arrays.asList(');
223% for i = 1:sn.nnodes
224% fprintf(fid,'node%d',i);
225% if i<sn.nnodes
226% fprintf(fid,', ');
227% else
228% fprintf(fid,'));\n');
229% end
230% end
231fprintf(fid,'\t\n');
232
233
234for k = 1:sn.nclasses
235 for c = 1:sn.nclasses
236 for i=1:sn.nnodes
237 for m=1:sn.nnodes
238 % routing matrix for each class
239 myP{k,c}(i,m) = rtnodes((i-1)*sn.nclasses+k,(m-1)*sn.nclasses+c);
240 if myP{k,c}(i,m) > 0
241 % do not change %d into %f to avoid round-off errors in
242 % the total probability
243 switch sn.nodetype(i)
244 case NodeType.Sink
245 % no-op
246 case NodeType.Fork
247 fprintf(fid,'\t\troutingMatrix.set(jobclass%d, jobclass%d, node%d, node%d, %f); // (%s,%s) -> (%s,%s)\n',k,c,i,m,sn.nodeparam{i}.fanOut,sn.nodenames{i},sn.classnames{k},sn.nodenames{m},sn.classnames{c});
248 otherwise
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});
250 end
251 end
252 end
253 end
254 %fprintf(fid,'\t\tP{%d,%d} = %s;\n',k,c,mat2str(myP{k,c}));
255 end
256end
257
258
259fprintf(fid,'\n\t\tmodel.link(routingMatrix);\n\n');
260if headers
261 fprintf(fid,'\t\treturn model;\n');
262 fprintf(fid,'\t}\n');
263end
264%if fid~=1
265% fclose(fid);
266%end
267end
Definition mmt.m:92