9 function obj = QInPow(proc)
17 ap = proc.all_A_plus();
18 am = proc.all_A_minus();
19 if isempty(a0) || isempty(ap) || isempty(am)
23 obj.matrices = cell(1, max([numel(am) + 1, numel(a0), numel(ap)]));
24 obj.matrices{1} = {a0{1}, ap{1}};
29 for k = 2:numel(obj.matrices)
30 obj.matrices{k} = {am{im}, a0{i0}, ap{ip}};
31 im = min(im + 1, numel(am));
32 i0 = min(i0 + 1, numel(a0));
33 ip = min(ip + 1, numel(ap));
38 if isempty(obj.process) || isempty(obj.process.all_A_0())
39 libqbd.raise_error('Infinitesimal generator matrix
is empty.');
43 function ret = inc_power(obj, step)
44 ret = libqbd.QInPow();
45 ret.power = obj.power + 1;
46 ret.process = obj.process;
47 ret.matrices = cell(1, numel(obj.matrices) + 1);
49 for k0 = (obj.power + 1):(numel(ret.matrices) - 1)
50 true_k0 = min(k0, numel(obj.matrices) - 1);
51 ret.matrices{k0 + 1} = {obj.matrices{true_k0 + 1}{1} * obj.process.get_A_minus(k0 - obj.power) * step};
54 for k0 = 0:(numel(ret.matrices) - 1)
55 true_k0 = min(k0, numel(obj.matrices) - 1);
56 blocks = obj.matrices{true_k0 + 1};
57 if isempty(ret.matrices{k0 + 1})
58 ret.matrices{k0 + 1} = {};
60 for j0 = 0:(numel(blocks) - 1)
61 m = zeros(size(blocks{j0 + 1}));
63 col = k0 + j0 - obj.power;
68 left = max(j0 - 1, 0);
69 right = min(j0 + 1, numel(blocks) - 1);
71 A = {obj.process.get_A_0(0), obj.process.get_A_minus(1)};
73 A = {obj.process.get_A_plus(col - 1), obj.process.get_A_0(col), obj.process.get_A_minus(col + 1)};
76 z_up = max(col - 1, 0);
77 z_left = max(k0 - obj.power, 0);
79 if z_up < z_left && col ~= 0
84 m = m + blocks{i0 + 1} * A{pos + 1} * step;
87 ret.matrices{k0 + 1}{end + 1} = m;
91 for k0 = 0:(numel(ret.matrices) - 1)
92 true_k0 = min(k0, numel(obj.matrices) - 1);
93 ret.matrices{k0 + 1}{end + 1} = obj.matrices{true_k0 + 1}{end} * obj.process.get_A_plus(k0 + obj.power) * step;
97 function obj = mull_by_const(obj, cons)
98 for k = 1:numel(obj.matrices)
99 for j = 1:numel(obj.matrices{k})
100 obj.matrices{k}{j} = obj.matrices{k}{j} * cons;
105 function obj = add_identity_matrix(obj)
107 for k0 = 0:(numel(obj.matrices) - 1)
108 m = obj.matrices{k0 + 1}{pos0 + 1};
109 obj.matrices{k0 + 1}{pos0 + 1} = m + eye(size(m));
116 function obj = plus_assign(obj, right)
117 if obj.power >= right.power
118 for k0 = 0:(numel(obj.matrices) - 1)
119 rk0 = min(k0, numel(right.matrices) - 1);
120 if k0 < (right.power + 1)
123 first = (numel(obj.matrices{k0 + 1}) - numel(right.matrices{rk0 + 1})) / 2;
125 for j0 = first:(first + numel(right.matrices{rk0 + 1}) - 1)
126 obj.matrices{k0 + 1}{j0 + 1} = obj.matrices{k0 + 1}{j0 + 1} + right.matrices{rk0 + 1}{j0 - first + 1};
132 obj = obj.plus_assign(tmp);
136 function ret = mull_by_vector(obj, pi)
137 ret = cell(1, numel(pi));
139 ret{k} = zeros(1, numel(pi{k}));
143 for k = numel(pi):(min(numel(obj.matrices), numel(pi) + obj.power) - 1)
144 ret{end + 1} = zeros(1, size(obj.matrices{k + 1}{1}, 1));
147 for k = 1:(obj.power - c)
148 ret{end + 1} = zeros(1, size(obj.matrices{end}{1}, 1));
153 for k0 = 0:(numel(pi) - 1)
154 pi_k = libqbd.as_row_vector(pi{k0 + 1});
156 col_num = col_num + 1;
158 for j0 = 0:(numel(obj.matrices{matrix_num + 1}) - 1)
159 ret{col_num + j0 + 1} = ret{col_num + j0 + 1} + pi_k * obj.matrices{matrix_num + 1}{j0 + 1};
161 if (matrix_num + 1) < numel(obj.matrices)
162 matrix_num = matrix_num + 1;
166 while numel(ret) > 1 && max(ret{end}) <= 0.0