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 "Factory.h"
00025 #include "moses/UserMessage.h"
00026 #include "moses/TypeDef.h"
00027 #include "moses/FactorCollection.h"
00028
00029
00030 #ifdef LM_SRI
00031 # include "SRI.h"
00032 #include "ParallelBackoff.h"
00033 #endif
00034 #ifdef LM_IRST
00035 # include "IRST.h"
00036 #endif
00037 #ifdef LM_RAND
00038 # include "Rand.h"
00039 #endif
00040
00041 #include "ORLM.h"
00042
00043 #ifdef LM_REMOTE
00044 # include "Remote.h"
00045 #endif
00046
00047 #include "Ken.h"
00048 #include "Backward.h"
00049
00050 #ifdef LM_LDHT
00051 # include "LDHT.h"
00052 #endif
00053
00054 #include "Base.h"
00055 #include "Joint.h"
00056
00057 using namespace std;
00058
00059 namespace Moses
00060 {
00061
00062 namespace LanguageModelFactory
00063 {
00064
00065 LanguageModel* CreateLanguageModel(LMImplementation lmImplementation
00066 , const std::vector<FactorType> &factorTypes
00067 , size_t nGramOrder
00068 , const std::string &languageModelFile
00069 , int dub)
00070 {
00071 if (lmImplementation == Ken || lmImplementation == LazyKen) {
00072 return ConstructKenLM(languageModelFile, factorTypes[0], lmImplementation == LazyKen);
00073 } else if (lmImplementation == BackwardLM || lmImplementation == LazyBackwardLM) {
00074 return ConstructBackwardLM(languageModelFile, factorTypes[0], lmImplementation == LazyBackwardLM);
00075 }
00076 LanguageModelImplementation *lm = NULL;
00077 switch (lmImplementation) {
00078 case RandLM:
00079 #ifdef LM_RAND
00080 lm = NewRandLM();
00081 #endif
00082 break;
00083 case ORLM:
00084 lm = new LanguageModelORLM();
00085 break;
00086 case Remote:
00087 #ifdef LM_REMOTE
00088 lm = new LanguageModelRemote();
00089 #endif
00090 break;
00091
00092 case SRI:
00093 #ifdef LM_SRI
00094 lm = new LanguageModelSRI();
00095 #endif
00096 break;
00097 case IRST:
00098 #ifdef LM_IRST
00099 lm = new LanguageModelIRST(dub);
00100 #endif
00101 break;
00102 case Joint:
00103 #ifdef LM_SRI
00104 lm = new LanguageModelJoint(new LanguageModelSRI());
00105 #endif
00106 break;
00107 case ParallelBackoff:
00108 #ifdef LM_SRI
00109 lm = NewParallelBackoff();
00110 #endif
00111 break;
00112 case LDHTLM:
00113 #ifdef LM_LDHT
00114 return ConstructLDHTLM(languageModelFile,
00115 scoreIndexManager,
00116 factorTypes[0]);
00117 #endif
00118 break;
00119 default:
00120 break;
00121 }
00122
00123 if (lm == NULL) {
00124 UserMessage::Add("Language model type unknown. Probably not compiled into library");
00125 return NULL;
00126 } else {
00127 switch (lm->GetLMType()) {
00128 case SingleFactor:
00129 if (! static_cast<LanguageModelSingleFactor*>(lm)->Load(languageModelFile, factorTypes[0], nGramOrder)) {
00130 cerr << "single factor model failed" << endl;
00131 delete lm;
00132 lm = NULL;
00133 }
00134 break;
00135 case MultiFactor:
00136 if (! static_cast<LanguageModelMultiFactor*>(lm)->Load(languageModelFile, factorTypes, nGramOrder)) {
00137 cerr << "multi factor model failed" << endl;
00138 delete lm;
00139 lm = NULL;
00140 }
00141 break;
00142 }
00143 }
00144
00145 return new LMRefCount(lm);
00146 }
00147 }
00148
00149 }
00150