00001
00002
00004
00005
00006
00008
00009 #ifndef __PPMLanguageModel_h__
00010 #define __PPMLanguageModel_h__
00011
00012 #include "NoClones.h"
00013 #include "MSVC_Unannoy.h"
00014 #include <vector>
00015 #include <stdio.h>
00016
00017 #include "LanguageModel.h"
00018
00019
00020 const int MAX_ORDER = 5;
00021 const int maxcont =200;
00022
00023 namespace Dasher {class CPPMLanguageModel;}
00024 class Dasher::CPPMLanguageModel : public Dasher::CLanguageModel, private NoClones
00025 {
00026 public:
00027 CPPMLanguageModel(CAlphabet *_alphabet, int _normalization);
00028 virtual ~CPPMLanguageModel();
00029
00030 class CPPMnode {
00031 public:
00032 CPPMnode* find_symbol(int sym);
00033 CPPMnode* add_symbol_to_node(int sym,int *update);
00034 CPPMnode* child;
00035 CPPMnode* next;
00036 CPPMnode* vine;
00037 short int count;
00038 const short int symbol;
00039 CPPMnode(int sym);
00040 };
00041
00042 class CPPMContext : public CContext {
00043 public:
00044 CPPMContext(CPPMContext const &input) : CContext(input)
00045 { head = input.head;order= input.order;}
00046 CPPMContext(CPPMnode* _head=0, int _order=0) : head(_head),order(_order) {};
00047 ~CPPMContext() {};
00048 void dump();
00049 CPPMnode* head;
00050 int order;
00051 };
00052
00053 void ReleaseContext(CContext*);
00054 CContext* GetRootContext();
00055 inline CContext* CloneContext(CContext*);
00056 void EnterSymbol(CContext* context, modelchar Symbol);
00057
00058 bool GetProbs(CContext*, std::vector<unsigned int> &Probs, double AddProb);
00059
00060 void LearnSymbol(CContext* Context, modelchar Symbol);
00061 void dump();
00062
00063 private:
00064 CPPMContext *m_rootcontext;
00065 CPPMnode *root;
00066 void AddSymbol(CPPMContext& context,int symbol);
00067 void dumpSymbol(int symbol);
00068 void dumpString( char *str, int pos, int len );
00069 void dumpTrie( CPPMnode *t, int d );
00070
00071
00072
00073 };
00074
00076
00078
00080
00081 inline CPPMLanguageModel::CPPMnode::CPPMnode(int sym) : symbol(sym)
00082 {
00083 child=next=vine=0;
00084 count=1;
00085 }
00086
00088
00089 inline void CPPMLanguageModel::CPPMContext::dump()
00090
00091 {
00092
00093
00094
00095
00096 }
00097
00099
00100 inline CContext* CPPMLanguageModel::GetRootContext()
00101 {
00102 CPPMContext * nc = new CPPMLanguageModel::CPPMContext(*m_rootcontext);
00103 CContext *cont=static_cast<CContext *> (nc);
00104 return cont;
00105 }
00106
00108
00109 inline CContext* CPPMLanguageModel::CloneContext(CContext *copythis)
00110 {
00111 CPPMContext *ppmcontext=static_cast<CPPMContext *> (copythis);
00112 CPPMContext * nc = new CPPMLanguageModel::CPPMContext(*ppmcontext);
00113 return static_cast<CContext *> (nc);
00114 }
00115
00117
00118 inline void CPPMLanguageModel::ReleaseContext(CContext *release)
00119 {
00120 delete release;
00121 }
00122
00123 #endif