1function test14 (nmat)
2%TEST14 test metis, symbfact2, and etree2
3% Example:
4%   test14(nmat)
5% See also cholmod_test
6
7% Copyright 2007, Timothy A. Davis, http://www.suitesparse.com
8
9fprintf ('=================================================================\n');
10fprintf ('test14: test metis, symbfact2, and etree2\n') ;
11
12index = ssget ;
13
14[ignore f] = sort (max (index.nrows, index.ncols)) ;
15
16% f1 = find (max (index.nrows (f), index.ncols (f)) > 55500) ;
17% f1 = f1 (1) ;
18% f = f (f1:end) ;
19
20% These bugs show up when Common->metis_memory is set to zero:
21% skip = [ 1298 ] ; % runs out of memory in metis(A,'row')
22skip =  1257  ;   %#ok	% GHS_psdef/crankseg_1: segfault in metis(A,'row') ;
23skip =  850  ;    %#ok	% Chen/pkustk04: segfault in metis(A,'row') ;
24skip = [ ] ;	  %#ok
25
26if (nargin > 0)
27    nmat = max (0,nmat) ;
28    nmat = min (nmat, length (f)) ;
29    f = f (1:nmat) ;
30end
31
32for i = f
33
34    fprintf ('%d:\n', i) ;
35    if (any (skip == i))
36	fprintf ('skip %s / %s\n', index.Group {i}, index.Name {i}) ;
37	continue
38    end
39
40    % try
41
42	Prob = ssget (i)						    %#ok
43	A = Prob.A ;
44	[m n] = size (A) ;
45
46	if (m == n)
47	    S = spones (A) ;
48	else
49	    n = min (m,n) ;
50	    S = spones (A (1:n,1:n)) ;
51	end
52
53	try % compute nnz(S*S')
54	    nzaat = nnz (S*S') ;
55	catch
56	    nzaat = -1 ;
57	end
58	try % compute nnz(S'*S)
59	    nzata = nnz (S'*S) ;
60	catch
61	    nzata = -1 ;
62	end
63	S = S | S' ;
64
65	fprintf ('nnz(A)    %d\n', nnz (A)) ;
66	fprintf ('nnz(S)    %d\n', nnz (S)) ;
67	fprintf ('nnz(A*A'') %d\n', nzaat) ;
68	fprintf ('nnz(A''*A) %d\n', nzata) ;
69
70	fprintf ('metis (S):\n') ;     p1 = metis (S) ;
71	fprintf ('metis (A,row):\n') ; p2 = metis (A, 'row') ;
72	fprintf ('metis (A,col):\n') ; p3 = metis (A, 'col') ;
73
74	fprintf ('turning off postorder:\n') ;
75	fprintf ('metis (S):\n') ;     n1 = metis (S, 'sym', 'no postorder') ;
76	fprintf ('metis (A,row):\n') ; n2 = metis (A, 'row', 'no postorder') ;
77	fprintf ('metis (A,col):\n') ; n3 = metis (A, 'col', 'no postorder') ;
78
79	fprintf ('analyzing results:\n') ;
80
81	[pa1 po1] = etree2 (S (n1,n1)) ;
82	[pa2 po2] = etree2 (A (n2,:), 'row') ;
83	[pa3 po3] = etree2 (A (:,n3), 'col') ;
84
85	q1 = n1 (po1) ;
86	q2 = n2 (po2) ;
87	q3 = n3 (po3) ;
88
89	if (any (p1 ~= q1))
90	    error ('1!') ;
91	end
92
93	if (any (p2 ~= q2))
94	    error ('2!') ;
95	end
96
97	if (any (p3 ~= q3))
98	    error ('3!') ;
99	end
100
101	s1 = symbfact2 (S (p1,p1)) ;
102	s2 = symbfact2 (A (p2,:), 'row') ;
103	s3 = symbfact2 (A (:,p3), 'col') ;
104
105	t1 = symbfact2 (S (n1,n1)) ;
106	t2 = symbfact2 (A (n2,:), 'row') ;
107	t3 = symbfact2 (A (:,n3), 'col') ;
108
109	if (any (s1 ~= t1 (po1)))
110	    error ('s1!') ;
111	end
112
113	if (any (s2 ~= t2 (po2)))
114	    error ('s2!') ;
115	end
116
117	if (any (s3 ~= t3 (po3)))
118	    error ('s3!') ;
119	end
120
121    % catch
122    %	fprintf ('%d failed\n') ;
123    % end
124end
125
126
127fprintf ('test14 passed\n') ;
128