26 size =
sizeof(double);
29 size = 2*
sizeof(double);
60 B->is_undirected =
true;
66 int *ia =
A->ia, *ja =
A->ja, *ib, *jb, nz =
A->nz, m =
A->m, n =
A->n,
type =
A->type,
format =
A->format;
77 for (i = 0; i <= n; i++) ib[i] = 0;
78 for (i = 0; i < m; i++){
79 for (j = ia[i]; j < ia[i+1]; j++){
84 for (i = 0; i < n; i++) ib[i+1] += ib[i];
90 for (i = 0; i < m; i++){
91 for (j = ia[i]; j < ia[i+1]; j++){
93 b[ib[ja[j]]++] = a[j];
101 for (i = 0; i < m; i++){
102 for (j = ia[i]; j < ia[i+1]; j++){
104 b[2*ib[ja[j]]] = a[2*j];
105 b[2*ib[ja[j]]+1] = a[2*j+1];
114 for (i = 0; i < m; i++){
115 for (j = ia[i]; j < ia[i+1]; j++){
117 bi[ib[ja[j]]++] = ai[j];
123 for (i = 0; i < m; i++){
124 for (j = ia[i]; j < ia[i+1]; j++){
138 for (i = n-1; i >= 0; i--) ib[i+1] = ib[i];
146 bool pattern_symmetric_only) {
153 A->is_symmetric =
true;
154 A->is_pattern_symmetric =
true;
159 if (!
A)
return false;
163 int *ia, *ja, *ib, *jb,
type, m;
169 if (
A->is_symmetric)
return true;
170 if (test_pattern_symmetry_only &&
A->is_pattern_symmetric)
return true;
172 if (
A->m !=
A->n)
return false;
175 if (!
B)
return false;
183 mask =
gv_calloc((
size_t)m,
sizeof(
int));
184 for (i = 0; i < m; i++) mask[i] = -1;
193 for (i = 0; i <= m; i++)
if (ia[i] != ib[i])
goto RETURN;
194 for (i = 0; i < m; i++){
195 for (j = ia[i]; j < ia[i+1]; j++){
198 for (j = ib[i]; j < ib[i+1]; j++){
199 if (mask[jb[j]] < ia[i])
goto RETURN;
201 for (j = ib[i]; j < ib[i+1]; j++){
211 for (i = 0; i <= m; i++)
if (ia[i] != ib[i])
goto RETURN;
212 for (i = 0; i < m; i++){
213 for (j = ia[i]; j < ia[i+1]; j++){
216 for (j = ib[i]; j < ib[i+1]; j++){
217 if (mask[jb[j]] < ia[i])
goto RETURN;
219 for (j = ib[i]; j < ib[i+1]; j++){
230 for (i = 0; i < m; i++){
231 for (j = ia[i]; j < ia[i+1]; j++){
234 for (j = ib[i]; j < ib[i+1]; j++){
235 if (mask[jb[j]] < ia[i])
goto RETURN;
237 for (j = ib[i]; j < ib[i+1]; j++){
238 if (bi[j] != ai[mask[jb[j]]])
goto RETURN;
245 for (i = 0; i < m; i++){
246 for (j = ia[i]; j < ia[i+1]; j++){
249 for (j = ib[i]; j < ib[i+1]; j++){
250 if (mask[jb[j]] < ia[i])
goto RETURN;
263 if (!test_pattern_symmetry_only) {
264 A->is_symmetric =
true;
266 A->is_pattern_symmetric =
true;
288 A->ia =
gv_calloc((
size_t)(m + 1),
sizeof(
int));
298 size_t nz_t = (size_t) nz;
310 if (
A->size > 0 && nz_t > 0) {
321 size_t nz_t = (size_t) nz;
391 fprintf(f,
"%%%%MatrixMarket matrix coordinate real general\n");
394 fprintf(f,
"%%%%MatrixMarket matrix coordinate complex general\n");
397 fprintf(f,
"%%%%MatrixMarket matrix coordinate integer general\n");
400 fprintf(f,
"%%%%MatrixMarket matrix coordinate pattern general\n");
408 fprintf(f,
"%d %d %d\n",
A->m,
A->n,
A->nz);
409 const int *
const ia =
A->ia;
410 const int *
const ja =
A->ja;
413 const double *
const a =
A->a;
414 for (
int i = 0; i < m; i++){
415 for (
int j = ia[i]; j < ia[i+1]; j++){
416 fprintf(f,
"%d %d %16.8g\n",i+1, ja[j]+1, a[j]);
422 const double *
const a =
A->a;
423 for (
int i = 0; i < m; i++){
424 for (
int j = ia[i]; j < ia[i+1]; j++){
425 fprintf(f,
"%d %d %16.8g %16.8g\n",i+1, ja[j]+1, a[2*j], a[2*j+1]);
431 const int *
const ai =
A->a;
432 for (
int i = 0; i < m; i++){
433 for (
int j = ia[i]; j < ia[i+1]; j++){
434 fprintf(f,
"%d %d %d\n",i+1, ja[j]+1, ai[j]);
440 for (
int i = 0; i < m; i++){
441 for (
int j = ia[i]; j < ia[i+1]; j++){
442 fprintf(f,
"%d %d\n",i+1, ja[j]+1);
462 fprintf(f,
"%%%%MatrixMarket matrix coordinate real general\n");
465 fprintf(f,
"%%%%MatrixMarket matrix coordinate complex general\n");
468 fprintf(f,
"%%%%MatrixMarket matrix coordinate integer general\n");
471 fprintf(f,
"%%%%MatrixMarket matrix coordinate pattern general\n");
479 fprintf(f,
"%d %d %d\n",
A->m,
A->n,
A->nz);
486 for (i = 0; i <
A->nz; i++){
487 fprintf(f,
"%d %d %16.8g\n",ia[i]+1, ja[i]+1, a[i]);
492 for (i = 0; i <
A->nz; i++){
493 fprintf(f,
"%d %d %16.8g %16.8g\n",ia[i]+1, ja[i]+1, a[2*i], a[2*i+1]);
498 for (i = 0; i <
A->nz; i++){
499 fprintf(f,
"%d %d %d\n",ia[i]+1, ja[i]+1, ai[i]);
503 for (i = 0; i <
A->nz; i++){
504 fprintf(f,
"%d %d\n",ia[i]+1, ja[i]+1);
583 assert(m > 0 && n > 0 && nz >= 0);
585 if (m <=0 || n <= 0 || nz < 0)
return NULL;
592 for (i = 0; i <= m; i++){
598 const double *
const val = val0;
600 for (i = 0; i < nz; i++){
601 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
607 for (i = 0; i < m; i++) ia[i+1] += ia[i];
608 for (i = 0; i < nz; i++){
609 a[ia[irn[i]]] = val[i];
610 ja[ia[irn[i]]++] = jcn[i];
612 for (i = m; i > 0; i--) ia[i] = ia[i - 1];
617 const double *
const val = val0;
619 for (i = 0; i < nz; i++){
620 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
626 for (i = 0; i < m; i++) ia[i+1] += ia[i];
627 for (i = 0; i < nz; i++){
628 a[2*ia[irn[i]]] = val[2 * i];
629 a[2*ia[irn[i]]+1] = val[2 * i + 1];
630 ja[ia[irn[i]]++] = jcn[i];
632 for (i = m; i > 0; i--) ia[i] = ia[i - 1];
637 const int *
const vali = val0;
639 for (i = 0; i < nz; i++){
640 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
646 for (i = 0; i < m; i++) ia[i+1] += ia[i];
647 for (i = 0; i < nz; i++){
648 ai[ia[irn[i]]] = vali[i];
649 ja[ia[irn[i]]++] = jcn[i];
651 for (i = m; i > 0; i--) ia[i] = ia[i - 1];
656 for (i = 0; i < nz; i++){
657 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
663 for (i = 0; i < m; i++) ia[i+1] += ia[i];
664 for (i = 0; i < nz; i++){
665 ja[ia[irn[i]]++] = jcn[i];
667 for (i = m; i > 0; i--) ia[i] = ia[i - 1];
671 for (i = 0; i < nz; i++){
672 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
678 for (i = 0; i < m; i++) ia[i+1] += ia[i];
679 memcpy(
A->a, val0,
A->size*((
size_t)nz));
680 for (i = 0; i < nz; i++){
681 ja[ia[irn[i]]++] = jcn[i];
683 for (i = m; i > 0; i--) ia[i] = ia[i - 1];
700 int *jcn,
const void *val,
701 int type,
size_t sz) {
714 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
719 assert(
A->type ==
B->type);
722 if (m !=
B->m || n !=
B->n)
return NULL;
724 nzmax =
A->nz +
B->nz;
731 mask =
gv_calloc((
size_t)n,
sizeof(
int));
733 for (i = 0; i < n; i++) mask[i] = -1;
742 for (i = 0; i < m; i++){
743 for (j = ia[i]; j < ia[i+1]; j++){
749 for (j = ib[i]; j < ib[i+1]; j++){
750 if (mask[jb[j]] < ic[i]){
754 c[mask[jb[j]]] += b[j];
765 for (i = 0; i < m; i++){
766 for (j = ia[i]; j < ia[i+1]; j++){
770 c[2*nz+1] = a[2*j+1];
773 for (j = ib[i]; j < ib[i+1]; j++){
774 if (mask[jb[j]] < ic[i]){
777 c[2*nz+1] = b[2*j+1];
780 c[2*mask[jb[j]]] += b[2*j];
781 c[2*mask[jb[j]]+1] += b[2*j+1];
792 for (i = 0; i < m; i++){
793 for (j = ia[i]; j < ia[i+1]; j++){
799 for (j = ib[i]; j < ib[i+1]; j++){
800 if (mask[jb[j]] < ic[i]){
805 c[mask[jb[j]]] += b[j];
813 for (i = 0; i < m; i++){
814 for (j = ia[i]; j < ia[i+1]; j++){
819 for (j = ib[i]; j < ib[i+1]; j++){
820 if (mask[jb[j]] < ic[i]){
846 int i, j, k, *ia, *ja, m;
857 for (i = 0; i < m; i++){
858 for (k = 0; k <
dim; k++) res[i *
dim + k] = 0;
859 for (j = ia[i]; j < ia[i+1]; j++){
860 for (k = 0; k <
dim; k++) res[i *
dim + k] += a[j] * v[ja[j] *
dim + k];
867 int i, j, *ia, *ja, m;
868 double *a, *u =
NULL;
882 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
883 for (i = 0; i < m; i++){
885 for (j = ia[i]; j < ia[i+1]; j++){
886 u[i] += a[j]*v[ja[j]];
891 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
892 for (i = 0; i < m; i++){
894 for (j = ia[i]; j < ia[i+1]; j++){
903 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
904 for (i = 0; i < m; i++){
906 for (j = ia[i]; j < ia[i+1]; j++){
907 u[i] += ai[j]*v[ja[j]];
912 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
913 for (i = 0; i < m; i++){
915 for (j = ia[i]; j < ia[i+1]; j++){
933 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
934 int i, j, k, jj,
type, nz;
939 if (
A->n !=
B->m)
return NULL;
940 if (
A->type !=
B->type){
942 printf(
"in SparseMatrix_multiply, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
948 mask = calloc((
size_t)
B->n,
sizeof(
int));
949 if (!mask)
return NULL;
951 for (i = 0; i <
B->n; i++) mask[i] = -1;
954 for (i = 0; i < m; i++){
955 for (j = ia[i]; j < ia[i+1]; j++){
957 for (k = ib[jj]; k < ib[jj+1]; k++){
958 if (mask[jb[k]] != -i - 2){
961 fprintf(stderr,
"overflow in SparseMatrix_multiply !!!\n");
967 mask[jb[k]] = -i - 2;
987 for (i = 0; i < m; i++){
988 for (j = ia[i]; j < ia[i+1]; j++){
990 for (k = ib[jj]; k < ib[jj+1]; k++){
991 if (mask[jb[k]] < ic[i]){
997 assert(jc[mask[jb[k]]] == jb[k]);
998 c[mask[jb[k]]] += a[j]*b[k];
1012 for (i = 0; i < m; i++){
1013 for (j = ia[i]; j < ia[i+1]; j++){
1015 for (k = ib[jj]; k < ib[jj+1]; k++){
1016 if (mask[jb[k]] < ic[i]){
1019 c[2*nz] = a[2*j]*b[2*k] - a[2*j+1]*b[2*k+1];
1020 c[2*nz+1] = a[2*j]*b[2*k+1] + a[2*j+1]*b[2*k];
1023 assert(jc[mask[jb[k]]] == jb[k]);
1024 c[2*mask[jb[k]]] += a[2*j]*b[2*k] - a[2*j+1]*b[2*k+1];
1025 c[2*mask[jb[k]]+1] += a[2*j]*b[2*k+1] + a[2*j+1]*b[2*k];
1039 for (i = 0; i < m; i++){
1040 for (j = ia[i]; j < ia[i+1]; j++){
1042 for (k = ib[jj]; k < ib[jj+1]; k++){
1043 if (mask[jb[k]] < ic[i]){
1049 assert(jc[mask[jb[k]]] == jb[k]);
1050 c[mask[jb[k]]] += a[j]*b[k];
1060 for (i = 0; i < m; i++){
1061 for (j = ia[i]; j < ia[i+1]; j++){
1063 for (k = ib[jj]; k < ib[jj+1]; k++){
1064 if (mask[jb[k]] < ic[i]){
1069 assert(jc[mask[jb[k]]] == jb[k]);
1096 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic =
C->ia, *jc =
C->ja, *
id, *jd;
1097 int i, j, k, l, ll, jj,
type, nz;
1102 if (
A->n !=
B->m)
return NULL;
1103 if (
B->n !=
C->m)
return NULL;
1105 if (
A->type !=
B->type ||
B->type !=
C->type){
1107 printf(
"in SparseMatrix_multiply, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
1115 mask = calloc((
size_t)
C->n,
sizeof(
int));
1116 if (!mask)
return NULL;
1118 for (i = 0; i <
C->n; i++) mask[i] = -1;
1121 for (i = 0; i < m; i++){
1122 for (j = ia[i]; j < ia[i+1]; j++){
1124 for (l = ib[jj]; l < ib[jj+1]; l++){
1126 for (k = ic[ll]; k < ic[ll+1]; k++){
1127 if (mask[jc[k]] != -i - 2){
1130 fprintf(stderr,
"overflow in SparseMatrix_multiply !!!\n");
1135 mask[jc[k]] = -i - 2;
1154 for (i = 0; i < m; i++){
1155 for (j = ia[i]; j < ia[i+1]; j++){
1157 for (l = ib[jj]; l < ib[jj+1]; l++){
1159 for (k = ic[ll]; k < ic[ll+1]; k++){
1160 if (mask[jc[k]] <
id[i]){
1163 d[nz] = a[j]*b[l]*c[k];
1166 assert(jd[mask[jc[k]]] == jc[k]);
1167 d[mask[jc[k]]] += a[j]*b[l]*c[k];
1184 int *ia =
A->
ia, *ja =
A->ja,
type =
A->type, n =
A->n;
1185 int *mask =
NULL, nz = 0, i, j, sta;
1187 mask =
gv_calloc((
size_t)n,
sizeof(
int));
1188 for (i = 0; i < n; i++) mask[i] = -1;
1196 for (i = 0; i <
A->m; i++){
1197 for (j = sta; j < ia[i+1]; j++){
1198 if (mask[ja[j]] < ia[i]){
1203 assert(ja[mask[ja[j]]] == ja[j]);
1204 a[mask[ja[j]]] += a[j];
1217 for (i = 0; i <
A->m; i++) {
1218 for (j = sta; j < ia[i+1]; j++) {
1219 if (mask[ja[j]] < ia[i]) {
1221 a[2 * nz] = a[2 * j];
1222 a[2 * nz + 1] = a[2 * j + 1];
1225 assert(ja[mask[ja[j]]] == ja[j]);
1226 a[2 * mask[ja[j]]] += a[2 * j];
1227 a[2 * mask[ja[j]]+1] += a[2 * j + 1];
1240 for (i = 0; i <
A->m; i++){
1241 for (j = sta; j < ia[i+1]; j++){
1242 if (mask[ja[j]] < ia[i]){
1247 assert(ja[mask[ja[j]]] == ja[j]);
1248 a[mask[ja[j]]] += a[j];
1260 for (i = 0; i <
A->m; i++){
1261 for (j = sta; j < ia[i+1]; j++){
1262 if (mask[ja[j]] < ia[i]){
1266 assert(ja[mask[ja[j]]] == ja[j]);
1284 int jcn,
const void *val) {
1287 static const int nentries = 1;
1292 if (nz + nentries >=
A->nzmax){
1293 nzmax = nz + nentries;
1299 if (
A->size) memcpy((
char*)
A->a + ((
size_t)nz)*
A->size/
sizeof(
char), val,
A->size*((
size_t)nentries));
1300 if (irn >=
A->m)
A->m = irn + 1;
1301 if (jcn >=
A->n)
A->n = jcn + 1;
1308 int i, j, *ia, *ja, nz, sta;
1319 for (i = 0; i <
A->m; i++){
1320 for (j = sta; j < ia[i+1]; j++){
1334 for (i = 0; i <
A->m; i++){
1335 for (j = sta; j < ia[i+1]; j++){
1339 a[2*nz+1] = a[2*j+1];
1351 for (i = 0; i <
A->m; i++){
1352 for (j = sta; j < ia[i+1]; j++){
1365 for (i = 0; i <
A->m; i++){
1366 for (j = sta; j < ia[i+1]; j++){
1388 int i, j, *ia, *ja, nz, sta;
1399 for (i = 0; i <
A->m; i++){
1400 for (j = sta; j < ia[i+1]; j++){
1414 for (i = 0; i <
A->m; i++){
1415 for (j = sta; j < ia[i+1]; j++){
1419 a[2*nz+1] = a[2*j+1];
1431 for (i = 0; i <
A->m; i++){
1432 for (j = sta; j < ia[i+1]; j++){
1445 for (i = 0; i <
A->m; i++){
1446 for (j = sta; j < ia[i+1]; j++){
1463 A->is_pattern_symmetric =
false;
1464 A->is_symmetric =
false;
1482 for (i = 0; i <
A->m; i++){
1483 deg = ia[i+1] - ia[i];
1484 for (j = ia[i]; j < ia[i+1]; j++){
1492 for (i = 0; i <
A->m; i++){
1493 deg = ia[i+1] - ia[i];
1494 for (j = ia[i]; j < ia[i+1]; j++){
1496 a[2*j] = a[2*j]/deg;
1497 a[2*j+1] = a[2*j+1]/deg;
1522 int i, *ia, *ja, nz, m, n;
1534 if (n != m)
return NULL;
1538 memcpy(
B->ia, ia,
sizeof(
int)*((
size_t)(m+1)));
1539 memcpy(
B->ja, ja,
sizeof(
int)*((
size_t)nz));
1547 for (i = 0; i <
A->nz; i++) a[i] = 1.;
1549 A->size =
sizeof(double);
1561 printf(
"only CSR and real matrix supported.\n");
1568 for (i = 0; i <
A->m; i++){
1569 for (j =
A->ia[i]; j <
A->ia[i+1]; j++){
1580 memcpy(
B->ia,
A->ia,
sizeof(
int)*((
size_t)(
A->m+1)));
1581 if (
A->ia[
A->m] != 0) {
1582 memcpy(
B->ja,
A->ja,
sizeof(
int)*((
size_t)(
A->ia[
A->m])));
1584 if (
A->a) memcpy(
B->a,
A->a,
A->size*((
size_t)
A->nz));
1585 B->is_pattern_symmetric =
A->is_pattern_symmetric;
1586 B->is_symmetric =
A->is_symmetric;
1587 B->is_undirected =
A->is_undirected;
1594 int i, j, m =
A->m, *ia =
A->ia, *ja =
A->ja;
1596 for (i = 0; i < m; i++){
1597 for (j = ia[i]; j < ia[i+1]; j++){
1598 if (i == ja[j])
return true;
1605 int **levelset_ptr,
int **levelset,
1606 int **mask,
bool reinitialize_mask) {
1615 int i, j, sta = 0, sto = 1, nz, ii;
1616 int m =
A->m, *ia =
A->ia, *ja =
A->ja;
1618 if (!(*levelset_ptr)) *levelset_ptr =
gv_calloc((
size_t)(m + 2),
sizeof(
int));
1619 if (!(*levelset)) *levelset =
gv_calloc((
size_t)m,
sizeof(
int));
1621 *mask =
gv_calloc((
size_t)m,
sizeof(
int));
1622 for (i = 0; i < m; i++) (*mask)[i] =
UNMASKED;
1626 assert(root >= 0 && root < m);
1627 (*levelset_ptr)[0] = 0;
1628 (*levelset_ptr)[1] = 1;
1629 (*levelset)[0] = root;
1635 for (i = sta; i < sto; i++){
1636 ii = (*levelset)[i];
1637 for (j = ia[ii]; j < ia[ii+1]; j++){
1638 if (ii == ja[j])
continue;
1639 if ((*mask)[ja[j]] < 0){
1640 (*levelset)[nz++] = ja[j];
1641 (*mask)[ja[j]] = *nlevel + 1;
1645 (*levelset_ptr)[++(*nlevel)] = nz;
1650 if (reinitialize_mask)
for (i = 0; i < (*levelset_ptr)[*nlevel]; i++) (*mask)[(*levelset)[i]] =
UNMASKED;
1656 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL, nlevel;
1657 int m =
A->m, i, nn;
1662 int *comps_ptr =
gv_calloc((
size_t)(m + 1),
sizeof(
int));
1666 for (i = 0; i < m; i++){
1667 if (i == 0 || mask[i] < 0) {
1669 if (i == 0) *comps = levelset;
1670 nn = levelset_ptr[nlevel];
1672 comps_ptr[(*ncomp)+1] = comps_ptr[(*ncomp)] + nn;
1688 int *ia =
A->ia, *ja =
A->ja, n =
A->n, m =
A->m;
1689 int *super =
NULL, *nsuper =
NULL, i, j, *mask =
NULL, isup, *newmap, isuper;
1691 super =
gv_calloc((
size_t)n,
sizeof(
int));
1692 nsuper =
gv_calloc((
size_t)(n + 1),
sizeof(
int));
1693 mask =
gv_calloc((
size_t)n,
sizeof(
int));
1694 newmap =
gv_calloc((
size_t)n,
sizeof(
int));
1698 for (i = 0; i < n; i++) super[i] = isup;
1700 for (i = 0; i < n; i++) mask[i] = -1;
1703 for (i = 0; i < m; i++){
1706 printf(
"doing row %d-----\n",i+1);
1708 for (j = ia[i]; j < ia[i+1]; j++){
1709 isuper = super[ja[j]];
1712 for (j = ia[i]; j < ia[i+1]; j++){
1713 isuper = super[ja[j]];
1714 if (mask[isuper] < i){
1716 if (nsuper[isuper] == 0){
1718 printf(
"node %d keep super node id %d\n",ja[j]+1,isuper+1);
1721 newmap[isuper] = isuper;
1723 newmap[isuper] = isup;
1726 printf(
"make node %d into supernode %d\n",ja[j]+1,isup+1);
1728 super[ja[j]] = isup++;
1732 printf(
"node %d join super node %d\n",ja[j]+1,newmap[isuper]+1);
1734 super[ja[j]] = newmap[isuper];
1735 nsuper[newmap[isuper]]++;
1740 for (j = 0; j < isup; j++) printf(
"(%d,%d),",j+1,nsuper[j]);
1745 for (i = 0; i < n; i++){
1746 printf(
"node %d is in supernode %d\n",i, super[i]);
1750 fprintf(stderr,
"n = %d, nsup = %d\n",n,isup);
1755 for (i = 0; i < isup; i++) nsuper[i+1] += nsuper[i];
1758 for (i = 0; i < n; i++){
1760 (*cluster)[nsuper[isuper]++] = i;
1762 for (i = isup; i > 0; i--) nsuper[i] = nsuper[i-1];
1768 for (i = 0; i < *ncluster; i++){
1770 for (j = (*clusterp)[i]; j < (*clusterp)[i+1]; j++){
1771 printf(
"%d, ",(*cluster)[j]);
1786 int nz =
A->nz,
type =
A->type;
1787 int m =
A->m, n =
A->n, i, j;
1789 if (!
A)
return NULL;
1791 irn =
gv_calloc((
size_t)nz * 2,
sizeof(
int));
1792 jcn =
gv_calloc((
size_t)nz * 2,
sizeof(
int));
1796 assert(
A->size != 0 && nz > 0);
1798 memcpy(val,
A->a,
A->size*((
size_t)nz));
1799 memcpy(((
char*) val) + ((
size_t)nz)*
A->size,
A->a,
A->size*((
size_t)nz));
1803 for (i = 0; i < m; i++){
1804 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1806 jcn[nz++] = (
A->ja)[j] + m;
1809 for (i = 0; i < m; i++){
1810 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1812 irn[nz++] = (
A->ja)[j] + m;
1817 B->is_symmetric =
true;
1818 B->is_pattern_symmetric =
true;
1827 switch (bipartite_options){
1829 if (
A->m ==
A->n)
return A;
1853 int nz = 0, i, j, *irn, *jcn, *ia =
A->
ia, *ja =
A->ja, m =
A->m, n =
A->n;
1857 int irow = 0, icol = 0;
1859 if (nrow <= 0 || ncol <= 0)
return NULL;
1863 rmask =
gv_calloc((
size_t)m,
sizeof(
int));
1864 cmask =
gv_calloc((
size_t)n,
sizeof(
int));
1865 for (i = 0; i < m; i++) rmask[i] = -1;
1866 for (i = 0; i < n; i++) cmask[i] = -1;
1869 for (i = 0; i < nrow; i++) {
1870 if (rindices[i] >= 0 && rindices[i] < m){
1871 rmask[rindices[i]] = irow++;
1875 for (i = 0; i < nrow; i++) {
1881 for (i = 0; i < ncol; i++) {
1882 if (cindices[i] >= 0 && cindices[i] < n){
1883 cmask[cindices[i]] = icol++;
1887 for (i = 0; i < ncol; i++) {
1892 for (i = 0; i < m; i++){
1893 if (rmask[i] < 0)
continue;
1894 for (j = ia[i]; j < ia[i+1]; j++){
1895 if (cmask[ja[j]] < 0)
continue;
1905 irn =
gv_calloc((
size_t)nz,
sizeof(
int));
1906 jcn =
gv_calloc((
size_t)nz,
sizeof(
int));
1907 val =
gv_calloc((
size_t)nz,
sizeof(
double));
1910 for (i = 0; i < m; i++){
1911 if (rmask[i] < 0)
continue;
1912 for (j = ia[i]; j < ia[i+1]; j++){
1913 if (cmask[ja[j]] < 0)
continue;
1915 jcn[nz] = cmask[ja[j]];
1926 irn =
gv_calloc((
size_t)nz,
sizeof(
int));
1927 jcn =
gv_calloc((
size_t)nz,
sizeof(
int));
1928 val =
gv_calloc(2 * (
size_t)nz,
sizeof(
double));
1931 for (i = 0; i < m; i++){
1932 if (rmask[i] < 0)
continue;
1933 for (j = ia[i]; j < ia[i+1]; j++){
1934 if (cmask[ja[j]] < 0)
continue;
1936 jcn[nz] = cmask[ja[j]];
1938 val[2*nz+1] = a[2*j+1];
1949 irn =
gv_calloc((
size_t)nz,
sizeof(
int));
1950 jcn =
gv_calloc((
size_t)nz,
sizeof(
int));
1951 val =
gv_calloc((
size_t)nz,
sizeof(
int));
1954 for (i = 0; i < m; i++){
1955 if (rmask[i] < 0)
continue;
1956 for (j = ia[i]; j < ia[i+1]; j++){
1957 if (cmask[ja[j]] < 0)
continue;
1959 jcn[nz] = cmask[ja[j]];
1968 irn =
gv_calloc((
size_t)nz,
sizeof(
int));
1969 jcn =
gv_calloc((
size_t)nz,
sizeof(
int));
1971 for (i = 0; i < m; i++){
1972 if (rmask[i] < 0)
continue;
1973 for (j = ia[i]; j < ia[i+1]; j++){
1974 if (cmask[ja[j]] < 0)
continue;
1976 jcn[nz++] = cmask[ja[j]];
2009 for (i = 0; i <
A->nz; i++) a[i] = 1.;
2011 A->size =
sizeof(double);
2023 for (i = 1; i <= m; i++) (
A->ia)[i] = (
A->ia)[i-1] + n;
2027 for (i = 0; i < m; i++){
2028 for (j = 0; j < n; j++) {
2047 int m =
D->
m, n =
D->n;
2048 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL;
2049 int i, j, k, nlevel;
2058 if (!(*dist0)) *dist0 =
gv_calloc(n * n,
sizeof(
double));
2059 for (i = 0; i < n*n; i++) (*dist0)[i] = -1;
2061 for (k = 0; k < n; k++) {
2063 assert(levelset_ptr[nlevel] == n);
2064 for (i = 0; i < nlevel; i++) {
2065 for (j = levelset_ptr[i]; j < levelset_ptr[i+1]; j++) {
2066 (*dist0)[k*n+levelset[j]] = i;
void SparseMatrix_distance_matrix(SparseMatrix D0, double **dist0)
static SparseMatrix SparseMatrix_realloc(SparseMatrix A, int nz)
void SparseMatrix_decompose_to_supervariables(SparseMatrix A, int *ncluster, int **cluster, int **clusterp)
SparseMatrix SparseMatrix_from_coordinate_format(SparseMatrix A)
SparseMatrix SparseMatrix_transpose(SparseMatrix A)
SparseMatrix SparseMatrix_remove_upper(SparseMatrix A)
SparseMatrix SparseMatrix_get_submatrix(SparseMatrix A, int nrow, int ncol, int *rindices, int *cindices)
SparseMatrix SparseMatrix_symmetrize(SparseMatrix A, bool pattern_symmetric_only)
SparseMatrix SparseMatrix_general_new(int m, int n, int nz, int type, size_t sz, int format)
SparseMatrix SparseMatrix_get_augmented(SparseMatrix A)
static size_t size_of_matrix_type(int type)
void SparseMatrix_multiply_dense(SparseMatrix A, const double *v, double *res, int dim)
SparseMatrix SparseMatrix_coordinate_form_add_entry(SparseMatrix A, int irn, int jcn, const void *val)
static SparseMatrix SparseMatrix_from_coordinate_arrays_internal(int nz, int m, int n, int *irn, int *jcn, const void *val0, int type, size_t sz, int sum_repeated)
bool SparseMatrix_is_symmetric(SparseMatrix A, bool test_pattern_symmetry_only)
SparseMatrix SparseMatrix_to_square_matrix(SparseMatrix A, int bipartite_options)
void SparseMatrix_multiply_vector(SparseMatrix A, double *v, double **res)
SparseMatrix SparseMatrix_multiply(SparseMatrix A, SparseMatrix B)
SparseMatrix SparseMatrix_divide_row_by_degree(SparseMatrix A)
void SparseMatrix_export(FILE *f, SparseMatrix A)
static void SparseMatrix_export_csr(FILE *f, SparseMatrix A)
SparseMatrix SparseMatrix_from_coordinate_arrays_not_compacted(int nz, int m, int n, int *irn, int *jcn, void *val0, int type, size_t sz)
SparseMatrix SparseMatrix_from_coordinate_arrays(int nz, int m, int n, int *irn, int *jcn, const void *val, int type, size_t sz)
static void SparseMatrix_export_coord(FILE *f, SparseMatrix A)
void SparseMatrix_delete(SparseMatrix A)
SparseMatrix SparseMatrix_make_undirected(SparseMatrix A)
static SparseMatrix SparseMatrix_alloc(SparseMatrix A, int nz)
SparseMatrix SparseMatrix_copy(SparseMatrix A)
SparseMatrix SparseMatrix_set_entries_to_real_one(SparseMatrix A)
static void SparseMatrix_level_sets(SparseMatrix A, int root, int *nlevel, int **levelset_ptr, int **levelset, int **mask, bool reinitialize_mask)
SparseMatrix SparseMatrix_get_real_adjacency_matrix_symmetrized(SparseMatrix A)
SparseMatrix SparseMatrix_sort(SparseMatrix A)
SparseMatrix SparseMatrix_sum_repeat_entries(SparseMatrix A)
SparseMatrix SparseMatrix_add(SparseMatrix A, SparseMatrix B)
SparseMatrix SparseMatrix_multiply3(SparseMatrix A, SparseMatrix B, SparseMatrix C)
SparseMatrix SparseMatrix_apply_fun(SparseMatrix A, double(*fun)(double x))
bool SparseMatrix_has_diagonal(SparseMatrix A)
static SparseMatrix SparseMatrix_init(int m, int n, int type, size_t sz, int format)
int * SparseMatrix_weakly_connected_components(SparseMatrix A0, int *ncomp, int **comps)
SparseMatrix SparseMatrix_from_coordinate_format_not_compacted(SparseMatrix A)
SparseMatrix SparseMatrix_remove_diagonal(SparseMatrix A)
SparseMatrix SparseMatrix_new(int m, int n, int nz, int type, int format)
SparseMatrix SparseMatrix_from_dense(int m, int n, double *x)
@ BIPARTITE_PATTERN_UNSYM
Memory allocation wrappers that exit on failure.
static void * gv_recalloc(void *ptr, size_t old_nmemb, size_t new_nmemb, size_t size)
static void * gv_calloc(size_t nmemb, size_t size)
static void * gv_alloc(size_t size)
GVIO_API const char * format