2 % JLINE Conversion utilities
for JLINE format models
4 % JLINE provides
static methods to convert between LINE MATLAB models
5 % and JLINE Java/Kotlin models. This
class serves as the primary interface
6 %
for interoperability between the MATLAB and Java implementations of LINE.
8 % @brief JLINE format conversion and Java interoperability utilities
11 % - Convert LINE MATLAB models to JLINE Java models
12 % - Convert JLINE Java models back to LINE MATLAB format
13 % - Access JLINE solvers from MATLAB
14 % - Handle serialization between MATLAB and Java representations
18 % % Convert a LINE model to JLINE format
19 % jnetwork = JLINE.from_model(network);
20 % % Get a JLINE solver
21 % jssa = JLINE.get_solver(jnetwork,
'ssa');
25 jar_loc = which(
'jline.jar');
30 function model = from_line_layered_network(line_layered_network)
31 sn = line_layered_network.getStruct;
34 model = jline.lang.layered.LayeredNetwork(line_layered_network.getName);
37 P = cell(1,sn.nhosts);
40 sn_mult_h = java.lang.Integer.MAX_VALUE;
42 sn_mult_h = sn.mult(h);
45 case SchedStrategy.REF
46 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.REF);
47 case SchedStrategy.INF
48 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.INF);
49 case SchedStrategy.FCFS
50 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.FCFS);
51 case SchedStrategy.LCFS
52 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LCFS);
53 case SchedStrategy.SIRO
54 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.SIRO);
55 case SchedStrategy.SJF
56 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.SJF);
57 case SchedStrategy.LJF
58 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LJF);
60 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.PS);
61 case SchedStrategy.DPS
62 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.DPS);
63 case SchedStrategy.GPS
64 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.GPS);
65 case SchedStrategy.SEPT
66 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.SEPT);
67 case SchedStrategy.LEPT
68 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LEPT);
69 case {SchedStrategy.HOL, SchedStrategy.FCFSPRIO}
70 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.FCFSPRIO);
71 case SchedStrategy.FORK
72 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.FORK);
73 case SchedStrategy.EXT
74 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.EXT);
75 case SchedStrategy.LCFSPR
76 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LCFSPR);
77 case SchedStrategy.LCFSPI
78 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LCFSPI);
79 case SchedStrategy.LCFSPRIO
80 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LCFSPRIO);
81 case SchedStrategy.LCFSPRPRIO
82 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LCFSPRPRIO);
83 case SchedStrategy.LCFSPIPRIO
84 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.LCFSPIPRIO);
85 case SchedStrategy.PSPRIO % todo
86 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.PSPRIO);
87 case SchedStrategy.DPSPRIO % todo
88 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.DPSPRIO);
89 case SchedStrategy.GPSPRIO % todo
90 P{h} = jline.lang.layered.Processor(model, sn.names{h}, sn_mult_h, jline.lang.constant.SchedStrategy.GPSPRIO);
93 P{h}.setReplication(sn.repl(h));
98 T = cell(1,sn.ntasks);
101 if isinf(sn.mult(tidx))
102 sn_mult_tidx = java.lang.Integer.MAX_VALUE;
104 sn_mult_tidx = sn.mult(tidx);
106 % Check
if this is a CacheTask
108 % Get replacement strategy from ordinal
109 switch sn.replacestrat(tidx)
110 case ReplacementStrategy.RR
111 jReplacestrat = jline.lang.constant.ReplacementStrategy.RR;
112 case ReplacementStrategy.FIFO
113 jReplacestrat = jline.lang.constant.ReplacementStrategy.FIFO;
114 case ReplacementStrategy.SFIFO
115 jReplacestrat = jline.lang.constant.ReplacementStrategy.SFIFO;
116 case ReplacementStrategy.LRU
117 jReplacestrat = jline.lang.constant.ReplacementStrategy.LRU;
119 jReplacestrat = jline.lang.constant.ReplacementStrategy.FIFO;
121 T{t} = jline.lang.layered.CacheTask(model, sn.names{tidx}, sn.nitems(tidx), sn.itemcap{tidx}, jReplacestrat, sn_mult_tidx);
123 switch sn.sched(tidx)
124 case SchedStrategy.REF
125 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.REF);
126 case SchedStrategy.INF
127 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.INF);
128 case SchedStrategy.FCFS
129 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.FCFS);
130 case SchedStrategy.LCFS
131 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.LCFS);
132 case SchedStrategy.SIRO
133 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.SIRO);
134 case SchedStrategy.SJF
135 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.SJF);
136 case SchedStrategy.LJF
137 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.LJF);
138 case SchedStrategy.PS
139 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.PS);
140 case SchedStrategy.DPS
141 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.DPS);
142 case SchedStrategy.GPS
143 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.GPS);
144 case SchedStrategy.SEPT
145 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.SEPT);
146 case SchedStrategy.LEPT
147 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.LEPT);
148 case {SchedStrategy.HOL, SchedStrategy.FCFSPRIO}
149 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.FCFSPRIO);
150 case SchedStrategy.FORK
151 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.FORK);
152 case SchedStrategy.EXT
153 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.EXT);
154 case SchedStrategy.LCFSPR
155 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.LCFSPR);
156 case SchedStrategy.PSPRIO % todo
157 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.PSPRIO);
158 case SchedStrategy.DPSPRIO % todo
159 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.DPSPRIO);
160 case SchedStrategy.GPSPRIO % todo
161 T{t} = jline.lang.layered.Task(model, sn.names{tidx}, sn_mult_tidx, jline.lang.constant.SchedStrategy.GPSPRIO);
164 T{t}.on(
P{sn.parent(tidx)});
166 T{t}.setReplication(sn.repl(tidx));
168 if ~isempty(sn.think{tidx}) && sn.think_type(tidx) ~= ProcessType.DISABLED
169 switch sn.think_type(tidx)
170 case ProcessType.IMMEDIATE
171 T{t}.setThinkTime(jline.lang.processes.Immediate);
173 T{t}.setThinkTime(jline.lang.processes.Exp(1/sn.think_mean(tidx)));
174 case ProcessType.ERLANG
175 T{t}.setThinkTime(jline.lang.processes.Erlang.fitMeanAndSCV(sn.think_mean(tidx), sn.think_scv(tidx)));
176 case ProcessType.HYPEREXP
177 if ~isempty(sn.think_params{tidx}) && length(sn.think_params{tidx}) >= 3
178 T{t}.setThinkTime(jline.lang.processes.HyperExp(sn.think_params{tidx}(1), sn.think_params{tidx}(2), sn.think_params{tidx}(3)));
180 T{t}.setThinkTime(jline.lang.processes.HyperExp.fitMeanAndSCV(sn.think_mean(tidx), sn.think_scv(tidx)));
182 case ProcessType.COXIAN
183 T{t}.setThinkTime(jline.lang.processes.Coxian.fitMeanAndSCV(sn.think_mean(tidx), sn.think_scv(tidx)));
185 T{t}.setThinkTime(jline.lang.processes.APH.fitMeanAndSCV(sn.think_mean(tidx), sn.think_scv(tidx)));
187 if ~isempty(sn.think_proc{tidx})
188 proc = sn.think_proc{tidx};
189 T{t}.setThinkTime(jline.lang.processes.PH(JLINE.from_line_matrix(proc{1}), JLINE.from_line_matrix(proc{2})));
191 T{t}.setThinkTime(jline.lang.processes.Exp(1/sn.think_mean(tidx)));
194 if ~isempty(sn.think_proc{tidx})
195 proc = sn.think_proc{tidx};
196 T{t}.setThinkTime(jline.lang.processes.MAP(JLINE.from_line_matrix(proc{1}), JLINE.from_line_matrix(proc{2})));
198 T{t}.setThinkTime(jline.lang.processes.Exp(1/sn.think_mean(tidx)));
201 line_error(mfilename,sprintf(
'JLINE conversion does not support the %s distribution for task think time yet.',
char(sn.think_type(tidx))));
206 E = cell(1,sn.nentries);
209 % Check
if this is an ItemEntry (has nitems > 0)
210 if sn.nitems(eidx) > 0
211 % ItemEntry requires cardinality and popularity distribution
212 if ~isempty(sn.itemproc) && ~isempty(sn.itemproc{eidx})
213 jPopularity = JLINE.from_line_distribution(sn.itemproc{eidx});
215 % Default to uniform distribution
216 jPopularity = jline.lang.processes.DiscreteSampler(jline.util.matrix.Matrix.uniformDistribution(sn.nitems(eidx)));
218 E{e} = jline.lang.layered.ItemEntry(model, sn.names{eidx}, sn.nitems(eidx), jPopularity);
220 E{e} = jline.lang.layered.Entry(model, sn.names{eidx});
222 E{e}.on(T{sn.parent(eidx)-sn.tshift});
226 A = cell(1,sn.nacts);
229 tidx = sn.parent(aidx);
230 onTask = tidx-sn.tshift;
231 % Convert host demand from primitives to Java distribution
232 switch sn.hostdem_type(aidx)
233 case ProcessType.IMMEDIATE
234 jHostDem = jline.lang.processes.Immediate;
235 case ProcessType.DISABLED
236 jHostDem = jline.lang.processes.Disabled;
238 jHostDem = jline.lang.processes.Exp(1/sn.hostdem_mean(aidx));
239 case ProcessType.ERLANG
240 jHostDem = jline.lang.processes.Erlang.fitMeanAndSCV(sn.hostdem_mean(aidx), sn.hostdem_scv(aidx));
241 case ProcessType.HYPEREXP
242 if ~isempty(sn.hostdem_params{aidx}) && length(sn.hostdem_params{aidx}) >= 3
243 jHostDem = jline.lang.processes.HyperExp(sn.hostdem_params{aidx}(1), sn.hostdem_params{aidx}(2), sn.hostdem_params{aidx}(3));
245 jHostDem = jline.lang.processes.HyperExp.fitMeanAndSCV(sn.hostdem_mean(aidx), sn.hostdem_scv(aidx));
247 case ProcessType.COXIAN
248 jHostDem = jline.lang.processes.Coxian.fitMeanAndSCV(sn.hostdem_mean(aidx), sn.hostdem_scv(aidx));
250 jHostDem = jline.lang.processes.APH.fitMeanAndSCV(sn.hostdem_mean(aidx), sn.hostdem_scv(aidx));
252 if ~isempty(sn.hostdem_proc{aidx})
253 proc = sn.hostdem_proc{aidx};
254 jHostDem = jline.lang.processes.PH(JLINE.from_line_matrix(proc{1}), JLINE.from_line_matrix(proc{2}));
256 jHostDem = jline.lang.processes.Exp(1/sn.hostdem_mean(aidx));
259 if ~isempty(sn.hostdem_proc{aidx})
260 proc = sn.hostdem_proc{aidx};
261 jHostDem = jline.lang.processes.MAP(JLINE.from_line_matrix(proc{1}), JLINE.from_line_matrix(proc{2}));
263 jHostDem = jline.lang.processes.Exp(1/sn.hostdem_mean(aidx));
266 jHostDem = jline.lang.processes.Det(sn.hostdem_mean(aidx));
268 line_error(mfilename,sprintf(
'JLINE conversion does not support the %s distribution for host demand yet.',
char(sn.hostdem_type(aidx))));
270 A{a} = jline.lang.layered.Activity(model, sn.names{aidx}, jHostDem);
273 boundTo = find(sn.graph((sn.eshift+1):(sn.eshift+sn.nentries),aidx));
276 A{a}.boundTo(E{boundTo});
279 if sn.sched(tidx) ~= SchedStrategy.REF % ref tasks don
't reply
280 repliesTo = find(sn.replygraph(a,:)); % index of entry
281 if ~isempty(repliesTo)
282 if ~sn.isref(sn.parent(sn.eshift+repliesTo))
283 A{a}.repliesTo(E{repliesTo});
288 if ~isempty(sn.callpair)
289 cidxs = find(sn.callpair(:,1)==aidx);
290 calls = sn.callpair(:,2);
292 switch sn.calltype(c)
294 A{a}.synchCall(E{calls(c)-sn.eshift},sn.callproc_mean(c));
296 A{a}.asynchCall(E{calls(c)-sn.eshift},sn.callproc_mean(c));
305 if ~isempty(sn.think{h}) && sn.think_type(h) ~= ProcessType.DISABLED
306 switch sn.think_type(h)
307 case ProcessType.IMMEDIATE
308 P{h}.setThinkTime(jline.lang.processes.Immediate);
310 P{h}.setThinkTime(jline.lang.processes.Exp(1/sn.think_mean(h)));
311 case ProcessType.ERLANG
312 P{h}.setThinkTime(jline.lang.processes.Erlang.fitMeanAndSCV(sn.think_mean(h),sn.think_scv(h)));
313 case ProcessType.HYPEREXP
314 % For HyperExp, reconstruct from params
if available, otherwise use fitMeanAndSCV
315 if ~isempty(sn.think_params{h}) && length(sn.think_params{h}) >= 3
316 P{h}.setThinkTime(jline.lang.processes.HyperExp(sn.think_params{h}(1), sn.think_params{h}(2), sn.think_params{h}(3)));
318 P{h}.setThinkTime(jline.lang.processes.HyperExp.fitMeanAndSCV(sn.think_mean(h), sn.think_scv(h)));
320 case ProcessType.COXIAN
321 % For Coxian, use fitMeanAndSCV
322 P{h}.setThinkTime(jline.lang.processes.Coxian.fitMeanAndSCV(sn.think_mean(h), sn.think_scv(h)));
324 % For APH, reconstruct from params
if available
325 if ~isempty(sn.think_params{h})
326 P{h}.setThinkTime(jline.lang.processes.APH.fitMeanAndSCV(sn.think_mean(h), sn.think_scv(h)));
328 P{h}.setThinkTime(jline.lang.processes.Exp(1/sn.think_mean(h)));
331 line_error(mfilename,sprintf(
'JLINE conversion does not support the %s distribution yet.',
char(sn.think_type(h))));
336 %% Sequential precedences
338 aidx = sn.ashift + ai;
339 tidx = sn.parent(aidx);
341 for bidx=find(sn.graph(aidx,:))
342 if bidx > sn.ashift % ignore precedence between entries and activities
343 % Serial pattern (SEQ)
344 if full(sn.actpretype(aidx)) == ActivityPrecedenceType.PRE_SEQ && full(sn.actposttype(bidx)) == ActivityPrecedenceType.POST_SEQ
345 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.Serial(sn.names{aidx}, sn.names{bidx}));
351 %%%%%%%%%%%%%%%%%%%%%%%%%%% translated up to here
353 %% Loop precedences (POST_LOOP)
354 % Loop structure in sn.graph:
355 % - Entry activity (preAct) has edge to first loop body activity
356 % - Last loop body activity has back-edge to first loop body (weight = 1-1/counts)
357 % - Last loop body activity has edge to end activity (weight = 1/counts)
358 % - All loop body and end activities have POST_LOOP type
359 processedLoops = false(1, sn.nacts);
361 aidx = sn.ashift + ai;
362 tidx = sn.parent(aidx);
363 % Check
if this activity starts a loop (has a successor with POST_LOOP type)
364 % and hasn
't been processed as part of another loop
365 if processedLoops(ai)
369 successors = find(sn.graph(aidx,:));
370 for bidx = successors
371 if bidx > sn.ashift && full(sn.actposttype(bidx)) == ActivityPrecedenceType.POST_LOOP
372 % Skip if this loop body activity was already processed
373 if processedLoops(bidx - sn.ashift)
376 % Found start of a loop: aidx is the entry, bidx is first loop body activity
378 precActs = java.util.ArrayList();
380 % Follow the chain of POST_LOOP activities
383 precActs.add(sprintf("%s", sn.names{curIdx}));
384 processedLoops(curIdx - sn.ashift) = true;
386 % Find successors of current activity
387 curSuccessors = find(sn.graph(curIdx,:));
388 curSuccessors = curSuccessors(curSuccessors > sn.ashift);
390 % Check for loop termination: find the end activity
391 % End activity has weight = 1/counts (not the back-edge weight)
394 for succIdx = curSuccessors
395 if full(sn.actposttype(succIdx)) == ActivityPrecedenceType.POST_LOOP
396 if succIdx == loopStart
397 % This is the back-edge, skip it
400 weight = full(sn.graph(curIdx, succIdx));
401 if weight > 0 && weight < 1
402 % This is the end activity (weight = 1/counts)
405 % This is the next activity in the loop body (weight = 1.0)
412 % Found end activity - calculate counts and output
413 weight = full(sn.graph(curIdx, endIdx));
417 counts = 1; % Fallback to prevent division by zero
419 precActs.add(sprintf("%s", sn.names{endIdx}));
420 processedLoops(endIdx - sn.ashift) = true;
422 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.Loop(sn.names{aidx}, precActs, jline.util.matrix.Matrix(counts)));
425 % Continue to next activity in loop body
428 % No more successors - shouldn't happen in valid loop
432 break; % Only process one loop starting from
this activity
437 %% OrFork precedences (POST_OR)
441 aidx = sn.ashift + ai;
442 tidx = sn.parent(aidx);
445 for bidx=find(sn.graph(aidx,:))
446 if bidx > sn.ashift % ignore precedence between entries and activities
447 % Or pattern (POST_OR)
448 if full(sn.actposttype(bidx)) == ActivityPrecedenceType.POST_OR
449 if precMarker == 0 % start a new orjoin
450 precActs = java.util.ArrayList();
451 precMarker = aidx-sn.ashift;
452 precActs.add(sprintf(
"%s", sn.names{bidx}));
453 probs=full(sn.graph(aidx,bidx));
455 precActs.add(sprintf(
"%s", sn.names{bidx}));
456 probs(end+1)=full(sn.graph(aidx,bidx));
464 probsMatrix = jline.util.matrix.Matrix(1,length(probs));
465 for i=1:length(probs)
466 probsMatrix.set(0,i-1,probs(i));
468 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.OrFork(sn.names{precMarker+sn.ashift}, precActs, probsMatrix));
473 %% AndFork precedences (POST_AND)
477 aidx = sn.ashift + ai;
478 tidx = sn.parent(aidx);
480 for bidx=find(sn.graph(aidx,:))
481 if bidx > sn.ashift % ignore precedence between entries and activities
482 % Or pattern (POST_AND)
483 if full(sn.actposttype(bidx)) == ActivityPrecedenceType.POST_AND
485 postActs = java.util.ArrayList();
486 postActs.add(sprintf(
"%s", sn.names{bidx}));
488 postActs.add(sprintf(
"%s", sn.names{bidx}));
491 if precMarker == 0 % start a
new orjoin
492 precMarker = aidx-sn.ashift;
498 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.AndFork(sn.names{precMarker+sn.ashift}, postActs));
503 %% CacheAccess precedences (POST_CACHE)
507 aidx = sn.ashift + ai;
508 tidx = sn.parent(aidx);
510 for bidx=find(sn.graph(aidx,:))
511 if bidx > sn.ashift % ignore precedence between entries and activities
512 % CacheAccess pattern (POST_CACHE)
513 if full(sn.actposttype(bidx)) == ActivityPrecedenceType.POST_CACHE
515 postActs = java.util.ArrayList();
516 postActs.add(sprintf(
"%s", sn.names{bidx}));
518 postActs.add(sprintf(
"%s", sn.names{bidx}));
521 if precMarker == 0 % start a
new cache access
522 precMarker = aidx-sn.ashift;
528 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.CacheAccess(sn.names{precMarker+sn.ashift}, postActs));
534 %% OrJoin precedences (PRE_OR)
536 for bi = sn.nacts:-1:1
537 bidx = sn.ashift + bi;
538 tidx = sn.parent(bidx);
539 %
for all predecessors
540 for aidx=find(sn.graph(:,bidx))
'
541 if aidx > sn.ashift % ignore precedence between entries and activities
542 % OrJoin pattern (PRE_OR)
543 if full(sn.actpretype(aidx)) == ActivityPrecedenceType.PRE_OR
544 if precMarker == 0 % start a new orjoin
545 precActs = java.util.ArrayList();
546 precMarker = bidx-sn.ashift;
547 precActs.add(sprintf("%s", sn.names{aidx}));
549 precActs.add(sprintf("%s", sn.names{aidx}));
555 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.OrJoin(precActs, sn.names{precMarker+sn.ashift}));
560 %% AndJoin precedences (PRE_AND)
562 for bi = sn.nacts:-1:1
563 bidx = sn.ashift + bi;
564 tidx = sn.parent(bidx);
565 % for all predecessors
566 for aidx=find(sn.graph(:,bidx))'
567 if aidx > sn.ashift % ignore precedence between entries and activities
568 % OrJoin pattern (PRE_AND)
569 if full(sn.actpretype(aidx)) == ActivityPrecedenceType.PRE_AND
570 if precMarker == 0 % start a new orjoin
571 precActs = java.util.ArrayList();
572 precMarker = bidx-sn.ashift;
573 precActs.add(sprintf(
"%s", sn.names{aidx}));
575 precActs.add(sprintf(
"%s", sn.names{aidx}));
581 % Find quorum parameter from original precedence structure
582 postActName = sn.names{precMarker+sn.ashift};
583 localTaskIdx = tidx - sn.tshift;
585 for ap = 1:length(line_layered_network.tasks{localTaskIdx}.precedences)
586 precedence = line_layered_network.tasks{localTaskIdx}.precedences(ap);
587 if precedence.preType == ActivityPrecedenceType.PRE_AND
588 % Check
if this precedence contains our post activity
589 if any(strcmp(precedence.postActs, postActName))
590 quorum = precedence.preParams;
597 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.AndJoin(precActs, sn.names{precMarker+sn.ashift}));
599 T{tidx-sn.tshift}.addPrecedence(jline.lang.layered.ActivityPrecedence.AndJoin(precActs, sn.names{precMarker+sn.ashift}, quorum));
607 function jdist = from_line_distribution(line_dist)
608 if isa(line_dist,
'Exp')
609 jdist = jline.lang.processes.Exp(line_dist.getParam(1).paramValue);
610 elseif isa(line_dist, "APH")
611 alpha = line_dist.getParam(1).paramValue;
612 T = line_dist.getParam(2).paramValue;
613 jline_alpha = java.util.ArrayList();
614 for i = 1:length(alpha)
615 jline_alpha.add(alpha(i));
617 jline_T = JLINE.from_line_matrix(T);
618 jdist = jline.lang.processes.APH(jline_alpha, jline_T);
619 elseif isa(line_dist, 'Coxian')
620 jline_mu = java.util.ArrayList();
621 jline_phi = java.util.ArrayList();
622 if length(line_dist.params) == 3
623 jline_mu.add(line_dist.getParam(1).paramValue);
624 jline_mu.add(line_dist.getParam(2).paramValue);
625 jline_phi.add(line_dist.getParam(3).paramValue);
627 mu = line_dist.getParam(1).paramValue;
628 phi = line_dist.getParam(2).paramValue;
632 for i = 1:length(phi)
633 jline_phi.add(phi(i));
636 jdist = jline.lang.processes.Coxian(jline_mu, jline_phi);
637 elseif isa(line_dist, 'Det')
638 jdist = jline.lang.processes.Det(line_dist.getParam(1).paramValue);
639 elseif isa(line_dist, 'DiscreteSampler')
640 popularity_p = JLINE.from_line_matrix(line_dist.getParam(1).paramValue);
641 popularity_val = JLINE.from_line_matrix(line_dist.getParam(2).paramValue);
642 jdist = jline.lang.processes.DiscreteSampler(popularity_p, popularity_val);
643 elseif isa(line_dist, 'Erlang')
644 jdist = jline.lang.processes.Erlang(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue);
645 elseif isa(line_dist, 'Gamma')
646 jdist = jline.lang.processes.Gamma(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue);
647 elseif isa(line_dist, "HyperExp")
648 jdist = jline.lang.processes.HyperExp(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue, line_dist.getParam(3).paramValue);
649 elseif isa(line_dist, 'Lognormal')
650 jdist = jline.lang.processes.Lognormal(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue);
651 elseif isa(line_dist, 'Pareto')
652 jdist = jline.lang.processes.Pareto(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue);
653 elseif isa(line_dist, 'MAP')
656 jdist = jline.lang.processes.MAP(JLINE.from_line_matrix(D0), JLINE.from_line_matrix(D1));
657 elseif isa(line_dist, 'MMPP2')
658 lambda0 = line_dist.getParam(1).paramValue;
659 lambda1 = line_dist.getParam(2).paramValue;
660 sigma0 = line_dist.getParam(3).paramValue;
661 sigma1 = line_dist.getParam(4).paramValue;
662 jdist = jline.lang.processes.MMPP2(lambda0, lambda1, sigma0, sigma1);
663 elseif isa(line_dist, 'PH')
664 alpha = line_dist.getParam(1).paramValue;
665 T = line_dist.getParam(2).paramValue;
666 jdist = jline.lang.processes.PH(JLINE.from_line_matrix(alpha), JLINE.from_line_matrix(T));
667 elseif isa(line_dist, 'Uniform')
668 jdist = jline.lang.processes.Uniform(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue);
669 elseif isa(line_dist, 'Weibull')
670 jdist = jline.lang.processes.Weibull(line_dist.getParam(1).paramValue, line_dist.getParam(2).paramValue);
671 elseif isa(line_dist, 'Zipf')
672 jdist = jline.lang.processes.Zipf(line_dist.getParam(3).paramValue, line_dist.getParam(2).paramValue);
673 elseif isa(line_dist, 'Immediate')
674 jdist = jline.lang.processes.Immediate();
675 elseif isempty(line_dist) || isa(line_dist, 'Disabled')
676 jdist = jline.lang.processes.Disabled();
678 elseif isa(line_dist, 'Replayer')
679 jdist = jline.lang.processes.Replayer(line_dist.params{1}.paramValue);
680 elseif isa(line_dist,
'Trace')
681 jdist = jline.lang.processes.Trace(line_dist.params{1}.paramValue);
683 line_error(mfilename,
'Distribution not supported by JLINE.');
687 function matlab_dist = from_jline_distribution(jdist)
688 if isa(jdist,
'jline.lang.processes.Exp')
689 matlab_dist = Exp(jdist.getRate());
690 elseif isa(jdist, 'jline.lang.processes.Det')
691 matlab_dist = Det(jdist.getParam(1).getValue);
692 elseif isa(jdist, 'jline.lang.processes.Erlang')
693 matlab_dist = Erlang(jdist.getRate(),jdist.getNumberOfPhases());
694 elseif isa(jdist, 'jline.lang.processes.Gamma')
695 matlab_dist = Gamma(jdist.getParam(1).getValue,jdist.getParam(2).getValue);
696 elseif isa(jdist, 'jline.lang.processes.HyperExp')
697 matlab_dist = HyperExp(jdist.getParam(1).getValue, jdist.getParam(2).getValue, jdist.getParam(3).getValue);
698 elseif isa(jdist, 'jline.lang.processes.Lognormal')
699 matlab_dist = Lognormal(jdist.getParam(1).getValue,jdist.getParam(2).getValue);
700 elseif isa(jdist, 'jline.lang.processes.Pareto')
701 matlab_dist = Pareto(jdist.getParam(1).getValue,jdist.getParam(2).getValue);
702 elseif isa(jdist, 'jline.lang.processes.Uniform')
703 matlab_dist = Uniform(jdist.getParam(1).getValue,jdist.getParam(2).getValue);
704 elseif isa(jdist, 'jline.lang.processes.Weibull')
705 matlab_dist = Weibull(jdist.getParam(1).getValue,jdist.getParam(2).getValue);
706 elseif isa(jdist, 'jline.lang.processes.APH')
707 jalpha = jdist.getParam(1).getValue;
708 alpha = zeros(1, jalpha.length);
709 for i = 1:jalpha.length
710 alpha(i) = jalpha.get(i-1);
712 matlab_dist = APH(alpha, JLINE.from_jline_matrix(jdist.getParam(2).getValue));
713 elseif isa(jdist, 'jline.lang.processes.PH')
714 jalpha = jdist.getParam(1).getValue;
715 alpha = zeros(1, jalpha.length);
716 for i = 1:jalpha.length
717 alpha(i) = jalpha.get(i-1);
719 matlab_dist = PH(alpha, JLINE.from_jline_matrix(jdist.getParam(2).getValue));
720 elseif isa(jdist, 'jline.lang.processes.Coxian')
721 if jdist.getNumberOfPhases == 2
722 matlab_dist = Coxian([jdist.getParam(1).getValue.get(0), jdist.getParam(1).getValue.get(1)], [jdist.getParam(2).getValue.get(0),1]);
724 jmu = jdist.getParam(1).getValue;
725 jphi = jdist.getParam(2).getValue;
726 mu = zeros(1, jmu.size);
727 phi = zeros(1, jphi.size);
729 mu(i) = jmu.get(i-1);
732 phi(i) = jphi.get(i-1);
734 matlab_dist = Coxian(mu, phi);
736 elseif isa(jdist, 'jline.lang.processes.Immediate')
737 matlab_dist = Immediate();
738 elseif isa(jdist, 'jline.lang.processes.Disabled')
739 matlab_dist = Disabled();
741 line_error(mfilename,'Distribution not supported by JLINE.');
745 function set_csMatrix(line_node, jnode, jclasses)
746 nClasses = length(line_node.model.
classes);
747 csMatrix = jnode.initClassSwitchMatrix();
750 csMatrix.set(jclasses{i}, jclasses{j}, line_node.server.csFun(i,j,0,0));
753 jnode.setClassSwitchingMatrix(csMatrix);
756 function set_service(line_node, jnode, job_classes)
757 if (isa(line_node,
'Sink') || isa(line_node,
'Router') || isa(line_node,
'Cache') || isa(line_node,
'Logger') || isa(line_node,
'ClassSwitch') || isa(line_node,
'Fork') || isa(line_node,
'Join') || isa(line_node,
'Place') || isa(line_node,
'Transition'))
761 for n = 1 : length(job_classes)
762 if (isa(line_node,
'Queue') || isa(line_node,
'Delay'))
763 matlab_dist = line_node.getService(job_classes{n});
764 elseif (isa(line_node,
'Source'))
765 matlab_dist = line_node.getArrivalProcess(job_classes{n});
767 line_error(mfilename,
'Node not supported by JLINE.');
769 service_dist = JLINE.from_line_distribution(matlab_dist);
771 if (isa(line_node,
'Queue') || isa(line_node,
'Delay'))
772 jnode.setService(jnode.getModel().getClasses().get(n-1), service_dist, line_node.schedStrategyPar(n));
773 elseif (isa(line_node,
'Source'))
774 jnode.setArrival(jnode.getModel().getClasses().get(n-1), service_dist);
779 function set_delayoff(line_node, jnode, job_classes)
780 % Transfer setup and delayoff times from MATLAB Queue to Java Queue
781 if ~isa(line_node, 'Queue')
785 % Check if setupTime property exists and
is not empty
786 if ~isprop(line_node, 'setupTime') || isempty(line_node.setupTime)
790 for n = 1 : length(job_classes)
791 c = job_classes{n}.index;
792 % Check
if both setupTime and delayoffTime are set
for this class
793 if c <= length(line_node.setupTime) && ~isempty(line_node.setupTime{1, c}) && ...
794 c <= length(line_node.delayoffTime) && ~isempty(line_node.delayoffTime{1, c})
795 % Convert MATLAB distributions to Java distributions
796 setup_dist = JLINE.from_line_distribution(line_node.setupTime{1, c});
797 delayoff_dist = JLINE.from_line_distribution(line_node.delayoffTime{1, c});
798 % Set delayoff on the Java Queue
799 jnode.setDelayOff(jnode.getModel().getClasses().get(n-1), setup_dist, delayoff_dist);
804 function set_line_service(jline_node, line_node, job_classes, line_classes)
805 if (isa(line_node,
'Sink')) || isa(line_node,
'ClassSwitch')
808 for n = 1:job_classes.size()
809 if (isa(line_node, 'Queue') || isa(line_node, 'Delay'))
810 jdist = jline_node.getServiceProcess(job_classes.get(n-1));
811 matlab_dist = JLINE.from_jline_distribution(jdist);
812 line_node.setService(line_classes{n}, matlab_dist);
813 elseif (isa(line_node,
'Source'))
814 jdist = jline_node.getArrivalProcess(job_classes.get(n-1));
815 matlab_dist = JLINE.from_jline_distribution(jdist);
816 line_node.setArrival(line_classes{n}, matlab_dist);
817 elseif (isa(line_node,
'Router'))
820 line_error(mfilename,'Node not supported by JLINE.');
825 function node_object = from_line_node(line_node, jnetwork, ~, forkNode, sn)
826 % Handle optional sn argument
830 if isa(line_node,
'Delay')
831 node_object = jline.lang.
nodes.Delay(jnetwork, line_node.getName);
832 elseif isa(line_node, 'Queue')
833 switch line_node.schedStrategy
834 case SchedStrategy.INF
835 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.INF);
836 case SchedStrategy.FCFS
837 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FCFS);
838 case SchedStrategy.LCFS
839 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LCFS);
840 case SchedStrategy.SIRO
841 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.SIRO);
842 case SchedStrategy.SJF
843 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.SJF);
844 case SchedStrategy.LJF
845 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LJF);
846 case SchedStrategy.PS
847 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.PS);
848 case SchedStrategy.DPS
849 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.DPS);
850 case SchedStrategy.GPS
851 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.GPS);
852 case SchedStrategy.SEPT
853 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.SEPT);
854 case SchedStrategy.LEPT
855 node_object = jline.lang.
nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LEPT);
856 case {SchedStrategy.HOL, SchedStrategy.FCFSPRIO}
857 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FCFSPRIO);
858 case SchedStrategy.FORK
859 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FORK);
860 case SchedStrategy.EXT
861 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.EXT);
862 case SchedStrategy.REF
863 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.REF);
864 case SchedStrategy.LCFSPR
865 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LCFSPR);
866 case SchedStrategy.LCFSPI
867 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LCFSPI);
868 case SchedStrategy.LCFSPRIO
869 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LCFSPRIO);
870 case SchedStrategy.LCFSPRPRIO
871 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LCFSPRPRIO);
872 case SchedStrategy.LCFSPIPRIO
873 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LCFSPIPRIO);
874 case SchedStrategy.FCFSPR
875 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FCFSPR);
876 case SchedStrategy.FCFSPI
877 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FCFSPI);
878 case SchedStrategy.FCFSPRPRIO
879 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FCFSPRPRIO);
880 case SchedStrategy.FCFSPIPRIO
881 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FCFSPIPRIO);
882 case SchedStrategy.PSPRIO
883 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.PSPRIO);
884 case SchedStrategy.DPSPRIO
885 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.DPSPRIO);
886 case SchedStrategy.GPSPRIO
887 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.GPSPRIO);
888 case SchedStrategy.POLLING
889 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.POLLING);
890 case SchedStrategy.SRPT
891 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.SRPT);
892 case SchedStrategy.SRPTPRIO
893 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.SRPTPRIO);
894 case SchedStrategy.PSJF
895 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.PSJF);
896 case SchedStrategy.FB
897 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.FB);
898 case SchedStrategy.LRPT
899 node_object = jline.lang.nodes.Queue(jnetwork, line_node.getName, jline.lang.constant.SchedStrategy.LRPT);
901 nservers = line_node.getNumberOfServers;
903 node_object.setNumberOfServers(java.lang.Integer.MAX_VALUE);
905 node_object.setNumberOfServers(line_node.getNumberOfServers);
907 if ~isempty(line_node.lldScaling)
908 node_object.setLoadDependence(JLINE.from_line_matrix(line_node.lldScaling));
910 if ~isempty(line_node.lcdScaling)
912 line_error(mfilename, "Class-dependent models require sn struct for MATLAB-to-JAVA translation.");
914 node_object.setLimitedClassDependence(JLINE.handle_to_serializablefun(line_node.lcdScaling, sn));
916 % Transfer LJD (Limited Joint Dependence) scaling
917 if ~isempty(line_node.ljdScaling) && ~isempty(line_node.ljdCutoffs)
918 jScaling = JLINE.from_line_matrix(line_node.ljdScaling(:));
919 jCutoffs = JLINE.from_line_matrix(line_node.ljdCutoffs(:));
920 node_object.setLimitedJointDependence(jScaling, jCutoffs);
922 % NOTE: LJCD (Limited Joint Class Dependence)
is transferred in
923 % from_line_network after
classes are created
924 % Set queue capacity if finite
925 if ~isinf(line_node.cap)
926 node_object.setCapacity(line_node.cap);
928 elseif isa(line_node, 'Source')
929 node_object = jline.lang.
nodes.Source(jnetwork, line_node.getName);
930 elseif isa(line_node, 'Sink')
931 node_object = jline.lang.
nodes.Sink(jnetwork, line_node.getName);
932 elseif isa(line_node, 'Router')
933 node_object = jline.lang.
nodes.Router(jnetwork, line_node.getName);
934 elseif isa(line_node, 'ClassSwitch')
935 node_object = jline.lang.
nodes.ClassSwitch(jnetwork, line_node.getName);
936 elseif isa(line_node, 'Fork')
937 node_object = jline.lang.
nodes.Fork(jnetwork, line_node.name);
938 node_object.setTasksPerLink(line_node.output.tasksPerLink);
939 elseif isa(line_node, 'Join')
940 node_object = jline.lang.
nodes.Join(jnetwork, line_node.name, forkNode);
941 elseif isa(line_node, 'Logger')
942 node_object = jline.lang.
nodes.Logger(jnetwork, line_node.name, [line_node.filePath,line_node.fileName]);
943 elseif isa(line_node, 'Cache')
944 nitems = line_node.items.nitems;
945 switch line_node.replacestrategy
946 case ReplacementStrategy.RR
947 repStrategy = jline.lang.constant.ReplacementStrategy.RR;
948 case ReplacementStrategy.FIFO
949 repStrategy = jline.lang.constant.ReplacementStrategy.FIFO;
950 case ReplacementStrategy.SFIFO
951 repStrategy = jline.lang.constant.ReplacementStrategy.SFIFO;
952 case ReplacementStrategy.LRU
953 repStrategy = jline.lang.constant.ReplacementStrategy.LRU;
955 if ~isempty(line_node.graph)
956 node_object = jline.lang.
nodes.Cache(jnetwork, line_node.name, nitems, JLINE.from_line_matrix(line_node.itemLevelCap), repStrategy, JLINE.from_line_matrix(line_node.graph));
958 node_object = jline.lang.
nodes.Cache(jnetwork, line_node.name, nitems, JLINE.from_line_matrix(line_node.itemLevelCap), repStrategy);
960 elseif isa(line_node, 'Place')
961 node_object = jline.lang.
nodes.Place(jnetwork, line_node.getName);
962 elseif isa(line_node, 'Transition')
963 node_object = jline.lang.
nodes.Transition(jnetwork, line_node.getName);
964 % Modes are added later in from_line_network after
classes are created
966 line_error(mfilename,'Node not supported by JLINE.');
970 function node_object = from_jline_node(jline_node, model, job_classes)
971 if isa(jline_node, 'jline.lang.
nodes.Delay')
972 node_object = Delay(model, jline_node.getName.toCharArray');
973 elseif isa(jline_node, 'jline.lang.
nodes.Queue')
974 schedStrategy = jline_node.getSchedStrategy;
975 switch schedStrategy.name().toCharArray'
977 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.INF);
979 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.FCFS);
981 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.LCFS);
983 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.SIRO);
985 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.SJF);
987 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.LJF);
989 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.PS);
991 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.DPS);
993 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.GPS);
995 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.SEPT);
997 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.LEPT);
998 case {
'HOL',
'FCFSPRIO'}
999 node_object = Queue(model, jline_node.getName.toCharArray
', SchedStrategy.FCFSPRIO);
1001 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.FORK);
1003 node_object = Queue(model, jline_node.getName.toCharArray
', SchedStrategy.EXT);
1005 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.REF);
1007 node_object = Queue(model, jline_node.getName.toCharArray
', SchedStrategy.LCFSPR);
1009 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.SRPT);
1011 node_object = Queue(model, jline_node.getName.toCharArray
', SchedStrategy.SRPTPRIO);
1013 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.PSJF);
1015 node_object = Queue(model, jline_node.getName.toCharArray
', SchedStrategy.FB);
1017 node_object = Queue(model, jline_node.getName.toCharArray', SchedStrategy.LRPT);
1019 node_object.setNumberOfServers(jline_node.getNumberOfServers);
1020 if ~isempty(JLINE.from_jline_matrix(jline_node.getLimitedLoadDependence))
1021 node_object.setLoadDependence(JLINE.from_jline_matrix(jline_node.getLimitedLoadDependence));
1023 elseif isa(jline_node, 'jline.lang.
nodes.Source')
1024 node_object = Source(model, jline_node.getName.toCharArray');
1025 elseif isa(jline_node, 'jline.lang.
nodes.Sink')
1026 node_object = Sink(model, jline_node.getName.toCharArray');
1027 elseif isa(jline_node, 'jline.lang.
nodes.Router')
1028 node_object = Router(model, jline_node.getName.toCharArray');
1029 elseif isa(jline_node, 'jline.lang.
nodes.ClassSwitch')
1030 nClasses = job_classes.size;
1031 csMatrix = zeros(nClasses, nClasses);
1034 csMatrix(r,s) = jline_node.getServer.applyCsFun(r-1,s-1);
1037 node_object = ClassSwitch(model, jline_node.getName.toCharArray', csMatrix);
1038 elseif isa(jline_node, 'jline.lang.
nodes.Place')
1039 node_object = Place(model, jline_node.getName.toCharArray');
1040 elseif isa(jline_node, 'jline.lang.
nodes.Transition')
1041 node_object = Transition(model, jline_node.getName.toCharArray');
1042 % Note: Mode configurations need to be set after
classes are created
1044 line_error(mfilename,'Node not supported by JLINE.');
1048 function node_class = from_line_class(line_class, jnetwork)
1050 if isa(line_class, 'ClosedSignal')
1051 % ClosedSignal -> jline.lang.ClosedSignal
1052 jSignalType = jline.lang.constant.SignalType.fromID(line_class.signalType);
1053 node_class = jline.lang.ClosedSignal(jnetwork, line_class.getName, jSignalType, jnetwork.getNodeByName(line_class.refstat.getName), line_class.priority);
1054 elseif isa(line_class, 'Signal') || isa(line_class, 'OpenSignal')
1055 % Signal/OpenSignal -> jline.lang.Signal (includes CATASTROPHE type)
1056 jSignalType = jline.lang.constant.SignalType.fromID(line_class.signalType);
1057 node_class = jline.lang.Signal(jnetwork, line_class.getName, jSignalType, line_class.priority);
1058 elseif isa(line_class, 'OpenClass')
1059 node_class = jline.lang.OpenClass(jnetwork, line_class.getName, line_class.priority);
1060 elseif isa(line_class, 'SelfLoopingClass')
1061 node_class = jline.lang.SelfLoopingClass(jnetwork, line_class.getName, line_class.population, jnetwork.getNodeByName(line_class.refstat.getName), line_class.priority);
1062 elseif isa(line_class, 'ClosedClass')
1063 node_class = jline.lang.ClosedClass(jnetwork, line_class.getName, line_class.population, jnetwork.getNodeByName(line_class.refstat.getName), line_class.priority);
1065 line_error(mfilename,'Class type not supported by JLINE.');
1067 if line_class.isReferenceClass()
1068 node_class.setReferenceClass(true);
1072 function node_class = from_jline_class(jclass, model)
1073 if isa(jclass, 'jline.lang.OpenClass')
1074 node_class = OpenClass(model, jclass.getName.toCharArray', jclass.getPriority);
1075 elseif isa(jclass, 'jline.lang.SelfLoopingClass')
1076 node_class = SelfLoopingClass(model, jclass.getName.toCharArray', jclass.getNumberOfJobs, model.getNodeByName(jclass.getReferenceStation.getName), jclass.getPriority);
1077 elseif isa(jclass, 'jline.lang.ClosedClass')
1078 node_class = ClosedClass(model, jclass.getName.toCharArray', jclass.getNumberOfJobs, model.getNodeByName(jclass.getReferenceStation.getName), jclass.getPriority);
1080 line_error(mfilename,'Class type not supported by JLINE.');
1084 function from_line_links(model, jmodel)
1085 connections = model.getConnectionMatrix();
1086 [m, ~] = size(connections);
1087 jnodes = jmodel.getNodes();
1088 jclasses = jmodel.getClasses();
1089 njclasses = jclasses.size();
1090 line_nodes = model.getNodes;
1091 sn = model.getStruct;
1093 % Build mapping from MATLAB node index to Java node index
1094 % (accounting for skipped auto-added ClassSwitch
nodes)
1095 matlab2java_node_idx = zeros(1, length(line_nodes));
1097 for i = 1:length(line_nodes)
1098 if isa(line_nodes{i},
'ClassSwitch') && line_nodes{i}.autoAdded
1099 matlab2java_node_idx(i) = -1; % Mark as skipped
1101 matlab2java_node_idx(i) = jidx;
1107 % [ ] Update to consider different weights/routing
for classes
1108 if isempty(sn.rtorig)
1109 useLinkMethod = false; % this model did not call link()
1111 jrt_matrix = jmodel.initRoutingMatrix();
1112 useLinkMethod = true;
1115 % For models with auto-added ClassSwitch
nodes, use sn.rtorig directly
1116 % to set up routing with proper class switching
1118 for i = 1:length(line_nodes)
1119 if isa(line_nodes{i},
'ClassSwitch') && line_nodes{i}.autoAdded
1125 if useLinkMethod && hasAutoCS
1126 % Use sn.rtorig directly - it contains the full routing with class switching
1127 % sn.rtorig already excludes auto-added ClassSwitch
nodes (it's based on nstations)
1128 % So we iterate over the rtorig matrix dimensions directly
1131 if ~isempty(sn.rtorig{r,s})
1132 Prs = sn.rtorig{r,s};
1133 [nrows, ncols] = size(Prs);
1137 % sn.rtorig uses station indices which
map to non-CS
nodes
1138 % Find the java node indices by matching station index to node
1139 jsrc_idx = i - 1; % Direct mapping since rtorig excludes CS
1141 jrt_matrix.set(jclasses.get(r-1), jclasses.get(s-1), jnodes.get(jsrc_idx), jnodes.get(jdest_idx), Prs(i,j));
1149 % Original logic
for models without
auto-added ClassSwitch
1151 line_node = line_nodes{i};
1153 % Skip
auto-added ClassSwitch
nodes - Java will add them automatically
1154 if isa(line_node, 'ClassSwitch') && line_node.autoAdded
1158 jnode_idx = matlab2java_node_idx(i);
1160 output_strat = line_node.output.outputStrategy{k};
1161 switch RoutingStrategy.fromText(output_strat{2})
1162 case RoutingStrategy.DISABLED
1163 jnodes.get(jnode_idx).setRouting(jclasses.get(k-1),jline.lang.constant.RoutingStrategy.DISABLED);
1164 case RoutingStrategy.RAND
1165 jnodes.get(jnode_idx).setRouting(jclasses.get(k-1),jline.lang.constant.RoutingStrategy.RAND);
1166 outlinks_i=find(connections(i,:));
1168 for j= outlinks_i(:)
'
1169 jdest_idx = matlab2java_node_idx(j);
1171 jmodel.addLink(jnodes.get(jnode_idx), jnodes.get(jdest_idx));
1175 case RoutingStrategy.RROBIN
1176 jnodes.get(jnode_idx).setRouting(jclasses.get(k-1),jline.lang.constant.RoutingStrategy.RROBIN);
1177 outlinks_i=find(connections(i,:))';
1179 line_error(mfilename,
'RROBIN cannot be used together with the link() command.');
1181 for j= outlinks_i(:)
'
1182 jdest_idx = matlab2java_node_idx(j);
1184 jmodel.addLink(jnodes.get(jnode_idx), jnodes.get(jdest_idx));
1187 case RoutingStrategy.WRROBIN
1188 outlinks_i=find(connections(i,:))';
1189 for j= outlinks_i(:)
'
1190 jdest_idx = matlab2java_node_idx(j);
1192 jmodel.addLink(jnodes.get(jnode_idx), jnodes.get(jdest_idx));
1196 line_error(mfilename,'RROBIN cannot be used together with the link() command.
');
1198 for j= 1:length(output_strat{3})
1199 node_target = jmodel.getNodeByName(output_strat{3}{j}{1}.getName());
1200 weight = output_strat{3}{j}{2};
1201 jnodes.get(jnode_idx).setRouting(jclasses.get(k-1),jline.lang.constant.RoutingStrategy.WRROBIN, node_target, weight);
1203 case RoutingStrategy.PROB
1204 outlinks_i=find(connections(i,:));
1205 jnodes.get(jnode_idx).setRouting(jclasses.get(k-1), jline.lang.constant.RoutingStrategy.PROB);
1207 for j= outlinks_i(:)'
1208 jdest_idx = matlab2java_node_idx(j);
1210 jmodel.addLink(jnodes.get(jnode_idx), jnodes.get(jdest_idx));
1214 if length(output_strat) >= 3
1215 probabilities = output_strat{3};
1216 for j = 1:length(probabilities)
1217 dest_idx = probabilities{j}{1}.index;
1218 jdest_idx = matlab2java_node_idx(dest_idx);
1219 if (connections(i, dest_idx) ~= 0) && jdest_idx >= 0
1221 jrt_matrix.set(jclasses.get(k-1), jclasses.get(k-1), jnodes.get(jnode_idx), jnodes.get(jdest_idx), probabilities{j}{2});
1223 jnodes.get(jnode_idx).setProbRouting(jclasses.get(k-1), jnodes.get(jdest_idx), probabilities{j}{2});
1229 line_warning(mfilename, sprintf(
'''%s
'' routing strategy not supported by JLINE, setting as Disabled.\n
',output_strat{2}));
1230 jnodes.get(jnode_idx).setRouting(jclasses.get(k-1),jline.lang.constant.RoutingStrategy.DISABLED);
1236 jmodel.link(jrt_matrix);
1237 % Align the sn.rtorig be the same, treating artificial
1238 % ClassSwitch nodes as if they were explicitly specified
1239 jsn = jmodel.getStruct(true);
1240 rtorig = java.util.HashMap();
1241 if ~isempty(model.sn.rtorig)
1242 if iscell(model.sn.rtorig)
1244 sub_rtorig = java.util.HashMap();
1246 sub_rtorig.put(jclasses.get(s-1), JLINE.from_line_matrix(model.sn.rtorig{r,s}));
1248 rtorig.put(jclasses.get(r-1), sub_rtorig);
1252 jsn.rtorig = rtorig;
1256 function model = from_jline_routing(model, jnetwork)
1257 jnodes = jnetwork.getNodes();
1258 jclasses = jnetwork.getClasses();
1259 %n_classes = jclasses.size();
1260 n_nodes = jnodes.size();
1261 network_nodes = model.getNodes;
1262 network_classes = model.getClasses;
1264 connections = JLINE.from_jline_matrix(jnetwork.getConnectionMatrix());
1265 [row,col] = find(connections);
1267 model.addLink(network_nodes{row(i)},network_nodes{col(i)});
1271 jnode = jnodes.get(n-1);
1272 output_strategies = jnode.getOutputStrategies();
1273 n_strategies = output_strategies.size();
1274 for m = 1 : n_strategies
1275 output_strat = output_strategies.get(m-1);
1276 routing_strat = output_strat.getRoutingStrategy;
1277 routing_strat_classidx = output_strat.getJobClass.getIndex();
1278 switch char(routing_strat)
1280 network_nodes{n}.setRouting(network_classes{routing_strat_classidx}, RoutingStrategy.RAND);
1282 network_nodes{n}.setRouting(network_classes{routing_strat_classidx}, RoutingStrategy.RROBIN);
1284 network_nodes{n}.setRouting(network_classes{routing_strat_classidx}, RoutingStrategy.RROBIN);
1290 function model = from_jline_links(model, jnetwork)
1291 P = model.initRoutingMatrix;
1292 jnodes = jnetwork.getNodes();
1293 jclasses = jnetwork.getClasses();
1294 n_classes = jclasses.size();
1295 n_nodes = jnodes.size();
1298 jnode = jnodes.get(n-1);
1299 output_strategies = jnode.getOutputStrategies();
1300 n_strategies = output_strategies.size();
1301 for m = 1 : n_strategies
1302 output_strat = output_strategies.get(m-1);
1303 dest = output_strat.getDestination();
1304 if~isempty(dest) % disabled strategy
1305 in_idx = jnetwork.getNodeIndex(jnode)+1;
1306 out_idx = jnetwork.getNodeIndex(dest)+1;
1308 P{1}(in_idx,out_idx) = output_strat.getProbability();
1310 strat_class = output_strat.getJobClass();
1311 class_idx = jnetwork.getJobClassIndex(strat_class)+1;
1312 P{class_idx,class_idx}(in_idx,out_idx) = output_strat.getProbability();
1319 %Align the sn.rtorig be the same (Assume Java network is
1320 %created by calling Network.link)
1321 sn = jnetwork.getStruct;
1322 rtorig = cell(n_classes, n_classes);
1325 rtorig{r,s} = JLINE.from_jline_matrix(sn.rtorig.get(jclasses.get(r-1)).get(jclasses.get(s-1)));
1328 model.sn.rtorig = rtorig;
1331 function [jnetwork] = from_line_network(model)
1334 sn = model.getStruct;
1336 jnetwork = jline.lang.Network(model.getName);
1337 line_nodes = model.getNodes;
1338 line_classes = model.getClasses;
1340 jnodes = cell(1,length(line_nodes));
1341 jclasses = cell(1,length(line_classes));
1343 for n = 1 : length(line_nodes)
1344 % Skip auto-added ClassSwitch nodes - Java's link() will add them automatically
1345 if isa(line_nodes{n},
'ClassSwitch') && line_nodes{n}.autoAdded
1348 if isa(line_nodes{n},
'Join')
1349 jnodes{n} = JLINE.from_line_node(line_nodes{n}, jnetwork, line_classes, jnodes{line_nodes{n}.joinOf.index}, sn);
1351 jnodes{n} = JLINE.from_line_node(line_nodes{n}, jnetwork, line_classes, [], sn);
1355 for n = 1 : length(line_classes)
1356 jclasses{n} = JLINE.from_line_class(line_classes{n}, jnetwork);
1359 % Set up forJobClass associations
for signal
classes
1360 for n = 1 : length(line_classes)
1361 if (isa(line_classes{n},
'Signal') || isa(line_classes{n},
'OpenSignal') || isa(line_classes{n},
'ClosedSignal'))
1362 if ~isempty(line_classes{n}.targetJobClass)
1363 targetIdx = line_classes{n}.targetJobClass.index;
1364 jclasses{n}.forJobClass(jclasses{targetIdx});
1369 for n = 1: length(jnodes)
1370 if isempty(jnodes{n})
1371 continue; % Skip
nodes that were not converted (e.g.,
auto-added ClassSwitch)
1373 JLINE.set_service(line_nodes{n}, jnodes{n}, line_classes);
1374 JLINE.set_delayoff(line_nodes{n}, jnodes{n}, line_classes);
1377 % Set drop rules
for stations (after
classes are created)
1378 for n = 1: length(jnodes)
1379 if isempty(jnodes{n})
1380 continue; % Skip
nodes that were not converted
1382 if isa(line_nodes{n},
'Station') && ~isa(line_nodes{n},
'Source')
1383 for r = 1:length(line_classes)
1384 if length(line_nodes{n}.dropRule) >= r && ~isempty(line_nodes{n}.dropRule(r))
1385 dropRule = line_nodes{n}.dropRule(r);
1387 case DropStrategy.DROP
1388 jnodes{n}.setDropRule(jclasses{r}, jline.lang.constant.DropStrategy.Drop);
1389 case DropStrategy.BAS
1390 jnodes{n}.setDropRule(jclasses{r}, jline.lang.constant.DropStrategy.BlockingAfterService);
1391 case DropStrategy.WAITQ
1392 jnodes{n}.setDropRule(jclasses{r}, jline.lang.constant.DropStrategy.WaitingQueue);
1399 % Transfer LJCD (Limited Joint Class Dependence) scaling
for stations
1400 % This must be done after
classes are created since LJCD
is indexed per-class
1401 for n = 1:length(jnodes)
1402 if isempty(jnodes{n})
1405 if isa(line_nodes{n},
'Station') && ~isempty(line_nodes{n}.ljcdScaling) && ~isempty(line_nodes{n}.ljcdCutoffs)
1406 jCutoffs = JLINE.from_line_matrix(line_nodes{n}.ljcdCutoffs(:));
1407 K = length(line_nodes{n}.ljcdScaling);
1408 jScalingMap = java.util.HashMap();
1410 if ~isempty(line_nodes{n}.ljcdScaling{c})
1411 jScalingVec = JLINE.from_line_matrix(line_nodes{n}.ljcdScaling{c}(:));
1412 jScalingMap.put(jclasses{c}, jScalingVec);
1415 jnodes{n}.setLimitedJointClassDependence(jScalingMap, jCutoffs);
1419 % Set polling type and switchover times
for polling queues
1420 for n = 1: length(jnodes)
1421 if isempty(jnodes{n})
1424 if isa(line_nodes{n},
'Queue') && line_nodes{n}.schedStrategy == SchedStrategy.POLLING
1426 if ~isempty(line_nodes{n}.pollingType) && ~isempty(line_nodes{n}.pollingType{1})
1427 pollingType = line_nodes{n}.pollingType{1};
1429 case PollingType.GATED
1430 jPollingType = jline.lang.constant.PollingType.GATED;
1431 case PollingType.EXHAUSTIVE
1432 jPollingType = jline.lang.constant.PollingType.EXHAUSTIVE;
1433 case PollingType.KLIMITED
1434 jPollingType = jline.lang.constant.PollingType.KLIMITED;
1436 if pollingType == PollingType.KLIMITED && ~isempty(line_nodes{n}.pollingPar)
1437 jnodes{n}.setPollingType(jPollingType, int32(line_nodes{n}.pollingPar));
1439 jnodes{n}.setPollingType(jPollingType);
1442 % Set switchover times
1443 if ~isempty(line_nodes{n}.switchoverTime)
1444 for r = 1:length(line_classes)
1445 if length(line_nodes{n}.switchoverTime) >= r && ~isempty(line_nodes{n}.switchoverTime{r})
1446 soTime = line_nodes{n}.switchoverTime{r};
1447 if ~isa(soTime,
'Immediate')
1448 jnodes{n}.setSwitchover(jclasses{r}, JLINE.from_line_distribution(soTime));
1456 for n = 1: length(jnodes)
1457 if isempty(jnodes{n})
1458 continue; % Skip
nodes that were not converted
1460 if isa(line_nodes{n},
"ClassSwitch") && ~line_nodes{n}.autoAdded
1461 % Only set csMatrix
for user-defined ClassSwitch
nodes (not auto-added)
1462 JLINE.set_csMatrix(line_nodes{n}, jnodes{n}, jclasses);
1463 elseif isa(line_nodes{n},
"Join")
1464 jnodes{n}.initJoinJobClasses();
1465 elseif isa(line_nodes{n},
"Cache")
1466 for r = 1 : sn.nclasses
1467 if length(line_nodes{n}.server.hitClass) >= r && ~isempty(line_nodes{n}.server.hitClass(r))
1468 if ~isa(line_nodes{n}.popularity{r},
'Disabled')
1469 jnodes{n}.setRead(jclasses{r}, JLINE.from_line_distribution(line_nodes{n}.popularity{r}));
1470 jnodes{n}.setHitClass(jclasses{r}, jclasses{line_nodes{n}.server.hitClass(r)});
1471 jnodes{n}.setMissClass(jclasses{r}, jclasses{line_nodes{n}.server.missClass(r)});
1475 % Transfer accessProb from MATLAB to Java
1476 if ~isempty(line_nodes{n}.accessProb)
1477 accessProbMat = line_nodes{n}.accessProb;
1478 [K1, K2] = size(accessProbMat);
1479 jAccessProb = javaArray(
'jline.util.matrix.Matrix', K1, K2);
1482 if ~isempty(accessProbMat{k1, k2})
1483 jAccessProb(k1, k2) = JLINE.from_line_matrix(accessProbMat{k1, k2});
1487 jnodes{n}.setAccessProb(jAccessProb);
1489 elseif isa(line_nodes{n},
"Transition")
1490 % First, add modes (must be done after
classes are created)
1491 for m = 1:line_nodes{n}.getNumberOfModes()
1492 modeName = line_nodes{n}.modeNames{m};
1493 jmode = jnodes{n}.addMode(modeName);
1494 % Set timing strategy
1495 switch line_nodes{n}.timingStrategies(m)
1496 case TimingStrategy.TIMED
1497 jnodes{n}.setTimingStrategy(jmode, jline.lang.constant.TimingStrategy.TIMED);
1498 case TimingStrategy.IMMEDIATE
1499 jnodes{n}.setTimingStrategy(jmode, jline.lang.constant.TimingStrategy.IMMEDIATE);
1502 jnodes{n}.setDistribution(jmode, JLINE.from_line_distribution(line_nodes{n}.distributions{m}));
1503 % Set firing weights and priorities
1504 jnodes{n}.setFiringWeights(jmode, line_nodes{n}.firingWeights(m));
1505 jnodes{n}.setFiringPriorities(jmode, int32(line_nodes{n}.firingPriorities(m)));
1506 % Set number of servers
1507 jnodes{n}.setNumberOfServers(jmode, java.lang.Integer(line_nodes{n}.numberOfServers(m)));
1509 % Now set enabling conditions, inhibiting conditions, and firing outcomes
1510 jmodes = jnodes{n}.getModes();
1511 for m = 1:line_nodes{n}.getNumberOfModes()
1512 jmode = jmodes.get(m-1);
1513 enabCond = line_nodes{n}.enablingConditions{m};
1514 inhibCond = line_nodes{n}.inhibitingConditions{m};
1515 firingOut = line_nodes{n}.firingOutcomes{m};
1516 for r = 1:sn.nclasses
1517 for i = 1:length(line_nodes)
1518 % Set enabling conditions
1519 if enabCond(i, r) > 0 && isa(line_nodes{i},
'Place')
1520 jnodes{n}.setEnablingConditions(jmode, jclasses{r}, jnodes{i}, enabCond(i, r));
1522 % Set inhibiting conditions
1523 if inhibCond(i, r) < Inf && isa(line_nodes{i},
'Place')
1524 jnodes{n}.setInhibitingConditions(jmode, jclasses{r}, jnodes{i}, inhibCond(i, r));
1526 % Set firing outcomes
1527 if firingOut(i, r) ~= 0
1528 jnodes{n}.setFiringOutcome(jmode, jclasses{r}, jnodes{i}, firingOut(i, r));
1536 % Assume JLINE and LINE network are both created via link
1537 JLINE.from_line_links(model, jnetwork);
1539 % Transfer finite capacity regions from MATLAB to Java
1540 if ~isempty(model.regions)
1541 for f = 1:length(model.regions)
1542 fcr = model.regions{f};
1543 % Convert MATLAB node list to Java list
1544 javaNodeList = java.util.ArrayList();
1545 for i = 1:length(fcr.nodes)
1546 matlabNode = fcr.
nodes{i};
1547 % Find corresponding Java node by name
1548 nodeName = matlabNode.getName();
1549 for j = 1:length(line_nodes)
1550 if strcmp(line_nodes{j}.getName(), nodeName) && ~isempty(jnodes{j})
1551 javaNodeList.add(jnodes{j});
1557 jfcr = jnetwork.addRegion(javaNodeList);
1558 % Set global max jobs
1559 if fcr.globalMaxJobs > 0 && ~isinf(fcr.globalMaxJobs)
1560 jfcr.setGlobalMaxJobs(fcr.globalMaxJobs);
1562 % Set per-class max jobs and drop rules
1563 for r = 1:length(line_classes)
1564 if length(fcr.classMaxJobs) >= r && fcr.classMaxJobs(r) > 0 && ~isinf(fcr.classMaxJobs(r))
1565 jfcr.setClassMaxJobs(jclasses{r}, fcr.classMaxJobs(r));
1567 if length(fcr.dropRule) >= r
1568 % Convert MATLAB DropStrategy numeric to Java DropStrategy
enum
1569 jDropStrategy = jline.lang.constant.DropStrategy.fromID(fcr.dropRule(r));
1570 jfcr.setDropRule(jclasses{r}, jDropStrategy);
1576 jnetwork.initDefault;
1577 for n = 1: length(line_nodes)
1578 if isempty(jnodes{n})
1579 continue; % Skip
nodes that were not converted
1581 if line_nodes{n}.isStateful
1582 jnodes{n}.setState(JLINE.from_line_matrix(line_nodes{n}.getState));
1583 jnodes{n}.setStateSpace(JLINE.from_line_matrix(line_nodes{n}.getStateSpace));
1584 jnodes{n}.setStatePrior(JLINE.from_line_matrix(line_nodes{n}.getStatePrior));
1587 % Force
struct refresh so sn.state reflects updated node states
1588 jnetwork.setHasStruct(
false);
1592 function jnetwork = line_to_jline(model)
1593 jnetwork = LINE2JLINE(model);
1596 function model = jline_to_line(jnetwork)
1597 if isa(jnetwork,
'JNetwork')
1598 jnetwork = jnetwork.obj;
1600 %javaaddpath(jar_loc);
1601 model = Network(
char(jnetwork.getName));
1602 network_nodes = jnetwork.getNodes;
1603 job_classes = jnetwork.getClasses;
1605 line_nodes = cell(network_nodes.size,1);
1606 line_classes = cell(job_classes.size,1);
1609 for n = 1 : network_nodes.size
1610 if ~isa(network_nodes.get(n-1), 'jline.lang.
nodes.ClassSwitch')
1611 line_nodes{n} = JLINE.from_jline_node(network_nodes.get(n-1), model, job_classes);
1615 for n = 1 : job_classes.size
1616 line_classes{n} = JLINE.from_jline_class(job_classes.get(n-1), model);
1619 for n = 1 : network_nodes.size
1620 if isa(network_nodes.get(n-1),
'jline.lang.nodes.ClassSwitch')
1621 line_nodes{n} = JLINE.from_jline_node(network_nodes.get(n-1), model, job_classes);
1625 for n = 1 : network_nodes.size
1626 JLINE.set_line_service(network_nodes.get(n-1), line_nodes{n}, job_classes, line_classes);
1629 if ~isempty(jnetwork.getStruct.rtorig)
1631 model = JLINE.from_jline_links(model, jnetwork);
1633 % Do not use link() method
1634 model = JLINE.from_jline_routing(model, jnetwork);
1638 function matrix = arraylist_to_matrix(jline_matrix)
1639 if isempty(jline_matrix)
1642 matrix = zeros(jline_matrix.size(), 1);
1643 for row = 1:jline_matrix.size()
1644 matrix(row, 1) = jline_matrix.get(row-1);
1649 function matrix = from_jline_matrix(jline_matrix)
1650 if isempty(jline_matrix)
1653 matrix = zeros(jline_matrix.getNumRows(), jline_matrix.getNumCols());
1654 for row = 1:jline_matrix.getNumRows()
1655 for col = 1:jline_matrix.getNumCols()
1656 val = jline_matrix.get(row-1, col-1);
1657 if (val >= 33333333 && val <= 33333334)
1658 matrix(row, col) = GlobalConstants.Immediate;
1659 elseif (val >= -33333334 && val <= -33333333)
1660 matrix(row, col) = -GlobalConstants.Immediate;
1661 elseif (val >= 2147483647 - 1) % Integer.MAX_VALUE with -1 tolerance
1662 matrix(row, col) = Inf;
1663 elseif (val <= -2147483648 + 1) % Integer.MIN_VALUE with +1 tolerance
1664 matrix(row, col) = -Inf;
1666 matrix(row, col) = val;
1673 function jline_matrix = from_line_matrix(matrix)
1674 [rows, cols] = size(matrix);
1675 jline_matrix = jline.util.matrix.Matrix(rows, cols);
1678 if matrix(row,col) ~= 0
1679 jline_matrix.set(row-1, col-1, matrix(row, col));
1685 function lsn = from_jline_struct_layered(jlayerednetwork, jlsn)
1686 lsn = LayeredNetworkStruct();
1687 lsn.nidx= jlsn.nidx;
1688 lsn.nhosts= jlsn.nhosts;
1689 lsn.ntasks= jlsn.ntasks;
1690 lsn.nentries= jlsn.nentries;
1691 lsn.nacts= jlsn.nacts;
1692 lsn.ncalls= jlsn.ncalls;
1693 lsn.hshift= jlsn.hshift;
1694 lsn.tshift= jlsn.tshift;
1695 lsn.eshift= jlsn.eshift;
1696 lsn.ashift= jlsn.ashift;
1697 lsn.cshift= jlsn.cshift;
1699 lsn.tasksof{h,1} = JLINE.arraylist_to_matrix(jlsn.tasksof.get(uint32(h)))
';
1702 lsn.entriesof{lsn.tshift+t,1} = JLINE.arraylist_to_matrix(jlsn.entriesof.get(uint32(jlsn.tshift+t)))';
1704 for t=1:(jlsn.ntasks+jlsn.nentries)
1705 lsn.actsof{lsn.tshift+t,1} = JLINE.arraylist_to_matrix(jlsn.actsof.get(uint32(jlsn.tshift+t)))';
1708 lsn.callsof{lsn.ashift+a,1} = JLINE.arraylist_to_matrix(jlsn.callsof.get(uint32(jlsn.ashift+a)))';
1710 for i = 1:jlsn.sched.size
1711 lsn.sched(i,1) = SchedStrategy.(char(jlsn.sched.get(uint32(i))));
1713 for i = 1:jlsn.names.size
1714 lsn.names{i,1} = jlsn.names.get(uint32(i));
1715 lsn.hashnames{i,1} = jlsn.hashnames.get(uint32(i));
1717 lsn.mult = JLINE.from_jline_matrix(jlsn.mult);
1718 lsn.mult = lsn.mult(2:(lsn.eshift+1))
'; % remove 0-padding
1719 lsn.maxmult = JLINE.from_jline_matrix(jlsn.maxmult);
1720 lsn.maxmult = lsn.maxmult(2:(lsn.eshift+1))'; % remove 0-padding
1722 lsn.repl = JLINE.from_jline_matrix(jlsn.repl)';
1723 lsn.repl = lsn.repl(2:end); % remove 0-padding
1724 lsn.type = JLINE.from_jline_matrix(jlsn.type)';
1725 lsn.type = lsn.type(2:end); % remove 0-padding
1726 lsn.parent = JLINE.from_jline_matrix(jlsn.parent);
1727 lsn.parent = lsn.parent(2:end); % remove 0-padding
1728 lsn.nitems = JLINE.from_jline_matrix(jlsn.nitems);
1729 % Ensure proper column vector format matching MATLAB
's (nhosts+ntasks+nentries) x 1
1730 if isrow(lsn.nitems)
1731 lsn.nitems = lsn.nitems(2:end)'; % remove 0-padding and transpose
1733 lsn.nitems = lsn.nitems(2:end); % remove 0-padding (already column)
1735 % Ensure correct size
1736 expectedSize = lsn.nhosts + lsn.ntasks + lsn.nentries;
1737 if length(lsn.nitems) < expectedSize
1738 lsn.nitems(expectedSize,1) = 0;
1739 elseif length(lsn.nitems) > expectedSize
1740 lsn.nitems = lsn.nitems(1:expectedSize);
1742 lsn.replacestrat = JLINE.from_jline_matrix(jlsn.replacestrat);
1743 lsn.replacestrat = lsn.replacestrat(2:end)
'; % remove 0-padding
1744 for i = 1:jlsn.callnames.size
1745 lsn.callnames{i,1} = jlsn.callnames.get(uint32(i));
1746 lsn.callhashnames{i,1} = jlsn.callhashnames.get(uint32(i));
1748 for i = 1:jlsn.calltype.size % calltype may be made into a matrix in Java
1749 ct = char(jlsn.calltype.get(uint32(i)));
1750 lsn.calltype(i) = CallType.(ct);
1752 lsn.calltype = sparse(lsn.calltype'); % remove 0-padding
1753 lsn.callpair = JLINE.from_jline_matrix(jlsn.callpair);
1754 lsn.callpair = lsn.callpair(2:end,2:end); % remove 0-paddings
1755 if isempty(lsn.callpair)
1758 lsn.actpretype = sparse(JLINE.from_jline_matrix(jlsn.actpretype)
');
1759 lsn.actpretype = lsn.actpretype(2:end); % remove 0-padding
1760 lsn.actposttype = sparse(JLINE.from_jline_matrix(jlsn.actposttype)');
1761 lsn.actposttype = lsn.actposttype(2:end); % remove 0-padding
1762 lsn.graph = JLINE.from_jline_matrix(jlsn.graph);
1763 lsn.graph = lsn.graph(2:end,2:end); % remove 0-paddings
1764 lsn.dag = JLINE.from_jline_matrix(jlsn.dag);
1765 lsn.dag = lsn.dag(2:end,2:end); % remove 0-paddings
1766 lsn.taskgraph = JLINE.from_jline_matrix(jlsn.taskgraph);
1767 lsn.taskgraph = sparse(lsn.taskgraph(2:end,2:end)); % remove 0-paddings
1768 lsn.replygraph = JLINE.from_jline_matrix(jlsn.replygraph);
1769 lsn.replygraph = logical(lsn.replygraph(2:end,2:end)); % remove 0-paddings
1770 lsn.iscache = JLINE.from_jline_matrix(jlsn.iscache);
1771 % Ensure proper column vector format matching MATLAB
's (nhosts+ntasks) x 1
1772 expectedCacheSize = lsn.nhosts + lsn.ntasks;
1773 if isrow(lsn.iscache)
1774 if length(lsn.iscache) > expectedCacheSize
1775 lsn.iscache = lsn.iscache(2:(expectedCacheSize+1))'; % remove 0-padding and transpose
1777 lsn.iscache = lsn.iscache'; % just transpose
1780 % Ensure correct size
1781 if length(lsn.iscache) < expectedCacheSize
1782 lsn.iscache(expectedCacheSize,1) = 0;
1783 elseif length(lsn.iscache) > expectedCacheSize
1784 lsn.iscache = lsn.iscache(1:expectedCacheSize);
1786 lsn.iscaller = JLINE.from_jline_matrix(jlsn.iscaller);
1787 lsn.iscaller = full(lsn.iscaller(2:end,2:end)); % remove 0-paddings
1788 lsn.issynccaller = JLINE.from_jline_matrix(jlsn.issynccaller);
1789 lsn.issynccaller = full(lsn.issynccaller(2:end,2:end)); % remove 0-paddings
1790 lsn.isasynccaller = JLINE.from_jline_matrix(jlsn.isasynccaller);
1791 lsn.isasynccaller = full(lsn.isasynccaller(2:end,2:end)); % remove 0-paddings
1792 lsn.isref = JLINE.from_jline_matrix(jlsn.isref);
1793 lsn.isref = lsn.isref(2:end)
'; % remove 0-paddings
1796 function sn = from_jline_struct(jnetwork, jsn)
1797 %lst and rtfun are not implemented
1798 %Due to the transformation of Java lambda to matlab function
1800 jsn = jnetwork.getStruct(false);
1802 jclasses = jnetwork.getClasses();
1803 jnodes = jnetwork.getNodes();
1804 jstateful = jnetwork.getStatefulNodes();
1805 jstations = jnetwork.getStations();
1806 sn = NetworkStruct();
1808 sn.nnodes = jsn.nnodes;
1809 sn.nclasses = jsn.nclasses;
1810 sn.nclosedjobs = jsn.nclosedjobs;
1811 sn.nstations = jsn.nstations;
1812 sn.nstateful = jsn.nstateful;
1813 sn.nchains = jsn.nchains;
1815 sn.refstat = JLINE.from_jline_matrix(jsn.refstat) + 1;
1816 sn.njobs = JLINE.from_jline_matrix(jsn.njobs);
1817 sn.nservers = JLINE.from_jline_matrix(jsn.nservers);
1818 sn.connmatrix = JLINE.from_jline_matrix(jsn.connmatrix);
1819 % Fix for Java getConnectionMatrix bug: ensure connmatrix is nnodes x nnodes
1820 if size(sn.connmatrix,1) < sn.nnodes
1821 sn.connmatrix(sn.nnodes,1) = 0;
1823 if size(sn.connmatrix,2) < sn.nnodes
1824 sn.connmatrix(1,sn.nnodes) = 0;
1826 sn.scv = JLINE.from_jline_matrix(jsn.scv);
1827 sn.isstation = logical(JLINE.from_jline_matrix(jsn.isstation));
1828 sn.isstateful = logical(JLINE.from_jline_matrix(jsn.isstateful));
1829 sn.isstatedep = logical(JLINE.from_jline_matrix(jsn.isstatedep));
1830 sn.nodeToStateful = JLINE.from_jline_matrix(jsn.nodeToStateful)+1;
1831 sn.nodeToStateful(sn.nodeToStateful==0) = nan;
1832 sn.nodeToStation = JLINE.from_jline_matrix(jsn.nodeToStation)+1;
1833 sn.nodeToStation(sn.nodeToStation==0) = nan;
1834 sn.stationToNode = JLINE.from_jline_matrix(jsn.stationToNode)+1;
1835 sn.stationToNode(sn.stationToNode==0) = nan;
1836 sn.stationToStateful = JLINE.from_jline_matrix(jsn.stationToStateful)+1;
1837 sn.stationToStateful(sn.stationToStateful==0) = nan;
1838 sn.statefulToStation = JLINE.from_jline_matrix(jsn.statefulToStation)+1;
1839 sn.statefulToStation(sn.statefulToStation==0) = nan;
1840 sn.statefulToNode = JLINE.from_jline_matrix(jsn.statefulToNode)+1;
1841 sn.statefulToNode(sn.statefulToNode==0) = nan;
1842 sn.rates = JLINE.from_jline_matrix(jsn.rates);
1843 sn.fj = JLINE.from_jline_matrix(jsn.fj);
1844 sn.classprio = JLINE.from_jline_matrix(jsn.classprio);
1845 sn.phases = JLINE.from_jline_matrix(jsn.phases);
1846 sn.phasessz = JLINE.from_jline_matrix(jsn.phasessz);
1847 sn.phaseshift = JLINE.from_jline_matrix(jsn.phaseshift);
1848 sn.schedparam = JLINE.from_jline_matrix(jsn.schedparam);
1849 sn.chains = logical(JLINE.from_jline_matrix(jsn.chains));
1850 sn.rt = JLINE.from_jline_matrix(jsn.rt);
1851 sn.nvars = JLINE.from_jline_matrix(jsn.nvars);
1852 sn.rtnodes = JLINE.from_jline_matrix(jsn.rtnodes);
1853 sn.csmask = logical(JLINE.from_jline_matrix(jsn.csmask));
1854 sn.isslc = logical(JLINE.from_jline_matrix(jsn.isslc));
1855 sn.cap = JLINE.from_jline_matrix(jsn.cap);
1856 sn.classcap = JLINE.from_jline_matrix(jsn.classcap);
1857 sn.refclass = JLINE.from_jline_matrix(jsn.refclass)+1;
1858 sn.lldscaling = JLINE.from_jline_matrix(jsn.lldscaling);
1860 if ~isempty(jsn.cdscaling) && jsn.cdscaling.size() > 0
1861 % Convert Java SerializableFunction to MATLAB function handles
1862 sn.cdscaling = cell(sn.nstations, 1);
1863 % Iterate through the map entries to handle null values properly
1864 entrySet = jsn.cdscaling.entrySet();
1865 entryIter = entrySet.iterator();
1866 stationFunMap = containers.Map();
1867 while entryIter.hasNext()
1868 entry = entryIter.next();
1869 stationName = char(entry.getKey().getName());
1871 jfun = entry.getValue();
1873 stationFunMap(stationName) = jfun;
1876 % getValue() returns null for default lambda functions
1877 % Skip and use default value
1880 % Assign functions to stations
1881 for i = 1:sn.nstations
1882 jstation = jstations.get(i-1);
1883 stationName = char(jstation.getName());
1884 if isKey(stationFunMap, stationName)
1885 jfun = stationFunMap(stationName);
1886 % Create a MATLAB function handle that calls the Java apply() method
1887 sn.cdscaling{i} = @(ni) JLINE.call_java_cdscaling(jfun, ni);
1889 sn.cdscaling{i} = @(ni) 1;
1893 sn.cdscaling = cell(sn.nstations, 0);
1896 if ~isempty(jsn.nodetype)
1897 sn.nodetype = zeros(sn.nnodes, 1);
1898 for i = 1:jsn.nodetype.size
1899 nodetype = jsn.nodetype.get(i-1);
1900 switch nodetype.name().toCharArray'
1902 sn.nodetype(i) = NodeType.Queue;
1904 sn.nodetype(i) = NodeType.Delay;
1906 sn.nodetype(i) = NodeType.Source;
1908 sn.nodetype(i) = NodeType.Sink;
1910 sn.nodetype(i) = NodeType.Join;
1912 sn.nodetype(i) = NodeType.Fork;
1914 sn.nodetype(i) = NodeType.ClassSwitch;
1916 sn.nodetype(i) = NodeType.Logger;
1918 sn.nodetype(i) = NodeType.Cache;
1920 sn.nodetype(i) = NodeType.Place;
1922 sn.nodetype(i) = NodeType.Transition;
1924 sn.nodetype(i) = NodeType.Router;
1931 if ~isempty(jsn.classnames)
1932 for i = 1:jsn.classnames.size
1933 sn.classnames(i,1) = jsn.classnames.get(i-1);
1939 if ~isempty(jsn.nodenames)
1940 for i = 1:jsn.nodenames.size
1941 sn.nodenames(i,1) = jsn.nodenames.get(i-1);
1947 if ~isempty(jsn.rtorig) && jsn.rtorig.size()>0
1948 sn.rtorig = cell(sn.nclasses, sn.nclasses);
1949 for r = 1:sn.nclasses
1950 for s = 1:sn.nclasses
1951 sn.rtorig{r,s} = JLINE.from_jline_matrix(jsn.rtorig.get(jclasses.get(r-1)).get(jclasses.get(s-1)));
1958 if ~isempty(jsn.state)
1959 sn.state = cell(sn.nstateful, 1);
1960 for i = 1:sn.nstateful
1961 sn.state{i} = JLINE.from_jline_matrix(jstateful.get(i-1).getState());
1967 if ~isempty(jsn.stateprior)
1968 sn.stateprior = cell(sn.nstateful, 1);
1969 for i = 1:sn.nstateful
1970 sn.stateprior{i} = JLINE.from_jline_matrix(jstateful.get(i-1).getStatePrior());
1976 if ~isempty(jsn.space)
1977 sn.space = cell(sn.nstateful, 1);
1978 for i = 1:sn.nstateful
1979 sn.space{i} = JLINE.from_jline_matrix(jstateful.get(i-1).getStateSpace());
1985 if ~isempty(jsn.routing)
1986 sn.routing = zeros(sn.nnodes, sn.nclasses);
1988 for j = 1:sn.nclasses
1989 routingStrategy = jsn.routing.get(jnodes.get(i-1)).get(jclasses.get(j-1));
1990 switch routingStrategy.name().toCharArray'
1992 sn.routing(i,j) = RoutingStrategy.PROB;
1994 sn.routing(i,j) = RoutingStrategy.RAND;
1996 sn.routing(i,j) = RoutingStrategy.RROBIN;
1998 sn.routing(i,j) = RoutingStrategy.WRROBIN;
2000 sn.routing(i,j) = RoutingStrategy.JSQ;
2002 sn.routing(i,j) = RoutingStrategy.DISABLED;
2004 sn.routing(i,j) = RoutingStrategy.FIRING;
2006 sn.routing(i,j) = RoutingStrategy.KCHOICES;
2014 if ~isempty(jsn.procid)
2015 sn.procid = nan(sn.nstations, sn.nclasses); % Initialize with NaN to match MATLAB behavior
2016 for i = 1:sn.nstations
2017 for j = 1:sn.nclasses
2018 stationMap = jsn.procid.get(jstations.get(i-1));
2019 if isempty(stationMap)
2020 sn.procid(i,j) = ProcessType.DISABLED;
2023 processType = stationMap.get(jclasses.get(j-1));
2024 if isempty(processType)
2025 sn.procid(i,j) = ProcessType.DISABLED;
2028 switch processType.name.toCharArray'
2030 sn.procid(i,j) = ProcessType.EXP;
2032 sn.procid(i,j) = ProcessType.ERLANG;
2034 sn.procid(i,j) = ProcessType.HYPEREXP;
2036 sn.procid(i,j) = ProcessType.PH;
2038 sn.procid(i,j) = ProcessType.APH;
2040 sn.procid(i,j) = ProcessType.MAP;
2042 sn.procid(i,j) = ProcessType.UNIFORM;
2044 sn.procid(i,j) = ProcessType.DET;
2046 sn.procid(i,j) = ProcessType.COXIAN;
2048 sn.procid(i,j) = ProcessType.GAMMA;
2050 sn.procid(i,j) = ProcessType.PARETO;
2052 sn.procid(i,j) = ProcessType.WEIBULL;
2054 sn.procid(i,j) = ProcessType.LOGNORMAL;
2056 sn.procid(i,j) = ProcessType.MMPP2;
2058 sn.procid(i,j) = ProcessType.REPLAYER;
2060 sn.procid(i,j) = ProcessType.TRACE;
2062 sn.procid(i,j) = ProcessType.IMMEDIATE;
2064 sn.procid(i,j) = ProcessType.DISABLED;
2066 sn.procid(i,j) = ProcessType.COX2;
2068 sn.procid(i,j) = ProcessType.BMAP;
2070 sn.procid(i,j) = ProcessType.ME;
2072 sn.procid(i,j) = ProcessType.RAP;
2074 sn.procid(i,j) = ProcessType.BINOMIAL;
2076 sn.procid(i,j) = ProcessType.POISSON;
2078 sn.procid(i,j) = ProcessType.GEOMETRIC;
2080 sn.procid(i,j) = ProcessType.DUNIFORM;
2082 sn.procid(i,j) = ProcessType.BERNOULLI;
2084 sn.procid(i,j) = ProcessType.PRIOR;
2086 % Unknown ProcessType - default to DISABLED
2087 sn.procid(i,j) = ProcessType.DISABLED;
2096 sn.mu = cell(sn.nstations, 1);
2097 for i = 1:sn.nstations
2098 sn.mu{i} = cell(1, sn.nclasses);
2099 for j = 1:sn.nclasses
2100 sn.mu{i}{j} = JLINE.from_jline_matrix(jsn.mu.get(jstations.get(i-1)).get(jclasses.get(j-1)));
2107 if ~isempty(jsn.phi)
2108 sn.phi = cell(sn.nstations, 1);
2109 for i = 1:sn.nstations
2110 sn.phi{i} = cell(1, sn.nclasses);
2111 for j = 1:sn.nclasses
2112 sn.phi{i}{j} = JLINE.from_jline_matrix(jsn.phi.get(jstations.get(i-1)).get(jclasses.get(j-1)));
2119 if ~isempty(jsn.proc)
2120 sn.proc = cell(sn.nstations, 1);
2121 for i = 1:sn.nstations
2122 sn.proc{i} = cell(1, sn.nclasses);
2123 for j = 1:sn.nclasses
2124 proc_i_j = jsn.proc.get(jstations.get(i-1)).get(jclasses.get(j-1));
2125 sn.proc{i}{j} = cell(1, proc_i_j.size);
2126 for k = 1:proc_i_j.size
2127 sn.proc{i}{j}{k} = JLINE.from_jline_matrix(proc_i_j.get(uint32(k-1)));
2135 if ~isempty(jsn.pie)
2136 sn.pie = cell(sn.nstations, 1);
2137 for i = 1:sn.nstations
2138 sn.pie{i} = cell(1, sn.nclasses);
2139 for j = 1:sn.nclasses
2140 sn.pie{i}{j} = JLINE.from_jline_matrix(jsn.pie.get(jstations.get(i-1)).get(jclasses.get(j-1)));
2147 if ~isempty(jsn.sched)
2148 sn.sched = zeros(sn.nstations, 1);
2149 for i = 1:sn.nstations
2150 schedStrategy = jsn.sched.get(jstations.get(i-1));
2151 switch schedStrategy.name.toCharArray'
2153 sn.sched(i) = SchedStrategy.INF;
2155 sn.sched(i) = SchedStrategy.FCFS;
2157 sn.sched(i) = SchedStrategy.LCFS;
2159 sn.sched(i) = SchedStrategy.LCFSPR;
2161 sn.sched(i) = SchedStrategy.SIRO;
2163 sn.sched(i) = SchedStrategy.SJF;
2165 sn.sched(i) = SchedStrategy.LJF;
2167 sn.sched(i) = SchedStrategy.PS;
2169 sn.sched(i) = SchedStrategy.DPS;
2171 sn.sched(i) = SchedStrategy.GPS;
2173 sn.sched(i) = SchedStrategy.PSPRIO;
2175 sn.sched(i) = SchedStrategy.DPSPRIO;
2177 sn.sched(i) = SchedStrategy.GPSPRIO;
2179 sn.sched(i) = SchedStrategy.SEPT;
2181 sn.sched(i) = SchedStrategy.LEPT;
2182 case {
'HOL',
'FCFSPRIO'}
2183 sn.sched(i) = SchedStrategy.FCFSPRIO;
2185 sn.sched(i) = SchedStrategy.FORK;
2187 sn.sched(i) = SchedStrategy.EXT;
2189 sn.sched(i) = SchedStrategy.REF;
2196 if ~isempty(jsn.inchain)
2197 sn.inchain = cell(1, sn.nchains);
2198 for i = 1:sn.nchains
2199 sn.inchain{1,i} = JLINE.from_jline_matrix(jsn.inchain.get(uint32(i-1)))+1;
2205 if ~isempty(jsn.visits)
2206 sn.
visits = cell(sn.nchains, 1);
2207 for i = 1:sn.nchains
2208 sn.
visits{i,1} = JLINE.from_jline_matrix(jsn.visits.get(uint32(i-1)));
2214 if ~isempty(jsn.nodevisits)
2216 for i = 1:sn.nchains
2217 sn.
nodevisits{1,i} = JLINE.from_jline_matrix(jsn.nodevisits.get(uint32(i-1)));
2223 if ~isempty(jsn.droprule)
2224 sn.droprule = zeros(sn.nstations, sn.nclasses);
2225 for i = 1:sn.nstations
2226 for j = 1:sn.nclasses
2227 dropStrategy = jsn.droprule.get(jstations.get(i-1)).get(jclasses.get(j-1));
2228 switch dropStrategy.name.toCharArray'
2230 sn.droprule(i,j) = DropStrategy.WAITQ;
2232 sn.droprule(i,j) = DropStrategy.DROP;
2233 case 'BlockingAfterService'
2234 sn.droprule(i,j) = DropStrategy.BAS;
2242 if ~isempty(jsn.nodeparam)
2243 sn.nodeparam = cell(sn.nnodes, 1);
2246 jnode = jnodes.get(i-1);
2247 jparam = jsn.nodeparam.get(jnode);
2250 % sn.nodeparam{i} = [];
2255 if isa(jparam,
'jline.lang.nodeparam.StationNodeParam')
2256 if ~isempty(jparam.fileName)
2257 sn.nodeparam{i}.fileName = cell(1, sn.nclasses);
2258 for r = 1:sn.nclasses
2259 fname = jparam.fileName.get(r-1);
2261 sn.nodeparam{i}.fileName{r} = char(fname);
2267 % TransitionNodeParam
2268 if isa(jparam,
'jline.lang.nodeparam.TransitionNodeParam')
2269 if ~isempty(jparam.firingprocid)
2270 sn.nodeparam{i}.firingprocid = containers.Map(
'KeyType',
'char',
'ValueType',
'any');
2271 keys = jparam.firingprocid.keySet.iterator;
2274 proc = jparam.firingprocid.get(key);
2275 sn.nodeparam{i}.firingprocid(
char(key.toString)) = char(proc.toString);
2278 if ~isempty(jparam.firingphases)
2279 sn.nodeparam{i}.firingphases = JLINE.from_jline_matrix(jparam.firingphases);
2281 if ~isempty(jparam.fireweight)
2282 sn.nodeparam{i}.fireweight = JLINE.from_jline_matrix(jparam.fireweight);
2287 if isa(jparam,
'jline.lang.nodeparam.JoinNodeParam')
2288 if ~isempty(jparam.joinStrategy)
2289 sn.nodeparam{i}.joinStrategy = cell(1, sn.nclasses);
2290 sn.nodeparam{i}.fanIn = cell(1, sn.nclasses);
2291 for r = 1:sn.nclasses
2292 jclass = jclasses.get(r-1);
2293 joinStrategy = jparam.joinStrategy.get(jclass);
2294 if ~isempty(joinStrategy)
2295 strategyStr = char(joinStrategy.name.toString);
2298 sn.nodeparam{i}.joinStrategy{r} = JoinStrategy.STD;
2300 sn.nodeparam{i}.joinStrategy{r} = JoinStrategy.PARTIAL;
2302 sn.nodeparam{i}.joinStrategy{r} = strategyStr;
2304 sn.nodeparam{i}.fanIn{r} = jparam.fanIn.get(jclass);
2311 if isa(jparam,
'jline.lang.nodeparam.RoutingNodeParam')
2312 for r = 1:sn.nclasses
2313 jclass = jclasses.get(r-1);
2315 if ~isempty(jparam.weights) && jparam.weights.containsKey(jclass)
2316 sn.nodeparam{i}.weights{r} = JLINE.from_jline_matrix(jparam.weights.get(jclass));
2319 if ~isempty(jparam.outlinks) && jparam.outlinks.containsKey(jclass)
2320 sn.nodeparam{i}.outlinks{r} = JLINE.from_jline_matrix(jparam.outlinks.get(jclass));
2326 if isa(jparam,
'jline.lang.nodeparam.ForkNodeParam')
2327 if ~isnan(jparam.fanOut)
2328 sn.nodeparam{i}.fanOut = jparam.fanOut;
2333 if isa(jparam,
'jline.lang.nodeparam.CacheNodeParam')
2335 if ~isnan(jparam.nitems)
2336 sn.nodeparam{i}.nitems = jparam.nitems;
2340 if ~isempty(jparam.accost)
2341 % For Java 2D arrays (Matrix[][]), size(arr,2) returns 1 in MATLAB
2342 % We need to get length of first row to get actual second dimension
2343 K1 = size(jparam.accost, 1);
2345 firstRow = jparam.accost(1); % Get first row (Java array)
2346 K2 = length(firstRow);
2350 sn.nodeparam{i}.accost = cell(K1, K2);
2353 mat = jparam.accost(k1, k2); % MATLAB handles Java array indexing
2355 sn.nodeparam{i}.accost{k1, k2} = JLINE.from_jline_matrix(mat);
2362 if ~isempty(jparam.itemcap)
2363 sn.nodeparam{i}.itemcap = JLINE.from_jline_matrix(jparam.itemcap);
2366 % pread - convert from Java Map<Integer, List<Double>> to MATLAB cell array {R}
2367 if ~isempty(jparam.pread)
2368 nclasses = sn.nclasses;
2369 sn.nodeparam{i}.pread = cell(1, nclasses);
2371 list = jparam.pread.get(int32(r-1)); % Java 0-based indexing
2373 values = zeros(1, list.size);
2375 values(j) = list.get(j-1);
2377 sn.nodeparam{i}.pread{r} = values;
2379 sn.nodeparam{i}.pread{r} = NaN;
2385 if ~isempty(jparam.replacestrat)
2386 switch
char(jparam.replacestrat)
2388 sn.nodeparam{i}.replacestrat = ReplacementStrategy.RR;
2390 sn.nodeparam{i}.replacestrat = ReplacementStrategy.FIFO;
2392 sn.nodeparam{i}.replacestrat = ReplacementStrategy.SFIFO;
2394 sn.nodeparam{i}.replacestrat = ReplacementStrategy.LRU;
2399 if ~isempty(jparam.hitclass)
2400 sn.nodeparam{i}.hitclass = 1+JLINE.from_jline_matrix(jparam.hitclass);
2404 if ~isempty(jparam.missclass)
2405 sn.nodeparam{i}.missclass =1+ JLINE.from_jline_matrix(jparam.missclass);
2408 % actual hit/miss probabilities
2409 if ~isempty(jparam.actualhitprob)
2410 sn.nodeparam{i}.actualhitprob = JLINE.from_jline_matrix(jparam.actualhitprob);
2412 if ~isempty(jparam.actualmissprob)
2413 sn.nodeparam{i}.actualmissprob = JLINE.from_jline_matrix(jparam.actualmissprob);
2421 %
if ~isempty(jsn.nodeparam)
2422 % sn.nodeparam = cell(sn.nnodes, 1);
2423 % % Note that JLINE only support node parameters related to
2424 % % Fork, Join, WWROBIN and RROBIN
2425 %
for i = 1:sn.nnodes
2426 %
if jsn.nodeparam.get(jnodes.get(i-1)).isEmpty
2427 % sn.nodeparam{i} = [];
2429 %
if ~isnan(jsn.nodeparam.get(jnodes.get(i-1)).nitems)
2430 % sn.nodeparam{i}.nitems = jsn.nodeparam.get(jnodes.get(i-1)).nitems;
2432 %
if ~isnan(jsn.nodeparam.get(jnodes.get(i-1)).fanOut)
2433 % sn.nodeparam{i}.fanOut = jsn.nodeparam.get(jnodes.get(i-1)).fanOut;
2435 %
if ~isempty(jsn.nodeparam.get(jnodes.get(i-1)).joinStrategy)
2436 %
if ~jsn.nodeparam.get(jnodes.get(i-1)).joinStrategy.isEmpty
2437 % sn.nodeparam{i}.joinStrategy = cell(1, sn.nclasses);
2438 % sn.nodeparam{i}.fanIn = cell(1, sn.nclasses);
2439 %
for r = 1:sn.nclasses
2440 % joinStrategy = jsn.nodeparam.get(jnodes.get(i-1)).joinStrategy.get(jclasses.get(r-1));
2441 %
switch joinStrategy.name.toCharArray
'
2443 % sn.nodeparam{i}.joinStrategy{r} = JoinStrategy.STD;
2445 % sn.nodeparam{i}.joinStrategy{r} = JoinStrategy.PARTIAL;
2447 % sn.nodeparam{i}.fanIn{r} = jsn.nodeparam.get(jnodes.get(i-1)).fanIn.get(jclasses.get(r-1));
2452 % if ~isempty(jsn.nodeparam.get(jnodes.get(i-1)).weights)
2453 % for r = 1:sn.nclasses
2454 % sn.nodeparam{i}{r}.weights = JLINE.from_jline_matrix(jsn.nodeparam.get(jnodes.get(i-1)).weights.get(jclasses.get(r-1)));
2458 % if ~isempty(jsn.nodeparam.get(jnodes.get(i-1)).outlinks)
2459 % for r = 1:sn.nclasses
2460 % sn.nodeparam{i}{r}.outlinks = JLINE.from_jline_matrix(jsn.nodeparam.get(jnodes.get(i-1)).outlinks.get(jclasses.get(r-1)));
2466 % sn.nodeparam = {};
2469 if ~isempty(jsn.sync)
2471 sn.sync = cell(jsync.size, 1);
2472 for i = 1:jsync.size
2473 jsync_i = jsync.get(uint32(i-1));
2474 sn.sync{i,1} = struct('active
',cell(1),'passive
',cell(1));
2476 jactive = jsync_i.active.get(uint32(0));
2477 jpassive = jsync_i.passive.get(uint32(0));
2479 %Currently assume that prob would always be a value
2480 %instead of lambda function (No idea of how to convert
2481 %Java lambda function to matlab lambda function)
2482 switch jactive.getEvent.name.toCharArray'
2484 sn.sync{i,1}.active{1} = Event(EventType.INIT, jactive.getNode+1, jactive.getJobClass+1, ...
2485 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2486 jactive.getT, jactive.getJob);
2488 sn.sync{i,1}.active{1} = Event(EventType.LOCAL, jactive.getNode+1, jactive.getJobClass+1, ...
2489 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2490 jactive.getT, jactive.getJob);
2492 sn.sync{i,1}.active{1} = Event(EventType.ARV, jactive.getNode+1, jactive.getJobClass+1, ...
2493 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2494 jactive.getT, jactive.getJob);
2496 sn.sync{i,1}.active{1} = Event(EventType.DEP, jactive.getNode+1, jactive.getJobClass+1, ...
2497 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2498 jactive.getT, jactive.getJob);
2500 sn.sync{i,1}.active{1} = Event(EventType.PHASE, jactive.getNode+1, jactive.getJobClass+1, ...
2501 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2502 jactive.getT, jactive.getJob);
2504 sn.sync{i,1}.active{1} = Event(EventType.READ, jactive.getNode+1, jactive.getJobClass+1, ...
2505 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2506 jactive.getT, jactive.getJob);
2508 sn.sync{i,1}.active{1} = Event(EventType.STAGE, jactive.getNode+1, jactive.getJobClass+1, ...
2509 jactive.getProb, JLINE.from_jline_matrix(jactive.getState), ...
2510 jactive.getT, jactive.getJob);
2513 switch jpassive.getEvent.name.toCharArray
'
2515 sn.sync{i,1}.passive{1} = Event(EventType.INIT, jpassive.getNode+1, jpassive.getJobClass+1, ...
2516 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2517 jpassive.getT, jpassive.getJob);
2519 sn.sync{i,1}.passive{1} = Event(EventType.LOCAL, jpassive.getNode+1, jpassive.getJobClass+1, ...
2520 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2521 jpassive.getT, jpassive.getJob);
2523 sn.sync{i,1}.passive{1} = Event(EventType.ARV, jpassive.getNode+1, jpassive.getJobClass+1, ...
2524 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2525 jpassive.getT, jpassive.getJob);
2527 sn.sync{i,1}.passive{1} = Event(EventType.DEP, jpassive.getNode+1, jpassive.getJobClass+1, ...
2528 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2529 jpassive.getT, jpassive.getJob);
2531 sn.sync{i,1}.passive{1} = Event(EventType.PHASE, jpassive.getNode+1, jpassive.getJobClass+1, ...
2532 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2533 jpassive.getT, jpassive.getJob);
2535 sn.sync{i,1}.passive{1} = Event(EventType.READ, jpassive.getNode+1, jpassive.getJobClass+1, ...
2536 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2537 jpassive.getT, jpassive.getJob);
2539 sn.sync{i,1}.passive{1} = Event(EventType.STAGE, jpassive.getNode+1, jpassive.getJobClass+1, ...
2540 jpassive.getProb, JLINE.from_jline_matrix(jpassive.getState), ...
2541 jpassive.getT, jpassive.getJob);
2549 function [QN,UN,RN,WN,AN,TN] = arrayListToResults(alist)
2551 case 'jline.solvers.LayeredNetworkAvgTable
'
2552 QN = JLINE.arraylist_to_matrix(alist.getQLen());
2553 UN = JLINE.arraylist_to_matrix(alist.getUtil());
2554 RN = JLINE.arraylist_to_matrix(alist.getRespT());
2555 WN = JLINE.arraylist_to_matrix(alist.getResidT());
2556 AN = NaN*JLINE.arraylist_to_matrix(alist.getTput()); % getArvR not yet available in JLINE
2557 TN = JLINE.arraylist_to_matrix(alist.getTput());
2559 QN = JLINE.arraylist_to_matrix(alist.getQLen());
2560 UN = JLINE.arraylist_to_matrix(alist.getUtil());
2561 RN = JLINE.arraylist_to_matrix(alist.getRespT());
2562 WN = JLINE.arraylist_to_matrix(alist.getResidT());
2563 AN = JLINE.arraylist_to_matrix(alist.getArvR());
2564 TN = JLINE.arraylist_to_matrix(alist.getTput());
2568 function featSupported = getFeatureSet()
2569 % FEATSUPPORTED = GETFEATURESET()
2571 featSupported = SolverFeatureSet;
2572 featSupported.setTrue({'Sink
','Source
',...
2573 'ClassSwitch
','Delay
','DelayStation
','Queue
',...
2574 'APH
','Coxian
','Erlang
','Exp
','HyperExp
',...
2575 'StatelessClassSwitcher
','InfiniteServer
','SharedServer
','Buffer
','Dispatcher
',...
2576 'Server
','JobSink
','RandomSource
','ServiceTunnel
',...
2577 'SchedStrategy_INF
','SchedStrategy_PS
',...
2578 'RoutingStrategy_PROB
','RoutingStrategy_RAND
',...
2579 'ClosedClass
','OpenClass
'});
2582 function [bool, featSupported] = supports(model)
2583 % [BOOL, FEATSUPPORTED] = SUPPORTS(MODEL)
2585 featUsed = model.getUsedLangFeatures();
2586 featSupported = JLINE.getFeatureSet();
2587 bool = SolverFeatureSet.supports(featSupported, featUsed);
2591 function solverOptions = parseSolverOptions(solverOptions, options)
2592 fn = fieldnames(options);
2593 fn2 = fieldnames(solverOptions);
2594 for f = 1:length(fn)
2596 for j = 1:length(fn2)
2597 if strcmp(fn{f}, fn2{j})
2601 solverOptions.seed = options.seed;
2603 solverOptions.samples = options.samples;
2605 % Parse confint - can be a level (0.95) or 0 to disable
2606 [confintEnabled, confintLevel] = Solver.parseConfInt(options.confint);
2608 solverOptions.confint = confintLevel;
2610 solverOptions.confint = 0;
2613 solverOptions.method = options.method;
2614 case 'config
' % SSA specific
2615 if isfield(options.config,'eventcache
')
2616 solverOptions.config.eventcache = options.config.eventcache;
2619 switch options.(fn{f})
2620 case {VerboseLevel.SILENT}
2621 solverOptions.verbose = solverOptions.verbose.SILENT;
2622 case {VerboseLevel.STD}
2623 solverOptions.verbose = solverOptions.verbose.STD;
2624 case {VerboseLevel.DEBUG}
2625 solverOptions.verbose = solverOptions.verbose.DEBUG;
2628 solverOptions.(fn{f}) = JLINE.from_line_matrix(options.init_sol);
2630 if isscalar(options.cutoff)
2631 solverOptions.(fn{f}) = jline.util.matrix.Matrix.singleton(options.cutoff);
2633 solverOptions.(fn{f}) = JLINE.from_line_matrix(options.cutoff);
2636 case 'rewardIterations
'
2637 solverOptions.rewardIterations = java.lang.Integer(options.rewardIterations);
2639 solverOptions.(fn{f}) = options.(fn{f});
2646 line_printf('Could not find option %s in the JLINE options.\n
', fn{f});
2651 function [ssa] = SolverSSA(network_object, options)
2652 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.SSA);
2654 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2656 jline.util.Maths.setRandomNumbersMatlab(true);
2657 ssa = jline.solvers.ssa.SolverSSA(network_object, solverOptions);
2660 function [mam] = SolverMAM(network_object, options)
2661 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.MAM);
2663 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2665 mam = jline.solvers.mam.SolverMAM(network_object, solverOptions);
2668 function [jmt] = SolverJMT(network_object, options)
2669 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.JMT);
2671 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2673 jmt = jline.solvers.jmt.SolverJMT(network_object, solverOptions);
2676 function [ctmc] = SolverCTMC(network_object, options)
2677 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.CTMC);
2679 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2681 ctmc = jline.solvers.ctmc.SolverCTMC(network_object,solverOptions);
2684 function [fluid] = SolverFluid(network_object, options)
2685 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.FLUID);
2687 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2689 fluid = jline.solvers.fluid.SolverFluid(network_object, solverOptions);
2692 function [QN, UN, RN, TN, CN, XN, t, QNt, UNt, TNt, xvec] = runFluidAnalyzer(network, options)
2693 % RUNFLUIDANALYZER Run JLINE fluid analyzer and return results
2695 % [QN, UN, RN, TN, CN, XN, T, QNT, UNT, TNT, XVEC] = JLINE.runFluidAnalyzer(NETWORK, OPTIONS)
2697 % Runs the JLINE fluid solver on the given network and converts
2698 % results back to MATLAB data structures.
2701 % network - LINE Network model
2702 % options - Solver options structure with fields:
2703 % .method - solver method
2704 % .stiff - use stiff ODE solver
2707 % QN, UN, RN, TN - Steady-state metrics [M x K]
2708 % CN, XN - System metrics [1 x K]
2709 % t - Time vector [Tmax x 1]
2710 % QNt, UNt, TNt - Transient metrics {M x K} cells
2711 % xvec - State vector structure
2713 jmodel = LINE2JLINE(network);
2714 jsolver = JLINE.SolverFluid(jmodel);
2715 import jline.solvers.fluid.*;
2717 jsolver.options.method = options.method;
2718 jsolver.options.stiff = options.stiff;
2719 result = jsolver.runMethodSpecificAnalyzerViaLINE();
2721 % Convert JLINE result to MATLAB data structures
2722 M = jmodel.getNumberOfStatefulNodes();
2723 K = jmodel.getNumberOfClasses();
2725 QN = NaN * zeros(M, K);
2726 UN = NaN * zeros(M, K);
2727 RN = NaN * zeros(M, K);
2728 TN = NaN * zeros(M, K);
2729 CN = NaN * zeros(1, K);
2730 XN = NaN * zeros(1, K);
2736 Tmax = result.t.length();
2737 t = NaN * zeros(Tmax, 1);
2741 QN(ist, jst) = result.QN.get(ist-1, jst-1);
2742 UN(ist, jst) = result.UN.get(ist-1, jst-1);
2743 RN(ist, jst) = result.RN.get(ist-1, jst-1);
2744 TN(ist, jst) = result.TN.get(ist-1, jst-1);
2749 CN(1, jst) = result.CN.get(0, jst-1);
2750 XN(1, jst) = result.XN.get(0, jst-1);
2756 QNt{ist, jst}(p, 1) = result.QNt(ist, jst).get(p-1, 0);
2757 UNt{ist, jst}(p, 1) = result.UNt(ist, jst).get(p-1, 0);
2758 TNt{ist, jst}(p, 1) = result.TNt(ist, jst).get(p-1, 0);
2764 t(p, 1) = result.t.get(p-1, 0);
2767 % JLINE does not return odeStateVec
2768 xvec.odeStateVec = [];
2772 function [des] = SolverDES(network_object, options)
2773 % Create DES-specific options object
2774 desOptions = jline.solvers.des.DESOptions();
2776 % Copy standard options
2777 desOptions.samples = options.samples;
2778 desOptions.seed = options.seed;
2780 [confintEnabled, confintLevel] = Solver.parseConfInt(options.confint);
2782 desOptions.confint = confintLevel;
2784 desOptions.confint = 0;
2786 % Pass timespan for transient analysis
2787 if isfield(options, 'timespan
') && length(options.timespan) >= 2
2788 desOptions.timespan = options.timespan;
2790 % Pass DES-specific options if configured
2791 if isfield(options, 'config
')
2792 % Transient detection options
2793 if isfield(options.config, 'tranfilter
')
2794 desOptions.tranfilter = options.config.tranfilter;
2796 if isfield(options.config, 'mserbatch
')
2797 desOptions.mserbatch = options.config.mserbatch;
2799 if isfield(options.config, 'warmupfrac
')
2800 desOptions.warmupfrac = options.config.warmupfrac;
2802 % Confidence interval options
2803 if isfield(options.config, 'cimethod
')
2804 desOptions.cimethod = options.config.cimethod;
2806 if isfield(options.config, 'obmoverlap
')
2807 desOptions.obmoverlap = options.config.obmoverlap;
2809 if isfield(options.config, 'ciminbatch
')
2810 desOptions.ciminbatch = options.config.ciminbatch;
2812 if isfield(options.config, 'ciminobs
')
2813 desOptions.ciminobs = options.config.ciminobs;
2815 % Convergence options
2816 if isfield(options.config, 'cnvgon
')
2817 desOptions.cnvgon = options.config.cnvgon;
2819 if isfield(options.config, 'cnvgtol
')
2820 desOptions.cnvgtol = options.config.cnvgtol;
2822 if isfield(options.config, 'cnvgbatch
')
2823 desOptions.cnvgbatch = options.config.cnvgbatch;
2825 if isfield(options.config, 'cnvgchk
')
2826 desOptions.cnvgchk = options.config.cnvgchk;
2830 des = jline.solvers.des.SolverDES(network_object, desOptions);
2833 function [mva] = SolverMVA(network_object, options)
2834 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.MVA);
2836 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2838 mva = jline.solvers.mva.SolverMVA(network_object, solverOptions);
2841 function [nc] = SolverNC(network_object, options)
2842 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.NC);
2844 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2846 nc = jline.solvers.nc.SolverNC(network_object, solverOptions);
2849 function [auto] = SolverAuto(network_object, options)
2850 solverOptions = jline.solvers.auto.AUTOptions();
2852 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2854 auto = jline.solvers.auto.SolverAUTO(network_object, solverOptions);
2857 function streamOpts = StreamingOptions(varargin)
2858 % STREAMINGOPTIONS Create Java StreamingOptions for SSA/DES stream() method
2860 % @brief Creates StreamingOptions for streaming simulation metrics
2862 % @param varargin Name-value pairs for options:
2863 % 'transport
' - 'http
' (recommended) or 'grpc
' (default: 'http
')
2864 % 'endpoint
' - Receiver endpoint (default: 'localhost:8080/metrics
' for HTTP)
2865 % 'mode
' - 'sampled
' or 'time_window
' (default: 'sampled
')
2866 % 'sampleFrequency
' - Push every N events in sampled mode (default: 100)
2867 % 'timeWindowSeconds
' - Window duration in time_window mode (default: 1.0)
2868 % 'serviceName
' - Service identifier (default: 'line-stream')
2869 % 'includeQueueLength' - Include queue length metrics (default: true)
2870 % 'includeUtilization' - Include utilization metrics (default: true)
2871 % 'includeThroughput' - Include throughput metrics (default: true)
2872 % 'includeResponseTime' - Include response time metrics (default: true)
2873 % 'includeArrivalRate' - Include arrival rate metrics (default: true)
2875 % @return streamOpts Java StreamingOptions object
2879 % streamOpts = JLINE.StreamingOptions('transport', 'http', 'sampleFrequency', 50);
2882 streamOpts = jline.streaming.StreamingOptions();
2884 % Parse optional arguments
2886 addParameter(p,
'transport',
'http', @ischar);
2887 addParameter(p,
'endpoint',
'', @ischar); % Empty means use
default for transport
2888 addParameter(p,
'mode',
'sampled', @ischar);
2889 addParameter(p,
'sampleFrequency', 100, @isnumeric);
2890 addParameter(p,
'timeWindowSeconds', 1.0, @isnumeric);
2891 addParameter(p,
'serviceName',
'line-stream', @ischar);
2892 addParameter(p,
'includeQueueLength',
true, @islogical);
2893 addParameter(p,
'includeUtilization',
true, @islogical);
2894 addParameter(p,
'includeThroughput',
true, @islogical);
2895 addParameter(p,
'includeResponseTime',
true, @islogical);
2896 addParameter(p,
'includeArrivalRate',
true, @islogical);
2897 parse(p, varargin{:});
2899 % Set transport type
2900 transportTypes = javaMethod(
'values',
'jline.streaming.StreamingOptions$TransportType');
2901 switch lower(p.Results.transport)
2903 streamOpts.transport = transportTypes(1); % HTTP
2905 streamOpts.transport = transportTypes(2); % GRPC
2907 streamOpts.transport = transportTypes(1); % Default to HTTP
2910 % Set endpoint (use provided or default based on transport)
2911 if ~isempty(p.Results.endpoint)
2912 streamOpts.endpoint = p.Results.endpoint;
2914 % If empty, StreamingOptions uses its default for the transport type
2917 streamModes = javaMethod('values', 'jline.streaming.StreamingOptions$StreamMode');
2918 switch lower(p.Results.mode)
2920 streamOpts.mode = streamModes(1); % SAMPLED
2922 streamOpts.mode = streamModes(2); % TIME_WINDOW
2924 streamOpts.mode = streamModes(1); % Default to SAMPLED
2928 streamOpts.sampleFrequency = p.Results.sampleFrequency;
2929 streamOpts.timeWindowSeconds = p.Results.timeWindowSeconds;
2930 streamOpts.serviceName = p.Results.serviceName;
2931 streamOpts.includeQueueLength = p.Results.includeQueueLength;
2932 streamOpts.includeUtilization = p.Results.includeUtilization;
2933 streamOpts.includeThroughput = p.Results.includeThroughput;
2934 streamOpts.includeResponseTime = p.Results.includeResponseTime;
2935 streamOpts.includeArrivalRate = p.Results.includeArrivalRate;
2938 function result = convertSampleResult(jresult)
2939 % CONVERTSAMPLERESULT Convert Java sample result to MATLAB struct
2941 % @brief Converts Java SampleNodeState to MATLAB structure
2943 % @param jresult Java SampleNodeState
object
2944 % @return result MATLAB struct with fields: t, state, isaggregate
2948 % Convert time matrix
2949 if ~isempty(jresult.t)
2950 result.t = JLINE.from_jline_matrix(jresult.t);
2955 % Convert state matrix
2956 if ~isempty(jresult.state) && isa(jresult.state, 'jline.util.matrix.Matrix')
2957 result.state = JLINE.from_jline_matrix(jresult.state);
2962 result.isaggregate = jresult.isaggregate;
2965 function [ln] = SolverLN(layered_network_object, options)
2966 solverOptions = jline.solvers.SolverOptions(jline.lang.constant.SolverType.LN);
2968 solverOptions = JLINE.parseSolverOptions(solverOptions, options);
2970 ln = jline.solvers.ln.SolverLN(layered_network_object, solverOptions);
2973 function serfun = handle_to_serializablefun(handle, sn)
2974 % HANDLE_TO_SERIALIZABLEFUN Convert MATLAB function handle to Java SerializableFunction
2976 % This function pre-computes the function values for all possible state
2977 % combinations and creates a Java PrecomputedCDFunction
object.
2979 % @param handle MATLAB function handle that takes a vector ni and returns a scalar
2980 % @param sn Network struct containing njobs (population per class)
2981 % @return serfun Java PrecomputedCDFunction
object
2983 % Get number of
classes and maximum populations
2984 nclasses = sn.nclasses;
2985 njobs = sn.njobs; % Population per class
2987 % For open
classes (njobs=0), use a reasonable bound
2990 if maxPop(r) == 0 || isinf(maxPop(r))
2991 % For open
classes, use sum of closed class populations or 100 as bound
2992 maxPop(r) = max(100, sum(njobs(isfinite(njobs) & njobs > 0)));
2996 % Create Java PrecomputedCDFunction
object
2997 serfun = jline.util.PrecomputedCDFunction(nclasses);
2999 % Enumerate all possible state combinations and pre-compute function values
3000 % Use recursive enumeration to handle arbitrary number of
classes
3001 JLINE.enumerate_states(handle, serfun, maxPop, zeros(1, nclasses), 1);
3004 function enumerate_states(handle, serfun, maxPop, currentState, classIdx)
3005 % ENUMERATE_STATES Recursively enumerate all state combinations
3007 % @param handle MATLAB function handle
3008 % @param serfun Java PrecomputedCDFunction
object to populate
3009 % @param maxPop Maximum population per class
3010 % @param currentState Current state being built
3011 % @param classIdx Current class index being enumerated
3013 nclasses = length(maxPop);
3015 if classIdx > nclasses
3016 % We have a complete state, compute and store the function value
3018 value = handle(currentState);
3019 % Convert to Java
int array and add to serfun
3020 jstate = jline.util.matrix.Matrix(1, nclasses);
3022 jstate.set(0, r-1, currentState(r));
3024 serfun.addValue(jstate, value);
3026 % If function evaluation fails, skip this state
3031 % Enumerate all populations for current class
3032 for n = 0:maxPop(classIdx)
3033 currentState(classIdx) = n;
3034 JLINE.enumerate_states(handle, serfun, maxPop, currentState, classIdx + 1);
3038 function result = call_java_cdscaling(jfun, ni)
3039 % CALL_JAVA_CDSCALING Call a Java SerializableFunction for class dependence
3041 % This function converts a MATLAB vector to a Java Matrix and calls
3042 % the Java function's apply() method.
3044 % @param jfun Java SerializableFunction<Matrix, Double>
object
3045 % @param ni MATLAB vector representing the state (jobs per class)
3046 % @return result The scaling factor returned by the Java function
3048 % Convert MATLAB vector to Java Matrix
3050 jmatrix = jline.util.matrix.Matrix(1, length(ni));
3051 for r = 1:length(ni)
3052 jmatrix.set(0, r-1, ni(r));
3055 jmatrix = jline.util.matrix.Matrix(length(ni), 1);
3056 for r = 1:length(ni)
3057 jmatrix.set(r-1, 0, ni(r));
3061 % Call the Java function and convert result to MATLAB
double
3062 jresult = jfun.apply(jmatrix);
3063 result =
double(jresult);