31 size =
sizeof(double);
58 B->is_undirected =
true;
64 int *ia =
A->ia, *ja =
A->ja, *ib, *jb, m =
A->m, n =
A->n,
type =
A->type,
format =
A->format;
65 const size_t nz =
A->nz;
76 for (
int i = 0; i <= n; i++) ib[i] = 0;
77 for (
int i = 0; i < m; i++){
78 for (j = ia[i]; j < ia[i+1]; j++){
83 for (
int i = 0; i < n; i++) ib[i+1] += ib[i];
89 for (
int i = 0; i < m; i++){
90 for (j = ia[i]; j < ia[i+1]; j++){
92 b[ib[ja[j]]++] = a[j];
100 for (
int i = 0; i < m; i++){
101 for (j = ia[i]; j < ia[i+1]; j++){
103 bi[ib[ja[j]]++] = ai[j];
109 for (
int i = 0; i < m; i++){
110 for (j = ia[i]; j < ia[i+1]; j++){
120 for (
int i = n-1; i >= 0; i--) ib[i+1] = ib[i];
128 bool pattern_symmetric_only) {
135 A->is_symmetric =
true;
136 A->is_pattern_symmetric =
true;
141 if (!
A)
return false;
145 int *ia, *ja, *ib, *jb,
type, m;
151 if (
A->is_symmetric)
return true;
152 if (test_pattern_symmetry_only &&
A->is_pattern_symmetric)
return true;
154 if (
A->m !=
A->n)
return false;
157 if (!
B)
return false;
165 mask =
gv_calloc((
size_t)m,
sizeof(
int));
166 for (i = 0; i < m; i++) mask[i] = -1;
175 for (i = 0; i <= m; i++)
if (ia[i] != ib[i])
goto RETURN;
176 for (i = 0; i < m; i++){
177 for (j = ia[i]; j < ia[i+1]; j++){
180 for (j = ib[i]; j < ib[i+1]; j++){
181 if (mask[jb[j]] < ia[i])
goto RETURN;
183 for (j = ib[i]; j < ib[i+1]; j++){
193 for (i = 0; i < m; i++){
194 for (j = ia[i]; j < ia[i+1]; j++){
197 for (j = ib[i]; j < ib[i+1]; j++){
198 if (mask[jb[j]] < ia[i])
goto RETURN;
200 for (j = ib[i]; j < ib[i+1]; j++){
201 if (bi[j] != ai[mask[jb[j]]])
goto RETURN;
208 for (i = 0; i < m; i++){
209 for (j = ia[i]; j < ia[i+1]; j++){
212 for (j = ib[i]; j < ib[i+1]; j++){
213 if (mask[jb[j]] < ia[i])
goto RETURN;
222 if (!test_pattern_symmetry_only) {
223 A->is_symmetric =
true;
225 A->is_pattern_symmetric =
true;
247 A->ia =
gv_calloc((
size_t)(m + 1),
sizeof(
int));
268 if (
A->size > 0 && nz > 0) {
352 fprintf(f,
"%%%%MatrixMarket matrix coordinate integer general\n");
355 fprintf(stderr,
"export of non-integer matrices is unsupported\n");
359 fprintf(f,
"%d %d %" PRISIZE_T "\n",
A->m,
A->n,
A->nz);
360 const int *
const ia =
A->ia;
361 const int *
const ja =
A->ja;
362 const int *
const ai =
A->a;
363 for (
int i = 0; i < m; i++) {
364 for (
int j = ia[i]; j < ia[i + 1]; j++) {
365 fprintf(f,
"%d %d %d\n", i + 1, ja[j] + 1, ai[j]);
377 fprintf(stderr,
"exporting coordinate format matrices is not supported\n");
436 assert(m > 0 && n > 0);
438 if (m <=0 || n <= 0)
return NULL;
443 for (
int i = 0; i <= m; i++){
449 const double *
const val = val0;
451 for (
size_t i = 0; i < nz; i++){
452 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
457 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
458 for (
size_t i = 0; i < nz; i++){
459 a[ia[irn[i]]] = val[i];
460 ja[ia[irn[i]]++] = jcn[i];
462 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
467 const int *
const vali = val0;
469 for (
size_t i = 0; i < nz; i++){
470 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
475 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
476 for (
size_t i = 0; i < nz; i++){
477 ai[ia[irn[i]]] = vali[i];
478 ja[ia[irn[i]]++] = jcn[i];
480 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
485 for (
size_t i = 0; i < nz; i++){
486 if (irn[i] < 0 || irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
491 for (
int i = 0; i < m; i++) ia[i+1] += ia[i];
492 for (
size_t i = 0; i < nz; i++){
493 ja[ia[irn[i]]++] = jcn[i];
495 for (
int i = m; i > 0; i--) ia[i] = ia[i - 1];
512 const void *val,
int type,
530 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
535 assert(
A->type ==
B->type);
538 if (m !=
B->m || n !=
B->n)
return NULL;
540 const size_t nzmax =
A->nz +
B->nz;
546 mask =
gv_calloc((
size_t)n,
sizeof(
int));
548 for (
int i = 0; i < n; i++) mask[i] = -1;
557 for (
int i = 0; i < m; i++) {
558 for (j = ia[i]; j < ia[i+1]; j++){
559 mask[ja[j]] = (int)nz;
564 for (j = ib[i]; j < ib[i+1]; j++){
565 if (mask[jb[j]] < ic[i]){
569 c[mask[jb[j]]] += b[j];
580 for (
int i = 0; i < m; i++) {
581 for (j = ia[i]; j < ia[i+1]; j++){
582 mask[ja[j]] = (int)nz;
587 for (j = ib[i]; j < ib[i+1]; j++){
588 if (mask[jb[j]] < ic[i]){
593 c[mask[jb[j]]] += b[j];
601 for (
int i = 0; i < m; i++) {
602 for (j = ia[i]; j < ia[i+1]; j++){
603 mask[ja[j]] = (int)nz;
607 for (j = ib[i]; j < ib[i+1]; j++){
608 if (mask[jb[j]] < ic[i]){
631 int i, j, k, *ia, *ja, m;
642 for (i = 0; i < m; i++){
643 for (k = 0; k <
dim; k++) res[i *
dim + k] = 0;
644 for (j = ia[i]; j < ia[i+1]; j++){
645 for (k = 0; k <
dim; k++) res[i *
dim + k] += a[j] * v[ja[j] *
dim + k];
652 int i, j, *ia, *ja, m;
653 double *a, *u =
NULL;
667 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
668 for (i = 0; i < m; i++){
670 for (j = ia[i]; j < ia[i+1]; j++){
671 u[i] += a[j]*v[ja[j]];
676 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
677 for (i = 0; i < m; i++){
679 for (j = ia[i]; j < ia[i+1]; j++){
688 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
689 for (i = 0; i < m; i++){
691 for (j = ia[i]; j < ia[i+1]; j++){
692 u[i] += ai[j]*v[ja[j]];
697 if (!u) u =
gv_calloc((
size_t)m,
sizeof(
double));
698 for (i = 0; i < m; i++){
700 for (j = ia[i]; j < ia[i+1]; j++){
717 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
723 if (
A->n !=
B->m)
return NULL;
724 if (
A->type !=
B->type){
726 printf(
"in SparseMatrix_multiply, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
732 mask = calloc((
size_t)
B->n,
sizeof(
int));
733 if (!mask)
return NULL;
735 for (
int i = 0; i <
B->n; i++) mask[i] = -1;
738 for (
int i = 0; i < m; i++) {
739 for (j = ia[i]; j < ia[i+1]; j++){
741 for (k = ib[jj]; k < ib[jj+1]; k++){
742 if (mask[jb[k]] != -i - 2){
745 fprintf(stderr,
"overflow in SparseMatrix_multiply !!!\n");
750 mask[jb[k]] = -i - 2;
769 for (
int i = 0; i < m; i++) {
770 for (j = ia[i]; j < ia[i+1]; j++){
772 for (k = ib[jj]; k < ib[jj+1]; k++){
773 if (mask[jb[k]] < ic[i]){
774 mask[jb[k]] = (int)nz;
779 assert(jc[mask[jb[k]]] == jb[k]);
780 c[mask[jb[k]]] += a[j]*b[k];
794 for (
int i = 0; i < m; i++) {
795 for (j = ia[i]; j < ia[i+1]; j++){
797 for (k = ib[jj]; k < ib[jj+1]; k++){
798 if (mask[jb[k]] < ic[i]){
799 mask[jb[k]] = (int)nz;
804 assert(jc[mask[jb[k]]] == jb[k]);
805 c[mask[jb[k]]] += a[j]*b[k];
815 for (
int i = 0; i < m; i++) {
816 for (j = ia[i]; j < ia[i+1]; j++){
818 for (k = ib[jj]; k < ib[jj+1]; k++){
819 if (mask[jb[k]] < ic[i]){
820 mask[jb[k]] = (int)nz;
824 assert(jc[mask[jb[k]]] == jb[k]);
847 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic =
C->ia, *jc =
C->ja, *
id, *jd;
848 int j, k, l, ll, jj,
type;
853 if (
A->n !=
B->m)
return NULL;
854 if (
B->n !=
C->m)
return NULL;
856 if (
A->type !=
B->type ||
B->type !=
C->type){
858 printf(
"in SparseMatrix_multiply3, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
866 mask = calloc((
size_t)
C->n,
sizeof(
int));
867 if (!mask)
return NULL;
869 for (
int i = 0; i <
C->n; i++) mask[i] = -1;
872 for (
int i = 0; i < m; i++){
873 for (j = ia[i]; j < ia[i+1]; j++){
875 for (l = ib[jj]; l < ib[jj+1]; l++){
877 for (k = ic[ll]; k < ic[ll+1]; k++){
878 if (mask[jc[k]] != -i - 2){
881 fprintf(stderr,
"overflow in SparseMatrix_multiply3 !!!\n");
886 mask[jc[k]] = -i - 2;
904 for (
int i = 0; i < m; i++){
905 for (j = ia[i]; j < ia[i+1]; j++){
907 for (l = ib[jj]; l < ib[jj+1]; l++){
909 for (k = ic[ll]; k < ic[ll+1]; k++){
910 if (mask[jc[k]] <
id[i]){
911 mask[jc[k]] = (int)nz;
913 d[nz] = a[j]*b[l]*c[k];
916 assert(jd[mask[jc[k]]] == jc[k]);
917 d[mask[jc[k]]] += a[j]*b[l]*c[k];
933 int *ia =
A->
ia, *ja =
A->ja,
type =
A->type, n =
A->n;
934 int *mask =
NULL, j, sta;
937 mask =
gv_calloc((
size_t)n,
sizeof(
int));
938 for (
int i = 0; i < n; i++) mask[i] = -1;
945 for (
int i = 0; i <
A->m; i++) {
946 for (j = sta; j < ia[i+1]; j++){
947 if (mask[ja[j]] < ia[i]){
950 mask[ja[j]] = (int)nz++;
952 assert(ja[mask[ja[j]]] == ja[j]);
953 a[mask[ja[j]]] += a[j];
965 for (
int i = 0; i <
A->m; i++) {
966 for (j = sta; j < ia[i+1]; j++){
967 if (mask[ja[j]] < ia[i]){
970 mask[ja[j]] = (int)nz++;
972 assert(ja[mask[ja[j]]] == ja[j]);
973 a[mask[ja[j]]] += a[j];
984 for (
int i = 0; i <
A->m; i++) {
985 for (j = sta; j < ia[i+1]; j++){
986 if (mask[ja[j]] < ia[i]){
988 mask[ja[j]] = (int)nz++;
990 assert(ja[mask[ja[j]]] == ja[j]);
1008 int jcn,
const void *val,
1010 static const size_t nentries = 1;
1013 assert(
A->type ==
type &&
"call to SparseMatrix_coordinate_form_add_entry "
1014 "with incompatible value type");
1015 const size_t nz =
A->nz;
1017 if (nz + nentries >=
A->nzmax){
1018 const size_t nzmax = nz + nentries + 10;
1023 if (
A->size) memcpy((
char *)
A->a + nz *
A->size /
sizeof(
char), val,
A->size * nentries);
1024 if (irn >=
A->m)
A->m = irn + 1;
1025 if (jcn >=
A->n)
A->n = jcn + 1;
1032 int i, j, *ia, *ja, sta;
1043 for (i = 0; i <
A->m; i++){
1044 for (j = sta; j < ia[i+1]; j++){
1051 ia[i + 1] = (int)nz;
1058 for (i = 0; i <
A->m; i++){
1059 for (j = sta; j < ia[i+1]; j++){
1066 ia[i + 1] = (int)nz;
1072 for (i = 0; i <
A->m; i++){
1073 for (j = sta; j < ia[i+1]; j++){
1079 ia[i + 1] = (int)nz;
1093 int i, j, *ia, *ja, sta;
1104 for (i = 0; i <
A->m; i++){
1105 for (j = sta; j < ia[i+1]; j++){
1112 ia[i + 1] = (int)nz;
1119 for (i = 0; i <
A->m; i++){
1120 for (j = sta; j < ia[i+1]; j++){
1127 ia[i + 1] = (int)nz;
1133 for (i = 0; i <
A->m; i++){
1134 for (j = sta; j < ia[i+1]; j++){
1140 ia[i + 1] = (int)nz;
1149 A->is_pattern_symmetric =
false;
1150 A->is_symmetric =
false;
1167 for (i = 0; i <
A->m; i++){
1168 deg = ia[i+1] - ia[i];
1169 for (j = ia[i]; j < ia[i+1]; j++){
1196 const size_t nz =
A->
nz;
1202 if (n != m)
return NULL;
1206 memcpy(
B->ia, ia,
sizeof(
int)*((
size_t)(m+1)));
1207 memcpy(
B->ja, ja,
sizeof(
int) * nz);
1215 for (
size_t i = 0; i <
A->nz; i++) a[i] = 1.;
1217 A->size =
sizeof(double);
1229 printf(
"only CSR and real matrix supported.\n");
1236 for (i = 0; i <
A->m; i++){
1237 for (j =
A->ia[i]; j <
A->ia[i+1]; j++){
1248 memcpy(
B->ia,
A->ia,
sizeof(
int)*((
size_t)(
A->m+1)));
1249 if (
A->ia[
A->m] != 0) {
1250 memcpy(
B->ja,
A->ja,
sizeof(
int)*((
size_t)(
A->ia[
A->m])));
1252 if (
A->a) memcpy(
B->a,
A->a,
A->size *
A->nz);
1253 B->is_pattern_symmetric =
A->is_pattern_symmetric;
1254 B->is_symmetric =
A->is_symmetric;
1255 B->is_undirected =
A->is_undirected;
1262 int i, j, m =
A->m, *ia =
A->ia, *ja =
A->ja;
1264 for (i = 0; i < m; i++){
1265 for (j = ia[i]; j < ia[i+1]; j++){
1266 if (i == ja[j])
return true;
1273 int **levelset_ptr,
int **levelset,
1274 int **mask,
bool reinitialize_mask) {
1283 int j, sta = 0, sto = 1, ii;
1284 int m =
A->m, *ia =
A->ia, *ja =
A->ja;
1286 if (!(*levelset_ptr)) *levelset_ptr =
gv_calloc((
size_t)(m + 2),
sizeof(
int));
1287 if (!(*levelset)) *levelset =
gv_calloc((
size_t)m,
sizeof(
int));
1289 *mask =
gv_calloc((
size_t)m,
sizeof(
int));
1290 for (
int i = 0; i < m; i++) (*mask)[i] =
UNMASKED;
1294 assert(root >= 0 && root < m);
1295 (*levelset_ptr)[0] = 0;
1296 (*levelset_ptr)[1] = 1;
1297 (*levelset)[0] = root;
1303 for (
int i = sta; i < sto; i++){
1304 ii = (*levelset)[i];
1305 for (j = ia[ii]; j < ia[ii+1]; j++){
1306 if (ii == ja[j])
continue;
1307 if ((*mask)[ja[j]] < 0){
1308 (*levelset)[nz++] = ja[j];
1309 (*mask)[ja[j]] = *nlevel + 1;
1313 (*levelset_ptr)[++(*nlevel)] = (int)nz;
1318 if (reinitialize_mask)
for (
int i = 0; i < (*levelset_ptr)[*nlevel]; i++) (*mask)[(*levelset)[i]] =
UNMASKED;
1324 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL, nlevel;
1325 int m =
A->m, i, nn;
1330 int *comps_ptr =
gv_calloc((
size_t)(m + 1),
sizeof(
int));
1334 for (i = 0; i < m; i++){
1335 if (i == 0 || mask[i] < 0) {
1337 if (i == 0) *comps = levelset;
1338 nn = levelset_ptr[nlevel];
1340 comps_ptr[(*ncomp)+1] = comps_ptr[(*ncomp)] + nn;
1356 int *ia =
A->ia, *ja =
A->ja, n =
A->n, m =
A->m;
1357 int *super =
NULL, *nsuper =
NULL, j, *mask =
NULL, isup, *newmap, isuper;
1359 super =
gv_calloc((
size_t)n,
sizeof(
int));
1360 nsuper =
gv_calloc((
size_t)(n + 1),
sizeof(
int));
1361 mask =
gv_calloc((
size_t)n,
sizeof(
int));
1362 newmap =
gv_calloc((
size_t)n,
sizeof(
int));
1366 for (
int i = 0; i < n; i++) super[i] = isup;
1368 for (
int i = 0; i < n; i++) mask[i] = -1;
1371 for (
int i = 0; i < m; i++){
1374 printf(
"doing row %d-----\n",i+1);
1376 for (j = ia[i]; j < ia[i+1]; j++){
1377 isuper = super[ja[j]];
1380 for (j = ia[i]; j < ia[i+1]; j++){
1381 isuper = super[ja[j]];
1382 if (mask[isuper] < i){
1384 if (nsuper[isuper] == 0){
1386 printf(
"node %d keep super node id %d\n",ja[j]+1,isuper+1);
1389 newmap[isuper] = isuper;
1391 newmap[isuper] = isup;
1394 printf(
"make node %d into supernode %d\n",ja[j]+1,isup+1);
1396 super[ja[j]] = isup++;
1400 printf(
"node %d join super node %d\n",ja[j]+1,newmap[isuper]+1);
1402 super[ja[j]] = newmap[isuper];
1403 nsuper[newmap[isuper]]++;
1408 for (j = 0; j < isup; j++) printf(
"(%d,%d),",j+1,nsuper[j]);
1413 for (
int i = 0; i < n; i++){
1414 printf(
"node %d is in supernode %d\n",i, super[i]);
1418 fprintf(stderr,
"n = %d, nsup = %d\n",n,isup);
1423 for (
int i = 0; i < isup; i++) nsuper[i+1] += nsuper[i];
1426 for (
int i = 0; i < n; i++) {
1428 (*cluster)[nsuper[isuper]++] = i;
1430 for (
int i = isup; i > 0; i--) nsuper[i] = nsuper[i-1];
1436 for (
int i = 0; i < *ncluster; i++) {
1438 for (j = (*clusterp)[i]; j < (*clusterp)[i+1]; j++){
1439 printf(
"%d, ",(*cluster)[j]);
1456 int m =
A->m, n =
A->n, i, j;
1458 if (!
A)
return NULL;
1465 assert(
A->size != 0 && nz > 0);
1467 memcpy(val,
A->a,
A->size * nz);
1468 memcpy((
char *)val + nz *
A->size,
A->a,
A->size * nz);
1472 for (i = 0; i < m; i++){
1473 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1475 jcn[nz++] = (
A->ja)[j] + m;
1478 for (i = 0; i < m; i++){
1479 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1481 irn[nz++] = (
A->ja)[j] + m;
1486 B->is_symmetric =
true;
1487 B->is_pattern_symmetric =
true;
1496 switch (bipartite_options){
1498 if (
A->m ==
A->n)
return A;
1523 int j, *irn, *jcn, *ia =
A->
ia, *ja =
A->ja, m =
A->m, n =
A->n;
1527 int irow = 0, icol = 0;
1529 if (nrow <= 0 || ncol <= 0)
return NULL;
1533 rmask =
gv_calloc((
size_t)m,
sizeof(
int));
1534 cmask =
gv_calloc((
size_t)n,
sizeof(
int));
1535 for (
int i = 0; i < m; i++) rmask[i] = -1;
1536 for (
int i = 0; i < n; i++) cmask[i] = -1;
1539 for (
int i = 0; i < nrow; i++) {
1540 if (rindices[i] >= 0 && rindices[i] < m){
1541 rmask[rindices[i]] = irow++;
1545 for (
int i = 0; i < nrow; i++) {
1551 for (
int i = 0; i < ncol; i++) {
1552 if (cindices[i] >= 0 && cindices[i] < n){
1553 cmask[cindices[i]] = icol++;
1557 for (
int i = 0; i < ncol; i++) {
1562 for (
int i = 0; i < m; i++) {
1563 if (rmask[i] < 0)
continue;
1564 for (j = ia[i]; j < ia[i+1]; j++){
1565 if (cmask[ja[j]] < 0)
continue;
1580 for (
int i = 0; i < m; i++) {
1581 if (rmask[i] < 0)
continue;
1582 for (j = ia[i]; j < ia[i+1]; j++){
1583 if (cmask[ja[j]] < 0)
continue;
1585 jcn[nz] = cmask[ja[j]];
1601 for (
int i = 0; i < m; i++) {
1602 if (rmask[i] < 0)
continue;
1603 for (j = ia[i]; j < ia[i+1]; j++){
1604 if (cmask[ja[j]] < 0)
continue;
1606 jcn[nz] = cmask[ja[j]];
1618 for (
int i = 0; i < m; i++) {
1619 if (rmask[i] < 0)
continue;
1620 for (j = ia[i]; j < ia[i+1]; j++){
1621 if (cmask[ja[j]] < 0)
continue;
1623 jcn[nz++] = cmask[ja[j]];
1649 for (
size_t i = 0; i <
A->nz; i++) a[i] = 1.;
1651 A->size =
sizeof(double);
1658 int m =
D->
m, n =
D->n;
1659 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL;
1660 int i, j, k, nlevel;
1671 int *
const d =
dist->a;
1672 for (i = 0; i <= n; ++i) {
1673 dist->ia[i] = i * n;
1675 for (i = 0; i < n; ++i) {
1676 for (j = 0; j < n; ++j) {
1677 dist->ja[i * n + j] = j;
1682 for (k = 0; k < n; k++) {
1684 assert(levelset_ptr[nlevel] == n);
1685 for (i = 0; i < nlevel; i++) {
1686 for (j = levelset_ptr[i]; j < levelset_ptr[i+1]; j++) {
1687 d[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)
SparseMatrix SparseMatrix_distance_matrix(SparseMatrix D0)
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)
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)
SparseMatrix SparseMatrix_coordinate_form_add_entry_(SparseMatrix A, int irn, int jcn, const void *val, int type)
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)
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_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)
static double dist(int dim, double *x, double *y)
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]