+/* $Id$Revision: */
+/* vim:set shiftwidth=4 ts=8: */
+
+/**********************************************************
+* This software is part of the graphviz package *
+* http://www.graphviz.org/ *
+* *
+* Copyright (c) 1994-2004 AT&T Corp. *
+* and is licensed under the *
+* Common Public License, Version 1.0 *
+* by AT&T Corp. *
+* *
+* Information and Software Systems Research *
+* AT&T Research, Florham Park NJ *
+**********************************************************/
#include "SparseMatrix.h"
#include "mmio.h"
#include "matrix_market.h"
+#include "render.h"
#define MALLOC gmalloc
#define REALLOC grealloc
#define FREE free
#define MEMCPY memcpy
-int mm_get_type(MM_typecode typecode){
- if (mm_is_complex(typecode)){
- return MATRIX_TYPE_COMPLEX;
- } else if (mm_is_real(typecode)) {
- return MATRIX_TYPE_REAL;
- } else if (mm_is_integer(typecode)) {
- return MATRIX_TYPE_INTEGER;
- } else if (mm_is_pattern(typecode)){
- return MATRIX_TYPE_PATTERN;
- }
- return MATRIX_TYPE_UNKNOWN;
+int mm_get_type(MM_typecode typecode)
+{
+ if (mm_is_complex(typecode)) {
+ return MATRIX_TYPE_COMPLEX;
+ } else if (mm_is_real(typecode)) {
+ return MATRIX_TYPE_REAL;
+ } else if (mm_is_integer(typecode)) {
+ return MATRIX_TYPE_INTEGER;
+ } else if (mm_is_pattern(typecode)) {
+ return MATRIX_TYPE_PATTERN;
+ }
+ return MATRIX_TYPE_UNKNOWN;
}
-static void set_mm_typecode(int type, MM_typecode *typecode){
- switch (type){
- case MATRIX_TYPE_COMPLEX:
- mm_set_complex(typecode);
- break;
- case MATRIX_TYPE_REAL:
- mm_set_real(typecode);
- break;
- case MATRIX_TYPE_INTEGER:
- mm_set_integer(typecode);
- break;
- case MATRIX_TYPE_PATTERN:
- mm_set_pattern(typecode);
- break;
- default:
- break;
- }
+static void set_mm_typecode(int type, MM_typecode * typecode)
+{
+ switch (type) {
+ case MATRIX_TYPE_COMPLEX:
+ mm_set_complex(typecode);
+ break;
+ case MATRIX_TYPE_REAL:
+ mm_set_real(typecode);
+ break;
+ case MATRIX_TYPE_INTEGER:
+ mm_set_integer(typecode);
+ break;
+ case MATRIX_TYPE_PATTERN:
+ mm_set_pattern(typecode);
+ break;
+ default:
+ break;
+ }
}
-SparseMatrix SparseMatrix_import_matrix_market(FILE *f, int format){
- int ret_code, type;
- MM_typecode matcode;
- real *val = NULL, *v;
- int *vali = NULL, i, m, n, *I = NULL, *J = NULL, nz;
- void *vp = NULL;
- SparseMatrix A = NULL;
- int nzold;
- int c;
+SparseMatrix SparseMatrix_import_matrix_market(FILE * f, int format)
+{
+ int ret_code, type;
+ MM_typecode matcode;
+ real *val = NULL, *v;
+ int *vali = NULL, i, m, n, *I = NULL, *J = NULL, nz;
+ void *vp = NULL;
+ SparseMatrix A = NULL;
+ int nzold;
+ int c;
- if ((c=fgetc(f)) != '%'){
+ if ((c = fgetc(f)) != '%') {
+ ungetc(c, f);
+ return NULL;
+ }
ungetc(c, f);
- return NULL;
- }
- ungetc(c, f);
- if (mm_read_banner(f, &matcode) != 0) {
+ if (mm_read_banner(f, &matcode) != 0) {
#ifdef DEBUG
- printf("Could not process Matrix Market banner.\n");
+ printf("Could not process Matrix Market banner.\n");
#endif
- return NULL;
- }
-
-
- /* This is how one can screen matrix types if their application */
- /* only supports a subset of the Matrix Market data types. */
-
- if (!mm_is_matrix(matcode) ||
- !mm_is_sparse(matcode) ){
- assert(0);
- /*
- printf("Sorry, this application does not support dense matrix");
- printf("Market Market type: [%s]\n", mm_typecode_to_str(matcode));
- */
- return NULL;
- }
-
- /* find out size of sparse matrix .... */
- if ((ret_code = mm_read_mtx_crd_size(f, &m, &n, &nz)) !=0){
- assert(0);
- return NULL;
- }
- /* reseve memory for matrices */
-
- I = MALLOC(nz * sizeof(int));
- J = MALLOC(nz * sizeof(int));
-
-
+ return NULL;
+ }
- switch (format){
- case FORMAT_CSC:
- assert(0);/* not supported yet */
- break;
- case FORMAT_CSR:
- case FORMAT_COORD:
- /* NOTE: when reading in doubles, ANSI C requires the use of the "l" */
- /* specifier as in "%lg", "%lf", "%le", otherwise errors will occur */
- /* (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15) */
- type = mm_get_type(matcode);
- switch (type) {
- case MATRIX_TYPE_REAL:
- val = (real *) malloc(nz * sizeof(real));
- for (i=0; i<nz; i++) {
- fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]);
- I[i]--; /* adjust from 1-based to 0-based */
- J[i]--;
- }
- if (mm_is_symmetric(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- val = REALLOC(val, 2*sizeof(real)*nz);
- nzold = nz;
- for (i = 0; i < nzold; i++){
- if (I[i] != J[i]) {
- I[nz] = J[i];
- J[nz] = I[i];
- val[nz++] = val[i];
- }
- }
- } else if (mm_is_skew(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- val = REALLOC(val, 2*sizeof(real)*nz);
- vp = (void*) val;
- nzold = nz;
- for (i = 0; i < nzold; i++){
- assert(I[i] != J[i]);/* skew symm has no diag */
- I[nz] = J[i];
- J[nz] = I[i];
- val[nz++] = -val[i];
- }
- } else {
- assert(!mm_is_hermitian(matcode));
- }
- vp = (void*) val;
- break;
- case MATRIX_TYPE_INTEGER:
- vali = (int *) malloc(nz * sizeof(int));
- for (i=0; i<nz; i++) {
- fscanf(f, "%d %d %d\n", &I[i], &J[i], &vali[i]);
- I[i]--; /* adjust from 1-based to 0-based */
- J[i]--;
- }
- if (mm_is_symmetric(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- vali = REALLOC(vali, 2*sizeof(int)*nz);
- nzold = nz;
- for (i = 0; i < nzold; i++){
- if (I[i] != J[i]) {
- I[nz] = J[i];
- J[nz] = I[i];
- vali[nz++] = vali[i];
- }
- }
- } else if (mm_is_skew(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- vali = REALLOC(vali, 2*sizeof(int)*nz);
- vp = (void*) val;
- nzold = nz;
- for (i = 0; i < nzold; i++){
- assert(I[i] != J[i]);/* skew symm has no diag */
- I[nz] = J[i];
- J[nz] = I[i];
- vali[nz++] = -vali[i];
- }
- } else {
- assert(!mm_is_hermitian(matcode));
- }
- vp = (void*) vali;
- break;
- case MATRIX_TYPE_PATTERN:
- for (i=0; i<nz; i++) {
- fscanf(f, "%d %d\n", &I[i], &J[i]);
- I[i]--; /* adjust from 1-based to 0-based */
- J[i]--;
- }
- if (mm_is_symmetric(matcode) || mm_is_skew(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- nzold = nz;
- for (i = 0; i < nzold; i++){
- if (I[i] != J[i]) {
- I[nz] = J[i];
- J[nz++] = I[i];
- }
- }
- } else {
- assert(!mm_is_hermitian(matcode));
- }
- break;
- case MATRIX_TYPE_COMPLEX:
- val = (real *) malloc(2* nz * sizeof(real));
- v = val;
- for (i=0; i<nz; i++) {
- fscanf(f, "%d %d %lg %lg\n", &I[i], &J[i], &v[0], &v[1]);
- v +=2;
- I[i]--; /* adjust from 1-based to 0-based */
- J[i]--;
- }
- if (mm_is_symmetric(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- val = REALLOC(val, 4*sizeof(real)*nz);
- nzold = nz;
- for (i = 0; i < nzold; i++){
- if (I[i] != J[i]) {
- I[nz] = J[i];
- J[nz] = I[i];
- val[2*nz] = val[2*i];
- val[2*nz+1] = val[2*i+1];
- nz++;
- }
- }
- } else if (mm_is_skew(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- val = REALLOC(val, 4*sizeof(real)*nz);
- vp = (void*) val;
- nzold = nz;
- for (i = 0; i < nzold; i++){
- assert(I[i] != J[i]);/* skew symm has no diag */
- I[nz] = J[i];
- J[nz] = I[i];
- val[2*nz] = -val[2*i];
- val[2*nz+1] = -val[2*i+1];
- nz++;
+ /* This is how one can screen matrix types if their application */
+ /* only supports a subset of the Matrix Market data types. */
+
+ if (!mm_is_matrix(matcode) || !mm_is_sparse(matcode)) {
+ assert(0);
+ /*
+ printf("Sorry, this application does not support dense matrix");
+ printf("Market Market type: [%s]\n", mm_typecode_to_str(matcode));
+ */
+ return NULL;
+ }
+
+ /* find out size of sparse matrix .... */
+ if ((ret_code = mm_read_mtx_crd_size(f, &m, &n, &nz)) != 0) {
+ assert(0);
+ return NULL;
+ }
+ /* reseve memory for matrices */
+ I = MALLOC(nz * sizeof(int));
+ J = MALLOC(nz * sizeof(int));
+
+
+
+ switch (format) {
+ case FORMAT_CSC:
+ assert(0); /* not supported yet */
+ break;
+ case FORMAT_CSR:
+ case FORMAT_COORD:
+
+ /* NOTE: when reading in doubles, ANSI C requires the use of the "l" */
+ /* specifier as in "%lg", "%lf", "%le", otherwise errors will occur */
+ /* (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15) */
+ type = mm_get_type(matcode);
+ switch (type) {
+ case MATRIX_TYPE_REAL:
+ val = (real *) malloc(nz * sizeof(real));
+ for (i = 0; i < nz; i++) {
+ fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]);
+ I[i]--; /* adjust from 1-based to 0-based */
+ J[i]--;
+ }
+ if (mm_is_symmetric(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ val = REALLOC(val, 2 * sizeof(real) * nz);
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ if (I[i] != J[i]) {
+ I[nz] = J[i];
+ J[nz] = I[i];
+ val[nz++] = val[i];
+ }
+ }
+ } else if (mm_is_skew(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ val = REALLOC(val, 2 * sizeof(real) * nz);
+ vp = (void *) val;
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ assert(I[i] != J[i]); /* skew symm has no diag */
+ I[nz] = J[i];
+ J[nz] = I[i];
+ val[nz++] = -val[i];
+ }
+ } else {
+ assert(!mm_is_hermitian(matcode));
+ }
+ vp = (void *) val;
+ break;
+ case MATRIX_TYPE_INTEGER:
+ vali = (int *) malloc(nz * sizeof(int));
+ for (i = 0; i < nz; i++) {
+ fscanf(f, "%d %d %d\n", &I[i], &J[i], &vali[i]);
+ I[i]--; /* adjust from 1-based to 0-based */
+ J[i]--;
+ }
+ if (mm_is_symmetric(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ vali = REALLOC(vali, 2 * sizeof(int) * nz);
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ if (I[i] != J[i]) {
+ I[nz] = J[i];
+ J[nz] = I[i];
+ vali[nz++] = vali[i];
+ }
+ }
+ } else if (mm_is_skew(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ vali = REALLOC(vali, 2 * sizeof(int) * nz);
+ vp = (void *) val;
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ assert(I[i] != J[i]); /* skew symm has no diag */
+ I[nz] = J[i];
+ J[nz] = I[i];
+ vali[nz++] = -vali[i];
+ }
+ } else {
+ assert(!mm_is_hermitian(matcode));
+ }
+ vp = (void *) vali;
+ break;
+ case MATRIX_TYPE_PATTERN:
+ for (i = 0; i < nz; i++) {
+ fscanf(f, "%d %d\n", &I[i], &J[i]);
+ I[i]--; /* adjust from 1-based to 0-based */
+ J[i]--;
+ }
+ if (mm_is_symmetric(matcode) || mm_is_skew(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ if (I[i] != J[i]) {
+ I[nz] = J[i];
+ J[nz++] = I[i];
+ }
+ }
+ } else {
+ assert(!mm_is_hermitian(matcode));
+ }
+ break;
+ case MATRIX_TYPE_COMPLEX:
+ val = (real *) malloc(2 * nz * sizeof(real));
+ v = val;
+ for (i = 0; i < nz; i++) {
+ fscanf(f, "%d %d %lg %lg\n", &I[i], &J[i], &v[0], &v[1]);
+ v += 2;
+ I[i]--; /* adjust from 1-based to 0-based */
+ J[i]--;
+ }
+ if (mm_is_symmetric(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ val = REALLOC(val, 4 * sizeof(real) * nz);
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ if (I[i] != J[i]) {
+ I[nz] = J[i];
+ J[nz] = I[i];
+ val[2 * nz] = val[2 * i];
+ val[2 * nz + 1] = val[2 * i + 1];
+ nz++;
+ }
+ }
+ } else if (mm_is_skew(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ val = REALLOC(val, 4 * sizeof(real) * nz);
+ vp = (void *) val;
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ assert(I[i] != J[i]); /* skew symm has no diag */
+ I[nz] = J[i];
+ J[nz] = I[i];
+ val[2 * nz] = -val[2 * i];
+ val[2 * nz + 1] = -val[2 * i + 1];
+ nz++;
+
+ }
+ } else if (mm_is_hermitian(matcode)) {
+ I = REALLOC(I, 2 * sizeof(int) * nz);
+ J = REALLOC(J, 2 * sizeof(int) * nz);
+ val = REALLOC(val, 4 * sizeof(real) * nz);
+ vp = (void *) val;
+ nzold = nz;
+ for (i = 0; i < nzold; i++) {
+ if (I[i] != J[i]) {
+ I[nz] = J[i];
+ J[nz] = I[i];
+ val[2 * nz] = val[2 * i];
+ val[2 * nz + 1] = -val[2 * i + 1];
+ nz++;
+ }
+ }
+ }
+ vp = (void *) val;
+ break;
+ default:
+ return 0;
}
- } else if (mm_is_hermitian(matcode)){
- I = REALLOC(I, 2*sizeof(int)*nz);
- J = REALLOC(J, 2*sizeof(int)*nz);
- val = REALLOC(val, 4*sizeof(real)*nz);
- vp = (void*) val;
- nzold = nz;
- for (i = 0; i < nzold; i++){
- if (I[i] != J[i]){
- I[nz] = J[i];
- J[nz] = I[i];
- val[2*nz] = val[2*i];
- val[2*nz+1] = -val[2*i+1];
- nz++;
- }
+
+ if (format == FORMAT_CSR) {
+ A = SparseMatrix_from_coordinate_arrays(nz, m, n, I, J, vp,
+ type);
+ } else {
+ A = SparseMatrix_new(m, n, 1, type, FORMAT_COORD);
+ A = SparseMatrix_coordinate_form_add_entries(A, nz, I, J, vp);
}
- }
- vp = (void*) val;
- break;
+ break;
default:
- return 0;
+ A = NULL;
}
+ FREE(I);
+ FREE(J);
+ FREE(val);
- if (format == FORMAT_CSR) {
- A = SparseMatrix_from_coordinate_arrays(nz, m, n, I, J, vp, type);
- } else {
- A = SparseMatrix_new(m, n, 1, type, FORMAT_COORD);
- A = SparseMatrix_coordinate_form_add_entries(A, nz, I, J, vp);
+ if (mm_is_symmetric(matcode)) {
+ SparseMatrix_set_symmetric(A);
+ SparseMatrix_set_pattern_symmetric(A);
+ } else if (mm_is_skew(matcode)) {
+ SparseMatrix_set_skew(A);
+ } else if (mm_is_hermitian(matcode)) {
+ SparseMatrix_set_hemitian(A);
}
- break;
- default:
- A = NULL;
- }
- FREE(I);
- FREE(J);
- FREE(val);
- if (mm_is_symmetric(matcode)){
- SparseMatrix_set_symmetric(A);
- SparseMatrix_set_pattern_symmetric(A);
- } else if (mm_is_skew(matcode)){
- SparseMatrix_set_skew(A);
- } else if (mm_is_hermitian(matcode)){
- SparseMatrix_set_hemitian(A);
- }
-
- return A;
+ return A;
}
-static void mm_write_comment(FILE *file, char *comment){
- char percent[2]="%";
- fprintf(file, "%s %s\n",percent,comment);
+static void mm_write_comment(FILE * file, char *comment)
+{
+ char percent[2] = "%";
+ fprintf(file, "%s %s\n", percent, comment);
}
-void SparseMatrix_export_matrix_market(FILE *file, SparseMatrix A, char *comment){
- MM_typecode matcode;
+void SparseMatrix_export_matrix_market(FILE * file, SparseMatrix A,
+ char *comment)
+{
+ MM_typecode matcode;
- mm_initialize_typecode(&matcode);
- mm_set_matrix(&matcode);
- mm_set_sparse(&matcode);
- mm_set_general(&matcode);
- set_mm_typecode(A->type, &matcode);
+ mm_initialize_typecode(&matcode);
+ mm_set_matrix(&matcode);
+ mm_set_sparse(&matcode);
+ mm_set_general(&matcode);
+ set_mm_typecode(A->type, &matcode);
- mm_write_banner(file, matcode);
- mm_write_comment(file, comment);
+ mm_write_banner(file, matcode);
+ mm_write_comment(file, comment);
- SparseMatrix_export(file, A);
+ SparseMatrix_export(file, A);
-}
+}
+/* $Id$Revision: */
+/* vim:set shiftwidth=4 ts=8: */
+
+/**********************************************************
+* This software is part of the graphviz package *
+* http://www.graphviz.org/ *
+* *
+* Copyright (c) 1994-2004 AT&T Corp. *
+* and is licensed under the *
+* Common Public License, Version 1.0 *
+* by AT&T Corp. *
+* *
+* Information and Software Systems Research *
+* AT&T Research, Florham Park NJ *
+**********************************************************/
/*
* Matrix Market I/O library for ANSI C
*
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-/*#include <malloc.h>*/
#include <ctype.h>
#include "mmio.h"
-int mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_,
- double **val_, int **I_, int **J_)
+int mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_,
+ int *nz_, double **val_, int **I_, int **J_)
{
FILE *f;
MM_typecode matcode;
int i;
double *val;
int *I, *J;
-
+
if ((f = fopen(fname, "r")) == NULL)
- return -1;
-
-
- if (mm_read_banner(f, &matcode) != 0)
- {
- fprintf(stderr, "mm_read_unsymetric: Could not process Matrix Market banner ");
- fprintf(stderr, " in file [%s]\n", fname);
- return -1;
+ return -1;
+
+
+ if (mm_read_banner(f, &matcode) != 0) {
+ fprintf(stderr,
+ "mm_read_unsymetric: Could not process Matrix Market banner ");
+ fprintf(stderr, " in file [%s]\n", fname);
+ return -1;
}
-
-
-
- if ( !(mm_is_real(matcode) && mm_is_matrix(matcode) &&
- mm_is_sparse(matcode)))
- {
- fprintf(stderr, "Sorry, this application does not support ");
- fprintf(stderr, "Market Market type: [%s]\n",
- mm_typecode_to_str(matcode));
- return -1;
+
+
+
+ if (!(mm_is_real(matcode) && mm_is_matrix(matcode) &&
+ mm_is_sparse(matcode))) {
+ fprintf(stderr, "Sorry, this application does not support ");
+ fprintf(stderr, "Market Market type: [%s]\n",
+ mm_typecode_to_str(matcode));
+ return -1;
}
-
+
/* find out size of sparse matrix: M, N, nz .... */
-
- if (mm_read_mtx_crd_size(f, &M, &N, &nz) !=0)
- {
- fprintf(stderr, "read_unsymmetric_sparse(): could not parse matrix size.\n");
- return -1;
+
+ if (mm_read_mtx_crd_size(f, &M, &N, &nz) != 0) {
+ fprintf(stderr,
+ "read_unsymmetric_sparse(): could not parse matrix size.\n");
+ return -1;
}
-
+
*M_ = M;
*N_ = N;
*nz_ = nz;
-
+
/* reseve memory for matrices */
-
+
I = (int *) malloc(nz * sizeof(int));
J = (int *) malloc(nz * sizeof(int));
val = (double *) malloc(nz * sizeof(double));
-
+
*val_ = val;
*I_ = I;
*J_ = J;
-
+
/* NOTE: when reading in doubles, ANSI C requires the use of the "l" */
/* specifier as in "%lg", "%lf", "%le", otherwise errors will occur */
/* (ANSI C X3.159-1989, Sec. 4.9.6.2, p. 136 lines 13-15) */
-
- for (i=0; i<nz; i++)
- {
- fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]);
- I[i]--; /* adjust from 1-based to 0-based */
- J[i]--;
+
+ for (i = 0; i < nz; i++) {
+ fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]);
+ I[i]--; /* adjust from 1-based to 0-based */
+ J[i]--;
}
fclose(f);
-
+
return 0;
}
int mm_is_valid(MM_typecode matcode)
{
- if (!mm_is_matrix(matcode)) return 0;
- if (mm_is_dense(matcode) && mm_is_pattern(matcode)) return 0;
- if (mm_is_real(matcode) && mm_is_hermitian(matcode)) return 0;
- if (mm_is_pattern(matcode) && (mm_is_hermitian(matcode) ||
- mm_is_skew(matcode))) return 0;
+ if (!mm_is_matrix(matcode))
+ return 0;
+ if (mm_is_dense(matcode) && mm_is_pattern(matcode))
+ return 0;
+ if (mm_is_real(matcode) && mm_is_hermitian(matcode))
+ return 0;
+ if (mm_is_pattern(matcode) && (mm_is_hermitian(matcode) ||
+ mm_is_skew(matcode)))
+ return 0;
return 1;
}
-int mm_read_banner(FILE *f, MM_typecode *matcode)
+int mm_read_banner(FILE * f, MM_typecode * matcode)
{
char line[MM_MAX_LINE_LENGTH];
char banner[MM_MAX_TOKEN_LENGTH];
- char mtx[MM_MAX_TOKEN_LENGTH];
+ char mtx[MM_MAX_TOKEN_LENGTH];
char crd[MM_MAX_TOKEN_LENGTH];
char data_type[MM_MAX_TOKEN_LENGTH];
char storage_scheme[MM_MAX_TOKEN_LENGTH];
char *p;
- mm_clear_typecode(matcode);
+ mm_clear_typecode(matcode);
- if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)
- return MM_PREMATURE_EOF;
+ if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)
+ return MM_PREMATURE_EOF;
- if (sscanf(line, "%s %s %s %s %s", banner, mtx, crd, data_type,
- storage_scheme) != 5)
- return MM_PREMATURE_EOF;
+ if (sscanf(line, "%s %s %s %s %s", banner, mtx, crd, data_type,
+ storage_scheme) != 5)
+ return MM_PREMATURE_EOF;
- for (p=mtx; *p!='\0'; *p=tolower(*p),p++); /* convert to lower case */
- for (p=crd; *p!='\0'; *p=tolower(*p),p++);
- for (p=data_type; *p!='\0'; *p=tolower(*p),p++);
- for (p=storage_scheme; *p!='\0'; *p=tolower(*p),p++);
+ for (p = mtx; *p != '\0'; *p = tolower(*p), p++); /* convert to lower case */
+ for (p = crd; *p != '\0'; *p = tolower(*p), p++);
+ for (p = data_type; *p != '\0'; *p = tolower(*p), p++);
+ for (p = storage_scheme; *p != '\0'; *p = tolower(*p), p++);
/* check for banner */
- if (strncmp(banner, MatrixMarketBanner, strlen(MatrixMarketBanner)) != 0)
- return MM_NO_HEADER;
+ if (strncmp(banner, MatrixMarketBanner, strlen(MatrixMarketBanner)) !=
+ 0)
+ return MM_NO_HEADER;
/* first field should be "mtx" */
if (strcmp(mtx, MM_MTX_STR) != 0)
- return MM_UNSUPPORTED_TYPE;
+ return MM_UNSUPPORTED_TYPE;
mm_set_matrix(matcode);
/* second field describes whether this is a sparse matrix (in coordinate
- storgae) or a dense array */
+ storgae) or a dense array */
if (strcmp(crd, MM_SPARSE_STR) == 0)
- mm_set_sparse(matcode);
- else
- if (strcmp(crd, MM_DENSE_STR) == 0)
- mm_set_dense(matcode);
+ mm_set_sparse(matcode);
+ else if (strcmp(crd, MM_DENSE_STR) == 0)
+ mm_set_dense(matcode);
else
- return MM_UNSUPPORTED_TYPE;
-
+ return MM_UNSUPPORTED_TYPE;
+
/* third field */
if (strcmp(data_type, MM_REAL_STR) == 0)
- mm_set_real(matcode);
- else
- if (strcmp(data_type, MM_COMPLEX_STR) == 0)
- mm_set_complex(matcode);
- else
- if (strcmp(data_type, MM_PATTERN_STR) == 0)
- mm_set_pattern(matcode);
- else
- if (strcmp(data_type, MM_INT_STR) == 0)
- mm_set_integer(matcode);
+ mm_set_real(matcode);
+ else if (strcmp(data_type, MM_COMPLEX_STR) == 0)
+ mm_set_complex(matcode);
+ else if (strcmp(data_type, MM_PATTERN_STR) == 0)
+ mm_set_pattern(matcode);
+ else if (strcmp(data_type, MM_INT_STR) == 0)
+ mm_set_integer(matcode);
else
- return MM_UNSUPPORTED_TYPE;
-
+ return MM_UNSUPPORTED_TYPE;
+
/* fourth field */
if (strcmp(storage_scheme, MM_GENERAL_STR) == 0)
- mm_set_general(matcode);
- else
- if (strcmp(storage_scheme, MM_SYMM_STR) == 0)
- mm_set_symmetric(matcode);
- else
- if (strcmp(storage_scheme, MM_HERM_STR) == 0)
- mm_set_hermitian(matcode);
- else
- if (strcmp(storage_scheme, MM_SKEW_STR) == 0)
- mm_set_skew(matcode);
+ mm_set_general(matcode);
+ else if (strcmp(storage_scheme, MM_SYMM_STR) == 0)
+ mm_set_symmetric(matcode);
+ else if (strcmp(storage_scheme, MM_HERM_STR) == 0)
+ mm_set_hermitian(matcode);
+ else if (strcmp(storage_scheme, MM_SKEW_STR) == 0)
+ mm_set_skew(matcode);
else
- return MM_UNSUPPORTED_TYPE;
-
+ return MM_UNSUPPORTED_TYPE;
+
return 0;
}
-int mm_write_mtx_crd_size(FILE *f, int M, int N, int nz)
+int mm_write_mtx_crd_size(FILE * f, int M, int N, int nz)
{
if (fprintf(f, "%d %d %d\n", M, N, nz) != 3)
- return MM_COULD_NOT_WRITE_FILE;
- else
- return 0;
+ return MM_COULD_NOT_WRITE_FILE;
+ else
+ return 0;
}
-int mm_read_mtx_crd_size(FILE *f, int *M, int *N, int *nz )
+int mm_read_mtx_crd_size(FILE * f, int *M, int *N, int *nz)
{
char line[MM_MAX_LINE_LENGTH];
int num_items_read;
*M = *N = *nz = 0;
/* now continue scanning until you reach the end-of-comments */
- do
- {
- if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL)
- return MM_PREMATURE_EOF;
- }while (line[0] == '%');
+ do {
+ if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)
+ return MM_PREMATURE_EOF;
+ } while (line[0] == '%');
/* line[] is either blank or has M,N, nz */
if (sscanf(line, "%d %d %d", M, N, nz) == 3)
- return 0;
-
+ return 0;
+
else
- do
- {
- num_items_read = fscanf(f, "%d %d %d", M, N, nz);
- if (num_items_read == EOF) return MM_PREMATURE_EOF;
- }
- while (num_items_read != 3);
+ do {
+ num_items_read = fscanf(f, "%d %d %d", M, N, nz);
+ if (num_items_read == EOF)
+ return MM_PREMATURE_EOF;
+ }
+ while (num_items_read != 3);
return 0;
}
-int mm_read_mtx_array_size(FILE *f, int *M, int *N)
+int mm_read_mtx_array_size(FILE * f, int *M, int *N)
{
char line[MM_MAX_LINE_LENGTH];
int num_items_read;
/* set return null parameter values, in case we exit with errors */
*M = *N = 0;
-
+
/* now continue scanning until you reach the end-of-comments */
- do
- {
- if (fgets(line,MM_MAX_LINE_LENGTH,f) == NULL)
- return MM_PREMATURE_EOF;
- }while (line[0] == '%');
+ do {
+ if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL)
+ return MM_PREMATURE_EOF;
+ } while (line[0] == '%');
/* line[] is either blank or has M,N, nz */
if (sscanf(line, "%d %d", M, N) == 2)
- return 0;
-
- else /* we have a blank line */
- do
- {
- num_items_read = fscanf(f, "%d %d", M, N);
- if (num_items_read == EOF) return MM_PREMATURE_EOF;
- }
- while (num_items_read != 2);
+ return 0;
+
+ else /* we have a blank line */
+ do {
+ num_items_read = fscanf(f, "%d %d", M, N);
+ if (num_items_read == EOF)
+ return MM_PREMATURE_EOF;
+ }
+ while (num_items_read != 2);
return 0;
}
-int mm_write_mtx_array_size(FILE *f, int M, int N)
+int mm_write_mtx_array_size(FILE * f, int M, int N)
{
if (fprintf(f, "%d %d\n", M, N) != 2)
- return MM_COULD_NOT_WRITE_FILE;
- else
- return 0;
+ return MM_COULD_NOT_WRITE_FILE;
+ else
+ return 0;
}
/* use when I[], J[], and val[]J, and val[] are already allocated */
/******************************************************************/
-int mm_read_mtx_crd_data(FILE *f, int M, int N, int nz, int I[], int J[],
- double val[], MM_typecode matcode)
+int mm_read_mtx_crd_data(FILE * f, int M, int N, int nz, int I[], int J[],
+ double val[], MM_typecode matcode)
{
int i;
- if (mm_is_complex(matcode))
- {
- for (i=0; i<nz; i++)
- if (fscanf(f, "%d %d %lg %lg", &I[i], &J[i], &val[2*i], &val[2*i+1])
- != 4) return MM_PREMATURE_EOF;
- }
- else if (mm_is_real(matcode))
- {
- for (i=0; i<nz; i++)
- {
- if (fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i])
- != 3) return MM_PREMATURE_EOF;
-
- }
+ if (mm_is_complex(matcode)) {
+ for (i = 0; i < nz; i++)
+ if (fscanf
+ (f, "%d %d %lg %lg", &I[i], &J[i], &val[2 * i],
+ &val[2 * i + 1])
+ != 4)
+ return MM_PREMATURE_EOF;
+ } else if (mm_is_real(matcode)) {
+ for (i = 0; i < nz; i++) {
+ if (fscanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i])
+ != 3)
+ return MM_PREMATURE_EOF;
+
+ }
}
- else if (mm_is_pattern(matcode))
- {
- for (i=0; i<nz; i++)
- if (fscanf(f, "%d %d", &I[i], &J[i])
- != 2) return MM_PREMATURE_EOF;
- }
- else
- return MM_UNSUPPORTED_TYPE;
+ else if (mm_is_pattern(matcode)) {
+ for (i = 0; i < nz; i++)
+ if (fscanf(f, "%d %d", &I[i], &J[i])
+ != 2)
+ return MM_PREMATURE_EOF;
+ } else
+ return MM_UNSUPPORTED_TYPE;
return 0;
-
+
}
-int mm_read_mtx_crd_entry(FILE *f, int *I, int *J,
- double *real, double *imag, MM_typecode matcode)
+int mm_read_mtx_crd_entry(FILE * f, int *I, int *J,
+ double *real, double *imag, MM_typecode matcode)
{
- if (mm_is_complex(matcode))
- {
- if (fscanf(f, "%d %d %lg %lg", I, J, real, imag)
- != 4) return MM_PREMATURE_EOF;
- }
- else if (mm_is_real(matcode))
- {
- if (fscanf(f, "%d %d %lg\n", I, J, real)
- != 3) return MM_PREMATURE_EOF;
+ if (mm_is_complex(matcode)) {
+ if (fscanf(f, "%d %d %lg %lg", I, J, real, imag)
+ != 4)
+ return MM_PREMATURE_EOF;
+ } else if (mm_is_real(matcode)) {
+ if (fscanf(f, "%d %d %lg\n", I, J, real)
+ != 3)
+ return MM_PREMATURE_EOF;
}
- else if (mm_is_pattern(matcode))
- {
- if (fscanf(f, "%d %d", I, J) != 2) return MM_PREMATURE_EOF;
- }
- else
- return MM_UNSUPPORTED_TYPE;
+ else if (mm_is_pattern(matcode)) {
+ if (fscanf(f, "%d %d", I, J) != 2)
+ return MM_PREMATURE_EOF;
+ } else
+ return MM_UNSUPPORTED_TYPE;
return 0;
-
+
}
(nz pairs of real/imaginary values)
************************************************************************/
-int mm_read_mtx_crd(char *fname, int *M, int *N, int *nz, int **I, int **J,
- double **val, MM_typecode *matcode)
+int mm_read_mtx_crd(char *fname, int *M, int *N, int *nz, int **I, int **J,
+ double **val, MM_typecode * matcode)
{
int ret_code;
FILE *f;
- if (strcmp(fname, "stdin") == 0) f=stdin;
- else
- if ((f = fopen(fname, "r")) == NULL)
- return MM_COULD_NOT_READ_FILE;
+ if (strcmp(fname, "stdin") == 0)
+ f = stdin;
+ else if ((f = fopen(fname, "r")) == NULL)
+ return MM_COULD_NOT_READ_FILE;
if ((ret_code = mm_read_banner(f, matcode)) != 0)
- return ret_code;
+ return ret_code;
- if (!(mm_is_valid(*matcode) && mm_is_sparse(*matcode) &&
- mm_is_matrix(*matcode)))
- return MM_UNSUPPORTED_TYPE;
+ if (!(mm_is_valid(*matcode) && mm_is_sparse(*matcode) &&
+ mm_is_matrix(*matcode)))
+ return MM_UNSUPPORTED_TYPE;
if ((ret_code = mm_read_mtx_crd_size(f, M, N, nz)) != 0)
- return ret_code;
+ return ret_code;
- *I = (int *) malloc(*nz * sizeof(int));
- *J = (int *) malloc(*nz * sizeof(int));
+ *I = (int *) malloc(*nz * sizeof(int));
+ *J = (int *) malloc(*nz * sizeof(int));
*val = NULL;
- if (mm_is_complex(*matcode))
- {
- *val = (double *) malloc(*nz * 2 * sizeof(double));
- ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,
- *matcode);
- if (ret_code != 0) return ret_code;
- }
- else if (mm_is_real(*matcode))
- {
- *val = (double *) malloc(*nz * sizeof(double));
- ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,
- *matcode);
- if (ret_code != 0) return ret_code;
+ if (mm_is_complex(*matcode)) {
+ *val = (double *) malloc(*nz * 2 * sizeof(double));
+ ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,
+ *matcode);
+ if (ret_code != 0)
+ return ret_code;
+ } else if (mm_is_real(*matcode)) {
+ *val = (double *) malloc(*nz * sizeof(double));
+ ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,
+ *matcode);
+ if (ret_code != 0)
+ return ret_code;
}
- else if (mm_is_pattern(*matcode))
- {
- ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,
- *matcode);
- if (ret_code != 0) return ret_code;
+ else if (mm_is_pattern(*matcode)) {
+ ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *I, *J, *val,
+ *matcode);
+ if (ret_code != 0)
+ return ret_code;
}
- if (f != stdin) fclose(f);
+ if (f != stdin)
+ fclose(f);
return 0;
}
-int mm_write_banner(FILE *f, MM_typecode matcode)
+int mm_write_banner(FILE * f, MM_typecode matcode)
{
char *str = mm_typecode_to_str(matcode);
int ret_code;
ret_code = fprintf(f, "%s %s\n", MatrixMarketBanner, str);
free(str);
- if (ret_code !=2 )
- return MM_COULD_NOT_WRITE_FILE;
+ if (ret_code != 2)
+ return MM_COULD_NOT_WRITE_FILE;
else
- return 0;
+ return 0;
}
int mm_write_mtx_crd(char fname[], int M, int N, int nz, int I[], int J[],
- double val[], MM_typecode matcode)
+ double val[], MM_typecode matcode)
{
FILE *f;
int i;
- if (strcmp(fname, "stdout") == 0)
- f = stdout;
- else
- if ((f = fopen(fname, "w")) == NULL)
- return MM_COULD_NOT_WRITE_FILE;
-
+ if (strcmp(fname, "stdout") == 0)
+ f = stdout;
+ else if ((f = fopen(fname, "w")) == NULL)
+ return MM_COULD_NOT_WRITE_FILE;
+
/* print banner followed by typecode */
fprintf(f, "%s ", MatrixMarketBanner);
fprintf(f, "%s\n", mm_typecode_to_str(matcode));
/* print values */
if (mm_is_pattern(matcode))
- for (i=0; i<nz; i++)
- fprintf(f, "%d %d\n", I[i], J[i]);
- else
- if (mm_is_real(matcode))
- for (i=0; i<nz; i++)
- fprintf(f, "%d %d %20.16g\n", I[i], J[i], val[i]);
- else
- if (mm_is_complex(matcode))
- for (i=0; i<nz; i++)
- fprintf(f, "%d %d %20.16g %20.16g\n", I[i], J[i], val[2*i],
- val[2*i+1]);
- else
- {
- if (f != stdout) fclose(f);
- return MM_UNSUPPORTED_TYPE;
+ for (i = 0; i < nz; i++)
+ fprintf(f, "%d %d\n", I[i], J[i]);
+ else if (mm_is_real(matcode))
+ for (i = 0; i < nz; i++)
+ fprintf(f, "%d %d %20.16g\n", I[i], J[i], val[i]);
+ else if (mm_is_complex(matcode))
+ for (i = 0; i < nz; i++)
+ fprintf(f, "%d %d %20.16g %20.16g\n", I[i], J[i], val[2 * i],
+ val[2 * i + 1]);
+ else {
+ if (f != stdout)
+ fclose(f);
+ return MM_UNSUPPORTED_TYPE;
}
- if (f !=stdout) fclose(f);
+ if (f != stdout)
+ fclose(f);
return 0;
}
-
+
/**
* Create a new copy of a string s. strdup() is a common routine, but
}
*/
-char *mm_typecode_to_str(MM_typecode matcode)
+char *mm_typecode_to_str(MM_typecode matcode)
{
char buffer[MM_MAX_LINE_LENGTH];
char *types[4];
- /* char *strdup(const char *);*/
- int error =0;
+ /* char *strdup(const char *); */
+ int error = 0;
/* check for MTX type */
- if (mm_is_matrix(matcode))
- types[0] = MM_MTX_STR;
+ if (mm_is_matrix(matcode))
+ types[0] = MM_MTX_STR;
else
- error=1;
+ error = 1;
/* check for CRD or ARR matrix */
if (mm_is_sparse(matcode))
- types[1] = MM_SPARSE_STR;
+ types[1] = MM_SPARSE_STR;
+ else if (mm_is_dense(matcode))
+ types[1] = MM_DENSE_STR;
else
- if (mm_is_dense(matcode))
- types[1] = MM_DENSE_STR;
- else
- return NULL;
+ return NULL;
/* check for element data type */
if (mm_is_real(matcode))
- types[2] = MM_REAL_STR;
- else
- if (mm_is_complex(matcode))
- types[2] = MM_COMPLEX_STR;
- else
- if (mm_is_pattern(matcode))
- types[2] = MM_PATTERN_STR;
- else
- if (mm_is_integer(matcode))
- types[2] = MM_INT_STR;
+ types[2] = MM_REAL_STR;
+ else if (mm_is_complex(matcode))
+ types[2] = MM_COMPLEX_STR;
+ else if (mm_is_pattern(matcode))
+ types[2] = MM_PATTERN_STR;
+ else if (mm_is_integer(matcode))
+ types[2] = MM_INT_STR;
else
- return NULL;
+ return NULL;
/* check for symmetry type */
if (mm_is_general(matcode))
- types[3] = MM_GENERAL_STR;
- else
- if (mm_is_symmetric(matcode))
- types[3] = MM_SYMM_STR;
- else
- if (mm_is_hermitian(matcode))
- types[3] = MM_HERM_STR;
- else
- if (mm_is_skew(matcode))
- types[3] = MM_SKEW_STR;
+ types[3] = MM_GENERAL_STR;
+ else if (mm_is_symmetric(matcode))
+ types[3] = MM_SYMM_STR;
+ else if (mm_is_hermitian(matcode))
+ types[3] = MM_HERM_STR;
+ else if (mm_is_skew(matcode))
+ types[3] = MM_SKEW_STR;
else
- return NULL;
+ return NULL;
- sprintf(buffer,"%s %s %s %s", types[0], types[1], types[2], types[3]);
+ sprintf(buffer, "%s %s %s %s", types[0], types[1], types[2], types[3]);
return strdup(buffer);
}