[dasher: 7/16] Added method to check equivalence of two CPPMLanguageModels



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]