00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LM_MIXTURE
00024 #define LM_MIXTURE
00025
00026 #define END_ENUM { (char*)0, 0 }
00027
00028 class mixture: public mdiadaptlm
00029 {
00030 double** l[MAX_NGRAM];
00031 int* pm;
00032 int pmax;
00033 int k1,k2;
00034 int numslm;
00035 int prunethresh;
00036 interplm** sublm;
00037 char *ipfname;
00038 char *opfname;
00039
00040
00041 double reldist(double *l1,double *l2,int n);
00042 int genpmap();
00043 int pmap(ngram ng,int lev);
00044 public:
00045
00046 bool usefulltable;
00047
00048 mixture(bool fulltable,char *sublminfo,int depth,int prunefreq=0,char* ipfile=NULL,char* opfile=NULL);
00049
00050 int train();
00051
00052 int savepar(char* opf);
00053 int loadpar(char* opf);
00054
00055 inline int dub() {
00056 return dict->dub();
00057 }
00058
00059 inline int dub(int value) {
00060 for (int i=0; i<numslm; i++) {
00061 sublm[i]->dub(value);
00062 }
00063 return dict->dub(value);
00064 }
00065
00066 void settying(int a,int b) {
00067 k1=a;
00068 k2=b;
00069 }
00070 int discount(ngram ng,int size,double& fstar,double& lambda,int cv=0);
00071
00072
00073
00074 ~mixture(){
00075
00076 for (int i=0;i<=lmsize();i++){
00077 for (int j=0; j<pmax; j++) free(l[i][j]);
00078 free(l[i]);
00079 }
00080
00081 for (int i=0;i<numslm;i++) delete(sublm[i]);
00082
00083 }
00084
00085
00086 int get(ngram& ng,int n,int lev);
00087
00088 };
00089
00090 #endif
00091
00092
00093
00094