1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-1999 *
9 * by 1999 Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: utility main for training codebooks
15 author: Monty <xiphmont@mit.edu>
16 modifications by: Monty
17 last modification date: Dec 10 1999
19 ********************************************************************/
29 /* A metric for LSP codes */
30 /* candidate,actual */
31 static double _dist_and_pos(vqgen *v,double *b, double *a){
37 double actualdist=(a[i]-lastb);
38 double testdist=(b[i]-lastb);
39 if(actualdist>0 && testdist>0){
41 if(actualdist>testdist)
42 val=actualdist/testdist-1.;
44 val=testdist/actualdist-1.;
54 static void *set_metric(int m){
59 return(_dist_and_pos);
61 fprintf(stderr,"Invalid metric number\n");
66 static int rline(FILE *in,FILE *out,char *line,int max,int pass){
67 while(fgets(line,160,in)){
69 if(pass)fprintf(out,"%s",line);
78 trainvq [vq=file | [entries=n] [dim=n]] met=n in=file,firstcol
83 void setexit(int dummy){
84 fprintf(stderr,"\nexiting... please wait to finish this iteration\n");
88 int main(int argc,char *argv[]){
90 int entries=-1,dim=-1;
93 double (*metric)(vqgen *,double *, double *)=NULL;
103 /* continue training an existing book */
104 if(!strncmp(*argv,"vq=",3)){
106 char filename[80],*ptr;
107 if(sscanf(*argv,"vq=%70s",filename)!=1){
108 fprintf(stderr,"Syntax error in argument '%s'\n",*argv);
112 in=fopen(filename,"r");
113 ptr=strrchr(filename,'-');
118 sprintf(ptr,"%d.vqi",num+1);
120 strcat(filename,"-0.vqi");
122 out=fopen(filename,"w");
124 fprintf(stderr,"Unable to open %s for writing\n",filename);
127 fprintf(out,"# OggVorbis VQ codebook trainer, intermediate file\n");
130 /* we wish to suck in a preexisting book and continue to train it */
133 rline(in,out,line,160,1);
134 if(sscanf(line,"%d %d %d",&entries,&dim,&met)!=3){
135 fprintf(stderr,"Syntax error reading book file\n");
139 metric=set_metric(met);
140 vqgen_init(&v,dim,entries,metric,0.);
143 /* entries, bias, points */
145 for(j=0;j<entries;j++){
147 rline(in,out,line,160,0);
148 sscanf(line,"%lf",&a);
154 for(j=0;j<entries;j++){
155 rline(in,out,line,160,0);
156 sscanf(line,"%lf",&a);
163 v.entries=0; /* hack to avoid reseeding */
165 for(k=0;k<dim && k<80;k++){
166 rline(in,out,line,160,0);
167 sscanf(line,"%lf",b+k);
170 vqgen_addpoint(&v,b);
179 /* set parameters if we're not loading a pre book */
180 if(!strncmp(*argv,"entries=",8)){
181 sscanf(*argv,"entries=%d",&entries);
183 if(!strncmp(*argv,"desired=",8)){
184 sscanf(*argv,"desired=%lf",&desired);
186 if(!strncmp(*argv,"dim=",4)){
187 sscanf(*argv,"dim=%d",&dim);
190 /* which error metric (0==euclidian distance default) */
191 if(!strncmp(*argv,"met=",4)){
192 sscanf(*argv,"met=%d",&met);
193 metric=set_metric(met);
196 if(!strncmp(*argv,"in=",3)){
201 if(sscanf(*argv,"in=%79[^,],%d",file,&start)!=2)goto syner;
203 fprintf(stderr,"vq= must preceed in= arguments\n");
207 if(dim==-1 || entries==-1){
208 fprintf(stderr,"Must specify dimensionality and entries before"
209 " first input file\n");
212 vqgen_init(&v,dim,entries,metric,0.);
218 fprintf(stderr,"Could not open input file %s\n",file);
221 fprintf(out,"# training file entry: %s\n",file);
223 while(rline(in,out,line,1024,1)){
225 int n=sscanf(line,"%lf %lf %lf %lf %lf %lf %lf %lf "
226 "%lf %lf %lf %lf %lf %lf %lf %lf",
227 b,b+1,b+2,b+3,b+4,b+5,b+6,b+7,b+8,b+9,b+10,b+11,b+12,b+13,
230 fprintf(stderr,"ran out of columns reading %s\n",file);
233 vqgen_addpoint(&v,b+start);
242 signal(SIGTERM,setexit);
243 signal(SIGINT,setexit);
245 for(i=0;i<iter && !exiting;i++){
246 if(vqgen_iterate(&v)<desired)break;
251 fprintf(out,"%d %d %d\n",entries,dim,met);
254 for(j=0;j<entries;j++)
256 fprintf(out,"%f\n",v.entrylist[i++]);
258 fprintf(out,"# biases---\n");
260 for(j=0;j<entries;j++)
261 fprintf(out,"%f\n",v.bias[i++]);
263 fprintf(out,"# points---\n");
265 for(j=0;j<v.points;j++)
266 for(k=0;k<dim && k<80;k++)
267 fprintf(out,"%f\n",v.pointlist[i++]);
273 fprintf(stderr,"Syntax error in argument '%s'\n",*argv);