hkm_t *hkm_read (const char *filename) { int ret = 0, l; FILE *f = fopen (filename, "r"); int nlevel, bf, d; ret = fread (&nlevel, sizeof (nlevel), 1, f); HKM_READ_ERROR (ret, 1); ret = fread (&bf, sizeof (bf), 1, f); HKM_READ_ERROR (ret, 1); ret = fread (&d, sizeof (d), 1, f); HKM_READ_ERROR (ret, 1); hkm_t *hkm = hkm_new (d, nlevel, bf); assert (hkm); int k = hkm->bf; for (l = 0; l < hkm->nlevel; l++) { /* need to allocate the memory */ ret = fvec_fread (f, hkm->centroids[l], k * hkm->d); HKM_READ_ERROR (ret, k * hkm->d); k *= hkm->bf; } hkm->k = k / hkm->bf; return hkm; }
int fvec_read (const char *fname, int d, float *a, int o_f) { FILE * f = fopen(fname, "r"); if(!f) { fprintf(stderr, "cannot open %s: %s\n", fname, strerror(errno)); return -1; } int ret = fseek(f, (4 * d + 4) * o_f, SEEK_SET); if(ret < 0) { fprintf(stderr, "seek error in %s: %s\n", fname, strerror(errno)); fclose(f); return -1; } ret = fvec_fread(f, a, d); fclose(f); return ret; }