/********************************************************************
 *                                                                  *
 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
 *                                                                  *
 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *
 * by the Xiph.Org Foundation http://www.xiph.org/                  *
 *                                                                  *
 ********************************************************************

 function: build a VQ codebook 
 last mod: $Id: vqgen.h 16037 2009-05-26 21:10:58Z xiphmont $

 ********************************************************************/

#ifndef _VQGEN_H_
#define _VQGEN_H_

typedef struct vqgen{
  int seeded;
  int sorted;

  int it;
  int elements;

  int aux;
  float mindist;
  int centroid;

  /* point cache */
  float *pointlist; 
  long   points;
  long   allocated;

  /* entries */
  float *entrylist;
  long   *assigned;
  float *bias;
  long   entries;
  float *max;
  
  float  (*metric_func) (struct vqgen *v,float *entry,float *point);
  float *(*weight_func) (struct vqgen *v,float *point);

  FILE *asciipoints;
} vqgen;

typedef struct {
  long   min;       /* packed 24 bit float */       
  long   delta;     /* packed 24 bit float */       
  int    quant;     /* 0 < quant <= 16 */
  int    sequencep; /* bitflag */
} quant_meta;

static inline float *_point(vqgen *v,long ptr){
  return v->pointlist+((v->elements+v->aux)*ptr);
}

static inline float *_aux(vqgen *v,long ptr){
  return _point(v,ptr)+v->aux;
}

static inline float *_now(vqgen *v,long ptr){
  return v->entrylist+(v->elements*ptr);
}

extern void vqgen_init(vqgen *v,
                       int elements,int aux,int entries,float mindist,
                       float  (*metric)(vqgen *,float *, float *),
                       float *(*weight)(vqgen *,float *),int centroid);
extern void vqgen_addpoint(vqgen *v, float *p,float *aux);

extern float vqgen_iterate(vqgen *v,int biasp);
extern void vqgen_unquantize(vqgen *v,quant_meta *q);
extern void vqgen_quantize(vqgen *v,quant_meta *q);
extern void vqgen_cellmetric(vqgen *v);

#endif





