00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <iostream>
00024 #include "LanguageModelFactory.h"
00025 #include "UserMessage.h"
00026 #include "TypeDef.h"
00027 #include "FactorCollection.h"
00028
00029
00030 #ifdef LM_SRI
00031 # include "LanguageModelSRI.h"
00032 #include "LanguageModelParallelBackoff.h"
00033 #endif
00034 #ifdef LM_IRST
00035 # include "LanguageModelIRST.h"
00036 #endif
00037 #ifdef LM_RAND
00038 # include "LanguageModelRandLM.h"
00039 #endif
00040 #ifdef LM_ORLM
00041 # include "LanguageModelORLM.h"
00042 #endif
00043 #ifdef LM_REMOTE
00044 # include "LanguageModelRemote.h"
00045 #endif
00046 #ifdef LM_KEN
00047 # include "LanguageModelKen.h"
00048 #endif
00049 #ifdef LM_DMAP
00050 # include "LanguageModelDMapLM.h"
00051 #endif
00052
00053 #include "LanguageModel.h"
00054 #include "LanguageModelInternal.h"
00055 #include "LanguageModelSkip.h"
00056 #include "LanguageModelJoint.h"
00057
00058 using namespace std;
00059
00060 namespace Moses
00061 {
00062
00063 namespace LanguageModelFactory
00064 {
00065
00066 LanguageModel* CreateLanguageModel(LMImplementation lmImplementation
00067 , const std::vector<FactorType> &factorTypes
00068 , size_t nGramOrder
00069 , const std::string &languageModelFile
00070 , ScoreIndexManager &scoreIndexManager
00071 , int dub )
00072 {
00073 if (lmImplementation == Ken || lmImplementation == LazyKen) {
00074 #ifdef LM_KEN
00075 return ConstructKenLM(languageModelFile, scoreIndexManager, factorTypes[0], lmImplementation == LazyKen);
00076 #else
00077 UserMessage::Add("KenLM isn't compiled in but your config asked for it");
00078 return NULL;
00079 #endif
00080 }
00081 LanguageModelImplementation *lm = NULL;
00082 switch (lmImplementation) {
00083 case RandLM:
00084 #ifdef LM_RAND
00085 lm = new LanguageModelRandLM();
00086 #endif
00087 break;
00088 case ORLM:
00089 #ifdef LM_ORLM
00090 lm = new LanguageModelORLM();
00091 #endif
00092 break;
00093 case Remote:
00094 #ifdef LM_REMOTE
00095 lm = new LanguageModelRemote();
00096 #endif
00097 break;
00098
00099 case SRI:
00100 #ifdef LM_SRI
00101 lm = new LanguageModelSRI();
00102 #endif
00103 break;
00104 case IRST:
00105 #ifdef LM_IRST
00106 lm = new LanguageModelIRST(dub);
00107 #endif
00108 break;
00109 case Skip:
00110 #ifdef LM_SRI
00111 lm = new LanguageModelSkip(new LanguageModelSRI());
00112 #elif LM_INTERNAL
00113 lm = new LanguageModelSkip(new LanguageModelInternal());
00114 #endif
00115 break;
00116 case Joint:
00117 #ifdef LM_SRI
00118 lm = new LanguageModelJoint(new LanguageModelSRI());
00119 #elif LM_INTERNAL
00120 lm = new LanguageModelJoint(new LanguageModelInternal());
00121 #endif
00122 break;
00123 case ParallelBackoff:
00124 #ifdef LM_SRI
00125 lm = new LanguageModelParallelBackoff();
00126 #endif
00127 break;
00128 case Internal:
00129 #ifdef LM_INTERNAL
00130 lm = new LanguageModelInternal();
00131 #endif
00132 break;
00133 case DMapLM:
00134 #ifdef LM_DMAP
00135 lm = new LanguageModelDMapLM();
00136 #endif
00137 break;
00138 default:
00139 break;
00140 }
00141
00142 if (lm == NULL) {
00143 UserMessage::Add("Language model type unknown. Probably not compiled into library");
00144 return NULL;
00145 } else {
00146 switch (lm->GetLMType()) {
00147 case SingleFactor:
00148 if (! static_cast<LanguageModelSingleFactor*>(lm)->Load(languageModelFile, factorTypes[0], nGramOrder)) {
00149 cerr << "single factor model failed" << endl;
00150 delete lm;
00151 lm = NULL;
00152 }
00153 break;
00154 case MultiFactor:
00155 if (! static_cast<LanguageModelMultiFactor*>(lm)->Load(languageModelFile, factorTypes, nGramOrder)) {
00156 cerr << "multi factor model failed" << endl;
00157 delete lm;
00158 lm = NULL;
00159 }
00160 break;
00161 }
00162 }
00163
00164 return new LMRefCount(scoreIndexManager, lm);
00165 }
00166 }
00167
00168 }
00169