/* read a file containing floating vectors in various formats. Check the NaN */ float * my_fvec_read (const char * fname, int fmt, int verbose, int * nptr, int * dptr) { int ret = -1; float * v = NULL; int n = *nptr; int d = *dptr; /* read the vectors from the input file, and sanitize them if needed */ switch (fmt) { case FMT_FVEC: if (d == 0 || n == 0) {/* automatically read the dimension */ ret = fvecs_fsize (fname, &d, &n); fprintf (stderr, "File %s contains (%d bytes) %d vectors of dimension %d\n", fname, ret, n, d); assert (ret); } v = fvec_new (n * d); ret = fvecs_read (fname, d, n, v); break; case FMT_TEXT: assert (n !=0 && d != 0); v = fvec_new (n * d); ret = fvecs_read_txt (fname, d, n, v); break; case FMT_BVEC: if (d == 0 || n == 0) {/* automatically read the dimension */ ret = bvecs_fsize (fname, &d, &n); fprintf (stderr, "File %s contains (%d bytes) %d vectors of dimension %d\n", fname, ret, n, d); assert (ret); } v = fvec_new (n * d); ret = b2fvecs_read (fname, d, n, v); break; default: assert (1 || "Unknown input format\n"); } assert (ret >= n); /* Remove the Nan values */ int nNaN = fvec_purge_nans (v, n * d, 2); if (nNaN > 0 && verbose >= 1) fprintf (stderr, "found %d NaN values in what read from %s\n", nNaN, fname); *dptr = d; *nptr = n; return v; }
int b2fvecs_read (const char *fname, int d, int n, float *v) { int n_new; int d_new; bvecs_fsize (fname, &d_new, &n_new); assert (d_new == d); assert (n <= n_new); FILE * f = fopen (fname, "r"); assert (f || "b2fvecs_read: Unable to open the file"); b2fvecs_fread (f, v, n); fclose (f); return n; }
int b2fvecs_new_read (const char *fname, int *d_out, float **v_out) { int n; int d; bvecs_fsize (fname, &d, &n); float * v = fvec_new ((long) n * (long) d); FILE * f = fopen (fname, "r"); assert (f || "bvecs_new_read: Unable to open the file"); b2fvecs_fread (f, v, n); fclose (f); v_out = &v; return n; }