1function test19
2%TEST19 test cs_dmperm, cs_maxtransr, cs_dmspy, cs_scc
3%
4% Example:
5%   test19
6% See also: testall
7
8% Copyright 2006-2012, Timothy A. Davis, http://www.suitesparse.com
9
10clear functions
11
12randn ('state', 0) ;
13rand ('state', 0) ;
14
15clf
16
17for trials = 1:1000
18
19    m = fix (100 * rand (1)) ;
20    n = fix (100 * rand (1)) ;
21    % d = 0.1 * rand (1) ;
22    d = rand (1) * 4 * max (m,n) / max (m*n,1) ;
23    A = sprandn (m,n,d) ;
24    S = sprandn (m,m,d) + speye (m) ;
25
26    subplot (2,3,1) ;
27    cspy (A) ;
28
29    pp = dmperm (A) ;
30
31    sprnk = sum (pp > 0) ;
32
33    pp2 = cs_dmperm (A) ;
34    spr2 = sum (pp2 > 0) ;
35    if (spr2 ~= sprnk)
36        error ('!')
37    end
38
39    pp2 = cs_maxtransr (A) ;
40    spr2 = sum (pp2 > 0) ;
41    if (spr2 ~= sprnk)
42        error ('!')
43    end
44
45    [p,q,r,s] = dmperm (A) ;
46    C = A (p,q) ;
47    % r
48    % s
49
50    nk = length (r) - 1 ;
51
52    fprintf ('sprnk: %d  m %d n %d   nb: %d\n', sprnk, m, n, nk) ;
53
54    subplot (2,3,2) ;
55    hold off
56    spy (C)
57    hold on
58
59    for k = 1:nk
60        r1 = r(k) ;
61        r2 = r(k+1) ;
62        c1 = s(k)  ;
63        c2 = s(k+1) ;
64        plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
65    end
66
67    [p2,q2,rr2,ss2,cp,rp] = cs_dmperm (A) ;
68
69    if (min (m,n) > 0)
70        if (length (rr2) ~= length (r))
71            error ('# fine blocks!') ;
72        end
73    end
74
75    if (rp (4) - 1 ~= sprnk)
76        rp              %#ok
77        sprnk           %#ok
78        error ('!') ;
79    end
80
81    if (any (sort (p2) ~= 1:m))
82        error ('p2!') ;
83    end
84
85    if (any (sort (q2) ~= 1:n))
86        error ('q2!') ;
87    end
88
89    if (cp (5) ~= n+1)
90        error ('cp!') ;
91    end
92
93    if (rp (5) ~= m+1)
94        error ('rp!') ;
95    end
96
97    C = A (p2,q2) ;
98
99    subplot (2,3,3) ; cs_dmspy (A,0) ;
100
101    % hold off
102    % spy (C) ;
103    % hold on
104
105    % r1 = rp(1) ;
106    % r2 = rp(2) ;
107    % c1 = cp(1)  ;
108    % c2 = cp(2) ;
109    % plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
110
111    r1 = rp(1) ;
112    r2 = rp(2) ;
113    c1 = cp(2) ;
114    c2 = cp(3) ;
115    % plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
116
117    B = C (r1:r2-1, c1:c2-1) ;
118    if (nnz (diag (B)) ~= size (B,1))
119        error ('C1 diag!') ;
120    end
121
122    r1 = rp(2) ;
123    r2 = rp(3) ;
124    c1 = cp(3) ;
125    c2 = cp(4) ;
126    % plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'r') ;
127
128    B = C (r1:r2-1, c1:c2-1) ;
129    if (nnz (diag (B)) ~= size (B,1))
130        error ('C2 diag!') ;
131    end
132
133    r1 = rp(3) ;
134    r2 = rp(4) ;
135    c1 = cp(4) ;
136    c2 = cp(5) ;
137    % plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
138
139    B = C (r1:r2-1, c1:c2-1) ;
140    if (nnz (diag (B)) ~= size (B,1))
141        error ('C3 diag!') ;
142    end
143
144    r1 = rp(4) ;                                                            %#ok
145    r2 = rp(5) ;                                                            %#ok
146    c1 = cp(4) ;                                                            %#ok
147    c2 = cp(5) ;                                                            %#ok
148    % plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
149
150    if (~isempty (S))
151
152        [p1,q1,r0,s0] = dmperm (S) ;
153        [p3,r3] = cs_scc (S) ;
154        if (length (r3) ~= length (r0))
155            error ('scc size!') ;
156        end
157
158        if (any (sort (p3) ~= 1:m))
159            error ('scc perm!') ;
160        end
161
162        nk = length (r0)-1 ;
163
164        subplot (2,3,4) ;
165        hold off
166        spy (S (p1,q1)) ;
167        hold on
168        for k = 1:nk
169            r1 = r0(k) ;
170            r2 = r0(k+1) ;
171            c1 = s0(k)  ;
172            c2 = s0(k+1) ;
173            plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
174        end
175
176        subplot (2,3,5) ;
177        hold off
178        spy (S (p3,p3)) ;
179        hold on
180        for k = 1:nk
181            r1 = r3(k) ;
182            r2 = r3(k+1) ;
183            c1 = r3(k)  ;
184            c2 = r3(k+1) ;
185            plot ([c1 c2 c2 c1 c1]-.5, [r1 r1 r2 r2 r1]-.5, 'g') ;
186        end
187
188    end
189
190    subplot (2,3,6) ;
191    cs_dmspy (A) ;
192    drawnow
193   % pause
194
195
196
197
198end
199