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()
553 % Note: Java object does not support plot method
554 error('plot method not supported by Java object');
555 end
556
557 function jsimwView(self)
558 % JSIMWVIEW()
559 self.obj.jsimwView();
560 end
561
562 function view(self)
563 % VIEW()
564 self.jsimgView();
565 end
566
567 % Save methods (for consistency with MNetwork/SolverJMT)
568 function saveAsJSIM(self, filename)
569 % SAVEASJSIM(FILENAME)
570 % Note: Java object does not support direct JSIM export
571 error('saveAsJSIM method not supported by Java object. Use SolverJMT for JSIM export.');
572 end
573
574 function saveAsJMVA(self, filename)
575 % SAVEASJMVA(FILENAME)
576 % Note: Java object does not support direct JMVA export
577 error('saveAsJMVA method not supported by Java object. Use SolverJMT for JMVA export.');
578 end
579
580 end
581
582 methods (Static)
583
584
585 function model = tandemPs(lambda, D, S)
586 lambda = JLINE.from_line_matrix(lambda);
587 D = JLINE.from_line_matrix(D);
588 S = JLINE.from_line_matrix(S);
589 model = jline.lang.Network.tandemPs(lambda, D, S);
590 model = JNetwork(model);
591 end
592
593 function model = tandemPsInf(varargin)
594 lambda = JLINE.from_line_matrix(varargin{1});
595 D = JLINE.from_line_matrix(varargin{2});
596 if nargin == 2
597 model = jline.lang.Network.tandemPsInf(lambda, D);
598 elseif nargin == 3
599 Z = JLINE.from_line_matrix(varargin{3});
600 model = jline.lang.Network.tandemPsInf(lambda, D, Z);
601 elseif nargin == 4
602 Z = JLINE.from_line_matrix(varargin{3});
603 S = JLINE.from_line_matrix(varargin{4});
604 model = jline.lang.Network.tandemPsInf(lambda, D, Z, S);
605 else
606 error('Invalid number of arguments for tandemPsInf.');
607 end
608 model = JNetwork(model);
609 end
610
611 function model = tandemFcfs(varargin)
612 lambda = JLINE.from_line_matrix(varargin{1});
613 D = JLINE.from_line_matrix(varargin{2});
614 S = JLINE.from_line_matrix(varargin{3});
615 model = jline.lang.Network.tandemFcfs(lambda, D, S);
616 model = JNetwork(model);
617 end
618
619 function model = tandemFcfsInf(varargin)
620 lambda = JLINE.from_line_matrix(varargin{1});
621 D = JLINE.from_line_matrix(varargin{2});
622 if nargin == 2
623 model = jline.lang.Network.tandemFcfsInf(lambda, D);
624 elseif nargin == 3
625 Z = JLINE.from_line_matrix(varargin{3});
626 model = jline.lang.Network.tandemFcfsInf(lambda, D, Z);
627 elseif nargin == 4
628 Z = JLINE.from_line_matrix(varargin{3});
629 S = JLINE.from_line_matrix(varargin{4});
630 model = jline.lang.Network.tandemFcfsInf(lambda, D, Z, S);
631 else
632 error('Invalid number of arguments for tandemFcfsInf.');
633 end
634 model = JNetwork(model);
635 end
636
637 function model = tandem(lambda, D, strategy, S)
638 lambda = JLINE.from_line_matrix(lambda);
639 D = JLINE.from_line_matrix(D);
640 S = JLINE.from_line_matrix(S);
641 model = jline.lang.Network.tandem(lambda, D, strategy, S);
642 model = JNetwork(model);
643 end
644
645 function model = cyclicPs(varargin)
646 N = JLINE.from_line_matrix(varargin{1});
647 D = JLINE.from_line_matrix(varargin{2});
648 if nargin == 2
649 model = jline.lang.Network.cyclicPs(N, D);
650 elseif nargin == 3
651 S = JLINE.from_line_matrix(varargin{3});
652 model = jline.lang.Network.cyclicPs(N, D, S);
653 else
654 error('Invalid number of arguments for cyclicPs.');
655 end
656 model = JNetwork(model);
657 end
658
659 function model = cyclicFcfs(varargin)
660 N = JLINE.from_line_matrix(varargin{1});
661 D = JLINE.from_line_matrix(varargin{2});
662 if nargin == 2
663 model = jline.lang.Network.cyclicFcfs(N, D);
664 elseif nargin == 3
665 S = JLINE.from_line_matrix(varargin{3});
666 model = jline.lang.Network.cyclicFcfs(N, D, S);
667 else
668 error('Invalid number of arguments for cyclicFcfs.');
669 end
670 model = JNetwork(model);
671 end
672
673 function model = cyclicPsInf(varargin)
674 N = JLINE.from_line_matrix(varargin{1});
675 D = JLINE.from_line_matrix(varargin{2});
676 Z = JLINE.from_line_matrix(varargin{3});
677 if nargin == 3
678 model = jline.lang.Network.cyclicPsInf(N, D, Z);
679 elseif nargin == 4
680 S = JLINE.from_line_matrix(varargin{4});
681 model = jline.lang.Network.cyclicPsInf(N, D, Z, S);
682 else
683 error('Invalid number of arguments for cyclicPsInf.');
684 end
685 model = JNetwork(model);
686 end
687
688 function model = cyclicFcfsInf(varargin)
689 N = JLINE.from_line_matrix(varargin{1});
690 D = JLINE.from_line_matrix(varargin{2});
691 Z = JLINE.from_line_matrix(varargin{3});
692 if nargin == 3
693 model = jline.lang.Network.cyclicFcfsInf(N, D, Z);
694 elseif nargin == 4
695 S = JLINE.from_line_matrix(varargin{4});
696 model = jline.lang.Network.cyclicFcfsInf(N, D, Z, S);
697 else
698 error('Invalid number of arguments for cyclicFcfsInf.');
699 end
700 model = JNetwork(model);
701 end
702
703 function model = cyclic(N, D, strategy, S)
704 N = JLINE.from_line_matrix(N);
705 D = JLINE.from_line_matrix(D);
706 S = JLINE.from_line_matrix(S);
707 model = jline.lang.Network.cyclic(N, D, strategy, S);
708 model = JNetwork(model);
709 end
710
711 function P = serialRouting(varargin)
712 if nargin == 1 && iscell(varargin{1})
713 % Case: serialRouting(List<Node>)
714 nodes = varargin{1};
715 P = jline.lang.Network.serialRouting(nodes);
716
717 elseif nargin == 1 && isa(varargin{1}, 'Node')
718 % Case: serialRouting(Node...)
719 nodeObjs = cellfun(@(n) n.obj, varargin, 'UniformOutput', false);
720 P = jline.lang.Network.serialRouting(nodeObjs);
721
722 elseif nargin == 2
723 a = varargin{1};
724 b = varargin{2};
725 if isa(a, 'JobClass') && iscell(b)
726 % Case: serialRouting(JobClass, List<Node>)
727 P = jline.lang.Network.serialRouting(a.obj, b);
728
729 elseif isa(a, 'JobClass') && all(cellfun(@(x) isa(x,'Node'), b))
730 % Case: serialRouting(JobClass, Node...)
731 nodeObjs = cellfun(@(n) n.obj, b, 'UniformOutput', false);
732 P = jline.lang.Network.serialRouting(a.obj, nodeObjs);
733
734 elseif iscell(a) && iscell(b)
735 % Case: serialRouting(List<JobClass>, List<Node>)
736 P = jline.lang.Network.serialRouting(a, b);
737
738 else
739 error('Unsupported serialRouting input pattern.');
740 end
741
742 elseif nargin >= 2 && isa(varargin{1}, 'JobClass')
743 jobClass = varargin{1};
744 nodes = varargin(2:end);
745 nodeObjs = cellfun(@(n) n.obj, nodes, 'UniformOutput', false);
746 P = jline.lang.Network.serialRouting(jobClass.obj, nodeObjs);
747
748 elseif nargin >= 2 && all(cellfun(@(x) isa(x, 'Node'), varargin))
749 % Generic case: serialRouting(Node1, Node2, ..., NodeN)
750 nodeObjs = cellfun(@(n) n.obj, varargin, 'UniformOutput', false);
751 P = jline.lang.Network.serialRouting([nodeObjs{:}]);
752
753 elseif nargin == 2 && iscell(varargin{1}) && iscell(varargin{2})
754 % Possibly a fallback for serialRouting(jobClasses, nodes)
755 P = jline.lang.Network.serialRouting(varargin{1}, varargin{2});
756
757 else
758 error('Invalid arguments to serialRouting.');
759 end
760 end
761
762
763 end
764end
Definition mmt.m:92