[dasher: 7/16] Added method to check equivalence of two CPPMLanguageModels
- From: Patrick Welche <pwelche src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [dasher: 7/16] Added method to check equivalence of two CPPMLanguageModels
- Date: Tue, 1 Dec 2009 16:14:43 +0000 (UTC)
commit 560fb11f6a636cb0d655ddf5f8fcada2745901da
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date: Thu Jul 30 10:44:13 2009 +0100
Added method to check equivalence of two CPPMLanguageModels
(done if #ifdef DEBUG_LM_READWRITE)
Also fixed ReadFromFile, using above to check it matches with WriteToFile!
.../LanguageModelling/PPMLanguageModel.cpp | 36 ++++++++++++++++++++
.../LanguageModelling/PPMLanguageModel.h | 3 +-
Src/DasherCore/NodeCreationManager.cpp | 15 ++++++++-
3 files changed, 52 insertions(+), 2 deletions(-)
---
diff --git a/Src/DasherCore/LanguageModelling/PPMLanguageModel.cpp b/Src/DasherCore/LanguageModelling/PPMLanguageModel.cpp
index 7cecb93..0f5b1c8 100644
--- a/Src/DasherCore/LanguageModelling/PPMLanguageModel.cpp
+++ b/Src/DasherCore/LanguageModelling/PPMLanguageModel.cpp
@@ -329,10 +329,45 @@ void CPPMLanguageModel::dump()
*/
}
+bool CPPMLanguageModel::eq(CPPMLanguageModel *other) {
+ std::map<CPPMnode *,CPPMnode *> equivs;
+ if (!m_pRoot->eq(other->m_pRoot,equivs)) return false;
+ //have first & second being equivalent, for all entries in map, except vine ptrs not checked.
+ for (std::map<CPPMnode *,CPPMnode *>::iterator it=equivs.begin(); it!=equivs.end(); it++) {
+ CPPMnode *myVine = it->first->vine;
+ CPPMnode *oVine = it->second->vine;
+ if (myVine==NULL) {
+ if (oVine==NULL) continue;
+ return false;
+ } else if (oVine==NULL) return false;
+ std::map<CPPMnode *,CPPMnode *>::iterator found = equivs.find(myVine);
+ if (found->second != oVine) return false;
+ }
+ return true;
+}
+
////////////////////////////////////////////////////////////////////////
/// PPMnode definitions
////////////////////////////////////////////////////////////////////////
+bool CPPMLanguageModel::CPPMnode::eq(CPPMLanguageModel::CPPMnode *other, std::map<CPPMnode *,CPPMnode *> &equivs) {
+ if (sym != other->sym)
+ return false;
+ if (count != other->count)
+ return false;
+ //check children....but allow for different orders by sorting into symbol order
+ std::map<symbol, CPPMnode *> thisCh, otherCh;
+ for (ChildIterator it = children(); it != end(); it++) thisCh[(*it)->sym] = *it;
+ for (ChildIterator it = other->children(); it != other->end(); it++) otherCh[(*it)->sym] = *it;
+ if (thisCh.size() != otherCh.size())
+ return false;
+ for (std::map<symbol, CPPMnode *>::iterator it1 = thisCh.begin(), it2=otherCh.begin(); it1 != thisCh.end() ; it1++, it2++)
+ if (!it1->second->eq(it2->second, equivs))
+ return false; //different - note eq checks symbol
+ equivs.insert(std::pair<CPPMnode *,CPPMnode *>(this,other));
+ return true;
+}
+
CPPMLanguageModel::CPPMnode * CPPMLanguageModel::CPPMnode::find_symbol(symbol sym) const
// see if symbol is a child of node
{
@@ -498,6 +533,7 @@ bool CPPMLanguageModel::ReadFromFile(std::string strFilename) {
};
CPPMLanguageModel::CPPMnode *CPPMLanguageModel::GetAddress(int iIndex, std::map<int, CPPMnode*> *pMap) {
+ if (iIndex==0) return NULL;
std::map<int, CPPMnode*>::iterator it(pMap->find(iIndex));
if(it == pMap->end()) {
diff --git a/Src/DasherCore/LanguageModelling/PPMLanguageModel.h b/Src/DasherCore/LanguageModelling/PPMLanguageModel.h
index 24483a8..6445900 100644
--- a/Src/DasherCore/LanguageModelling/PPMLanguageModel.h
+++ b/Src/DasherCore/LanguageModelling/PPMLanguageModel.h
@@ -44,6 +44,7 @@ namespace Dasher {
symbol sym;
CPPMnode(symbol sym);
CPPMnode();
+ bool eq(CPPMnode *other, std::map<CPPMnode *,CPPMnode *> &equivs);
};
class ChildIterator {
public:
@@ -74,7 +75,7 @@ namespace Dasher {
};
public:
CPPMLanguageModel(Dasher::CEventHandler * pEventHandler, CSettingsStore * pSettingsStore, const CSymbolAlphabet & alph);
-
+ bool eq(CPPMLanguageModel *other);
virtual ~ CPPMLanguageModel();
Context CreateEmptyContext();
diff --git a/Src/DasherCore/NodeCreationManager.cpp b/Src/DasherCore/NodeCreationManager.cpp
index d6498c8..844c5ee 100644
--- a/Src/DasherCore/NodeCreationManager.cpp
+++ b/Src/DasherCore/NodeCreationManager.cpp
@@ -30,7 +30,20 @@ CNodeCreationManager::CNodeCreationManager(Dasher::CDasherInterfaceBase *pInterf
pTrainer->Train(GetStringParameter(SP_USER_LOC), GetStringParameter(SP_SYSTEM_LOC));
delete pTrainer;
-
+#ifdef DEBUG_LM_READWRITE
+ {
+ //test...
+ m_pLanguageModel->WriteToFile("test.model");
+ CPPMLanguageModel *pLan = (CPPMLanguageModel *)m_pLanguageModel;
+ CPPMLanguageModel *pLM2 = new CPPMLanguageModel(pEventHandler, pSettingsStore, pLan->SymbolAlphabet());
+ pLM2->ReadFromFile("test.model");
+ if (!pLan->eq(pLM2)) {
+ std::cout << "Not equal!" << std::endl;
+ pLM2->WriteToFile("test2.model");
+ }
+ delete pLM2;
+ }
+#endif
#ifndef _WIN32_WCE
m_pControlManager = new CControlManager(this);
#else
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]