gmm_t * gmm_read(FILE *f) { int d,k; READANDCHECK(&d,1); READANDCHECK(&k,1); gmm_t *g=gmm_new(d,k); READANDCHECK(g->w,g->k); READANDCHECK(g->mu,g->k*g->d); READANDCHECK(g->sigma,g->k*g->d); return g; }
int bvecs_new_from_siftgeo(const char *fname, int *d_out, unsigned char **v_out, int *d_meta_out, float **meta_out) { FILE * f = fopen(fname, "r"); if(!f) { fprintf(stderr, "could not open %s: %s\n", fname, strerror(errno)); return -1; } #define READANDCHECK(a,n) if(fread(a, sizeof(*(a)), n, f) != n) {fprintf(stderr, "weird format in %s\n", fname); goto err; } int n = 0, na = 0; int d = -1; unsigned char * v = NULL; float * meta = NULL; for(;;) { float buf[9]; int header_read = fread(buf, 1, sizeof(buf), f); if(header_read == 0 && feof(f)) break; else if(header_read != sizeof(buf)) { fprintf(stderr, "bvecs_new_from_siftgeo: error in point header in %s\n", fname); goto err; } int d2; READANDCHECK(&d2, 1) if(n == 0) { if(!(d2 >= 0 && d2 < 100000)) { fprintf(stderr, "bvecs_new_from_siftgeo: weird descriptor dim %d in %s\n", d2, fname); goto err; } d = d2; } else if(d2 != d) { fprintf(stderr, "bvecs_new_from_siftgeo: weird dim in %s (expect %d found %d)\n", fname, d, d2); goto err; } if(n >= na) { na = na == 0 ? 512 : na*3/2; if(meta_out) meta = realloc(meta, sizeof(float) * 9 * na); v = realloc(v, d * sizeof(float) * na); } if(meta_out) memcpy(meta + 9 * n, buf, sizeof(buf)); READANDCHECK(v + d * n, d); n++; } #undef READANDCHECK fclose(f); *d_out = d; *v_out = v; if(meta_out) *meta_out = meta; if(d_meta_out) *d_meta_out = 9; return n; err: fclose(f); free(v); free(meta); *d_out = -1; *v_out = NULL; if(meta_out) *meta_out = NULL; if(d_meta_out) *d_meta_out = -1; return -1; }