31 size =
sizeof(double);
34 size = 2*
sizeof(double);
61 B->is_undirected =
true;
67 int *ia =
A->ia, *ja =
A->ja, *ib, *jb, m =
A->m, n =
A->n,
type =
A->type,
format =
A->format;
68 const size_t nz =
A->nz;
79 for (i = 0; i <= n; i++) ib[i] = 0;
80 for (i = 0; i < m; i++){
81 for (j = ia[i]; j < ia[i+1]; j++){
86 for (i = 0; i < n; i++) ib[i+1] += ib[i];
92 for (i = 0; i < m; i++){
93 for (j = ia[i]; j < ia[i+1]; j++){
95 b[ib[ja[j]]++] = a[j];
103 for (i = 0; i < m; i++){
104 for (j = ia[i]; j < ia[i+1]; j++){
106 b[2*ib[ja[j]]] = a[2*j];
107 b[2*ib[ja[j]]+1] = a[2*j+1];
116 for (i = 0; i < m; i++){
117 for (j = ia[i]; j < ia[i+1]; j++){
119 bi[ib[ja[j]]++] = ai[j];
125 for (i = 0; i < m; i++){
126 for (j = ia[i]; j < ia[i+1]; j++){
136 for (i = n-1; i >= 0; i--) ib[i+1] = ib[i];
144 bool pattern_symmetric_only) {
151 A->is_symmetric =
true;
152 A->is_pattern_symmetric =
true;
157 if (!
A)
return false;
161 int *ia, *ja, *ib, *jb,
type, m;
167 if (
A->is_symmetric)
return true;
168 if (test_pattern_symmetry_only &&
A->is_pattern_symmetric)
return true;
170 if (
A->m !=
A->n)
return false;
173 if (!
B)
return false;
181 mask =
gv_calloc((
size_t)m,
sizeof(
int));
182 for (i = 0; i < m; i++) mask[i] = -1;
191 for (i = 0; i <= m; i++)
if (ia[i] != ib[i])
goto RETURN;
192 for (i = 0; i < m; i++){
193 for (j = ia[i]; j < ia[i+1]; j++){
196 for (j = ib[i]; j < ib[i+1]; j++){
197 if (mask[jb[j]] < ia[i])
goto RETURN;
199 for (j = ib[i]; j < ib[i+1]; j++){
209 for (i = 0; i <= m; i++)
if (ia[i] != ib[i])
goto RETURN;
210 for (i = 0; i < m; i++){
211 for (j = ia[i]; j < ia[i+1]; j++){
214 for (j = ib[i]; j < ib[i+1]; j++){
215 if (mask[jb[j]] < ia[i])
goto RETURN;
217 for (j = ib[i]; j < ib[i+1]; j++){
228 for (i = 0; i < m; i++){
229 for (j = ia[i]; j < ia[i+1]; j++){
232 for (j = ib[i]; j < ib[i+1]; j++){
233 if (mask[jb[j]] < ia[i])
goto RETURN;
235 for (j = ib[i]; j < ib[i+1]; j++){
236 if (bi[j] != ai[mask[jb[j]]])
goto RETURN;
243 for (i = 0; i < m; i++){
244 for (j = ia[i]; j < ia[i+1]; j++){
247 for (j = ib[i]; j < ib[i+1]; j++){
248 if (mask[jb[j]] < ia[i])
goto RETURN;
257 if (!test_pattern_symmetry_only) {
258 A->is_symmetric =
true;
260 A->is_pattern_symmetric =
true;
282 A->ia =
gv_calloc((
size_t)(m + 1),
sizeof(
int));
303 if (
A->size > 0 && nz > 0) {
387 fprintf(f,
"%%%%MatrixMarket matrix coordinate real general\n");
390 fprintf(f,
"%%%%MatrixMarket matrix coordinate complex general\n");
393 fprintf(f,
"%%%%MatrixMarket matrix coordinate integer general\n");
396 fprintf(f,
"%%%%MatrixMarket matrix coordinate pattern general\n");
402 fprintf(f,
"%d %d %" PRISIZE_T "\n",
A->m,
A->n,
A->nz);
403 const int *
const ia =
A->ia;
404 const int *
const ja =
A->ja;
407 const double *
const a =
A->a;
408 for (
int i = 0; i < m; i++){
409 for (
int j = ia[i]; j < ia[i+1]; j++){
410 fprintf(f,
"%d %d %16.8g\n",i+1, ja[j]+1, a[j]);
416 const double *
const a =
A->a;
417 for (
int i = 0; i < m; i++){
418 for (
int j = ia[i]; j < ia[i+1]; j++){
419 fprintf(f,
"%d %d %16.8g %16.8g\n",i+1, ja[j]+1, a[2*j], a[2*j+1]);
425 const int *
const ai =
A->a;
426 for (
int i = 0; i < m; i++){
427 for (
int j = ia[i]; j < ia[i+1]; j++){
428 fprintf(f,
"%d %d %d\n",i+1, ja[j]+1, ai[j]);
434 for (
int i = 0; i < m; i++){
435 for (
int j = ia[i]; j < ia[i+1]; j++){
436 fprintf(f,
"%d %d\n",i+1, ja[j]+1);
449 fprintf(f,
"%%%%MatrixMarket matrix coordinate real general\n");
452 fprintf(f,
"%%%%MatrixMarket matrix coordinate complex general\n");
455 fprintf(f,
"%%%%MatrixMarket matrix coordinate integer general\n");
458 fprintf(f,
"%%%%MatrixMarket matrix coordinate pattern general\n");
464 fprintf(f,
"%d %d %" PRISIZE_T "\n",
A->m,
A->n,
A->nz);
465 const int *
const ia =
A->ia;
466 const int *
const ja =
A->ja;
469 const double *
const a =
A->a;
470 for (
size_t i = 0; i <
A->nz; i++) {
471 fprintf(f,
"%d %d %16.8g\n",ia[i]+1, ja[i]+1, a[i]);
476 const double *
const a =
A->a;
477 for (
size_t i = 0; i <
A->nz; i++) {
478 fprintf(f,
"%d %d %16.8g %16.8g\n",ia[i]+1, ja[i]+1, a[2*i], a[2*i+1]);
483 const int *
const ai =
A->a;
484 for (
size_t i = 0; i <
A->nz; i++) {
485 fprintf(f,
"%d %d %d\n",ia[i]+1, ja[i]+1, ai[i]);
489 for (
size_t i = 0; i <
A->nz; i++){
490 fprintf(f,
"%d %d\n",ia[i]+1, ja[i]+1);
567 assert(m > 0 && n > 0);
569 if (m <=0 || n <= 0)
return NULL;
574 for (
int i = 0; i <= m; i++){
580 const double *
const val = val0;
582 for (
size_t i = 0; i < nz; i++){
583 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
588 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
589 for (
size_t i = 0; i < nz; i++){
590 a[ia[irn[i]]] = val[i];
591 ja[ia[irn[i]]++] = jcn[i];
593 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
598 const double *
const val = val0;
600 for (
size_t i = 0; i < nz; i++){
601 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
606 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
607 for (
size_t i = 0; i < nz; i++){
608 a[2*ia[irn[i]]] = val[2 * i];
609 a[2*ia[irn[i]]+1] = val[2 * i + 1];
610 ja[ia[irn[i]]++] = jcn[i];
612 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
617 const int *
const vali = val0;
619 for (
size_t i = 0; i < nz; i++){
620 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
625 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
626 for (
size_t i = 0; i < nz; i++){
627 ai[ia[irn[i]]] = vali[i];
628 ja[ia[irn[i]]++] = jcn[i];
630 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
635 for (
size_t i = 0; i < nz; i++){
636 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
641 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
642 for (
size_t i = 0; i < nz; i++){
643 ja[ia[irn[i]]++] = jcn[i];
645 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
662 const void *val,
int type,
680 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
685 assert(
A->type ==
B->type);
688 if (m !=
B->m || n !=
B->n)
return NULL;
690 const size_t nzmax =
A->nz +
B->nz;
696 mask =
gv_calloc((
size_t)n,
sizeof(
int));
698 for (i = 0; i < n; i++) mask[i] = -1;
707 for (i = 0; i < m; i++){
708 for (j = ia[i]; j < ia[i+1]; j++){
709 mask[ja[j]] = (int)nz;
714 for (j = ib[i]; j < ib[i+1]; j++){
715 if (mask[jb[j]] < ic[i]){
719 c[mask[jb[j]]] += b[j];
730 for (i = 0; i < m; i++){
731 for (j = ia[i]; j < ia[i+1]; j++){
732 mask[ja[j]] = (int)nz;
735 c[2*nz+1] = a[2*j+1];
738 for (j = ib[i]; j < ib[i+1]; j++){
739 if (mask[jb[j]] < ic[i]){
742 c[2*nz+1] = b[2*j+1];
745 c[2*mask[jb[j]]] += b[2*j];
746 c[2*mask[jb[j]]+1] += b[2*j+1];
757 for (i = 0; i < m; i++){
758 for (j = ia[i]; j < ia[i+1]; j++){
759 mask[ja[j]] = (int)nz;
764 for (j = ib[i]; j < ib[i+1]; j++){
765 if (mask[jb[j]] < ic[i]){
770 c[mask[jb[j]]] += b[j];
778 for (i = 0; i < m; i++){
779 for (j = ia[i]; j < ia[i+1]; j++){
780 mask[ja[j]] = (int)nz;
784 for (j = ib[i]; j < ib[i+1]; j++){
785 if (mask[jb[j]] < ic[i]){
808 int i, j, k, *ia, *ja, m;
819 for (i = 0; i < m; i++){
820 for (k = 0; k <
dim; k++) res[i *
dim + k] = 0;
821 for (j = ia[i]; j < ia[i+1]; j++){
822 for (k = 0; k <
dim; k++) res[i *
dim + k] += a[j] * v[ja[j] *
dim + k];
829 int i, j, *ia, *ja, m;
830 double *a, *u =
NULL;
844 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
845 for (i = 0; i < m; i++){
847 for (j = ia[i]; j < ia[i+1]; j++){
848 u[i] += a[j]*v[ja[j]];
853 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
854 for (i = 0; i < m; i++){
856 for (j = ia[i]; j < ia[i+1]; j++){
865 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
866 for (i = 0; i < m; i++){
868 for (j = ia[i]; j < ia[i+1]; j++){
869 u[i] += ai[j]*v[ja[j]];
874 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
875 for (i = 0; i < m; i++){
877 for (j = ia[i]; j < ia[i+1]; j++){
894 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
895 int i, j, k, jj,
type;
900 if (
A->n !=
B->m)
return NULL;
901 if (
A->type !=
B->type){
903 printf(
"in SparseMatrix_multiply, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
909 mask = calloc((
size_t)
B->n,
sizeof(
int));
910 if (!mask)
return NULL;
912 for (i = 0; i <
B->n; i++) mask[i] = -1;
915 for (i = 0; i < m; i++){
916 for (j = ia[i]; j < ia[i+1]; j++){
918 for (k = ib[jj]; k < ib[jj+1]; k++){
919 if (mask[jb[k]] != -i - 2){
922 fprintf(stderr,
"overflow in SparseMatrix_multiply !!!\n");
927 mask[jb[k]] = -i - 2;
946 for (i = 0; i < m; i++){
947 for (j = ia[i]; j < ia[i+1]; j++){
949 for (k = ib[jj]; k < ib[jj+1]; k++){
950 if (mask[jb[k]] < ic[i]){
951 mask[jb[k]] = (int)nz;
956 assert(jc[mask[jb[k]]] == jb[k]);
957 c[mask[jb[k]]] += a[j]*b[k];
971 for (i = 0; i < m; i++){
972 for (j = ia[i]; j < ia[i+1]; j++){
974 for (k = ib[jj]; k < ib[jj+1]; k++){
975 if (mask[jb[k]] < ic[i]){
976 mask[jb[k]] = (int)nz;
978 c[2*nz] = a[2*j]*b[2*k] - a[2*j+1]*b[2*k+1];
979 c[2*nz+1] = a[2*j]*b[2*k+1] + a[2*j+1]*b[2*k];
982 assert(jc[mask[jb[k]]] == jb[k]);
983 c[2*mask[jb[k]]] += a[2*j]*b[2*k] - a[2*j+1]*b[2*k+1];
984 c[2*mask[jb[k]]+1] += a[2*j]*b[2*k+1] + a[2*j+1]*b[2*k];
998 for (i = 0; i < m; i++){
999 for (j = ia[i]; j < ia[i+1]; j++){
1001 for (k = ib[jj]; k < ib[jj+1]; k++){
1002 if (mask[jb[k]] < ic[i]){
1003 mask[jb[k]] = (int)nz;
1008 assert(jc[mask[jb[k]]] == jb[k]);
1009 c[mask[jb[k]]] += a[j]*b[k];
1013 ic[i + 1] = (int)nz;
1019 for (i = 0; i < m; i++){
1020 for (j = ia[i]; j < ia[i+1]; j++){
1022 for (k = ib[jj]; k < ib[jj+1]; k++){
1023 if (mask[jb[k]] < ic[i]){
1024 mask[jb[k]] = (int)nz;
1028 assert(jc[mask[jb[k]]] == jb[k]);
1032 ic[i + 1] = (int)nz;
1051 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic =
C->ia, *jc =
C->ja, *
id, *jd;
1052 int i, j, k, l, ll, jj,
type;
1057 if (
A->n !=
B->m)
return NULL;
1058 if (
B->n !=
C->m)
return NULL;
1060 if (
A->type !=
B->type ||
B->type !=
C->type){
1062 printf(
"in SparseMatrix_multiply3, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
1070 mask = calloc((
size_t)
C->n,
sizeof(
int));
1071 if (!mask)
return NULL;
1073 for (i = 0; i <
C->n; i++) mask[i] = -1;
1076 for (i = 0; i < m; i++){
1077 for (j = ia[i]; j < ia[i+1]; j++){
1079 for (l = ib[jj]; l < ib[jj+1]; l++){
1081 for (k = ic[ll]; k < ic[ll+1]; k++){
1082 if (mask[jc[k]] != -i - 2){
1085 fprintf(stderr,
"overflow in SparseMatrix_multiply3 !!!\n");
1090 mask[jc[k]] = -i - 2;
1108 for (i = 0; i < m; i++){
1109 for (j = ia[i]; j < ia[i+1]; j++){
1111 for (l = ib[jj]; l < ib[jj+1]; l++){
1113 for (k = ic[ll]; k < ic[ll+1]; k++){
1114 if (mask[jc[k]] <
id[i]){
1115 mask[jc[k]] = (int)nz;
1117 d[nz] = a[j]*b[l]*c[k];
1120 assert(jd[mask[jc[k]]] == jc[k]);
1121 d[mask[jc[k]]] += a[j]*b[l]*c[k];
1126 id[i + 1] = (int)nz;
1137 int *ia =
A->
ia, *ja =
A->ja,
type =
A->type, n =
A->n;
1138 int *mask =
NULL, i, j, sta;
1141 mask =
gv_calloc((
size_t)n,
sizeof(
int));
1142 for (i = 0; i < n; i++) mask[i] = -1;
1149 for (i = 0; i <
A->m; i++){
1150 for (j = sta; j < ia[i+1]; j++){
1151 if (mask[ja[j]] < ia[i]){
1154 mask[ja[j]] = (int)nz++;
1156 assert(ja[mask[ja[j]]] == ja[j]);
1157 a[mask[ja[j]]] += a[j];
1161 ia[i + 1] = (int)nz;
1169 for (i = 0; i <
A->m; i++) {
1170 for (j = sta; j < ia[i+1]; j++) {
1171 if (mask[ja[j]] < ia[i]) {
1173 a[2 * nz] = a[2 * j];
1174 a[2 * nz + 1] = a[2 * j + 1];
1175 mask[ja[j]] = (int)nz++;
1177 assert(ja[mask[ja[j]]] == ja[j]);
1178 a[2 * mask[ja[j]]] += a[2 * j];
1179 a[2 * mask[ja[j]]+1] += a[2 * j + 1];
1183 ia[i + 1] = (int)nz;
1191 for (i = 0; i <
A->m; i++){
1192 for (j = sta; j < ia[i+1]; j++){
1193 if (mask[ja[j]] < ia[i]){
1196 mask[ja[j]] = (int)nz++;
1198 assert(ja[mask[ja[j]]] == ja[j]);
1199 a[mask[ja[j]]] += a[j];
1203 ia[i + 1] = (int)nz;
1210 for (i = 0; i <
A->m; i++){
1211 for (j = sta; j < ia[i+1]; j++){
1212 if (mask[ja[j]] < ia[i]){
1214 mask[ja[j]] = (int)nz++;
1216 assert(ja[mask[ja[j]]] == ja[j]);
1220 ia[i + 1] = (int)nz;
1234 int jcn,
const void *val) {
1235 static const size_t nentries = 1;
1238 const size_t nz =
A->nz;
1240 if (nz + nentries >=
A->nzmax){
1241 const size_t nzmax = nz + nentries + 10;
1246 if (
A->size) memcpy((
char *)
A->a + nz *
A->size /
sizeof(
char), val,
A->size * nentries);
1247 if (irn >=
A->m)
A->m = irn + 1;
1248 if (jcn >=
A->n)
A->n = jcn + 1;
1255 int i, j, *ia, *ja, sta;
1266 for (i = 0; i <
A->m; i++){
1267 for (j = sta; j < ia[i+1]; j++){
1274 ia[i + 1] = (int)nz;
1281 for (i = 0; i <
A->m; i++){
1282 for (j = sta; j < ia[i+1]; j++){
1286 a[2*nz+1] = a[2*j+1];
1291 ia[i + 1] = (int)nz;
1298 for (i = 0; i <
A->m; i++){
1299 for (j = sta; j < ia[i+1]; j++){
1306 ia[i + 1] = (int)nz;
1312 for (i = 0; i <
A->m; i++){
1313 for (j = sta; j < ia[i+1]; j++){
1319 ia[i + 1] = (int)nz;
1333 int i, j, *ia, *ja, sta;
1344 for (i = 0; i <
A->m; i++){
1345 for (j = sta; j < ia[i+1]; j++){
1352 ia[i + 1] = (int)nz;
1359 for (i = 0; i <
A->m; i++){
1360 for (j = sta; j < ia[i+1]; j++){
1364 a[2*nz+1] = a[2*j+1];
1369 ia[i + 1] = (int)nz;
1376 for (i = 0; i <
A->m; i++){
1377 for (j = sta; j < ia[i+1]; j++){
1384 ia[i + 1] = (int)nz;
1390 for (i = 0; i <
A->m; i++){
1391 for (j = sta; j < ia[i+1]; j++){
1397 ia[i + 1] = (int)nz;
1406 A->is_pattern_symmetric =
false;
1407 A->is_symmetric =
false;
1425 for (i = 0; i <
A->m; i++){
1426 deg = ia[i+1] - ia[i];
1427 for (j = ia[i]; j < ia[i+1]; j++){
1435 for (i = 0; i <
A->m; i++){
1436 deg = ia[i+1] - ia[i];
1437 for (j = ia[i]; j < ia[i+1]; j++){
1439 a[2*j] = a[2*j]/deg;
1440 a[2*j+1] = a[2*j+1]/deg;
1467 const size_t nz =
A->
nz;
1473 if (n != m)
return NULL;
1477 memcpy(
B->ia, ia,
sizeof(
int)*((
size_t)(m+1)));
1478 memcpy(
B->ja, ja,
sizeof(
int) * nz);
1486 for (
size_t i = 0; i <
A->nz; i++) a[i] = 1.;
1488 A->size =
sizeof(double);
1500 printf(
"only CSR and real matrix supported.\n");
1507 for (i = 0; i <
A->m; i++){
1508 for (j =
A->ia[i]; j <
A->ia[i+1]; j++){
1519 memcpy(
B->ia,
A->ia,
sizeof(
int)*((
size_t)(
A->m+1)));
1520 if (
A->ia[
A->m] != 0) {
1521 memcpy(
B->ja,
A->ja,
sizeof(
int)*((
size_t)(
A->ia[
A->m])));
1523 if (
A->a) memcpy(
B->a,
A->a,
A->size *
A->nz);
1524 B->is_pattern_symmetric =
A->is_pattern_symmetric;
1525 B->is_symmetric =
A->is_symmetric;
1526 B->is_undirected =
A->is_undirected;
1533 int i, j, m =
A->m, *ia =
A->ia, *ja =
A->ja;
1535 for (i = 0; i < m; i++){
1536 for (j = ia[i]; j < ia[i+1]; j++){
1537 if (i == ja[j])
return true;
1544 int **levelset_ptr,
int **levelset,
1545 int **mask,
bool reinitialize_mask) {
1554 int i, j, sta = 0, sto = 1, ii;
1555 int m =
A->m, *ia =
A->ia, *ja =
A->ja;
1557 if (!(*levelset_ptr)) *levelset_ptr =
gv_calloc((
size_t)(m + 2),
sizeof(
int));
1558 if (!(*levelset)) *levelset =
gv_calloc((
size_t)m,
sizeof(
int));
1560 *mask =
gv_calloc((
size_t)m,
sizeof(
int));
1561 for (i = 0; i < m; i++) (*mask)[i] =
UNMASKED;
1565 assert(root >= 0 && root < m);
1566 (*levelset_ptr)[0] = 0;
1567 (*levelset_ptr)[1] = 1;
1568 (*levelset)[0] = root;
1574 for (i = sta; i < sto; i++){
1575 ii = (*levelset)[i];
1576 for (j = ia[ii]; j < ia[ii+1]; j++){
1577 if (ii == ja[j])
continue;
1578 if ((*mask)[ja[j]] < 0){
1579 (*levelset)[nz++] = ja[j];
1580 (*mask)[ja[j]] = *nlevel + 1;
1584 (*levelset_ptr)[++(*nlevel)] = (int)nz;
1589 if (reinitialize_mask)
for (i = 0; i < (*levelset_ptr)[*nlevel]; i++) (*mask)[(*levelset)[i]] =
UNMASKED;
1595 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL, nlevel;
1596 int m =
A->m, i, nn;
1601 int *comps_ptr =
gv_calloc((
size_t)(m + 1),
sizeof(
int));
1605 for (i = 0; i < m; i++){
1606 if (i == 0 || mask[i] < 0) {
1608 if (i == 0) *comps = levelset;
1609 nn = levelset_ptr[nlevel];
1611 comps_ptr[(*ncomp)+1] = comps_ptr[(*ncomp)] + nn;
1627 int *ia =
A->ia, *ja =
A->ja, n =
A->n, m =
A->m;
1628 int *super =
NULL, *nsuper =
NULL, i, j, *mask =
NULL, isup, *newmap, isuper;
1630 super =
gv_calloc((
size_t)n,
sizeof(
int));
1631 nsuper =
gv_calloc((
size_t)(n + 1),
sizeof(
int));
1632 mask =
gv_calloc((
size_t)n,
sizeof(
int));
1633 newmap =
gv_calloc((
size_t)n,
sizeof(
int));
1637 for (i = 0; i < n; i++) super[i] = isup;
1639 for (i = 0; i < n; i++) mask[i] = -1;
1642 for (i = 0; i < m; i++){
1645 printf(
"doing row %d-----\n",i+1);
1647 for (j = ia[i]; j < ia[i+1]; j++){
1648 isuper = super[ja[j]];
1651 for (j = ia[i]; j < ia[i+1]; j++){
1652 isuper = super[ja[j]];
1653 if (mask[isuper] < i){
1655 if (nsuper[isuper] == 0){
1657 printf(
"node %d keep super node id %d\n",ja[j]+1,isuper+1);
1660 newmap[isuper] = isuper;
1662 newmap[isuper] = isup;
1665 printf(
"make node %d into supernode %d\n",ja[j]+1,isup+1);
1667 super[ja[j]] = isup++;
1671 printf(
"node %d join super node %d\n",ja[j]+1,newmap[isuper]+1);
1673 super[ja[j]] = newmap[isuper];
1674 nsuper[newmap[isuper]]++;
1679 for (j = 0; j < isup; j++) printf(
"(%d,%d),",j+1,nsuper[j]);
1684 for (i = 0; i < n; i++){
1685 printf(
"node %d is in supernode %d\n",i, super[i]);
1689 fprintf(stderr,
"n = %d, nsup = %d\n",n,isup);
1694 for (i = 0; i < isup; i++) nsuper[i+1] += nsuper[i];
1697 for (i = 0; i < n; i++){
1699 (*cluster)[nsuper[isuper]++] = i;
1701 for (i = isup; i > 0; i--) nsuper[i] = nsuper[i-1];
1707 for (i = 0; i < *ncluster; i++){
1709 for (j = (*clusterp)[i]; j < (*clusterp)[i+1]; j++){
1710 printf(
"%d, ",(*cluster)[j]);
1727 int m =
A->m, n =
A->n, i, j;
1729 if (!
A)
return NULL;
1736 assert(
A->size != 0 && nz > 0);
1738 memcpy(val,
A->a,
A->size * nz);
1739 memcpy((
char *)val + nz *
A->size,
A->a,
A->size * nz);
1743 for (i = 0; i < m; i++){
1744 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1746 jcn[nz++] = (
A->ja)[j] + m;
1749 for (i = 0; i < m; i++){
1750 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1752 irn[nz++] = (
A->ja)[j] + m;
1757 B->is_symmetric =
true;
1758 B->is_pattern_symmetric =
true;
1767 switch (bipartite_options){
1769 if (
A->m ==
A->n)
return A;
1794 int i, j, *irn, *jcn, *ia =
A->
ia, *ja =
A->ja, m =
A->m, n =
A->n;
1798 int irow = 0, icol = 0;
1800 if (nrow <= 0 || ncol <= 0)
return NULL;
1804 rmask =
gv_calloc((
size_t)m,
sizeof(
int));
1805 cmask =
gv_calloc((
size_t)n,
sizeof(
int));
1806 for (i = 0; i < m; i++) rmask[i] = -1;
1807 for (i = 0; i < n; i++) cmask[i] = -1;
1810 for (i = 0; i < nrow; i++) {
1811 if (rindices[i] >= 0 && rindices[i] < m){
1812 rmask[rindices[i]] = irow++;
1816 for (i = 0; i < nrow; i++) {
1822 for (i = 0; i < ncol; i++) {
1823 if (cindices[i] >= 0 && cindices[i] < n){
1824 cmask[cindices[i]] = icol++;
1828 for (i = 0; i < ncol; i++) {
1833 for (i = 0; i < m; i++){
1834 if (rmask[i] < 0)
continue;
1835 for (j = ia[i]; j < ia[i+1]; j++){
1836 if (cmask[ja[j]] < 0)
continue;
1851 for (i = 0; i < m; i++){
1852 if (rmask[i] < 0)
continue;
1853 for (j = ia[i]; j < ia[i+1]; j++){
1854 if (cmask[ja[j]] < 0)
continue;
1856 jcn[nz] = cmask[ja[j]];
1869 val =
gv_calloc(2 * nz,
sizeof(
double));
1872 for (i = 0; i < m; i++){
1873 if (rmask[i] < 0)
continue;
1874 for (j = ia[i]; j < ia[i+1]; j++){
1875 if (cmask[ja[j]] < 0)
continue;
1877 jcn[nz] = cmask[ja[j]];
1879 val[2*nz+1] = a[2*j+1];
1895 for (i = 0; i < m; i++){
1896 if (rmask[i] < 0)
continue;
1897 for (j = ia[i]; j < ia[i+1]; j++){
1898 if (cmask[ja[j]] < 0)
continue;
1900 jcn[nz] = cmask[ja[j]];
1912 for (i = 0; i < m; i++){
1913 if (rmask[i] < 0)
continue;
1914 for (j = ia[i]; j < ia[i+1]; j++){
1915 if (cmask[ja[j]] < 0)
continue;
1917 jcn[nz++] = cmask[ja[j]];
1943 for (
size_t i = 0; i <
A->nz; i++) a[i] = 1.;
1945 A->size =
sizeof(double);
1957 for (i = 1; i <= m; i++) (
A->ia)[i] = (
A->ia)[i-1] + n;
1961 for (i = 0; i < m; i++){
1962 for (j = 0; j < n; j++) {
1968 A->nz = (size_t)m * (
size_t)n;
1981 int m =
D->
m, n =
D->n;
1982 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL;
1983 int i, j, k, nlevel;
1992 if (!(*dist0)) *dist0 =
gv_calloc(n * n,
sizeof(
double));
1993 for (i = 0; i < n*n; i++) (*dist0)[i] = -1;
1995 for (k = 0; k < n; k++) {
1997 assert(levelset_ptr[nlevel] == n);
1998 for (i = 0; i < nlevel; i++) {
1999 for (j = levelset_ptr[i]; j < levelset_ptr[i+1]; j++) {
2000 (*dist0)[k*n+levelset[j]] = i;
SparseMatrix SparseMatrix_from_coordinate_arrays_not_compacted(size_t nz, int m, int n, int *irn, int *jcn, void *val0, int type, size_t sz)
void SparseMatrix_distance_matrix(SparseMatrix D0, double **dist0)
static SparseMatrix SparseMatrix_realloc(SparseMatrix A, size_t 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_get_augmented(SparseMatrix A)
static void SparseMatrix_alloc(SparseMatrix A, size_t nz)
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)
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(size_t 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)
static SparseMatrix SparseMatrix_from_coordinate_arrays_internal(size_t nz, int m, int n, int *irn, int *jcn, const void *val0, int type, size_t sz, int sum_repeated)
SparseMatrix SparseMatrix_make_undirected(SparseMatrix A)
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)
static SparseMatrix SparseMatrix_general_new(int m, int n, size_t nz, 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_from_dense(int m, int n, double *x)
SparseMatrix SparseMatrix_new(int m, int n, size_t nz, int type, int format)
@ 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
arithmetic overflow helpers
static bool size_overflow(size_t a, size_t b, size_t *res)
size_t nz
the actual length used is nz, for CSR/CSC matrix this is the same as ia[n]