int mm_read_mtx_crd_data(ZOLTAN_FILE* f, int M, int N, int nz, int I[], int J[], double val[], MM_typecode matcode) { int i; int dummy = 0; if (mm_is_complex(matcode)) { for (i=0; i<nz; i++) dummy = ZOLTAN_FILE_scanf (f, "%d %d %lg %lg", &I[i], &J[i], &val[2*i], &val[2*i+1]); if (dummy != 4) return MM_PREMATURE_EOF; } else if (mm_is_real(matcode)) { for (i=0; i<nz; i++) { dummy = ZOLTAN_FILE_scanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]); if (dummy != 3) return MM_PREMATURE_EOF; } } else if (mm_is_pattern(matcode)) { for (i=0; i<nz; i++) dummy = ZOLTAN_FILE_scanf(f, "%d %d", &I[i], &J[i]); if (dummy != 2) return MM_PREMATURE_EOF; } else return MM_UNSUPPORTED_TYPE; return 0; }
int mm_read_mtx_array_size(ZOLTAN_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 (ZOLTAN_FILE_gets(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 = ZOLTAN_FILE_scanf (f, "%d %d", M, N); if (num_items_read == EOF) return MM_PREMATURE_EOF; } while (num_items_read != 2); return 0; }
int mm_read_mtx_crd_size(ZOLTAN_FILE* f, int *M, int *N, int *nz ) { char line[MM_MAX_LINE_LENGTH], *c; int num_items_read; /* set return null parameter values, in case we exit with errors */ *M = *N = *nz = 0; /* now continue scanning until you reach the end-of-comments */ do { if (ZOLTAN_FILE_gets(line,MM_MAX_LINE_LENGTH,f) == NULL) return MM_PREMATURE_EOF; c = line; while (*c && (*c != '\n') && isspace(*c)) c++; }while (*c == '%'); /* line[] is either blank or has M,N, nz */ if (sscanf(line, "%d %d %d", M, N, nz) == 3) return 0; else do { num_items_read = ZOLTAN_FILE_scanf(f, "%d %d %d", M, N, nz); if (num_items_read == EOF) return MM_PREMATURE_EOF; } while (num_items_read != 3); return 0; }
static int input_assign_normal( ZOLTAN_FILE* finassign, /* input assignment file */ char *inassignname, /* name of input assignment file */ int nvtxs, /* number of vertices to output */ short *assignment) /* values to be printed */ { const char *yo = "input_assign_normal"; int flag; /* logical conditional */ int end_flag; /* return flag from read_int() */ int i, j; /* loop counter */ DEBUG_TRACE_START(0, yo); /* Get the assignment vector one line at a time, checking as you go. */ /* First read past any comments at top. */ end_flag = 1; while (end_flag == 1) { assignment[0] = read_int(finassign, &end_flag); } if (assignment[0] < 0) { printf("ERROR: Entry %d in assignment file `%s' less than zero (%d)\n", 1, inassignname, assignment[0]); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (end_flag == -1) { printf("ERROR: No values found in assignment file `%s'\n", inassignname); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } flag = 0; if (assignment[0] > nvtxs) flag = assignment[1]; for (i = 1; i < nvtxs; i++) { j = ZOLTAN_FILE_scanf(finassign, "%hd", &(assignment[i])); if (j != 1) { printf("ERROR: Too few values in assignment file `%s'.\n", inassignname); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (assignment[i] < 0) { printf("ERROR: Entry %d in assignment file `%s' less than zero (%d)\n", i+1, inassignname, assignment[i]); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (assignment[i] > nvtxs) { /* warn since probably an error */ if (assignment[i] > flag) flag = assignment[i]; } } if (flag && Debug_Chaco_Input) { printf("WARNING: Possible error in assignment file `%s'\n", inassignname); printf(" More assignment sets (%d) than vertices (%d)\n", flag, nvtxs); } /* Check for spurious extra stuff in file. */ flag = FALSE; end_flag = 0; while (!flag && end_flag != -1) { read_int(finassign, &end_flag); if (!end_flag) flag = TRUE; } if (flag && Debug_Chaco_Input) { printf("WARNING: Possible error in assignment file `%s'\n", inassignname); printf(" Numerical data found after expected end of file\n"); } ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (0); }
static int input_assign_inv( ZOLTAN_FILE* finassign, /* input assignment file */ char *inassignname, /* name of input assignment file */ int nvtxs, /* number of vertices to output */ short *assignment) /* values to be printed */ { const char *yo = "input_assign_inv"; int set; /* set number being read */ int size; /* number of vertices in set */ int total; /* total number of vertices read */ int done; /* have I hit end of file yet? */ int end_flag; /* return flag from read_int() */ int i, j, k; /* loop counter */ DEBUG_TRACE_START(0, yo); /* Get the assignment vector one line at a time, checking as you go. */ /* Initialize assignment to help error detection. */ for (i = 0; i < nvtxs; i++) { assignment[i] = -1; } /* First read past any comments at top. */ total = 0; set = 0; end_flag = 1; while (end_flag == 1) { size = read_int(finassign, &end_flag); } if (end_flag == -1) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" No values found\n"); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (size < 0) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" Size of set %d less than zero (%d)\n", set, size); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (total + size > nvtxs) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" Total set sizes greater than nvtxs (%d)\n", nvtxs); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } done = FALSE; while (!done && total < nvtxs) { for (i = 1; i <= size; i++) { j = ZOLTAN_FILE_scanf(finassign, "%d", &k); if (j != 1) { printf("ERROR: Too few values in assignment file `%s'.\n", inassignname); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (k <= 0 || k > nvtxs) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" Entry %d of set %d invalid (%d)\n", total + i, set, k); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if ((int) assignment[k - 1] != -1) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" Vertex %d assigned to multiple sets\n", k); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } assignment[k - 1] = (short) set; } total += size; j = ZOLTAN_FILE_scanf(finassign, "%d", &size); ++set; if (j != 1) { if (total != nvtxs) { printf("ERROR: Too few values in assignment file `%s'.\n", inassignname); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } else { done = TRUE; size = 0; } } if (size < 0) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" Size of set %d less than zero (%d)\n", set, size); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } if (total + size > nvtxs) { printf("ERROR: In assignment file `%s'\n", inassignname); printf(" Total set sizes greater than nvtxs (%d)\n", nvtxs); ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (1); } } ZOLTAN_FILE_close(finassign); DEBUG_TRACE_END(0, yo); return (0); }
int chaco_input_geom( ZOLTAN_FILE *fingeom, /* geometry input file */ char *geomname, /* name of geometry file */ int nvtxs, /* number of coordinates to read */ int *igeom, /* dimensionality of geometry */ float **x, /* coordinates of vertices */ float **y, float **z ) { const char *yo = "chaco_input_geom"; float xc, yc, zc =0; /* first x, y, z coordinate */ int nread; /* number of lines of coordinates read */ int flag; /* any bad data at end of file? */ int line_num; /* counts input lines in file */ int end_flag; /* return conditional */ int ndims; /* number of values in an input line */ int i=0; /* loop counter */ DEBUG_TRACE_START(0, yo); *x = *y = *z = NULL; line_num = 0; end_flag = 1; while (end_flag == 1) { xc = read_val(fingeom, &end_flag); ++line_num; } if (end_flag == -1) { printf("No values found in geometry file `%s'\n", geomname); ZOLTAN_FILE_close(fingeom); return (1); } ndims = 1; yc = read_val(fingeom, &end_flag); if (end_flag == 0) { ndims = 2; zc = read_val(fingeom, &end_flag); if (end_flag == 0) { ndims = 3; read_val(fingeom, &end_flag); if (!end_flag) { printf("Too many values on input line of geometry file `%s'\n", geomname); printf(" Maximum dimensionality is 3\n"); ZOLTAN_FILE_close(fingeom); return (1); } } } *igeom = ndims; *x = (float *) malloc((unsigned) nvtxs * sizeof(float)); (*x)[0] = xc; if (ndims > 1) { *y = (float *) malloc((unsigned) nvtxs * sizeof(float)); (*y)[0] = yc; } if (ndims > 2) { *z = (float *) malloc((unsigned) nvtxs * sizeof(float)); (*z)[0] = zc; } for (nread = 1; nread < nvtxs; nread++) { ++line_num; if (ndims == 1) { i = ZOLTAN_FILE_scanf(fingeom, "%f", &((*x)[nread])); } else if (ndims == 2) { i = ZOLTAN_FILE_scanf(fingeom, "%f%f", &((*x)[nread]), &((*y)[nread])); } else if (ndims == 3) { i = ZOLTAN_FILE_scanf(fingeom, "%f%f%f", &((*x)[nread]), &((*y)[nread]), &((*z)[nread])); } if (i == EOF) { printf("Too few lines of values in geometry file; nvtxs=%d, but only %d read\n", nvtxs, nread); ZOLTAN_FILE_close(fingeom); return (1); } else if (i != ndims) { printf("Wrong number of values in line %d of geometry file `%s'\n", line_num, geomname); ZOLTAN_FILE_close(fingeom); return (1); } } /* Check for spurious extra stuff in file. */ flag = 0; end_flag = 0; while (!flag && end_flag != -1) { read_val(fingeom, &end_flag); if (!end_flag) flag = 1; } if (flag && Debug_Chaco_Input) { printf("Warning: possible error in geometry file `%s'\n", geomname); printf(" Numerical data found after expected end of file\n"); } ZOLTAN_FILE_close(fingeom); DEBUG_TRACE_END(0, yo); return (0); }
int mm_read_unsymmetric_sparse(const char *fname, int *M_, int *N_, int *nz_, double **val_, int **I_, int **J_) { ZOLTAN_FILE *f; MM_typecode matcode; int M, N, nz; int i; double *val; int *I, *J; f = ZOLTAN_FILE_open(fname, "r", STANDARD); if (f == NULL) return -1; if (mm_read_banner(f, &matcode) != 0) { printf("mm_read_unsymetric: Could not process Matrix Market banner "); printf(" 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; } /* 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; } *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++) { ZOLTAN_FILE_scanf(f, "%d %d %lg\n", &I[i], &J[i], &val[i]); I[i]--; /* adjust from 1-based to 0-based */ J[i]--; } ZOLTAN_FILE_close(f); return 0; }