[dasher] More chinese fixes & tidying, inc language modelling...



commit ee21278aa12b171d5ddc735bd06ebec726456850
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date:   Fri Apr 30 14:02:23 2010 +0100

    More chinese fixes & tidying, inc language modelling...
    
      *Fix uniformity in PPMPYLanguageModel, restoring missing characters (!)
      *iPhone project file: remove PinYinConversionHelper
      *Rename PPMPYLanguageModel::GetPYProbs to GetProbs, removing special-case call
      *Fix offsets in MandarinAlphMgr

 .../LanguageModelling/PPMPYLanguageModel.cpp       |  100 +++++++++-----------
 .../LanguageModelling/PPMPYLanguageModel.h         |    4 +-
 Src/DasherCore/MandarinAlphMgr.cpp                 |   36 ++++---
 Src/DasherCore/NodeCreationManager.cpp             |   20 ++---
 Src/DasherCore/NodeCreationManager.h               |    1 -
 Src/iPhone/Dasher.xcodeproj/project.pbxproj        |    6 -
 6 files changed, 75 insertions(+), 92 deletions(-)
---
diff --git a/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.cpp b/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.cpp
index 89257a5..85fad58 100644
--- a/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.cpp
+++ b/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.cpp
@@ -67,7 +67,10 @@ CPPMPYLanguageModel::~CPPMPYLanguageModel() {
 /////////////////////////////////////////////////////////////////////
 // Get the probability distribution at the context
 
-void CPPMPYLanguageModel::GetProbs(Context context, std::vector<unsigned int> &probs, int norm, int iUniform) const {
+//ACL This is Will's original GetProbs() method - AFAICT unused, as the only
+// potential call site tested for MandarinDasher and if so explicitly called
+// the old GetPYProbs instead (!)...so have renamed latter to Get Probs instead...
+/*void CPPMPYLanguageModel::GetProbs(Context context, std::vector<unsigned int> &probs, int norm, int iUniform) const {
   const CPPMPYContext *ppmcontext = (const CPPMPYContext *)(context);
 
   //  DASHER_ASSERT(m_setContexts.count(ppmcontext) > 0);
@@ -185,10 +188,10 @@ void CPPMPYLanguageModel::GetProbs(Context context, std::vector<unsigned int> &p
   }
 
   DASHER_ASSERT(iToSpend == 0);
-}
+}*/
 
 void CPPMPYLanguageModel::GetPartProbs(Context context, std::vector<pair<symbol, unsigned int> > &vChildren, int norm, int iUniform){
-  
+  DASHER_ASSERT(!vChildren.empty());
   
   if(vChildren.size() == 1){
     vChildren[0].second = norm;
@@ -212,16 +215,16 @@ void CPPMPYLanguageModel::GetPartProbs(Context context, std::vector<pair<symbol,
   
   //Reproduce iterative calculations with SCENode trie
 
-  if(vChildren.size()){
-    vChildren[0].second = 0;
-    int i=1;
-    for (std::vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin()+1; it!=vChildren.end(); it++) {
-      it->second = iUniformLeft / (vChildren.size() - i);
+  //ACL following loop distributes the part of the probability mass assigned the uniform distribution.
+  // In Will's code, it assigned 0 to the first entry, then split evenly among the rest...seems wrong?!
+  int i=0;
+  for (std::vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin(); it!=vChildren.end(); it++) {
+    DASHER_ASSERT(it->first > -1 && it->first <= m_iAlphSize);
+    it->second = iUniformLeft / (vChildren.size() - i);
       //  std::cout<<"iUniformLeft: "<<iUniformLeft<<std::endl;
-      iUniformLeft -= it->second;
-      iToSpend -= it->second;
-      i++;
-    }
+    iUniformLeft -= it->second;
+    iToSpend -= it->second;
+    i++;
   }
 
   DASHER_ASSERT(iUniformLeft == 0);
@@ -229,27 +232,19 @@ void CPPMPYLanguageModel::GetPartProbs(Context context, std::vector<pair<symbol,
   int alpha = GetLongParameter( LP_LM_ALPHA );
   int beta = GetLongParameter( LP_LM_BETA );
 
-  CPPMPYnode *pTemp = ppmcontext->head;
-  CPPMPYnode *pFound;
   std::vector<CPPMPYnode *> vNodeStore;
 
   //new code
-  while(pTemp!=0){
+  for (CPPMPYnode *pTemp = ppmcontext->head; pTemp; pTemp=pTemp->vine) {
     int iTotal =0;
     vNodeStore.clear();
-    int i=0;
     for (std::vector<pair<symbol, unsigned int> >::const_iterator it = vChildren.begin(); it!=vChildren.end(); it++) {
 
-      pFound = pTemp->find_symbol(it->first);
-      //Mark: do we need to treat the exception of -1 separately?     
-      if(pFound){
-	  iTotal += pFound->count;
-	  vNodeStore.push_back(pFound);
-      }
-      else
-	vNodeStore.push_back(NULL);
-	
-      i++;
+      if (CPPMPYnode *pFound = pTemp->find_symbol(it->first)) {
+        iTotal += pFound->count;
+        vNodeStore.push_back(pFound);
+      } else
+        vNodeStore.push_back(NULL);
     }
     
 
@@ -261,23 +256,16 @@ void CPPMPYLanguageModel::GetPartProbs(Context context, std::vector<pair<symbol,
       for (vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin(); it!=vChildren.end(); it++) {
         if(vNodeStore[i]) {
           unsigned int p = static_cast < myint > (size_of_slice) * (100 * vNodeStore[i]->count - beta) / (100 * iTotal + alpha);
-          if((it->first>-1)&&(it->first<=m_iAlphSize)){
-            it->second += p;
-            iToSpend -= p;
-          }
+          it->second += p;
+          iToSpend -= p;
         }
         i++;
       }
     }
-    pTemp = pTemp->vine;
   }
   //code
   //std::cout<<"after lan mod second loop"<<std::endl;
 
-  
-  unsigned int size_of_slice = iToSpend;
-  int symbolsleft = vChildren.size()-1;
-
 //      std::ostringstream str;
 //      for (sym=0;sym<modelchars;sym++)
 //              str << probs[sym] << " ";
@@ -290,31 +278,29 @@ void CPPMPYLanguageModel::GetPartProbs(Context context, std::vector<pair<symbol,
 //      str2 << std::endl;
 //      DASHER_TRACEOUTPUT("valid %s",str2.str().c_str());
   //std::cout<<"after lan mod third loop"<<std::endl;
-  
-  if(vChildren.size()) {
-    int i=1;
-    for (std::vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin()+1; it!=vChildren.end(); it++) {
-      unsigned int p = size_of_slice / symbolsleft;
-      it->second += p;
-      iToSpend -= p;
-      i++;
-    }
+
+  //allow for rounding error by distributing the leftovers evenly amongst all elements...
+  // (ACL: previous code assigned nothing to element. Why? - I'm guessing due to confusion
+  //  with other LM code where the first element of the probability array was a dummy,
+  // storing 0 probability mass assigned to the 'root symbol' - not the case here!)
+  unsigned int p = iToSpend / vChildren.size();
+  for (std::vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin(); it!=vChildren.end(); it++) {
+    it->second += p;
+    iToSpend -= p;
   }
   // std::cout<<"after lan mod fourth loop"<<std::endl;
   int iLeft = vChildren.size()-1;
 
-  if(vChildren.size()) {
-    //  std::cout<<"iNumsyjbols "<<vChildren.size()<<std::endl;
+  //  std::cout<<"iNumsyjbols "<<vChildren.size()<<std::endl;
 
-    for (std::vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin()+1; it!=vChildren.end(); it++) {
+  for (std::vector<pair<symbol, unsigned int> >::iterator it = vChildren.begin()+1; it!=vChildren.end(); it++) {
 
-      //     std::cout<<"iLeft "<<iLeft<<std::endl;
-      //  std::cout<<"iToSpend "<<iToSpend<<std::endl;
-      unsigned int p = iToSpend / iLeft;
-      it->second += p;
-      --iLeft;
-      iToSpend -= p;
-    }
+    //     std::cout<<"iLeft "<<iLeft<<std::endl;
+    //  std::cout<<"iToSpend "<<iToSpend<<std::endl;
+    unsigned int p = iToSpend / iLeft;
+    it->second += p;
+    --iLeft;
+    iToSpend -= p;
   }
 
   //std::cout<<"after lan mod fifth loop"<<std::endl;
@@ -323,8 +309,10 @@ void CPPMPYLanguageModel::GetPartProbs(Context context, std::vector<pair<symbol,
 
 }
 
-
-void CPPMPYLanguageModel::GetPYProbs(Context context, std::vector<unsigned int> &probs, int norm, int iUniform) {
+//ACL this was Will's original "GetPYProbs" method - explicitly called instead of GetProbs
+// by an explicit cast to PPMPYLanguageModel whenever MandarinDasher was activated. Renaming
+// to GetProbs causes the normal (virtual) call to come straight here without any special-casing...
+void CPPMPYLanguageModel::GetProbs(Context context, std::vector<unsigned int> &probs, int norm, int iUniform) const {
   const CPPMPYContext *ppmcontext = (const CPPMPYContext *)(context);
 
 
diff --git a/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.h b/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.h
index 7ad933d..fcca317 100644
--- a/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.h
+++ b/Src/DasherCore/LanguageModelling/PPMPYLanguageModel.h
@@ -88,7 +88,9 @@ namespace Dasher {
     virtual void LearnPYSymbol(Context context, int Symbol);
 
     virtual void GetProbs(Context context, std::vector < unsigned int >&Probs, int norm, int iUniform) const;
-    void GetPYProbs(Context context, std::vector < unsigned int >&Probs, int norm, int iUniform);
+    
+    //ACL renamed, just call GetProbs instead:
+    //void GetPYProbs(Context context, std::vector < unsigned int >&Probs, int norm, int iUniform);
 
     void GetPartProbs(Context context, std::vector<std::pair<symbol, unsigned int> > &vChildren, int norm, int iUniform);
 
diff --git a/Src/DasherCore/MandarinAlphMgr.cpp b/Src/DasherCore/MandarinAlphMgr.cpp
index c276ed1..5ca8f92 100644
--- a/Src/DasherCore/MandarinAlphMgr.cpp
+++ b/Src/DasherCore/MandarinAlphMgr.cpp
@@ -79,7 +79,10 @@ CDasherNode *CMandarinAlphMgr::CreateSymbolNode(CAlphNode *pParent, symbol iSymb
     pInfo->iColour = 9;
     //CTrieNode parallels old PinyinConversionHelper's SetConvSymbol:
     CConvRoot *pNewNode = new CConvRoot(pParent, iLbnd, iHbnd, pInfo, this, m_pParser->GetTrieNode(m_pNCManager->GetAlphabet()->GetDisplayText(iSymbol)));
-    pNewNode->m_iOffset = pParent->m_iOffset+1;
+
+    //keep same offset, as we still haven't entered/selected a definite symbol
+    pNewNode->m_iOffset = pParent->m_iOffset;
+
     //from ConversionHelper:
     //pNewNode->m_pLanguageModel = m_pLanguageModel;
     pNewNode->iContext = m_pLanguageModel->CloneContext(pParent->iContext);
@@ -126,7 +129,6 @@ void CMandarinAlphMgr::CConvRoot::PopulateChildren() {
   // TODO: Fixme
   int parentClr = 0;
   // Finally loop through and create the children
-  
   for (vector<pair<symbol, unsigned int> >::const_iterator it = m_vChInfo.begin(); it!=m_vChInfo.end(); it++) {
     //      std::cout << "Current scec: " << pCurrentSCEChild << std::endl;
     unsigned int iLbnd(iCum);
@@ -138,7 +140,7 @@ void CMandarinAlphMgr::CConvRoot::PopulateChildren() {
     // what's right    
     
     CDasherNode::SDisplayInfo *pDisplayInfo = new CDasherNode::SDisplayInfo;
-    pDisplayInfo->iColour = m_pMgr->AssignColour(parentClr, iIdx);
+    pDisplayInfo->iColour = (m_vChInfo.size()==1) ? GetDisplayInfo()->iColour : m_pMgr->AssignColour(parentClr, iIdx);
     pDisplayInfo->bShove = true;
     pDisplayInfo->bVisible = true;
     
@@ -172,17 +174,12 @@ void CMandarinAlphMgr::CConvRoot::PopulateChildren() {
 
 void CMandarinAlphMgr::AssignSizes(std::vector<pair<symbol,unsigned int> > &vChildren, Dasher::CLanguageModel::Context context) {
 
-  const int iNorm(m_pNCManager->GetLongParameter(LP_NORMALIZATION));
-  const int uniform(m_pNCManager->GetLongParameter(LP_UNIFORM));
+  const uint64 iNorm(m_pNCManager->GetLongParameter(LP_NORMALIZATION));
+  const unsigned int uniform((m_pNCManager->GetLongParameter(LP_UNIFORM)*iNorm)/1000);
   
-  int iSymbols = m_pNCManager->GetAlphabet()->GetNumberSymbols(); 
   int iRemaining(iNorm);
   
-  //Kept normalization base from old code   
-  const int uniform_add(((iNorm * uniform) / 1000) / (iSymbols - 2));  // Subtract 2 from no symbols to lose control/root nodes;
-  const int nonuniform_norm(iNorm - (iSymbols - 2) * uniform_add);
-  
-  unsigned long long int sumProb=0;
+  uint64 sumProb=0;
   
   //CLanguageModel::Context iCurrentContext;
   
@@ -190,7 +187,9 @@ void CMandarinAlphMgr::AssignSizes(std::vector<pair<symbol,unsigned int> > &vChi
   
   //  std::cout<<"norm input: "<<nonuniform_norm/(iSymbols/iNChildren/100)<<std::endl;
   
-  static_cast<CPPMPYLanguageModel *>(m_pLanguageModel)->GetPartProbs(context, vChildren, nonuniform_norm, 0);
+  //ACL pass in iNorm and uniform directly - GetPartProbs distributes the last param between
+  // however elements there are in vChildren...
+  static_cast<CPPMPYLanguageModel *>(m_pLanguageModel)->GetPartProbs(context, vChildren, iNorm, uniform);
   
   //std::cout<<"after get probs "<<std::endl;
   
@@ -209,12 +208,17 @@ void CMandarinAlphMgr::AssignSizes(std::vector<pair<symbol,unsigned int> > &vChi
   
   for (std::vector<pair<symbol,unsigned int> >::iterator it = vChildren.begin(); it!=vChildren.end(); it++) {
     DASHER_ASSERT(it->first>-1); //ACL Will's code tested for both these conditions explicitly, and if so 
-    DASHER_ASSERT(sumProb>0);   //then used a probability if 0 (well, max(1,0)=>1). I don't think either
+    DASHER_ASSERT(sumProb>0);   //then used a probability of 0. I don't think either
                                 //should ever happen if the alphabet files are right (there'd have to
                                 //be either no conversions of the syllable+tone, or else the LM'd have
                                 //to assign zero probability to each), so I'm removing these tests for now...
-    iRemaining -= it->second = max(1,int((it->second*iNorm)/sumProb));
-                
+    iRemaining -= it->second = (it->second*iNorm)/sumProb;
+    if (it->second==0) {
+#ifdef DEBUG
+      std::cout << "WARNING: Erasing zero-probability conversion with symbol " << it->first << std::endl;
+#endif
+      vChildren.erase(it--);
+    }
     //  std::cout<<pNode->pszConversion<<std::endl;
     // std::cout<<pNode->Symbol<<std::endl;
     //    std::cout<<"Probs i "<<pNode<<std::endl;
@@ -242,6 +246,8 @@ void CMandarinAlphMgr::AssignSizes(std::vector<pair<symbol,unsigned int> > &vChi
     //std::cout<<"is "<<pNode->NodeSize<<std::endl;
   }
   
+  DASHER_ASSERT(iRemaining == 0);
+  
 }
 
 static int colourStore[2][3] = {
diff --git a/Src/DasherCore/NodeCreationManager.cpp b/Src/DasherCore/NodeCreationManager.cpp
index 54661f9..99ff864 100644
--- a/Src/DasherCore/NodeCreationManager.cpp
+++ b/Src/DasherCore/NodeCreationManager.cpp
@@ -36,11 +36,9 @@ CNodeCreationManager::CNodeCreationManager(Dasher::CDasherInterfaceBase *pInterf
   
   // Create an appropriate language model;
   
-  m_iConversionID = oAlphInfo.m_iConversionID;
-  
   //WZ: Mandarin Dasher Change
   //If statement checks for the specific Super PinYin alphabet, and sets language model to PPMPY
-  if((m_iConversionID==2)&&(pSettingsStore->GetStringParameter(SP_ALPHABET_ID)=="Chinese Super Pin Yin, grouped by Dictionary")){
+  if((oAlphInfo.m_iConversionID==2)&&(pSettingsStore->GetStringParameter(SP_ALPHABET_ID)=="Chinese Super Pin Yin, grouped by Dictionary")){
     
     std::string CHAlphabet = "Chinese / ç®?ä½?中æ?? (simplified chinese, in pin yin groups)";
     Dasher::CAlphIO::AlphInfo oCHAlphInfo = pAlphIO->GetInfo(CHAlphabet);
@@ -85,7 +83,7 @@ CNodeCreationManager::CNodeCreationManager(Dasher::CDasherInterfaceBase *pInterf
   // don't end up having to duck out to the NCM all the time
   
   //(ACL) Modify AlphabetManager for Mandarin Dasher
-  if (m_iConversionID == 2)
+  if (oAlphInfo.m_iConversionID == 2)
     m_pAlphabetManager = new CMandarinAlphMgr(pInterface, this, m_pLanguageModel);
   else
     m_pAlphabetManager = new CAlphabetManager(pInterface, this, m_pLanguageModel);
@@ -127,7 +125,7 @@ CNodeCreationManager::CNodeCreationManager(Dasher::CDasherInterfaceBase *pInterf
   m_pControlManager = 0;
 #endif
   
-  switch(m_iConversionID) {
+  switch(oAlphInfo.m_iConversionID) {
     default:
       //TODO: Error reporting here
       //fall through to
@@ -216,14 +214,10 @@ void CNodeCreationManager::GetProbs(CLanguageModel::Context context, std::vector
    
    //  m_pLanguageModel->GetProbs(context, Probs, iNorm, ((iNorm * uniform) / 1000));
    
-   //WZ: Mandarin Dasher Change
-   if(m_iConversionID==2){
-     //Mark: static cast ok?
-     static_cast<CPPMPYLanguageModel *>(m_pLanguageModel)->GetPYProbs(context, Probs, iNorm, 0);
-   }
-   else
-     //End Mandarin Dasher Change
-     m_pLanguageModel->GetProbs(context, Probs, iNorm, 0);
+   //ACL used to test explicitly for MandarinDasher and if so called GetPYProbs instead
+   // (by statically casting to PPMPYLanguageModel). However, have renamed PPMPYLanguageModel::GetPYProbs
+   // to GetProbs as per ordinary language model, so no need to test....
+   m_pLanguageModel->GetProbs(context, Probs, iNorm, 0);
 
    // #if _DEBUG
    //int iTotal = 0;
diff --git a/Src/DasherCore/NodeCreationManager.h b/Src/DasherCore/NodeCreationManager.h
index ce33a86..f189feb 100644
--- a/Src/DasherCore/NodeCreationManager.h
+++ b/Src/DasherCore/NodeCreationManager.h
@@ -71,7 +71,6 @@ class CNodeCreationManager : public Dasher::CDasherComponent {
   Dasher::CAlphabet *m_pAlphabet;        // pointer to the alphabet
   Dasher::CTrainer *m_pTrainer;
   
-  int m_iConversionID;
   
   Dasher::CAlphabetManager *m_pAlphabetManager;
   Dasher::CControlManager *m_pControlManager;
diff --git a/Src/iPhone/Dasher.xcodeproj/project.pbxproj b/Src/iPhone/Dasher.xcodeproj/project.pbxproj
index 9b8eb7c..86502f8 100755
--- a/Src/iPhone/Dasher.xcodeproj/project.pbxproj
+++ b/Src/iPhone/Dasher.xcodeproj/project.pbxproj
@@ -130,7 +130,6 @@
 		3344FE520F71717C00506EAA /* OneButtonDynamicFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDE60F71717C00506EAA /* OneButtonDynamicFilter.cpp */; };
 		3344FE530F71717C00506EAA /* OneButtonFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDE80F71717C00506EAA /* OneButtonFilter.cpp */; };
 		3344FE540F71717C00506EAA /* OneDimensionalFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDEA0F71717C00506EAA /* OneDimensionalFilter.cpp */; };
-		3344FE550F71717C00506EAA /* PinYinConversionHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDED0F71717C00506EAA /* PinYinConversionHelper.cpp */; };
 		3344FE560F71717C00506EAA /* PinyinParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDEF0F71717C00506EAA /* PinyinParser.cpp */; };
 		3344FE570F71717C00506EAA /* SCENode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDF10F71717C00506EAA /* SCENode.cpp */; };
 		3344FE580F71717C00506EAA /* SettingsStore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344FDF30F71717C00506EAA /* SettingsStore.cpp */; };
@@ -422,8 +421,6 @@
 		3344FDEA0F71717C00506EAA /* OneDimensionalFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OneDimensionalFilter.cpp; sourceTree = "<group>"; };
 		3344FDEB0F71717C00506EAA /* OneDimensionalFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneDimensionalFilter.h; sourceTree = "<group>"; };
 		3344FDEC0F71717C00506EAA /* Parameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Parameters.h; sourceTree = "<group>"; };
-		3344FDED0F71717C00506EAA /* PinYinConversionHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PinYinConversionHelper.cpp; sourceTree = "<group>"; };
-		3344FDEE0F71717C00506EAA /* PinYinConversionHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PinYinConversionHelper.h; sourceTree = "<group>"; };
 		3344FDEF0F71717C00506EAA /* PinyinParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PinyinParser.cpp; sourceTree = "<group>"; };
 		3344FDF00F71717C00506EAA /* PinyinParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PinyinParser.h; sourceTree = "<group>"; };
 		3344FDF10F71717C00506EAA /* SCENode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SCENode.cpp; sourceTree = "<group>"; };
@@ -864,8 +861,6 @@
 				332F32AE103C8A1E008448D7 /* MandarinAlphMgr.h */,
 				332F32AF103C8A1E008448D7 /* Trainer.cpp */,
 				332F32B0103C8A1E008448D7 /* Trainer.h */,
-				3344FDED0F71717C00506EAA /* PinYinConversionHelper.cpp */,
-				3344FDEE0F71717C00506EAA /* PinYinConversionHelper.h */,
 				3344FDEF0F71717C00506EAA /* PinyinParser.cpp */,
 				3344FDF00F71717C00506EAA /* PinyinParser.h */,
 				3344FDF10F71717C00506EAA /* SCENode.cpp */,
@@ -1206,7 +1201,6 @@
 				3344FE520F71717C00506EAA /* OneButtonDynamicFilter.cpp in Sources */,
 				3344FE530F71717C00506EAA /* OneButtonFilter.cpp in Sources */,
 				3344FE540F71717C00506EAA /* OneDimensionalFilter.cpp in Sources */,
-				3344FE550F71717C00506EAA /* PinYinConversionHelper.cpp in Sources */,
 				3344FE560F71717C00506EAA /* PinyinParser.cpp in Sources */,
 				3344FE570F71717C00506EAA /* SCENode.cpp in Sources */,
 				3344FE580F71717C00506EAA /* SettingsStore.cpp in Sources */,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]