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