LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ctmc_stochcomp.m
1function [S,Q11,Q12,Q21,Q22,T]=ctmc_stochcomp(Q,I)
2% [S,Q11,Q12,Q21,Q22,T] = CTMC_STOCHCOMP(Q,I)
3% Copyright (c) 2012-2026, Imperial College London
4% All rights reserved.
5if nargin==1
6 I=1:ceil(length(Q)/2);
7end
8isSelected = false(1, length(Q));
9for idx = 1:length(I)
10 isSelected(I(idx)) = true;
11end
12Ic = zeros(1, length(Q) - length(I));
13icPos = 0;
14for idx = 1:length(Q)
15 if ~isSelected(idx)
16 icPos = icPos + 1;
17 Ic(icPos) = idx;
18 end
19end
20Q11 = Q(I,I);
21Q12 = Q(I,Ic);
22Q21 = Q(Ic,I);
23Q22 = Q(Ic,Ic);
24% see _kb/03-api-layer.md (mc/ additions) for the ILUT/fill-in rationale
25GMRES_MIN_STATES = 6000;
26T = [];
27if size(Q22,1) > GMRES_MIN_STATES
28 [T,gflag] = ctmc_gmres_multi(-Q22, Q21);
29 if gflag ~= 0
30 T = [];
31 end
32end
33if isempty(T)
34 T = (-Q22) \ Q21;
35 if ~all(isfinite(T(:)))
36 % Backslash returns NaN on a rank-deficient complement, which then
37 % contaminates every downstream metric. Fall back to the minimum-norm
38 % least-squares solution, as the Java and Python kernels do.
39 T = lsqminnorm(full(-Q22), full(Q21));
40 end
41end
42T = Q12*T;
43S = Q11+T;
44end