LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
JNetwork.m
1classdef JNetwork < Model
2 % JLINE extended queueing network model.
3 %
4 % Copyright (c) 2012-2026, Imperial College London
5 % All rights reserved.
6
7 properties (Access=public)
8 obj; % java object
9 end
10
11 % PUBLIC METHODS
12 methods (Access=public)
13
14 %Constructor
15 function self = JNetwork(name)
16 % SELF = NETWORK(MODELNAME)
17 self@Model(name); % model is the model's name
18 self.obj = jline.lang.Network(name);
19 end
20
21 function sn = getStruct(self, wantInitialState) % get abritrary representation
22 if nargin<2
23 wantInitialState = false;
24 end
25 sn = JLINE.from_jline_struct(self.obj, self.obj.getStruct(wantInitialState));
26 end
27
28 function R = getNumberOfClasses(self)
29 % R = GETNUMBEROFCLASSES()
30
31 R = self.obj.getNumberOfClasses();
32 end
33
34 function M = getNumberOfStations(self)
35 % M = GETNUMBEROFSTATIONS()
36
37 M = self.obj.getNumberOfStations();
38 end
39
40
41 function I = getNumberOfNodes(self)
42 % I = GETNUMBEROFNODES()
43
44 I = self.obj.getNumberOfNodes();
45 end
46
47 function bool = hasFork(self)
48 % to be changed
49 bool = false;
50 end
51
52 function ind = getNodeIndex(self, name)
53 if ischar(name)
54 ind = self.obj.getNodeByName(name);
55 else
56 ind = self.obj.getNodeIndex(name.obj);
57 end
58 end
59
60 function node = getNodeByName(self, name)
61 % NODE = GETNODEBYNAME(NAME)
62
63 javaNode = self.obj.getNodeByName(name);
64 if isempty(javaNode)
65 node = NaN;
66 else
67 % Create a wrapper MATLAB object for the Java node
68 % We need to determine the node type and create appropriate wrapper
69 nodeClassName = char(javaNode.getClass().getSimpleName());
70
71 % Create the MATLAB wrapper object, then override the Java object
72 switch nodeClassName
73 case 'Queue'
74 node = Queue(self, char(javaNode.getName()), SchedStrategy.FCFS); % Default schedule strategy
75 case 'Source'
76 node = Source(self, char(javaNode.getName()));
77 case 'Sink'
78 node = Sink(self, char(javaNode.getName()));
79 case 'Router'
80 node = Router(self, char(javaNode.getName()));
81 case 'Fork'
82 node = Fork(self, char(javaNode.getName()));
83 case 'Join'
84 node = Join(self, char(javaNode.getName()));
85 case 'Cache'
86 % Cache requires additional parameters, using defaults
87 node = Cache(self, char(javaNode.getName()), 1, [1], ReplacementStrategy.LRU);
88 case 'Logger'
89 node = Logger(self, char(javaNode.getName()), 'default.log');
90 case 'ClassSwitch'
91 node = ClassSwitch(self, char(javaNode.getName()));
92 case 'Place'
93 node = Place(self, char(javaNode.getName()));
94 case 'Transition'
95 node = Transition(self, char(javaNode.getName()));
96 otherwise
97 % Fallback - create generic Node wrapper
98 node = Node(char(javaNode.getName()));
99 node.setModel(self);
100 end
101
102 % Override the Java object with the existing one from the network
103 node.obj = javaNode;
104 node.index = self.obj.getNodeIndex(javaNode);
105 end
106 end
107
108 function self = link(self, P)
109 if isa(P,'jline.lang.RoutingMatrix')
110 self.obj.link(P);
111 else
112 nodes = self.obj.getNodes();
113 classes = self.obj.getClasses();
114 routing_matrix = jline.lang.RoutingMatrix(self.obj, classes, nodes);
115 I = self.obj.getNumberOfNodes;
116 R = self.obj.getNumberOfClasses;
117
118 if size(P,1) == 1
119 for i = 1:I
120 for j = 1:I
121 for r=1:R
122 for s=1:R
123 if P{r,s}(i,j) > 0
124 routing_matrix.addConnection(nodes.get(i-1), nodes.get(j-1), classes.get(r-1), classes.get(s-1), P{r,s}(i,j));
125 end
126 end
127 end
128 end
129 end
130 else % if a single matrix
131 for i = 1:I
132 for j = 1:I
133 if P(i,j) > 0
134 routing_matrix.addConnection(nodes.get(i-1), nodes.get(j-1), classes.get(0), P(i,j));
135 end
136 end
137 end
138 end
139 self.obj.link(routing_matrix);
140 end
141 end
142
143 function P = initRoutingMatrix(self)
144 M = self.getNumberOfNodes();
145 R = self.getNumberOfClasses();
146 P = cellzeros(R,R,M,M);
147 P = RoutingMatrix(P);
148 end
149
150 function self = setChecks(self, bool)
151 self.obj.setChecks(bool);
152 end
153
154 function addLinks(self, nodesList)
155 % ADDLINKS(NODESLIST)
156
157 % Copyright (c) 2012-2026, Imperial College London
158 % All rights reserved.
159 for i=1:size(nodesList,1)
160 self.obj.addLink(self.obj.getNodeByIndex(nodesList(i,1)-1), self.obj.getNodeByIndex(nodesList(i,2)-1));
161 end
162 end
163
164 function addLink(self, node1, node2)
165 % ADDLINK(NODESLIST)
166
167 % Copyright (c) 2012-2026, Imperial College London
168 % All rights reserved.
169 self.obj.addLink(node1.obj, node2.obj);
170 end
171
172 function reset(self)
173 self.obj.reset();
174 end
175
176 function jsimgView(self)
177 self.obj.jsimgView();
178 end
179
180 % Additional methods for coherence with MNetwork
181
182 function nodes = getNodes(self)
183 % NODES = GETNODES()
184 javaNodes = self.obj.getNodes();
185 nodes = {};
186 for i = 0:javaNodes.size()-1
187 jNode = javaNodes.get(i);
188 nodes{end+1} = self.getNodeByName(char(jNode.getName()));
189 end
190 end
191
192 function classes = getClasses(self)
193 % CLASSES = GETCLASSES()
194 javaClasses = self.obj.getClasses();
195 classes = {};
196 for i = 0:javaClasses.size()-1
197 jClass = javaClasses.get(i);
198 % Note: Java object wrapping for classes not implemented
199 classes{end+1} = jClass;
200 end
201 end
202
203 function classNames = getClassNames(self)
204 % CLASSNAMES = GETCLASSNAMES()
205 javaClasses = self.obj.getClasses();
206 classNames = {};
207 for i = 0:javaClasses.size()-1
208 classNames{end+1} = char(javaClasses.get(i).getName());
209 end
210 end
211
212 function nodeNames = getNodeNames(self)
213 % NODENAMES = GETNODENAMES()
214 javaNodes = self.obj.getNodes();
215 nodeNames = {};
216 for i = 0:javaNodes.size()-1
217 nodeNames{end+1} = char(javaNodes.get(i).getName());
218 end
219 end
220
221 function nodeTypes = getNodeTypes(self)
222 % NODETYPES = GETNODETYPES()
223 javaNodeTypes = self.obj.getNodeTypes();
224 nodeTypes = {};
225 for i = 0:javaNodeTypes.size()-1
226 nodeTypes{end+1} = char(javaNodeTypes.get(i).toString());
227 end
228 end
229
230 function stationNames = getStationNames(self)
231 % STATIONNAMES = GETSTATIONNAMES()
232 % Note: Java object does not support getStationNames method directly
233 nodes = self.getNodes();
234 stationNames = {};
235 for i = 1:length(nodes)
236 if isa(nodes{i}, 'Station')
237 stationNames{end+1} = nodes{i}.getName();
238 end
239 end
240 end
241
242 function stationIndex = getStationIndex(self, name)
243 % STATIONINDEX = GETSTATIONINDEX(NAME)
244 if isa(name,'Node')
245 node = name;
246 name = node.getName();
247 end
248 stationIndex = find(cellfun(@(c) strcmp(c,name),self.getStationNames));
249 end
250
251 function classIndex = getClassIndex(self, name)
252 % CLASSINDEX = GETCLASSINDEX(NAME)
253 if isa(name,'JobClass')
254 jobclass = name;
255 name = jobclass.getName();
256 end
257 classIndex = find(cellfun(@(c) strcmp(c,name),self.getClassNames));
258 end
259
260 function station = getStationByName(self, name)
261 % STATION = GETSTATIONBYNAME(NAME)
262 node = self.getNodeByName(name);
263 if isa(node, 'Station')
264 station = node;
265 else
266 station = NaN;
267 end
268 end
269
270 function class = getClassByName(self, name)
271 % CLASS = GETCLASSBYNAME(NAME)
272 javaClass = self.obj.getClassByName(name);
273 if isempty(javaClass)
274 class = NaN;
275 else
276 % Note: Java object wrapping for classes not implemented
277 class = javaClass;
278 end
279 end
280
281 function node = getNodeByIndex(self, idx)
282 % NODE = GETNODEBYINDEX(IDX)
283 javaNode = self.obj.getNodeByIndex(idx-1); % Java uses 0-based indexing
284 if isempty(javaNode)
285 node = NaN;
286 else
287 node = self.getNodeByName(char(javaNode.getName()));
288 end
289 end
290
291 function station = getStationByIndex(self, idx)
292 % STATION = GETSTATIONBYINDEX(IDX)
293 stations = self.getStationNames();
294 if idx > 0 && idx <= length(stations)
295 station = self.getStationByName(stations{idx});
296 else
297 station = NaN;
298 end
299 end
300
301 function class = getClassByIndex(self, idx)
302 % CLASS = GETCLASSBYINDEX(IDX)
303 javaClass = self.obj.getClassByIndex(idx-1); % Java uses 0-based indexing
304 if isempty(javaClass)
305 class = NaN;
306 else
307 % Note: Java object wrapping for classes not implemented
308 class = javaClass;
309 end
310 end
311
312 function C = getNumberOfChains(self)
313 % C = GETNUMBEROFCHAINS()
314 sn = self.getStruct();
315 C = sn.nchains;
316 end
317
318 function S = getNumberOfStatefulNodes(self)
319 % S = GETNUMBEROFSTATEFULNODES()
320 % Note: Java object does not support this method directly
321 nodes = self.getNodes();
322 S = sum(cellfun(@(n) isa(n, 'StatefulNode'), nodes));
323 end
324
325 function list = getStationIndexes(self)
326 % LIST = GETSTATIONINDEXES()
327 nodes = self.getNodes();
328 list = find(cellfun(@(n) isa(n, 'Station'), nodes))';
329 end
330
331 function list = getIndexStatefulNodes(self)
332 % LIST = GETINDEXSTATEFULNODES()
333 nodes = self.getNodes();
334 list = find(cellfun(@(n) isa(n, 'StatefulNode'), nodes))';
335 end
336
337 function index = getIndexSourceStation(self)
338 % INDEX = GETINDEXSOURCESTATION()
339 % Note: Java object does not support this method directly
340 nodes = self.getNodes();
341 for i = 1:length(nodes)
342 if isa(nodes{i}, 'Source')
343 index = i;
344 return;
345 end
346 end
347 index = [];
348 end
349
350 function index = getIndexSourceNode(self)
351 % INDEX = GETINDEXSOURCENODE()
352 % Note: Java object does not support this method directly
353 nodes = self.getNodes();
354 for i = 1:length(nodes)
355 if isa(nodes{i}, 'Source')
356 index = i;
357 return;
358 end
359 end
360 index = [];
361 end
362
363 function index = getIndexSinkNode(self)
364 % INDEX = GETINDEXSINKNODE()
365 % Note: Java object does not support this method directly
366 nodes = self.getNodes();
367 for i = 1:length(nodes)
368 if isa(nodes{i}, 'Sink')
369 index = i;
370 return;
371 end
372 end
373 index = [];
374 end
375
376 function node = getSource(self)
377 % NODE = GETSOURCE()
378 idx = self.getIndexSourceNode();
379 if ~isempty(idx)
380 node = self.getNodeByIndex(idx);
381 else
382 node = NaN;
383 end
384 end
385
386 function node = getSink(self)
387 % NODE = GETSINK()
388 idx = self.getIndexSinkNode();
389 if ~isempty(idx)
390 node = self.getNodeByIndex(idx);
391 else
392 node = NaN;
393 end
394 end
395
396 function N = getNumberOfJobs(self)
397 % N = GETNUMBEROFJOBS()
398 javaClasses = self.obj.getClasses();
399 N = zeros(1, javaClasses.size());
400 for i = 0:javaClasses.size()-1
401 jClass = javaClasses.get(i);
402 if strcmp(char(jClass.getClass().getSimpleName()), 'ClosedClass')
403 N(i+1) = jClass.getPopulation();
404 else
405 N(i+1) = Inf;
406 end
407 end
408 end
409
410 function bool = hasOpenClasses(self)
411 % BOOL = HASOPENCLASSES()
412 N = self.getNumberOfJobs();
413 bool = any(isinf(N));
414 end
415
416 function bool = hasClosedClasses(self)
417 % BOOL = HASCLOSEDCLASSES()
418 N = self.getNumberOfJobs();
419 bool = any(isfinite(N));
420 end
421
422 function bool = isMatlabNative(self)
423 % BOOL = ISMATLABNATIVE()
424 %
425 % Returns false for Java (JNetwork) implementation
426
427 bool = false;
428 end
429
430 function bool = isJavaNative(self)
431 % BOOL = ISJAVANATIVE()
432 %
433 % Returns true for Java (JNetwork) implementation
434
435 bool = true;
436 end
437
438 function index = getIndexOpenClasses(self)
439 % INDEX = GETINDEXOPENCLASSES()
440 N = self.getNumberOfJobs();
441 index = find(isinf(N))';
442 end
443
444 function index = getIndexClosedClasses(self)
445 % INDEX = GETINDEXCLOSEDCLASSES()
446 N = self.getNumberOfJobs();
447 index = find(isfinite(N))';
448 end
449
450 function bool = hasClassSwitching(self)
451 % BOOL = HASCLASSSWITCHING()
452 nodes = self.getNodes();
453 bool = any(cellfun(@(n) isa(n,'ClassSwitch'), nodes));
454 end
455
456 function bool = hasJoin(self)
457 % BOOL = HASJOIN()
458 nodes = self.getNodes();
459 bool = any(cellfun(@(n) isa(n,'Join'), nodes));
460 end
461
462 function [M,R] = getSize(self)
463 % [M,R] = GETSIZE()
464 M = self.getNumberOfNodes();
465 R = self.getNumberOfClasses();
466 end
467
468 function used = getUsedLangFeatures(self)
469 % USED = GETUSEDLANGFEATURES()
470 javaFeatureSet = self.obj.getUsedLangFeatures();
471
472 % Convert Java FeatureSet to MATLAB struct
473 % Note: This is a simplified conversion - may need refinement
474 % based on the actual FeatureSet structure
475 used = struct();
476
477 % If the Java FeatureSet has accessible fields/methods,
478 % we would convert them here. For now, return the Java object
479 % This may need custom conversion logic depending on FeatureSet implementation
480 try
481 % Attempt to get feature names if FeatureSet has such methods
482 % This is a placeholder - actual implementation depends on FeatureSet API
483 used = javaFeatureSet;
484 catch
485 % Fallback - create empty struct
486 used = struct();
487 end
488 end
489
490 function summary(self)
491 % SUMMARY()
492 self.obj.summary();
493 end
494
495 function [D,Z] = getDemands(self)
496 % [D,Z] = GETDEMANDS()
497 ret = self.obj.getDemands();
498 D = JLINE.from_jline_matrix(ret.D);
499 Z = JLINE.from_jline_matrix(ret.Z);
500 end
501
502 function [lambda,D,N,Z,mu,S] = getProductFormParameters(self)
503 % [LAMBDA,D,N,Z,MU,S] = GETPRODUCTFORMPARAMETERS()
504 ret = self.obj.getProductFormParameters();
505 lambda = JLINE.from_jline_matrix(ret.lambda);
506 D = JLINE.from_jline_matrix(ret.D);
507 N = JLINE.from_jline_matrix(ret.N);
508 Z = JLINE.from_jline_matrix(ret.Z);
509 mu = JLINE.from_jline_matrix(ret.mu);
510 S = JLINE.from_jline_matrix(ret.S);
511 end
512
513 function printRoutingMatrix(self, onlyclass)
514 % PRINTROUTINGMATRIX(ONLYCLASS)
515 self.obj.printRoutingMatrix();
516 end
517
518 function [rt,rtNodes,connections,chains,rtNodesByClass,rtNodesByStation] = getRoutingMatrix(self, arvRates)
519 % [RT,RTNODES,CONNECTIONS,CHAINS,RTNODEBYCLASS,RTNODEBYSTATION] = GETROUTINGMATRIX(ARVRATES)
520 % Note: Java object does not support this method directly
521 error('getRoutingMatrix method not supported by Java object');
522 end
523
524 function P = getLinkedRoutingMatrix(self)
525 % P = GETLINKEDROUTINGMATRIX()
526 javaP = self.obj.getLinkedRoutingMatrix();
527 % Convert Java Map<JobClass, Map<JobClass, Matrix>> to MATLAB cell array
528 P = {};
529 % Note: This is a complex conversion - simplified implementation
530 % May need custom conversion logic based on how MATLAB expects this data
531 P = javaP; % Direct return for now - may need refinement
532 end
533
534 function connections = getConnectionMatrix(self)
535 % CONNECTIONS = GETCONNECTIONMATRIX()
536 javaConnections = self.obj.getConnectionMatrix();
537 connections = JLINE.from_jline_matrix(javaConnections);
538 end
539
540 function mask = getClassSwitchingMask(self)
541 % MASK = GETCLASSSWITCHINGMASK()
542 javaMask = self.obj.getClassSwitchingMask();
543 mask = JLINE.from_jline_matrix(javaMask);
544 end
545
546 function bool = hasProductFormSolution(self)
547 % BOOL = HASPRODUCTFORMSOLUTION()
548 bool = self.obj.hasProductFormSolution();
549 end
550
551 function plot(self)
552 % PLOT() - Display network as TikZ diagram in PDF viewer
553 % Requires pdflatex to be installed on the system
554 self.obj.plot();
555 end
556
557 function jsimwView(self)
558 % JSIMWVIEW()
559 self.obj.jsimwView();
560 end
561
562 function view(self)
563 % VIEW() Open the model in JSIMgraph
564 self.jsimgView();
565 end
566
567 function modelView(self)
568 % MODELVIEW() Open the model in ModelVisualizer
569 self.obj.plot();
570 end
571
572 % Save methods (for consistency with MNetwork/SolverJMT)
573 function saveAsJSIM(self, filename)
574 % SAVEASJSIM(FILENAME)
575 % Note: Java object does not support direct JSIM export
576 error('saveAsJSIM method not supported by Java object. Use SolverJMT for JSIM export.');
577 end
578
579 function saveAsJMVA(self, filename)
580 % SAVEASJMVA(FILENAME)
581 % Note: Java object does not support direct JMVA export
582 error('saveAsJMVA method not supported by Java object. Use SolverJMT for JMVA export.');
583 end
584
585 end
586
587 methods (Static)
588
589
590 function model = tandemPs(lambda, D, S)
591 lambda = JLINE.from_line_matrix(lambda);
592 D = JLINE.from_line_matrix(D);
593 S = JLINE.from_line_matrix(S);
594 model = jline.lang.Network.tandemPs(lambda, D, S);
595 model = JNetwork(model);
596 end
597
598 function model = tandemPsInf(varargin)
599 lambda = JLINE.from_line_matrix(varargin{1});
600 D = JLINE.from_line_matrix(varargin{2});
601 if nargin == 2
602 model = jline.lang.Network.tandemPsInf(lambda, D);
603 elseif nargin == 3
604 Z = JLINE.from_line_matrix(varargin{3});
605 model = jline.lang.Network.tandemPsInf(lambda, D, Z);
606 elseif nargin == 4
607 Z = JLINE.from_line_matrix(varargin{3});
608 S = JLINE.from_line_matrix(varargin{4});
609 model = jline.lang.Network.tandemPsInf(lambda, D, Z, S);
610 else
611 error('Invalid number of arguments for tandemPsInf.');
612 end
613 model = JNetwork(model);
614 end
615
616 function model = tandemFcfs(varargin)
617 lambda = JLINE.from_line_matrix(varargin{1});
618 D = JLINE.from_line_matrix(varargin{2});
619 S = JLINE.from_line_matrix(varargin{3});
620 model = jline.lang.Network.tandemFcfs(lambda, D, S);
621 model = JNetwork(model);
622 end
623
624 function model = tandemFcfsInf(varargin)
625 lambda = JLINE.from_line_matrix(varargin{1});
626 D = JLINE.from_line_matrix(varargin{2});
627 if nargin == 2
628 model = jline.lang.Network.tandemFcfsInf(lambda, D);
629 elseif nargin == 3
630 Z = JLINE.from_line_matrix(varargin{3});
631 model = jline.lang.Network.tandemFcfsInf(lambda, D, Z);
632 elseif nargin == 4
633 Z = JLINE.from_line_matrix(varargin{3});
634 S = JLINE.from_line_matrix(varargin{4});
635 model = jline.lang.Network.tandemFcfsInf(lambda, D, Z, S);
636 else
637 error('Invalid number of arguments for tandemFcfsInf.');
638 end
639 model = JNetwork(model);
640 end
641
642 function model = tandem(lambda, D, strategy, S)
643 lambda = JLINE.from_line_matrix(lambda);
644 D = JLINE.from_line_matrix(D);
645 S = JLINE.from_line_matrix(S);
646 model = jline.lang.Network.tandem(lambda, D, strategy, S);
647 model = JNetwork(model);
648 end
649
650 function model = cyclicPs(varargin)
651 N = JLINE.from_line_matrix(varargin{1});
652 D = JLINE.from_line_matrix(varargin{2});
653 if nargin == 2
654 model = jline.lang.Network.cyclicPs(N, D);
655 elseif nargin == 3
656 S = JLINE.from_line_matrix(varargin{3});
657 model = jline.lang.Network.cyclicPs(N, D, S);
658 else
659 error('Invalid number of arguments for cyclicPs.');
660 end
661 model = JNetwork(model);
662 end
663
664 function model = cyclicFcfs(varargin)
665 N = JLINE.from_line_matrix(varargin{1});
666 D = JLINE.from_line_matrix(varargin{2});
667 if nargin == 2
668 model = jline.lang.Network.cyclicFcfs(N, D);
669 elseif nargin == 3
670 S = JLINE.from_line_matrix(varargin{3});
671 model = jline.lang.Network.cyclicFcfs(N, D, S);
672 else
673 error('Invalid number of arguments for cyclicFcfs.');
674 end
675 model = JNetwork(model);
676 end
677
678 function model = cyclicPsInf(varargin)
679 N = JLINE.from_line_matrix(varargin{1});
680 D = JLINE.from_line_matrix(varargin{2});
681 Z = JLINE.from_line_matrix(varargin{3});
682 if nargin == 3
683 model = jline.lang.Network.cyclicPsInf(N, D, Z);
684 elseif nargin == 4
685 S = JLINE.from_line_matrix(varargin{4});
686 model = jline.lang.Network.cyclicPsInf(N, D, Z, S);
687 else
688 error('Invalid number of arguments for cyclicPsInf.');
689 end
690 model = JNetwork(model);
691 end
692
693 function model = cyclicFcfsInf(varargin)
694 N = JLINE.from_line_matrix(varargin{1});
695 D = JLINE.from_line_matrix(varargin{2});
696 Z = JLINE.from_line_matrix(varargin{3});
697 if nargin == 3
698 model = jline.lang.Network.cyclicFcfsInf(N, D, Z);
699 elseif nargin == 4
700 S = JLINE.from_line_matrix(varargin{4});
701 model = jline.lang.Network.cyclicFcfsInf(N, D, Z, S);
702 else
703 error('Invalid number of arguments for cyclicFcfsInf.');
704 end
705 model = JNetwork(model);
706 end
707
708 function model = cyclic(N, D, strategy, S)
709 N = JLINE.from_line_matrix(N);
710 D = JLINE.from_line_matrix(D);
711 S = JLINE.from_line_matrix(S);
712 model = jline.lang.Network.cyclic(N, D, strategy, S);
713 model = JNetwork(model);
714 end
715
716 function P = serialRouting(varargin)
717 if nargin == 1 && iscell(varargin{1})
718 % Case: serialRouting(List<Node>)
719 nodes = varargin{1};
720 P = jline.lang.Network.serialRouting(nodes);
721
722 elseif nargin == 1 && isa(varargin{1}, 'Node')
723 % Case: serialRouting(Node...)
724 nodeObjs = cellfun(@(n) n.obj, varargin, 'UniformOutput', false);
725 P = jline.lang.Network.serialRouting(nodeObjs);
726
727 elseif nargin == 2
728 a = varargin{1};
729 b = varargin{2};
730 if isa(a, 'JobClass') && iscell(b)
731 % Case: serialRouting(JobClass, List<Node>)
732 P = jline.lang.Network.serialRouting(a.obj, b);
733
734 elseif isa(a, 'JobClass') && all(cellfun(@(x) isa(x,'Node'), b))
735 % Case: serialRouting(JobClass, Node...)
736 nodeObjs = cellfun(@(n) n.obj, b, 'UniformOutput', false);
737 P = jline.lang.Network.serialRouting(a.obj, nodeObjs);
738
739 elseif iscell(a) && iscell(b)
740 % Case: serialRouting(List<JobClass>, List<Node>)
741 P = jline.lang.Network.serialRouting(a, b);
742
743 else
744 error('Unsupported serialRouting input pattern.');
745 end
746
747 elseif nargin >= 2 && isa(varargin{1}, 'JobClass')
748 jobClass = varargin{1};
749 nodes = varargin(2:end);
750 nodeObjs = cellfun(@(n) n.obj, nodes, 'UniformOutput', false);
751 P = jline.lang.Network.serialRouting(jobClass.obj, nodeObjs);
752
753 elseif nargin >= 2 && all(cellfun(@(x) isa(x, 'Node'), varargin))
754 % Generic case: serialRouting(Node1, Node2, ..., NodeN)
755 nodeObjs = cellfun(@(n) n.obj, varargin, 'UniformOutput', false);
756 P = jline.lang.Network.serialRouting([nodeObjs{:}]);
757
758 elseif nargin == 2 && iscell(varargin{1}) && iscell(varargin{2})
759 % Possibly a fallback for serialRouting(jobClasses, nodes)
760 P = jline.lang.Network.serialRouting(varargin{1}, varargin{2});
761
762 else
763 error('Invalid arguments to serialRouting.');
764 end
765 end
766
767
768 end
769end
Definition mmt.m:92