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.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +12 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +98 -0
  5. data/ext/scs/extconf.rb +29 -0
  6. data/lib/scs.rb +17 -0
  7. data/lib/scs/ffi.rb +117 -0
  8. data/lib/scs/solver.rb +173 -0
  9. data/lib/scs/version.rb +3 -0
  10. data/vendor/scs/LICENSE.txt +21 -0
  11. data/vendor/scs/Makefile +164 -0
  12. data/vendor/scs/README.md +222 -0
  13. data/vendor/scs/include/aa.h +56 -0
  14. data/vendor/scs/include/cones.h +46 -0
  15. data/vendor/scs/include/ctrlc.h +33 -0
  16. data/vendor/scs/include/glbopts.h +177 -0
  17. data/vendor/scs/include/linalg.h +26 -0
  18. data/vendor/scs/include/linsys.h +64 -0
  19. data/vendor/scs/include/normalize.h +18 -0
  20. data/vendor/scs/include/rw.h +17 -0
  21. data/vendor/scs/include/scs.h +161 -0
  22. data/vendor/scs/include/scs_blas.h +51 -0
  23. data/vendor/scs/include/util.h +65 -0
  24. data/vendor/scs/linsys/amatrix.c +305 -0
  25. data/vendor/scs/linsys/amatrix.h +36 -0
  26. data/vendor/scs/linsys/amatrix.o +0 -0
  27. data/vendor/scs/linsys/cpu/direct/private.c +366 -0
  28. data/vendor/scs/linsys/cpu/direct/private.h +26 -0
  29. data/vendor/scs/linsys/cpu/direct/private.o +0 -0
  30. data/vendor/scs/linsys/cpu/indirect/private.c +256 -0
  31. data/vendor/scs/linsys/cpu/indirect/private.h +31 -0
  32. data/vendor/scs/linsys/cpu/indirect/private.o +0 -0
  33. data/vendor/scs/linsys/external/amd/LICENSE.txt +934 -0
  34. data/vendor/scs/linsys/external/amd/SuiteSparse_config.c +469 -0
  35. data/vendor/scs/linsys/external/amd/SuiteSparse_config.h +254 -0
  36. data/vendor/scs/linsys/external/amd/SuiteSparse_config.o +0 -0
  37. data/vendor/scs/linsys/external/amd/amd.h +400 -0
  38. data/vendor/scs/linsys/external/amd/amd_1.c +180 -0
  39. data/vendor/scs/linsys/external/amd/amd_1.o +0 -0
  40. data/vendor/scs/linsys/external/amd/amd_2.c +1842 -0
  41. data/vendor/scs/linsys/external/amd/amd_2.o +0 -0
  42. data/vendor/scs/linsys/external/amd/amd_aat.c +184 -0
  43. data/vendor/scs/linsys/external/amd/amd_aat.o +0 -0
  44. data/vendor/scs/linsys/external/amd/amd_control.c +64 -0
  45. data/vendor/scs/linsys/external/amd/amd_control.o +0 -0
  46. data/vendor/scs/linsys/external/amd/amd_defaults.c +37 -0
  47. data/vendor/scs/linsys/external/amd/amd_defaults.o +0 -0
  48. data/vendor/scs/linsys/external/amd/amd_dump.c +179 -0
  49. data/vendor/scs/linsys/external/amd/amd_dump.o +0 -0
  50. data/vendor/scs/linsys/external/amd/amd_global.c +16 -0
  51. data/vendor/scs/linsys/external/amd/amd_global.o +0 -0
  52. data/vendor/scs/linsys/external/amd/amd_info.c +119 -0
  53. data/vendor/scs/linsys/external/amd/amd_info.o +0 -0
  54. data/vendor/scs/linsys/external/amd/amd_internal.h +304 -0
  55. data/vendor/scs/linsys/external/amd/amd_order.c +199 -0
  56. data/vendor/scs/linsys/external/amd/amd_order.o +0 -0
  57. data/vendor/scs/linsys/external/amd/amd_post_tree.c +120 -0
  58. data/vendor/scs/linsys/external/amd/amd_post_tree.o +0 -0
  59. data/vendor/scs/linsys/external/amd/amd_postorder.c +206 -0
  60. data/vendor/scs/linsys/external/amd/amd_postorder.o +0 -0
  61. data/vendor/scs/linsys/external/amd/amd_preprocess.c +118 -0
  62. data/vendor/scs/linsys/external/amd/amd_preprocess.o +0 -0
  63. data/vendor/scs/linsys/external/amd/amd_valid.c +92 -0
  64. data/vendor/scs/linsys/external/amd/amd_valid.o +0 -0
  65. data/vendor/scs/linsys/external/amd/changes +11 -0
  66. data/vendor/scs/linsys/external/qdldl/LICENSE +201 -0
  67. data/vendor/scs/linsys/external/qdldl/README.md +120 -0
  68. data/vendor/scs/linsys/external/qdldl/changes +4 -0
  69. data/vendor/scs/linsys/external/qdldl/qdldl.c +298 -0
  70. data/vendor/scs/linsys/external/qdldl/qdldl.h +177 -0
  71. data/vendor/scs/linsys/external/qdldl/qdldl.o +0 -0
  72. data/vendor/scs/linsys/external/qdldl/qdldl_types.h +21 -0
  73. data/vendor/scs/linsys/gpu/gpu.c +41 -0
  74. data/vendor/scs/linsys/gpu/gpu.h +85 -0
  75. data/vendor/scs/linsys/gpu/indirect/private.c +304 -0
  76. data/vendor/scs/linsys/gpu/indirect/private.h +36 -0
  77. data/vendor/scs/scs.mk +181 -0
  78. data/vendor/scs/src/aa.c +224 -0
  79. data/vendor/scs/src/aa.o +0 -0
  80. data/vendor/scs/src/cones.c +802 -0
  81. data/vendor/scs/src/cones.o +0 -0
  82. data/vendor/scs/src/ctrlc.c +77 -0
  83. data/vendor/scs/src/ctrlc.o +0 -0
  84. data/vendor/scs/src/linalg.c +84 -0
  85. data/vendor/scs/src/linalg.o +0 -0
  86. data/vendor/scs/src/normalize.c +93 -0
  87. data/vendor/scs/src/normalize.o +0 -0
  88. data/vendor/scs/src/rw.c +167 -0
  89. data/vendor/scs/src/rw.o +0 -0
  90. data/vendor/scs/src/scs.c +978 -0
  91. data/vendor/scs/src/scs.o +0 -0
  92. data/vendor/scs/src/scs_version.c +5 -0
  93. data/vendor/scs/src/scs_version.o +0 -0
  94. data/vendor/scs/src/util.c +196 -0
  95. data/vendor/scs/src/util.o +0 -0
  96. data/vendor/scs/test/data/small_random_socp +0 -0
  97. data/vendor/scs/test/minunit.h +13 -0
  98. data/vendor/scs/test/problem_utils.h +93 -0
  99. data/vendor/scs/test/problems/rob_gauss_cov_est.h +85 -0
  100. data/vendor/scs/test/problems/small_lp.h +50 -0
  101. data/vendor/scs/test/problems/small_random_socp.h +33 -0
  102. data/vendor/scs/test/random_socp_prob.c +171 -0
  103. data/vendor/scs/test/run_from_file.c +69 -0
  104. data/vendor/scs/test/run_tests +2 -0
  105. data/vendor/scs/test/run_tests.c +32 -0
  106. metadata +203 -0
@@ -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
+ }
@@ -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
+ }
@@ -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
+ }
@@ -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