32 size =
sizeof(double);
59 B->is_undirected =
true;
65 int *ia =
A->ia, *ja =
A->ja, *ib, *jb, n =
A->n,
type =
A->type,
format =
A->format;
66 const size_t m =
A->m;
67 const size_t nz =
A->nz;
78 for (
int i = 0; i <= n; i++) ib[i] = 0;
79 for (
size_t i = 0; i < m; i++){
80 for (j = ia[i]; j < ia[i+1]; j++){
85 for (
int i = 0; i < n; i++) ib[i+1] += ib[i];
91 for (
size_t i = 0; i < m; i++){
92 for (j = ia[i]; j < ia[i+1]; j++){
93 jb[ib[ja[j]]] = (int)i;
94 b[ib[ja[j]]++] = a[j];
102 for (
size_t i = 0; i < m; i++){
103 for (j = ia[i]; j < ia[i+1]; j++){
104 jb[ib[ja[j]]] = (int)i;
105 bi[ib[ja[j]]++] = ai[j];
111 for (
size_t i = 0; i < m; i++){
112 for (j = ia[i]; j < ia[i+1]; j++){
113 jb[ib[ja[j]]++] = (int)i;
122 for (
int i = n-1; i >= 0; i--) ib[i+1] = ib[i];
130 bool pattern_symmetric_only) {
137 A->is_symmetric =
true;
138 A->is_pattern_symmetric =
true;
143 if (!
A)
return false;
147 int *ia, *ja, *ib, *jb,
type;
153 if (
A->is_symmetric)
return true;
154 if (test_pattern_symmetry_only &&
A->is_pattern_symmetric)
return true;
156 if (
A->m != (
size_t)
A->n)
return false;
159 if (!
B)
return false;
165 const size_t m =
A->m;
168 for (
size_t i = 0; i < m; i++) mask[i] = -1;
177 for (
size_t i = 0; i <= m; i++)
if (ia[i] != ib[i])
goto RETURN;
178 for (
size_t i = 0; i < m; i++){
179 for (j = ia[i]; j < ia[i+1]; j++){
182 for (j = ib[i]; j < ib[i+1]; j++){
183 if (mask[jb[j]] < ia[i])
goto RETURN;
185 for (j = ib[i]; j < ib[i+1]; j++){
195 for (
size_t i = 0; i < m; i++){
196 for (j = ia[i]; j < ia[i+1]; j++){
199 for (j = ib[i]; j < ib[i+1]; j++){
200 if (mask[jb[j]] < ia[i])
goto RETURN;
202 for (j = ib[i]; j < ib[i+1]; j++){
203 if (bi[j] != ai[mask[jb[j]]])
goto RETURN;
210 for (
size_t 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;
224 if (!test_pattern_symmetry_only) {
225 A->is_symmetric =
true;
227 A->is_pattern_symmetric =
true;
270 if (
A->size > 0 && nz > 0) {
343 const size_t m =
A->m;
347 fprintf(f,
"%%%%MatrixMarket matrix coordinate integer general\n");
350 fprintf(stderr,
"export of non-integer matrices is unsupported\n");
355 const int *
const ia =
A->ia;
356 const int *
const ja =
A->ja;
357 const int *
const ai =
A->a;
358 for (
size_t i = 0; i < m; i++) {
359 for (
int j = ia[i]; j < ia[i + 1]; j++) {
360 fprintf(f,
"%" PRISIZE_T " %d %d\n", i + 1, ja[j] + 1, ai[j]);
372 fprintf(stderr,
"exporting coordinate format matrices is not supported\n");
428 assert(m > 0 && n > 0);
430 if (m ==0 || n <= 0)
return NULL;
435 for (
size_t i = 0; i <= m; i++){
441 const double *
const val = val0;
443 for (
size_t i = 0; i < nz; i++){
444 if (irn[i] < 0 || (
size_t)irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
449 for (
size_t i = 0; i < m; i++) ia[i+1] += ia[i];
450 for (
size_t i = 0; i < nz; i++){
451 a[ia[irn[i]]] = val[i];
452 ja[ia[irn[i]]++] = jcn[i];
454 for (
size_t i = m; i > 0; i--) ia[i] = ia[i - 1];
459 const int *
const vali = val0;
461 for (
size_t i = 0; i < nz; i++){
462 if (irn[i] < 0 || (
size_t)irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
467 for (
size_t i = 0; i < m; i++) ia[i+1] += ia[i];
468 for (
size_t i = 0; i < nz; i++){
469 ai[ia[irn[i]]] = vali[i];
470 ja[ia[irn[i]]++] = jcn[i];
472 for (
size_t i = m; i > 0; i--) ia[i] = ia[i - 1];
477 for (
size_t i = 0; i < nz; i++){
478 if (irn[i] < 0 || (
size_t)irn[i] >= m || jcn[i] < 0 || jcn[i] >= n) {
483 for (
size_t i = 0; i < m; i++) ia[i+1] += ia[i];
484 for (
size_t i = 0; i < nz; i++){
485 ja[ia[irn[i]]++] = jcn[i];
487 for (
size_t i = m; i > 0; i--) ia[i] = ia[i - 1];
504 const void *val,
int type,
522 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
527 assert(
A->type ==
B->type);
528 const size_t m =
A->m;
530 if (m !=
B->m || n !=
B->n)
return NULL;
532 const size_t nzmax =
A->nz +
B->nz;
538 mask =
gv_calloc((
size_t)n,
sizeof(
int));
540 for (
int i = 0; i < n; i++) mask[i] = -1;
549 for (
size_t i = 0; i < m; i++) {
550 for (j = ia[i]; j < ia[i+1]; j++){
551 mask[ja[j]] = (int)nz;
556 for (j = ib[i]; j < ib[i+1]; j++){
557 if (mask[jb[j]] < ic[i]){
561 c[mask[jb[j]]] += b[j];
572 for (
size_t i = 0; i < m; i++) {
573 for (j = ia[i]; j < ia[i+1]; j++){
574 mask[ja[j]] = (int)nz;
579 for (j = ib[i]; j < ib[i+1]; j++){
580 if (mask[jb[j]] < ic[i]){
585 c[mask[jb[j]]] += b[j];
593 for (
size_t i = 0; i < m; i++) {
594 for (j = ia[i]; j < ia[i+1]; j++){
595 mask[ja[j]] = (int)nz;
599 for (j = ib[i]; j < ib[i+1]; j++){
600 if (mask[jb[j]] < ic[i]){
632 const size_t m =
A->m;
634 for (
size_t i = 0; i < m; i++){
635 for (k = 0; k <
dim; k++) res[(
int)i *
dim + k] = 0;
636 for (j = ia[i]; j < ia[i+1]; j++){
637 for (k = 0; k <
dim; k++) res[(
int)i *
dim + k] += a[j] * v[ja[j] *
dim + k];
645 double *a, *u =
NULL;
652 const size_t m =
A->m;
659 if (!u) u =
gv_calloc(m,
sizeof(
double));
660 for (
size_t i = 0; i < m; i++){
662 for (j = ia[i]; j < ia[i+1]; j++){
663 u[i] += a[j]*v[ja[j]];
670 if (!u) u =
gv_calloc(m,
sizeof(
double));
671 for (
size_t i = 0; i < m; i++){
673 for (j = ia[i]; j < ia[i+1]; j++){
674 u[i] += ai[j]*v[ja[j]];
688 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic, *jc;
693 const size_t m =
A->m;
694 if ((
size_t)
A->n !=
B->m)
return NULL;
695 if (
A->type !=
B->type){
697 printf(
"in SparseMatrix_multiply, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
704 mask = calloc((
size_t)
B->n,
sizeof(
int));
705 if (!mask)
return NULL;
707 for (
int i = 0; i <
B->n; i++) mask[i] = -1;
710 for (
size_t i = 0; i < m; i++) {
711 for (j = ia[i]; j < ia[i+1]; j++){
713 for (k = ib[jj]; k < ib[jj+1]; k++){
714 if (mask[jb[k]] != -(
int)i - 2){
717 fprintf(stderr,
"overflow in SparseMatrix_multiply !!!\n");
722 mask[jb[k]] = -(int)i - 2;
738 for (
size_t 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]] < ic[i]){
743 mask[jb[k]] = (int)nz;
748 assert(jc[mask[jb[k]]] == jb[k]);
749 c[mask[jb[k]]] += a[j]*b[k];
767 int *ia =
A->ia, *ja =
A->ja, *ib =
B->ia, *jb =
B->ja, *ic =
C->ia, *jc =
C->ja, *
id, *jd;
768 int j, k, l, ll, jj,
type;
772 const size_t m =
A->m;
773 if ((
size_t)
A->n !=
B->m)
return NULL;
774 if ((
size_t)
B->n !=
C->m)
return NULL;
776 if (
A->type !=
B->type ||
B->type !=
C->type){
778 printf(
"in SparseMatrix_multiply3, the matrix types do not match, right now only multiplication of matrices of the same type is supported\n");
786 mask = calloc((
size_t)
C->n,
sizeof(
int));
787 if (!mask)
return NULL;
789 for (
int i = 0; i <
C->n; i++) mask[i] = -1;
792 for (
size_t i = 0; i < m; i++){
793 for (j = ia[i]; j < ia[i+1]; j++){
795 for (l = ib[jj]; l < ib[jj+1]; l++){
797 for (k = ic[ll]; k < ic[ll+1]; k++){
798 if (mask[jc[k]] != -(
int)i - 2){
801 fprintf(stderr,
"overflow in SparseMatrix_multiply3 !!!\n");
806 mask[jc[k]] = -(int)i - 2;
824 for (
size_t i = 0; i < m; i++){
825 for (j = ia[i]; j < ia[i+1]; j++){
827 for (l = ib[jj]; l < ib[jj+1]; l++){
829 for (k = ic[ll]; k < ic[ll+1]; k++){
830 if (mask[jc[k]] <
id[i]){
831 mask[jc[k]] = (int)nz;
833 d[nz] = a[j]*b[l]*c[k];
836 assert(jd[mask[jc[k]]] == jc[k]);
837 d[mask[jc[k]]] += a[j]*b[l]*c[k];
853 int *ia =
A->
ia, *ja =
A->ja,
type =
A->type, n =
A->n;
854 int *mask =
NULL, j, sta;
857 mask =
gv_calloc((
size_t)n,
sizeof(
int));
858 for (
int i = 0; i < n; i++) mask[i] = -1;
865 for (
size_t i = 0; i <
A->m; i++) {
866 for (j = sta; j < ia[i+1]; j++){
867 if (mask[ja[j]] < ia[i]){
870 mask[ja[j]] = (int)nz++;
872 assert(ja[mask[ja[j]]] == ja[j]);
873 a[mask[ja[j]]] += a[j];
885 for (
size_t i = 0; i <
A->m; i++) {
886 for (j = sta; j < ia[i+1]; j++){
887 if (mask[ja[j]] < ia[i]){
890 mask[ja[j]] = (int)nz++;
892 assert(ja[mask[ja[j]]] == ja[j]);
893 a[mask[ja[j]]] += a[j];
904 for (
size_t i = 0; i <
A->m; i++) {
905 for (j = sta; j < ia[i+1]; j++){
906 if (mask[ja[j]] < ia[i]){
908 mask[ja[j]] = (int)nz++;
910 assert(ja[mask[ja[j]]] == ja[j]);
928 int jcn,
const void *val,
930 static const size_t nentries = 1;
933 assert(
A->type ==
type &&
"call to SparseMatrix_coordinate_form_add_entry "
934 "with incompatible value type");
935 const size_t nz =
A->nz;
937 if (nz + nentries >=
A->nzmax){
938 const size_t nzmax = nz + nentries + 10;
943 if (
A->size) memcpy((
char *)
A->a + nz *
A->size /
sizeof(
char), val,
A->size * nentries);
944 if (irn >= (
int)
A->m)
A->m = (size_t)irn + 1;
945 if (jcn >=
A->n)
A->n = jcn + 1;
952 int j, *ia, *ja, sta;
963 for (
size_t i = 0; i <
A->m; i++){
964 for (j = sta; j < ia[i+1]; j++){
965 if (ja[j] != (
int)i){
978 for (
size_t i = 0; i <
A->m; i++){
979 for (j = sta; j < ia[i+1]; j++){
980 if (ja[j] != (
int)i){
992 for (
size_t i = 0; i <
A->m; i++){
993 for (j = sta; j < ia[i+1]; j++){
994 if (ja[j] != (
int)i){
1013 int j, *ia, *ja, sta;
1024 for (
size_t i = 0; i <
A->m; i++){
1025 for (j = sta; j < ia[i+1]; j++){
1026 if (ja[j] < (
int)i){
1032 ia[i + 1] = (int)nz;
1039 for (
size_t i = 0; i <
A->m; i++){
1040 for (j = sta; j < ia[i+1]; j++){
1041 if (ja[j] < (
int)i){
1047 ia[i + 1] = (int)nz;
1053 for (
size_t i = 0; i <
A->m; i++){
1054 for (j = sta; j < ia[i+1]; j++){
1055 if (ja[j] < (
int)i){
1060 ia[i + 1] = (int)nz;
1069 A->is_pattern_symmetric =
false;
1070 A->is_symmetric =
false;
1087 for (
size_t i = 0; i <
A->m; i++){
1088 deg = ia[i+1] - ia[i];
1089 for (j = ia[i]; j < ia[i+1]; j++){
1116 const size_t nz =
A->
nz;
1120 const size_t m =
A->m;
1122 if ((
size_t)n != m)
return NULL;
1126 memcpy(
B->ia, ia,
sizeof(
int) * (m + 1));
1127 memcpy(
B->ja, ja,
sizeof(
int) * nz);
1135 for (
size_t i = 0; i <
A->nz; i++) a[i] = 1.;
1137 A->size =
sizeof(double);
1149 printf(
"only CSR and real matrix supported.\n");
1156 for (
size_t i = 0; i <
A->m; i++){
1157 for (j =
A->ia[i]; j <
A->ia[i+1]; j++){
1168 memcpy(
B->ia,
A->ia,
sizeof(
int) * (
A->m + 1));
1169 if (
A->ia[
A->m] != 0) {
1170 memcpy(
B->ja,
A->ja,
sizeof(
int)*((
size_t)(
A->ia[
A->m])));
1172 if (
A->a) memcpy(
B->a,
A->a,
A->size *
A->nz);
1173 B->is_pattern_symmetric =
A->is_pattern_symmetric;
1174 B->is_symmetric =
A->is_symmetric;
1175 B->is_undirected =
A->is_undirected;
1182 int j, *ia =
A->ia, *ja =
A->ja;
1184 for (
size_t i = 0; i <
A->m; i++){
1185 for (j = ia[i]; j < ia[i+1]; j++){
1186 if ((
int)i == ja[j])
return true;
1193 int **levelset_ptr,
int **levelset,
1194 int **mask,
bool reinitialize_mask) {
1203 int j, sta = 0, sto = 1, ii;
1204 int *ia =
A->ia, *ja =
A->ja;
1205 const size_t m =
A->m;
1207 if (!(*levelset_ptr)) *levelset_ptr =
gv_calloc(m + 2,
sizeof(
int));
1208 if (!(*levelset)) *levelset =
gv_calloc(m,
sizeof(
int));
1211 for (
size_t i = 0; i < m; i++) (*mask)[i] =
UNMASKED;
1215 assert(root >= 0 && (
size_t)root < m);
1216 (*levelset_ptr)[0] = 0;
1217 (*levelset_ptr)[1] = 1;
1218 (*levelset)[0] = root;
1224 for (
int i = sta; i < sto; i++){
1225 ii = (*levelset)[i];
1226 for (j = ia[ii]; j < ia[ii+1]; j++){
1227 if (ii == ja[j])
continue;
1228 if ((*mask)[ja[j]] < 0){
1229 (*levelset)[nz++] = ja[j];
1230 (*mask)[ja[j]] = *nlevel + 1;
1234 (*levelset_ptr)[++(*nlevel)] = (int)nz;
1239 if (reinitialize_mask)
for (
int i = 0; i < (*levelset_ptr)[*nlevel]; i++) (*mask)[(*levelset)[i]] =
UNMASKED;
1245 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL, nlevel;
1247 const size_t m =
A->m;
1252 int *comps_ptr =
gv_calloc(m + 1,
sizeof(
int));
1256 for (
size_t i = 0; i < m; i++){
1257 if (i == 0 || mask[i] < 0) {
1259 if (i == 0) *comps = levelset;
1260 nn = levelset_ptr[nlevel];
1262 comps_ptr[(*ncomp)+1] = comps_ptr[(*ncomp)] + nn;
1278 int *ia =
A->ia, *ja =
A->ja, n =
A->n;
1279 const size_t m =
A->m;
1280 int *super =
NULL, *nsuper =
NULL, j, isup, *newmap, isuper;
1282 super =
gv_calloc((
size_t)n,
sizeof(
int));
1283 nsuper =
gv_calloc((
size_t)(n + 1),
sizeof(
int));
1284 size_t *
const mask =
gv_calloc((
size_t)n,
sizeof(
size_t));
1285 newmap =
gv_calloc((
size_t)n,
sizeof(
int));
1289 for (
int i = 0; i < n; i++) super[i] = isup;
1291 for (
int i = 0; i < n; i++) mask[i] =
SIZE_MAX;
1294 for (
size_t i = 0; i < m; i++){
1297 printf(
"doing row %" PRISIZE_T "-----\n", i + 1);
1299 for (j = ia[i]; j < ia[i+1]; j++){
1300 isuper = super[ja[j]];
1303 for (j = ia[i]; j < ia[i+1]; j++){
1304 isuper = super[ja[j]];
1305 if (mask[isuper] ==
SIZE_MAX || mask[isuper] < i){
1307 if (nsuper[isuper] == 0){
1309 printf(
"node %d keep super node id %d\n",ja[j]+1,isuper+1);
1312 newmap[isuper] = isuper;
1314 newmap[isuper] = isup;
1317 printf(
"make node %d into supernode %d\n",ja[j]+1,isup+1);
1319 super[ja[j]] = isup++;
1323 printf(
"node %d join super node %d\n",ja[j]+1,newmap[isuper]+1);
1325 super[ja[j]] = newmap[isuper];
1326 nsuper[newmap[isuper]]++;
1331 for (j = 0; j < isup; j++) printf(
"(%d,%d),",j+1,nsuper[j]);
1336 for (
int i = 0; i < n; i++){
1337 printf(
"node %d is in supernode %d\n",i, super[i]);
1341 fprintf(stderr,
"n = %d, nsup = %d\n",n,isup);
1346 for (
int i = 0; i < isup; i++) nsuper[i+1] += nsuper[i];
1349 for (
int i = 0; i < n; i++) {
1351 (*cluster)[nsuper[isuper]++] = i;
1353 for (
int i = isup; i > 0; i--) nsuper[i] = nsuper[i-1];
1359 for (
int i = 0; i < *ncluster; i++) {
1361 for (j = (*clusterp)[i]; j < (*clusterp)[i+1]; j++){
1362 printf(
"%d, ",(*cluster)[j]);
1380 const size_t m =
A->m;
1382 if (!
A)
return NULL;
1389 assert(
A->size != 0 && nz > 0);
1391 memcpy(val,
A->a,
A->size * nz);
1392 memcpy((
char *)val + nz *
A->size,
A->a,
A->size * nz);
1396 for (
size_t i = 0; i < m; i++){
1397 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1399 jcn[nz++] = (
A->ja)[j] + (
int)m;
1402 for (
size_t i = 0; i < m; i++){
1403 for (j = (
A->ia)[i]; j < (
A->ia)[i+1]; j++){
1405 irn[nz++] = (
A->ja)[j] + (
int)m;
1410 B->is_symmetric =
true;
1411 B->is_pattern_symmetric =
true;
1420 switch (bipartite_options){
1422 if (
A->m == (
size_t)
A->n)
return A;
1447 int j, *irn, *jcn, *ia =
A->
ia, *ja =
A->ja, n =
A->n;
1448 const size_t m =
A->m;
1452 int irow = 0, icol = 0;
1454 if (nrow <= 0 || ncol <= 0)
return NULL;
1459 cmask =
gv_calloc((
size_t)n,
sizeof(
int));
1460 for (
size_t i = 0; i < m; i++) rmask[i] = -1;
1461 for (
int i = 0; i < n; i++) cmask[i] = -1;
1464 for (
int i = 0; i < nrow; i++) {
1465 if (rindices[i] >= 0 && (
size_t)rindices[i] < m){
1466 rmask[rindices[i]] = irow++;
1470 for (
int i = 0; i < nrow; i++) {
1476 for (
int i = 0; i < ncol; i++) {
1477 if (cindices[i] >= 0 && cindices[i] < n){
1478 cmask[cindices[i]] = icol++;
1482 for (
int i = 0; i < ncol; i++) {
1487 for (
size_t i = 0; i < m; i++) {
1488 if (rmask[i] < 0)
continue;
1489 for (j = ia[i]; j < ia[i+1]; j++){
1490 if (cmask[ja[j]] < 0)
continue;
1505 for (
size_t i = 0; i < m; i++) {
1506 if (rmask[i] < 0)
continue;
1507 for (j = ia[i]; j < ia[i+1]; j++){
1508 if (cmask[ja[j]] < 0)
continue;
1510 jcn[nz] = cmask[ja[j]];
1526 for (
size_t i = 0; i < m; i++) {
1527 if (rmask[i] < 0)
continue;
1528 for (j = ia[i]; j < ia[i+1]; j++){
1529 if (cmask[ja[j]] < 0)
continue;
1531 jcn[nz] = cmask[ja[j]];
1543 for (
size_t i = 0; i < m; i++) {
1544 if (rmask[i] < 0)
continue;
1545 for (j = ia[i]; j < ia[i+1]; j++){
1546 if (cmask[ja[j]] < 0)
continue;
1548 jcn[nz++] = cmask[ja[j]];
1570 const size_t m =
D->
m;
1572 int *levelset_ptr =
NULL, *levelset =
NULL, *mask =
NULL;
1573 int i, j, k, nlevel;
1579 assert(m == (
size_t)n);
1584 int *
const d =
dist->a;
1585 for (i = 0; i <= n; ++i) {
1586 dist->ia[i] = i * n;
1588 for (i = 0; i < n; ++i) {
1589 for (j = 0; j < n; ++j) {
1590 dist->ja[i * n + j] = j;
1595 for (k = 0; k < n; k++) {
1597 assert(levelset_ptr[nlevel] == n);
1598 for (i = 0; i < nlevel; i++) {
1599 for (j = levelset_ptr[i]; j < levelset_ptr[i+1]; j++) {
1600 d[k * n + levelset[j]] = i;
SparseMatrix SparseMatrix_new(size_t m, int n, size_t nz, int type, int format)
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)
int * SparseMatrix_weakly_connected_components(SparseMatrix A0, size_t *ncomp, int **comps)
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_from_coordinate_arrays_not_compacted(size_t nz, size_t m, int n, int *irn, int *jcn, void *val0, int type, size_t sz)
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)
static SparseMatrix SparseMatrix_from_coordinate_arrays_internal(size_t nz, size_t 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_from_coordinate_arrays(size_t nz, size_t m, int n, int *irn, int *jcn, const void *val, int type, size_t sz)
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)
void SparseMatrix_delete(SparseMatrix A)
SparseMatrix SparseMatrix_coordinate_form_add_entry_(SparseMatrix A, int irn, int jcn, const void *val, UNUSED int type)
SparseMatrix SparseMatrix_make_undirected(SparseMatrix A)
SparseMatrix SparseMatrix_copy(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)
static SparseMatrix SparseMatrix_general_new(size_t m, int n, size_t nz, int type, size_t sz, int format)
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)
SparseMatrix SparseMatrix_from_coordinate_format_not_compacted(SparseMatrix A)
SparseMatrix SparseMatrix_remove_diagonal(SparseMatrix A)
static SparseMatrix SparseMatrix_init(size_t m, int n, int type, size_t sz, 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]
abstraction for squashing compiler warnings for unused symbols