/* Copyright (C) 1997,1998,1999,2000,2001 Franz Josef Och mkcls - a program for making word classes . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef KATEGPROBLEMKBC_H #define KATEGPROBLEMKBC_H typedef Array FreqArray; typedef Array FreqArrayReal; double verfaelsche(int a,double b); double verfaelsche(double a,double b); class KategProblemKBC { friend class KategProblem; private: Array _n; Array _n1; Array _n2; double sigmaVerfaelschung; short withVerfaelschung; Array _nverf; Array _n1verf; Array _n2verf; FreqType _nWords; protected: int eta0; int eta1; int c1_0; int c2_0; double _bigramVerfSum; double _unigramVerfSum1; double _unigramVerfSum2; double verfInit0; public: int nKats; KategProblemKBC(int nKats,double sv); double fullBewertung(int auswertung); FreqType n(int w1,int w2) { return _n[w1][w2]; }; FreqType n1(int w) { return _n1[w];}; FreqType n2(int w) { return _n2[w];}; double bigramVerfSum(); double unigramVerfSum1(); double unigramVerfSum2(); double nverf(int w1,int w2) { return _nverf[w1][w2]; } double n1verf(int w) { return _n1verf[w]; }; double n2verf(int w) { return _n2verf[w]; }; inline void addN(int w1,int w2, FreqType n); void setN(int w1,int w2, FreqType n); double myCriterionTerm(); }; inline void KategProblemKBC::addN(int w1,int w2, FreqType n) { if(n!=0) { FreqType &s= _n[w1][w2]; if(s==0) eta0--; else if(s==1) eta1--; if(_n1[w1]==0) c1_0--; if(_n2[w2]==0) c2_0--; if(withVerfaelschung) { double verfOld=verfaelsche(s,sigmaVerfaelschung); double verfNew=verfaelsche(s+n,sigmaVerfaelschung); double verfOld1=verfaelsche(_n1[w1],sigmaVerfaelschung); assert(verfOld1==_n1verf[w1]); double verfNew1=verfaelsche(_n1[w1]+n,sigmaVerfaelschung); double verfOld2=verfaelsche(_n2[w2],sigmaVerfaelschung); assert(verfOld2==_n2verf[w2]); double verfNew2=verfaelsche(_n2[w2]+n,sigmaVerfaelschung); _n1verf[w1]=verfNew1; _unigramVerfSum1+=verfNew1-verfOld1; _n2verf[w2]=verfNew2; _unigramVerfSum2+=verfNew2-verfOld2; _nverf[w1][w2]=verfNew; _bigramVerfSum+=verfNew-verfOld; _nWords+=n; } s+=n;_n1[w1]+=n;_n2[w2]+=n; assert(_n[w1][w2]>=0); assert(_n1[w1]>=0); assert(_n2[w2]>=0); if(s==0) eta0++; else if(s==1) eta1++; if(_n1[w1]==0) c1_0++; if(_n2[w2]==0) c2_0++; } }; #endif