LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
lqn_bpmn_debug.m
1% Debug version of lqn_bpmn to trace LN solver iteration
2clear solver AvgTable
3fprintf(1,'DEBUG: LN(MVA) iteration tracing for lqn_bpmn model\n\n');
4
5model = LayeredNetwork('myLayeredModel');
6
7P{1} = Processor(model, 'R1_Processor', 100, SchedStrategy.FCFS);
8P{2} = Processor(model, 'R2_Processor', Inf, SchedStrategy.INF);
9P{3} = Processor(model, 'R3_Processor', 2, SchedStrategy.FCFS);
10P{4} = Processor(model, 'R1A_Processor', 7, SchedStrategy.FCFS);
11P{5} = Processor(model, 'R1B_Processor', 3, SchedStrategy.FCFS);
12P{6} = Processor(model, 'R2A_Processor', 4, SchedStrategy.FCFS);
13P{7} = Processor(model, 'R2B_Processor', 5, SchedStrategy.FCFS);
14
15T{1} = Task(model, 'R1_Task', 100, SchedStrategy.REF).on(P{1}).setThinkTime(Exp.fitMean(20));
16T{2} = Task(model, 'R2_Task', Inf, SchedStrategy.INF).on(P{2}).setThinkTime(Immediate());
17T{3} = Task(model, 'R3_Task', 2, SchedStrategy.FCFS).on(P{3}).setThinkTime(Immediate());
18T{4} = Task(model, 'R1A_Task', 7, SchedStrategy.FCFS).on(P{4}).setThinkTime(Immediate());
19T{5} = Task(model, 'R1B_Task', 3, SchedStrategy.FCFS).on(P{5}).setThinkTime(Immediate());
20T{6} = Task(model, 'R2A_Task', 4, SchedStrategy.FCFS).on(P{6}).setThinkTime(Immediate());
21T{7} = Task(model, 'R2B_Task', 5, SchedStrategy.FCFS).on(P{7}).setThinkTime(Immediate());
22
23E{1} = Entry(model, 'R1_Ref_Entry').on(T{1});
24E{2} = Entry(model, 'R2_Synch_A2_Entry').on(T{2});
25E{3} = Entry(model, 'R2_Synch_A5_Entry').on(T{2});
26E{4} = Entry(model, 'R3_Synch_A9_Entry').on(T{3});
27E{5} = Entry(model, 'R1A_Synch_A1_Entry').on(T{4});
28E{6} = Entry(model, 'R1A_Synch_A2_Entry').on(T{4});
29E{7} = Entry(model, 'R1A_Synch_A3_Entry').on(T{4});
30E{8} = Entry(model, 'R1B_Synch_A4_Entry').on(T{5});
31E{9} = Entry(model, 'R1B_Synch_A5_Entry').on(T{5});
32E{10} = Entry(model, 'R1B_Synch_A6_Entry').on(T{5});
33E{11} = Entry(model, 'R2A_Synch_A7_Entry').on(T{6});
34E{12} = Entry(model, 'R2A_Synch_A8_Entry').on(T{6});
35E{13} = Entry(model, 'R2A_Synch_A11_Entry').on(T{6});
36E{14} = Entry(model, 'R2B_Synch_A9_Entry').on(T{7});
37E{15} = Entry(model, 'R2B_Synch_A10_Entry').on(T{7});
38E{16} = Entry(model, 'R2B_Synch_A12_Entry').on(T{7});
39
40A{1} = Activity(model, 'A1_Empty', Immediate()).on(T{1}).boundTo(E{1}).synchCall(E{5},1);
41A{2} = Activity(model, 'A2_Empty', Immediate()).on(T{1}).synchCall(E{6},1);
42A{3} = Activity(model, 'A5_Empty', Immediate()).on(T{1}).synchCall(E{9},1);
43A{4} = Activity(model, 'A6_Empty', Immediate()).on(T{1}).synchCall(E{10},1);
44A{5} = Activity(model, 'A3_Empty', Immediate()).on(T{1}).synchCall(E{7},1);
45A{6} = Activity(model, 'A4_Empty', Immediate()).on(T{1}).synchCall(E{8},1);
46A{7} = Activity(model, 'E4_Empty', Immediate()).on(T{2}).boundTo(E{2});
47A{8} = Activity(model, 'A7_Empty', Immediate()).on(T{2}).synchCall(E{11},1);
48A{9} = Activity(model, 'A8_Empty', Immediate()).on(T{2}).synchCall(E{12},1);
49A{10} = Activity(model, 'A9_Empty', Immediate()).on(T{2}).synchCall(E{14},1);
50A{11} = Activity(model, 'A11_Empty', Immediate()).on(T{2}).synchCall(E{13},1).repliesTo(E{2});
51A{12} = Activity(model, 'A12_Empty', Immediate()).on(T{2}).boundTo(E{3}).synchCall(E{16},1).repliesTo(E{3});
52A{13} = Activity(model, 'A10_Empty', Immediate()).on(T{2}).synchCall(E{15},1);
53A{14} = Activity(model, 'A13', Exp.fitMean(10)).on(T{3}).boundTo(E{4}).repliesTo(E{4});
54A{15} = Activity(model, 'A1', Exp.fitMean(7)).on(T{4}).boundTo(E{5}).repliesTo(E{5});
55A{16} = Activity(model, 'A2', Exp.fitMean(4)).on(T{4}).boundTo(E{6});
56A{17} = Activity(model, 'A3', Exp.fitMean(5)).on(T{4}).boundTo(E{7}).repliesTo(E{7});
57A{18} = Activity(model, 'A2_Res_Empty', Immediate()).on(T{4}).synchCall(E{2},1).repliesTo(E{6});
58A{19} = Activity(model, 'A4', Exp.fitMean(8)).on(T{5}).boundTo(E{8}).repliesTo(E{8});
59A{20} = Activity(model, 'A5', Exp.fitMean(4)).on(T{5}).boundTo(E{9});
60A{21} = Activity(model, 'A6', Exp.fitMean(6)).on(T{5}).boundTo(E{10}).repliesTo(E{10});
61A{22} = Activity(model, 'A5_Res_Empty', Immediate()).on(T{5}).synchCall(E{3},1).repliesTo(E{9});
62A{23} = Activity(model, 'A7', Exp.fitMean(6)).on(T{6}).boundTo(E{11}).repliesTo(E{11});
63A{24} = Activity(model, 'A8', Exp.fitMean(8)).on(T{6}).boundTo(E{12}).repliesTo(E{12});
64A{25} = Activity(model, 'A11', Exp.fitMean(4)).on(T{6}).boundTo(E{13}).repliesTo(E{13});
65A{26} = Activity(model, 'A9', Exp.fitMean(4)).on(T{7}).boundTo(E{14});
66A{27} = Activity(model, 'A10', Exp.fitMean(6)).on(T{7}).boundTo(E{15}).repliesTo(E{15});
67A{28} = Activity(model, 'A12', Exp.fitMean(8)).on(T{7}).boundTo(E{16}).repliesTo(E{16});
68A{29} = Activity(model, 'A9_Res_Empty', Immediate()).on(T{7}).synchCall(E{4},1).repliesTo(E{14});
69
70T{1}.addPrecedence(ActivityPrecedence.Serial(A{1}, A{2}));
71T{1}.addPrecedence(ActivityPrecedence.Serial(A{3}, A{4}));
72T{2}.addPrecedence(ActivityPrecedence.Serial(A{7}, A{8}));
73T{2}.addPrecedence(ActivityPrecedence.Serial(A{10}, A{13}));
74T{4}.addPrecedence(ActivityPrecedence.Serial(A{16}, A{18}));
75T{5}.addPrecedence(ActivityPrecedence.Serial(A{20}, A{22}));
76T{7}.addPrecedence(ActivityPrecedence.Serial(A{26}, A{29}));
77T{1}.addPrecedence(ActivityPrecedence.OrFork(A{2},{A{5}, A{6}},[0.6,0.4]));
78T{2}.addPrecedence(ActivityPrecedence.AndFork(A{8},{A{9}, A{10}}));
79T{1}.addPrecedence(ActivityPrecedence.OrJoin({A{5}, A{6}}, A{3}));
80T{2}.addPrecedence(ActivityPrecedence.AndJoin({A{9}, A{13}}, A{11}));
81
82% LN(MVA) solver with verbose output
83lnoptions = LN.defaultOptions;
84lnoptions.verbose = 1; % Enable verbose
85lnoptions.iter_max = 50; % Limit iterations for debugging
86options = MVA.defaultOptions;
87options.verbose = 0;
88
89fprintf(1,'\n=== Starting LN(MVA) Solver ===\n');
90solver = LN(model, @(model) MVA(model, options), lnoptions);
91
92% Access internal state before solving
93fprintf(1,'\nNumber of layers: %d\n', solver.nlayers);
94
95% Run solver
96AvgTable = solver.getAvgTable();
97
98% Print iteration results
99fprintf(1,'\n=== Iteration Summary ===\n');
100if ~isempty(solver.results)
101 numIters = size(solver.results, 1);
102 fprintf(1,'Total iterations: %d\n', numIters);
103
104 % Show first few iterations for each layer
105 for it = 1:min(5, numIters)
106 fprintf(1,'\n--- Iteration %d ---\n', it);
107 for e = 1:size(solver.results, 2)
108 if ~isempty(solver.results{it, e})
109 r = solver.results{it, e};
110 fprintf(1,'Layer %d: max(TN)=%.6f, max(QN)=%.6f, max(UN)=%.6f\n', ...
111 e, max(r.TN(:)), max(r.QN(:)), max(r.UN(:)));
112 end
113 end
114 end
115
116 % Show last iteration
117 fprintf(1,'\n--- Last Iteration (%d) ---\n', numIters);
118 for e = 1:size(solver.results, 2)
119 if ~isempty(solver.results{numIters, e})
120 r = solver.results{numIters, e};
121 fprintf(1,'Layer %d:\n', e);
122 fprintf(1,' TN: %s\n', mat2str(r.TN(:)', 4));
123 fprintf(1,' QN: %s\n', mat2str(r.QN(:)', 4));
124 end
125 end
126end
127
128fprintf(1,'\n=== Final Results (Key Tasks) ===\n');
129% Find task indices
130taskNames = {'R1_Task', 'R2_Task', 'R3_Task', 'R1A_Task', 'R1B_Task', 'R2A_Task', 'R2B_Task'};
131for i = 1:length(taskNames)
132 idx = find(strcmp(AvgTable.Node, taskNames{i}));
133 if ~isempty(idx)
134 fprintf(1,'%s: Tput=%.6f, QLen=%.6f, Util=%.6f\n', ...
135 taskNames{i}, AvgTable.Tput(idx), AvgTable.QLen(idx), AvgTable.Util(idx));
136 end
137end