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