[dasher] More chinese fixes & tidying, inc language modelling...
- From: Patrick Welche <pwelche src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dasher] More chinese fixes & tidying, inc language modelling...
- Date: Fri, 28 May 2010 12:50:45 +0000 (UTC)
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]