scs 0.2.0
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 +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +84 -0
- data/ext/scs/Rakefile +11 -0
- data/lib/scs/ffi.rb +117 -0
- data/lib/scs/solver.rb +178 -0
- data/lib/scs/version.rb +3 -0
- data/lib/scs.rb +17 -0
- data/vendor/scs/LICENSE.txt +21 -0
- data/vendor/scs/Makefile +164 -0
- data/vendor/scs/README.md +220 -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 +975 -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
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* ========================================================================= */
|
|
2
|
+
/* === amd_global ========================================================== */
|
|
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
|
+
/* In prior versions of AMD, this file declared the amd_malloc, amd_free,
|
|
12
|
+
amd_realloc, amd_calloc, and amd_printf functions. They are now replaced
|
|
13
|
+
by functions defined in SuiteSparse_config/SuiteSparse_config.c.
|
|
14
|
+
*/
|
|
15
|
+
/* Simply to suppress empty translation unit warnings. */
|
|
16
|
+
typedef int scs_amd_make_iso_compilers_happy;
|
|
Binary file
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/* ========================================================================= */
|
|
2
|
+
/* === AMD_info ============================================================ */
|
|
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 output statistics for AMD. See amd.h
|
|
12
|
+
* for details. If the Info array is not present, nothing is printed.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
#include "amd_internal.h"
|
|
16
|
+
|
|
17
|
+
#define PRI(format,x) { if (x >= 0) { SUITESPARSE_PRINTF ((format, x)) ; }}
|
|
18
|
+
|
|
19
|
+
GLOBAL void AMD_info
|
|
20
|
+
(
|
|
21
|
+
scs_float Info [ ]
|
|
22
|
+
)
|
|
23
|
+
{
|
|
24
|
+
scs_float n, ndiv, nmultsubs_ldl, nmultsubs_lu, lnz, lnzd ;
|
|
25
|
+
|
|
26
|
+
SUITESPARSE_PRINTF (("\nAMD version %d.%d.%d, %s, results:\n",
|
|
27
|
+
AMD_MAIN_VERSION, AMD_SUB_VERSION, AMD_SUBSUB_VERSION, AMD_DATE)) ;
|
|
28
|
+
|
|
29
|
+
if (!Info)
|
|
30
|
+
{
|
|
31
|
+
return ;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
n = Info [AMD_N] ;
|
|
35
|
+
ndiv = Info [AMD_NDIV] ;
|
|
36
|
+
nmultsubs_ldl = Info [AMD_NMULTSUBS_LDL] ;
|
|
37
|
+
nmultsubs_lu = Info [AMD_NMULTSUBS_LU] ;
|
|
38
|
+
lnz = Info [AMD_LNZ] ;
|
|
39
|
+
lnzd = (n >= 0 && lnz >= 0) ? (n + lnz) : (-1) ;
|
|
40
|
+
|
|
41
|
+
/* AMD return status */
|
|
42
|
+
SUITESPARSE_PRINTF ((" status: ")) ;
|
|
43
|
+
if (Info [AMD_STATUS] == AMD_OK)
|
|
44
|
+
{
|
|
45
|
+
SUITESPARSE_PRINTF (("OK\n")) ;
|
|
46
|
+
}
|
|
47
|
+
else if (Info [AMD_STATUS] == AMD_OUT_OF_MEMORY)
|
|
48
|
+
{
|
|
49
|
+
SUITESPARSE_PRINTF (("out of memory\n")) ;
|
|
50
|
+
}
|
|
51
|
+
else if (Info [AMD_STATUS] == AMD_INVALID)
|
|
52
|
+
{
|
|
53
|
+
SUITESPARSE_PRINTF (("invalid matrix\n")) ;
|
|
54
|
+
}
|
|
55
|
+
else if (Info [AMD_STATUS] == AMD_OK_BUT_JUMBLED)
|
|
56
|
+
{
|
|
57
|
+
SUITESPARSE_PRINTF (("OK, but jumbled\n")) ;
|
|
58
|
+
}
|
|
59
|
+
else
|
|
60
|
+
{
|
|
61
|
+
SUITESPARSE_PRINTF (("unknown\n")) ;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* statistics about the input matrix */
|
|
65
|
+
PRI (" n, dimension of A: %.20g\n", n);
|
|
66
|
+
PRI (" nz, number of nonzeros in A: %.20g\n",
|
|
67
|
+
Info [AMD_NZ]) ;
|
|
68
|
+
PRI (" symmetry of A: %.4f\n",
|
|
69
|
+
Info [AMD_SYMMETRY]) ;
|
|
70
|
+
PRI (" number of nonzeros on diagonal: %.20g\n",
|
|
71
|
+
Info [AMD_NZDIAG]) ;
|
|
72
|
+
PRI (" nonzeros in pattern of A+A' (excl. diagonal): %.20g\n",
|
|
73
|
+
Info [AMD_NZ_A_PLUS_AT]) ;
|
|
74
|
+
PRI (" # dense rows/columns of A+A': %.20g\n",
|
|
75
|
+
Info [AMD_NDENSE]) ;
|
|
76
|
+
|
|
77
|
+
/* statistics about AMD's behavior */
|
|
78
|
+
PRI (" memory used, in bytes: %.20g\n",
|
|
79
|
+
Info [AMD_MEMORY]) ;
|
|
80
|
+
PRI (" # of memory compactions: %.20g\n",
|
|
81
|
+
Info [AMD_NCMPA]) ;
|
|
82
|
+
|
|
83
|
+
/* statistics about the ordering quality */
|
|
84
|
+
SUITESPARSE_PRINTF (("\n"
|
|
85
|
+
" The following approximate statistics are for a subsequent\n"
|
|
86
|
+
" factorization of A(P,P) + A(P,P)'. They are slight upper\n"
|
|
87
|
+
" bounds if there are no dense rows/columns in A+A', and become\n"
|
|
88
|
+
" looser if dense rows/columns exist.\n\n")) ;
|
|
89
|
+
|
|
90
|
+
PRI (" nonzeros in L (excluding diagonal): %.20g\n",
|
|
91
|
+
lnz) ;
|
|
92
|
+
PRI (" nonzeros in L (including diagonal): %.20g\n",
|
|
93
|
+
lnzd) ;
|
|
94
|
+
PRI (" # divide operations for LDL' or LU: %.20g\n",
|
|
95
|
+
ndiv) ;
|
|
96
|
+
PRI (" # multiply-subtract operations for LDL': %.20g\n",
|
|
97
|
+
nmultsubs_ldl) ;
|
|
98
|
+
PRI (" # multiply-subtract operations for LU: %.20g\n",
|
|
99
|
+
nmultsubs_lu) ;
|
|
100
|
+
PRI (" max nz. in any column of L (incl. diagonal): %.20g\n",
|
|
101
|
+
Info [AMD_DMAX]) ;
|
|
102
|
+
|
|
103
|
+
/* total flop counts for various factorizations */
|
|
104
|
+
|
|
105
|
+
if (n >= 0 && ndiv >= 0 && nmultsubs_ldl >= 0 && nmultsubs_lu >= 0)
|
|
106
|
+
{
|
|
107
|
+
SUITESPARSE_PRINTF (("\n"
|
|
108
|
+
" chol flop count for real A, sqrt counted as 1 flop: %.20g\n"
|
|
109
|
+
" LDL' flop count for real A: %.20g\n"
|
|
110
|
+
" LDL' flop count for complex A: %.20g\n"
|
|
111
|
+
" LU flop count for real A (with no pivoting): %.20g\n"
|
|
112
|
+
" LU flop count for complex A (with no pivoting): %.20g\n\n",
|
|
113
|
+
n + ndiv + 2*nmultsubs_ldl,
|
|
114
|
+
ndiv + 2*nmultsubs_ldl,
|
|
115
|
+
9*ndiv + 8*nmultsubs_ldl,
|
|
116
|
+
ndiv + 2*nmultsubs_lu,
|
|
117
|
+
9*ndiv + 8*nmultsubs_lu)) ;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
Binary file
|