scs 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +98 -0
- data/ext/scs/extconf.rb +29 -0
- data/lib/scs.rb +17 -0
- data/lib/scs/ffi.rb +117 -0
- data/lib/scs/solver.rb +173 -0
- data/lib/scs/version.rb +3 -0
- data/vendor/scs/LICENSE.txt +21 -0
- data/vendor/scs/Makefile +164 -0
- data/vendor/scs/README.md +222 -0
- data/vendor/scs/include/aa.h +56 -0
- data/vendor/scs/include/cones.h +46 -0
- data/vendor/scs/include/ctrlc.h +33 -0
- data/vendor/scs/include/glbopts.h +177 -0
- data/vendor/scs/include/linalg.h +26 -0
- data/vendor/scs/include/linsys.h +64 -0
- data/vendor/scs/include/normalize.h +18 -0
- data/vendor/scs/include/rw.h +17 -0
- data/vendor/scs/include/scs.h +161 -0
- data/vendor/scs/include/scs_blas.h +51 -0
- data/vendor/scs/include/util.h +65 -0
- data/vendor/scs/linsys/amatrix.c +305 -0
- data/vendor/scs/linsys/amatrix.h +36 -0
- data/vendor/scs/linsys/amatrix.o +0 -0
- data/vendor/scs/linsys/cpu/direct/private.c +366 -0
- data/vendor/scs/linsys/cpu/direct/private.h +26 -0
- data/vendor/scs/linsys/cpu/direct/private.o +0 -0
- data/vendor/scs/linsys/cpu/indirect/private.c +256 -0
- data/vendor/scs/linsys/cpu/indirect/private.h +31 -0
- data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
- data/vendor/scs/linsys/external/amd/LICENSE.txt +934 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +469 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +254 -0
- data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
- data/vendor/scs/linsys/external/amd/amd.h +400 -0
- data/vendor/scs/linsys/external/amd/amd_1.c +180 -0
- data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_2.c +1842 -0
- data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_aat.c +184 -0
- data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_control.c +64 -0
- data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_defaults.c +37 -0
- data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_dump.c +179 -0
- data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_global.c +16 -0
- data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_info.c +119 -0
- data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_internal.h +304 -0
- data/vendor/scs/linsys/external/amd/amd_order.c +199 -0
- data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_post_tree.c +120 -0
- data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_postorder.c +206 -0
- data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_preprocess.c +118 -0
- data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
- data/vendor/scs/linsys/external/amd/amd_valid.c +92 -0
- data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
- data/vendor/scs/linsys/external/amd/changes +11 -0
- data/vendor/scs/linsys/external/qdldl/LICENSE +201 -0
- data/vendor/scs/linsys/external/qdldl/README.md +120 -0
- data/vendor/scs/linsys/external/qdldl/changes +4 -0
- data/vendor/scs/linsys/external/qdldl/qdldl.c +298 -0
- data/vendor/scs/linsys/external/qdldl/qdldl.h +177 -0
- data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
- data/vendor/scs/linsys/external/qdldl/qdldl_types.h +21 -0
- data/vendor/scs/linsys/gpu/gpu.c +41 -0
- data/vendor/scs/linsys/gpu/gpu.h +85 -0
- data/vendor/scs/linsys/gpu/indirect/private.c +304 -0
- data/vendor/scs/linsys/gpu/indirect/private.h +36 -0
- data/vendor/scs/scs.mk +181 -0
- data/vendor/scs/src/aa.c +224 -0
- data/vendor/scs/src/aa.o +0 -0
- data/vendor/scs/src/cones.c +802 -0
- data/vendor/scs/src/cones.o +0 -0
- data/vendor/scs/src/ctrlc.c +77 -0
- data/vendor/scs/src/ctrlc.o +0 -0
- data/vendor/scs/src/linalg.c +84 -0
- data/vendor/scs/src/linalg.o +0 -0
- data/vendor/scs/src/normalize.c +93 -0
- data/vendor/scs/src/normalize.o +0 -0
- data/vendor/scs/src/rw.c +167 -0
- data/vendor/scs/src/rw.o +0 -0
- data/vendor/scs/src/scs.c +978 -0
- data/vendor/scs/src/scs.o +0 -0
- data/vendor/scs/src/scs_version.c +5 -0
- data/vendor/scs/src/scs_version.o +0 -0
- data/vendor/scs/src/util.c +196 -0
- data/vendor/scs/src/util.o +0 -0
- data/vendor/scs/test/data/small_random_socp +0 -0
- data/vendor/scs/test/minunit.h +13 -0
- data/vendor/scs/test/problem_utils.h +93 -0
- data/vendor/scs/test/problems/rob_gauss_cov_est.h +85 -0
- data/vendor/scs/test/problems/small_lp.h +50 -0
- data/vendor/scs/test/problems/small_random_socp.h +33 -0
- data/vendor/scs/test/random_socp_prob.c +171 -0
- data/vendor/scs/test/run_from_file.c +69 -0
- data/vendor/scs/test/run_tests +2 -0
- data/vendor/scs/test/run_tests.c +32 -0
- metadata +203 -0
|
Binary file
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/* ========================================================================= */
|
|
2
|
+
/* === AMD_aat ============================================================= */
|
|
3
|
+
/* ========================================================================= */
|
|
4
|
+
|
|
5
|
+
/* ------------------------------------------------------------------------- */
|
|
6
|
+
/* AMD, Copyright (c) Timothy A. Davis, */
|
|
7
|
+
/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */
|
|
8
|
+
/* email: DrTimothyAldenDavis@gmail.com */
|
|
9
|
+
/* ------------------------------------------------------------------------- */
|
|
10
|
+
|
|
11
|
+
/* AMD_aat: compute the symmetry of the pattern of A, and count the number of
|
|
12
|
+
* nonzeros each column of A+A' (excluding the diagonal). Assumes the input
|
|
13
|
+
* matrix has no errors, with sorted columns and no duplicates
|
|
14
|
+
* (AMD_valid (n, n, Ap, Ai) must be AMD_OK, but this condition is not
|
|
15
|
+
* checked).
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "amd_internal.h"
|
|
19
|
+
|
|
20
|
+
GLOBAL size_t AMD_aat /* returns nz in A+A' */
|
|
21
|
+
(
|
|
22
|
+
Int n,
|
|
23
|
+
const Int Ap [ ],
|
|
24
|
+
const Int Ai [ ],
|
|
25
|
+
Int Len [ ], /* Len [j]: length of column j of A+A', excl diagonal*/
|
|
26
|
+
Int Tp [ ], /* workspace of size n */
|
|
27
|
+
scs_float Info [ ]
|
|
28
|
+
)
|
|
29
|
+
{
|
|
30
|
+
Int p1, p2, p, i, j, pj, pj2, k, nzdiag, nzboth, nz ;
|
|
31
|
+
scs_float sym ;
|
|
32
|
+
size_t nzaat ;
|
|
33
|
+
|
|
34
|
+
#ifndef NDEBUG
|
|
35
|
+
AMD_debug_init ("AMD AAT") ;
|
|
36
|
+
for (k = 0 ; k < n ; k++) Tp [k] = EMPTY ;
|
|
37
|
+
ASSERT (AMD_valid (n, n, Ap, Ai) == AMD_OK) ;
|
|
38
|
+
#endif
|
|
39
|
+
|
|
40
|
+
if (Info != (scs_float *) NULL)
|
|
41
|
+
{
|
|
42
|
+
/* clear the Info array, if it exists */
|
|
43
|
+
for (i = 0 ; i < AMD_INFO ; i++)
|
|
44
|
+
{
|
|
45
|
+
Info [i] = EMPTY ;
|
|
46
|
+
}
|
|
47
|
+
Info [AMD_STATUS] = AMD_OK ;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
for (k = 0 ; k < n ; k++)
|
|
51
|
+
{
|
|
52
|
+
Len [k] = 0 ;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
nzdiag = 0 ;
|
|
56
|
+
nzboth = 0 ;
|
|
57
|
+
nz = Ap [n] ;
|
|
58
|
+
|
|
59
|
+
for (k = 0 ; k < n ; k++)
|
|
60
|
+
{
|
|
61
|
+
p1 = Ap [k] ;
|
|
62
|
+
p2 = Ap [k+1] ;
|
|
63
|
+
AMD_DEBUG2 (("\nAAT Column: "ID" p1: "ID" p2: "ID"\n", k, p1, p2)) ;
|
|
64
|
+
|
|
65
|
+
/* construct A+A' */
|
|
66
|
+
for (p = p1 ; p < p2 ; )
|
|
67
|
+
{
|
|
68
|
+
/* scan the upper triangular part of A */
|
|
69
|
+
j = Ai [p] ;
|
|
70
|
+
if (j < k)
|
|
71
|
+
{
|
|
72
|
+
/* entry A (j,k) is in the strictly upper triangular part,
|
|
73
|
+
* add both A (j,k) and A (k,j) to the matrix A+A' */
|
|
74
|
+
Len [j]++ ;
|
|
75
|
+
Len [k]++ ;
|
|
76
|
+
AMD_DEBUG3 ((" upper ("ID","ID") ("ID","ID")\n", j,k, k,j));
|
|
77
|
+
p++ ;
|
|
78
|
+
}
|
|
79
|
+
else if (j == k)
|
|
80
|
+
{
|
|
81
|
+
/* skip the diagonal */
|
|
82
|
+
p++ ;
|
|
83
|
+
nzdiag++ ;
|
|
84
|
+
break ;
|
|
85
|
+
}
|
|
86
|
+
else /* j > k */
|
|
87
|
+
{
|
|
88
|
+
/* first entry below the diagonal */
|
|
89
|
+
break ;
|
|
90
|
+
}
|
|
91
|
+
/* scan lower triangular part of A, in column j until reaching
|
|
92
|
+
* row k. Start where last scan left off. */
|
|
93
|
+
ASSERT (Tp [j] != EMPTY) ;
|
|
94
|
+
ASSERT (Ap [j] <= Tp [j] && Tp [j] <= Ap [j+1]) ;
|
|
95
|
+
pj2 = Ap [j+1] ;
|
|
96
|
+
for (pj = Tp [j] ; pj < pj2 ; )
|
|
97
|
+
{
|
|
98
|
+
i = Ai [pj] ;
|
|
99
|
+
if (i < k)
|
|
100
|
+
{
|
|
101
|
+
/* A (i,j) is only in the lower part, not in upper.
|
|
102
|
+
* add both A (i,j) and A (j,i) to the matrix A+A' */
|
|
103
|
+
Len [i]++ ;
|
|
104
|
+
Len [j]++ ;
|
|
105
|
+
AMD_DEBUG3 ((" lower ("ID","ID") ("ID","ID")\n",
|
|
106
|
+
i,j, j,i)) ;
|
|
107
|
+
pj++ ;
|
|
108
|
+
}
|
|
109
|
+
else if (i == k)
|
|
110
|
+
{
|
|
111
|
+
/* entry A (k,j) in lower part and A (j,k) in upper */
|
|
112
|
+
pj++ ;
|
|
113
|
+
nzboth++ ;
|
|
114
|
+
break ;
|
|
115
|
+
}
|
|
116
|
+
else /* i > k */
|
|
117
|
+
{
|
|
118
|
+
/* consider this entry later, when k advances to i */
|
|
119
|
+
break ;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
Tp [j] = pj ;
|
|
123
|
+
}
|
|
124
|
+
/* Tp [k] points to the entry just below the diagonal in column k */
|
|
125
|
+
Tp [k] = p ;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* clean up, for remaining mismatched entries */
|
|
129
|
+
for (j = 0 ; j < n ; j++)
|
|
130
|
+
{
|
|
131
|
+
for (pj = Tp [j] ; pj < Ap [j+1] ; pj++)
|
|
132
|
+
{
|
|
133
|
+
i = Ai [pj] ;
|
|
134
|
+
/* A (i,j) is only in the lower part, not in upper.
|
|
135
|
+
* add both A (i,j) and A (j,i) to the matrix A+A' */
|
|
136
|
+
Len [i]++ ;
|
|
137
|
+
Len [j]++ ;
|
|
138
|
+
AMD_DEBUG3 ((" lower cleanup ("ID","ID") ("ID","ID")\n",
|
|
139
|
+
i,j, j,i)) ;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* --------------------------------------------------------------------- */
|
|
144
|
+
/* compute the symmetry of the nonzero pattern of A */
|
|
145
|
+
/* --------------------------------------------------------------------- */
|
|
146
|
+
|
|
147
|
+
/* Given a matrix A, the symmetry of A is:
|
|
148
|
+
* B = tril (spones (A), -1) + triu (spones (A), 1) ;
|
|
149
|
+
* sym = nnz (B & B') / nnz (B) ;
|
|
150
|
+
* or 1 if nnz (B) is zero.
|
|
151
|
+
*/
|
|
152
|
+
|
|
153
|
+
if (nz == nzdiag)
|
|
154
|
+
{
|
|
155
|
+
sym = 1 ;
|
|
156
|
+
}
|
|
157
|
+
else
|
|
158
|
+
{
|
|
159
|
+
sym = (2 * (scs_float) nzboth) / ((scs_float) (nz - nzdiag)) ;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
nzaat = 0 ;
|
|
163
|
+
for (k = 0 ; k < n ; k++)
|
|
164
|
+
{
|
|
165
|
+
nzaat += Len [k] ;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
AMD_DEBUG1 (("AMD nz in A+A', excluding diagonal (nzaat) = %g\n",
|
|
169
|
+
(scs_float) nzaat)) ;
|
|
170
|
+
AMD_DEBUG1 ((" nzboth: "ID" nz: "ID" nzdiag: "ID" symmetry: %g\n",
|
|
171
|
+
nzboth, nz, nzdiag, sym)) ;
|
|
172
|
+
|
|
173
|
+
if (Info != (scs_float *) NULL)
|
|
174
|
+
{
|
|
175
|
+
Info [AMD_STATUS] = AMD_OK ;
|
|
176
|
+
Info [AMD_N] = n ;
|
|
177
|
+
Info [AMD_NZ] = nz ;
|
|
178
|
+
Info [AMD_SYMMETRY] = sym ; /* symmetry of pattern of A */
|
|
179
|
+
Info [AMD_NZDIAG] = nzdiag ; /* nonzeros on diagonal of A */
|
|
180
|
+
Info [AMD_NZ_A_PLUS_AT] = nzaat ; /* nonzeros in A+A' */
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return (nzaat) ;
|
|
184
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/* ========================================================================= */
|
|
2
|
+
/* === AMD_control ========================================================= */
|
|
3
|
+
/* ========================================================================= */
|
|
4
|
+
|
|
5
|
+
/* ------------------------------------------------------------------------- */
|
|
6
|
+
/* AMD, Copyright (c) Timothy A. Davis, */
|
|
7
|
+
/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */
|
|
8
|
+
/* email: DrTimothyAldenDavis@gmail.com */
|
|
9
|
+
/* ------------------------------------------------------------------------- */
|
|
10
|
+
|
|
11
|
+
/* User-callable. Prints the control parameters for AMD. See amd.h
|
|
12
|
+
* for details. If the Control array is not present, the defaults are
|
|
13
|
+
* printed instead.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#include "amd_internal.h"
|
|
17
|
+
|
|
18
|
+
GLOBAL void AMD_control
|
|
19
|
+
(
|
|
20
|
+
scs_float Control [ ]
|
|
21
|
+
)
|
|
22
|
+
{
|
|
23
|
+
scs_float alpha ;
|
|
24
|
+
Int aggressive ;
|
|
25
|
+
|
|
26
|
+
if (Control != (scs_float *) NULL)
|
|
27
|
+
{
|
|
28
|
+
alpha = Control [AMD_DENSE] ;
|
|
29
|
+
aggressive = Control [AMD_AGGRESSIVE] != 0 ;
|
|
30
|
+
}
|
|
31
|
+
else
|
|
32
|
+
{
|
|
33
|
+
alpha = AMD_DEFAULT_DENSE ;
|
|
34
|
+
aggressive = AMD_DEFAULT_AGGRESSIVE ;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
SUITESPARSE_PRINTF ((
|
|
38
|
+
"\nAMD version %d.%d.%d, %s: approximate minimum degree ordering\n"
|
|
39
|
+
" dense row parameter: %g\n", AMD_MAIN_VERSION, AMD_SUB_VERSION,
|
|
40
|
+
AMD_SUBSUB_VERSION, AMD_DATE, alpha)) ;
|
|
41
|
+
|
|
42
|
+
if (alpha < 0)
|
|
43
|
+
{
|
|
44
|
+
SUITESPARSE_PRINTF ((" no rows treated as dense\n")) ;
|
|
45
|
+
}
|
|
46
|
+
else
|
|
47
|
+
{
|
|
48
|
+
SUITESPARSE_PRINTF ((
|
|
49
|
+
" (rows with more than max (%g * sqrt (n), 16) entries are\n"
|
|
50
|
+
" considered \"dense\", and placed last in output permutation)\n",
|
|
51
|
+
alpha)) ;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (aggressive)
|
|
55
|
+
{
|
|
56
|
+
SUITESPARSE_PRINTF ((" aggressive absorption: yes\n")) ;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
{
|
|
60
|
+
SUITESPARSE_PRINTF ((" aggressive absorption: no\n")) ;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
SUITESPARSE_PRINTF ((" size of AMD integer: %d\n\n", sizeof (Int))) ;
|
|
64
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* ========================================================================= */
|
|
2
|
+
/* === AMD_defaults ======================================================== */
|
|
3
|
+
/* ========================================================================= */
|
|
4
|
+
|
|
5
|
+
/* ------------------------------------------------------------------------- */
|
|
6
|
+
/* AMD, Copyright (c) Timothy A. Davis, */
|
|
7
|
+
/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */
|
|
8
|
+
/* email: DrTimothyAldenDavis@gmail.com */
|
|
9
|
+
/* ------------------------------------------------------------------------- */
|
|
10
|
+
|
|
11
|
+
/* User-callable. Sets default control parameters for AMD. See amd.h
|
|
12
|
+
* for details.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
#include "amd_internal.h"
|
|
16
|
+
|
|
17
|
+
/* ========================================================================= */
|
|
18
|
+
/* === AMD defaults ======================================================== */
|
|
19
|
+
/* ========================================================================= */
|
|
20
|
+
|
|
21
|
+
GLOBAL void AMD_defaults
|
|
22
|
+
(
|
|
23
|
+
scs_float Control [ ]
|
|
24
|
+
)
|
|
25
|
+
{
|
|
26
|
+
Int i ;
|
|
27
|
+
|
|
28
|
+
if (Control != (scs_float *) NULL)
|
|
29
|
+
{
|
|
30
|
+
for (i = 0 ; i < AMD_CONTROL ; i++)
|
|
31
|
+
{
|
|
32
|
+
Control [i] = 0 ;
|
|
33
|
+
}
|
|
34
|
+
Control [AMD_DENSE] = AMD_DEFAULT_DENSE ;
|
|
35
|
+
Control [AMD_AGGRESSIVE] = AMD_DEFAULT_AGGRESSIVE ;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/* ========================================================================= */
|
|
2
|
+
/* === AMD_dump ============================================================ */
|
|
3
|
+
/* ========================================================================= */
|
|
4
|
+
|
|
5
|
+
/* ------------------------------------------------------------------------- */
|
|
6
|
+
/* AMD, Copyright (c) Timothy A. Davis, */
|
|
7
|
+
/* Patrick R. Amestoy, and Iain S. Duff. See ../README.txt for License. */
|
|
8
|
+
/* email: DrTimothyAldenDavis@gmail.com */
|
|
9
|
+
/* ------------------------------------------------------------------------- */
|
|
10
|
+
|
|
11
|
+
/* Debugging routines for AMD. Not used if NDEBUG is not defined at compile-
|
|
12
|
+
* time (the default). See comments in amd_internal.h on how to enable
|
|
13
|
+
* debugging. Not user-callable.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#include "amd_internal.h"
|
|
17
|
+
|
|
18
|
+
#ifndef NDEBUG
|
|
19
|
+
|
|
20
|
+
/* This global variable is present only when debugging */
|
|
21
|
+
GLOBAL Int AMD_debug = -999 ; /* default is no debug printing */
|
|
22
|
+
|
|
23
|
+
/* ========================================================================= */
|
|
24
|
+
/* === AMD_debug_init ====================================================== */
|
|
25
|
+
/* ========================================================================= */
|
|
26
|
+
|
|
27
|
+
/* Sets the debug print level, by reading the file debug.amd (if it exists) */
|
|
28
|
+
|
|
29
|
+
GLOBAL void AMD_debug_init ( char *s )
|
|
30
|
+
{
|
|
31
|
+
FILE *f ;
|
|
32
|
+
f = fopen ("debug.amd", "r") ;
|
|
33
|
+
if (f == (FILE *) NULL)
|
|
34
|
+
{
|
|
35
|
+
AMD_debug = -999 ;
|
|
36
|
+
}
|
|
37
|
+
else
|
|
38
|
+
{
|
|
39
|
+
fscanf (f, ID, &AMD_debug) ;
|
|
40
|
+
fclose (f) ;
|
|
41
|
+
}
|
|
42
|
+
if (AMD_debug >= 0)
|
|
43
|
+
{
|
|
44
|
+
printf ("%s: AMD_debug_init, D= "ID"\n", s, AMD_debug) ;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* ========================================================================= */
|
|
49
|
+
/* === AMD_dump ============================================================ */
|
|
50
|
+
/* ========================================================================= */
|
|
51
|
+
|
|
52
|
+
/* Dump AMD's data structure, except for the hash buckets. This routine
|
|
53
|
+
* cannot be called when the hash buckets are non-empty.
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
GLOBAL void AMD_dump (
|
|
57
|
+
Int n, /* A is n-by-n */
|
|
58
|
+
Int Pe [ ], /* pe [0..n-1]: index in iw of start of row i */
|
|
59
|
+
Int Iw [ ], /* workspace of size iwlen, iwlen [0..pfree-1]
|
|
60
|
+
* holds the matrix on input */
|
|
61
|
+
Int Len [ ], /* len [0..n-1]: length for row i */
|
|
62
|
+
Int iwlen, /* length of iw */
|
|
63
|
+
Int pfree, /* iw [pfree ... iwlen-1] is empty on input */
|
|
64
|
+
Int Nv [ ], /* nv [0..n-1] */
|
|
65
|
+
Int Next [ ], /* next [0..n-1] */
|
|
66
|
+
Int Last [ ], /* last [0..n-1] */
|
|
67
|
+
Int Head [ ], /* head [0..n-1] */
|
|
68
|
+
Int Elen [ ], /* size n */
|
|
69
|
+
Int Degree [ ], /* size n */
|
|
70
|
+
Int W [ ], /* size n */
|
|
71
|
+
Int nel
|
|
72
|
+
)
|
|
73
|
+
{
|
|
74
|
+
Int i, pe, elen, nv, len, e, p, k, j, deg, w, cnt, ilast ;
|
|
75
|
+
|
|
76
|
+
if (AMD_debug < 0) return ;
|
|
77
|
+
ASSERT (pfree <= iwlen) ;
|
|
78
|
+
AMD_DEBUG3 (("\nAMD dump, pfree: "ID"\n", pfree)) ;
|
|
79
|
+
for (i = 0 ; i < n ; i++)
|
|
80
|
+
{
|
|
81
|
+
pe = Pe [i] ;
|
|
82
|
+
elen = Elen [i] ;
|
|
83
|
+
nv = Nv [i] ;
|
|
84
|
+
len = Len [i] ;
|
|
85
|
+
w = W [i] ;
|
|
86
|
+
|
|
87
|
+
if (elen >= EMPTY)
|
|
88
|
+
{
|
|
89
|
+
if (nv == 0)
|
|
90
|
+
{
|
|
91
|
+
AMD_DEBUG3 (("\nI "ID": nonprincipal: ", i)) ;
|
|
92
|
+
ASSERT (elen == EMPTY) ;
|
|
93
|
+
if (pe == EMPTY)
|
|
94
|
+
{
|
|
95
|
+
AMD_DEBUG3 ((" dense node\n")) ;
|
|
96
|
+
ASSERT (w == 1) ;
|
|
97
|
+
}
|
|
98
|
+
else
|
|
99
|
+
{
|
|
100
|
+
ASSERT (pe < EMPTY) ;
|
|
101
|
+
AMD_DEBUG3 ((" i "ID" -> parent "ID"\n", i, FLIP (Pe[i])));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
{
|
|
106
|
+
AMD_DEBUG3 (("\nI "ID": active principal supervariable:\n",i));
|
|
107
|
+
AMD_DEBUG3 ((" nv(i): "ID" Flag: %d\n", nv, (nv < 0))) ;
|
|
108
|
+
ASSERT (elen >= 0) ;
|
|
109
|
+
ASSERT (nv > 0 && pe >= 0) ;
|
|
110
|
+
p = pe ;
|
|
111
|
+
AMD_DEBUG3 ((" e/s: ")) ;
|
|
112
|
+
if (elen == 0) AMD_DEBUG3 ((" : ")) ;
|
|
113
|
+
ASSERT (pe + len <= pfree) ;
|
|
114
|
+
for (k = 0 ; k < len ; k++)
|
|
115
|
+
{
|
|
116
|
+
j = Iw [p] ;
|
|
117
|
+
AMD_DEBUG3 ((" "ID"", j)) ;
|
|
118
|
+
ASSERT (j >= 0 && j < n) ;
|
|
119
|
+
if (k == elen-1) AMD_DEBUG3 ((" : ")) ;
|
|
120
|
+
p++ ;
|
|
121
|
+
}
|
|
122
|
+
AMD_DEBUG3 (("\n")) ;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
{
|
|
127
|
+
e = i ;
|
|
128
|
+
if (w == 0)
|
|
129
|
+
{
|
|
130
|
+
AMD_DEBUG3 (("\nE "ID": absorbed element: w "ID"\n", e, w)) ;
|
|
131
|
+
ASSERT (nv > 0 && pe < 0) ;
|
|
132
|
+
AMD_DEBUG3 ((" e "ID" -> parent "ID"\n", e, FLIP (Pe [e]))) ;
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
{
|
|
136
|
+
AMD_DEBUG3 (("\nE "ID": unabsorbed element: w "ID"\n", e, w)) ;
|
|
137
|
+
ASSERT (nv > 0 && pe >= 0) ;
|
|
138
|
+
p = pe ;
|
|
139
|
+
AMD_DEBUG3 ((" : ")) ;
|
|
140
|
+
ASSERT (pe + len <= pfree) ;
|
|
141
|
+
for (k = 0 ; k < len ; k++)
|
|
142
|
+
{
|
|
143
|
+
j = Iw [p] ;
|
|
144
|
+
AMD_DEBUG3 ((" "ID"", j)) ;
|
|
145
|
+
ASSERT (j >= 0 && j < n) ;
|
|
146
|
+
p++ ;
|
|
147
|
+
}
|
|
148
|
+
AMD_DEBUG3 (("\n")) ;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/* this routine cannot be called when the hash buckets are non-empty */
|
|
154
|
+
AMD_DEBUG3 (("\nDegree lists:\n")) ;
|
|
155
|
+
if (nel >= 0)
|
|
156
|
+
{
|
|
157
|
+
cnt = 0 ;
|
|
158
|
+
for (deg = 0 ; deg < n ; deg++)
|
|
159
|
+
{
|
|
160
|
+
if (Head [deg] == EMPTY) continue ;
|
|
161
|
+
ilast = EMPTY ;
|
|
162
|
+
AMD_DEBUG3 ((ID": \n", deg)) ;
|
|
163
|
+
for (i = Head [deg] ; i != EMPTY ; i = Next [i])
|
|
164
|
+
{
|
|
165
|
+
AMD_DEBUG3 ((" "ID" : next "ID" last "ID" deg "ID"\n",
|
|
166
|
+
i, Next [i], Last [i], Degree [i])) ;
|
|
167
|
+
ASSERT (i >= 0 && i < n && ilast == Last [i] &&
|
|
168
|
+
deg == Degree [i]) ;
|
|
169
|
+
cnt += Nv [i] ;
|
|
170
|
+
ilast = i ;
|
|
171
|
+
}
|
|
172
|
+
AMD_DEBUG3 (("\n")) ;
|
|
173
|
+
}
|
|
174
|
+
ASSERT (cnt == n - nel) ;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
#endif
|