[dasher: 9/27] (Untested!) Remove CAlphabet* pointer from UserLog



commit 5bea49f474c2181fb0dc8d9c343fdd0994307e97
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date:   Thu Aug 5 20:44:51 2010 +0100

    (Untested!) Remove CAlphabet* pointer from UserLog
    
    it was only ever used to reconstruct (via GetText) the text for SymbolProb's
    reported in symbol node output; so I've combined SymbolProbDisplay into
    SymbolProb, making the nodes provide said text themselves.
    (TODO: could add symbol no. and prob (conditionally, #ifdef ?) to CEditEvent
       and trap that in UserLog, removing the extra params from Output altogether?)
    (TODO: also, I think the calculation of probabilities is broken: it uses
     Range() of the node / normalization, ignoring that for symbols inside subgroups
     their Range() will be relative to the subgroup, not the previous letter...)

 Src/DasherCore/AlphabetManager.cpp     |    6 +--
 Src/DasherCore/BasicLog.h              |    1 -
 Src/DasherCore/DasherInterfaceBase.cpp |    9 +----
 Src/DasherCore/DasherTypes.h           |   16 ++------
 Src/DasherCore/UserLog.cpp             |   23 +----------
 Src/DasherCore/UserLog.h               |    4 +-
 Src/DasherCore/UserLogBase.h           |    1 -
 Src/DasherCore/UserLogTrial.cpp        |   64 +++++++++++--------------------
 Src/DasherCore/UserLogTrial.h          |    7 +--
 9 files changed, 35 insertions(+), 96 deletions(-)
---
diff --git a/Src/DasherCore/AlphabetManager.cpp b/Src/DasherCore/AlphabetManager.cpp
index 2b06b52..81372de 100644
--- a/Src/DasherCore/AlphabetManager.cpp
+++ b/Src/DasherCore/AlphabetManager.cpp
@@ -428,11 +428,7 @@ void CAlphabetManager::CSymbolNode::Output(Dasher::VECTOR_SYMBOL_PROB* pAdded, i
 
   // Track this symbol and its probability for logging purposes
   if (pAdded != NULL) {
-    Dasher::SymbolProb sItem;
-    sItem.sym    = iSymbol;
-    sItem.prob   = Range() / (double)iNormalization;
-
-    pAdded->push_back(sItem);
+    pAdded->push_back(Dasher::SymbolProb(iSymbol, outputText(), Range() / (double)iNormalization));
   }
 }
 
diff --git a/Src/DasherCore/BasicLog.h b/Src/DasherCore/BasicLog.h
index a1a89a1..32207fb 100644
--- a/Src/DasherCore/BasicLog.h
+++ b/Src/DasherCore/BasicLog.h
@@ -24,7 +24,6 @@ class CBasicLog : public CUserLogBase {
   virtual void AddMouseLocation(int iX, int iY, float dNats) {};
   virtual void AddMouseLocationNormalized(int iX, int iY, bool bStoreIntegerRep, float dNats) {};
   virtual void OutputFile() {};
-  virtual void SetAlphabetPtr(Dasher::CAlphabet* pAlphabet = 0) {};
   virtual void InitIsDone() {};
   virtual void SetOuputFilename(const string& strFilename = "") {};
   virtual int GetLogLevelMask() {return 0;};
diff --git a/Src/DasherCore/DasherInterfaceBase.cpp b/Src/DasherCore/DasherInterfaceBase.cpp
index 1321caa..faf81b0 100644
--- a/Src/DasherCore/DasherInterfaceBase.cpp
+++ b/Src/DasherCore/DasherInterfaceBase.cpp
@@ -159,7 +159,7 @@ void CDasherInterfaceBase::Realize() {
   if(iUserLogLevel == 10)
     m_pUserLog = new CBasicLog(m_pEventHandler, m_pSettingsStore);
   else if (iUserLogLevel > 0)
-    m_pUserLog = new CUserLog(m_pEventHandler, m_pSettingsStore, iUserLogLevel, m_Alphabet);
+    m_pUserLog = new CUserLog(m_pEventHandler, m_pSettingsStore, iUserLogLevel);
 #else
   m_pUserLog = NULL;
 #endif
@@ -636,13 +636,6 @@ void CDasherInterfaceBase::ChangeAlphabet() {
 
   CreateNCManager();
 
-#ifndef _WIN32_WCE
-  // Let our user log object know about the new alphabet since
-  // it needs to convert symbols into text for the log file.
-  if (m_pUserLog != NULL)
-    m_pUserLog->SetAlphabetPtr(m_Alphabet);
-#endif
-
   // Apply options from alphabet
 
   SetBoolParameter( BP_TRAINING, false );
diff --git a/Src/DasherCore/DasherTypes.h b/Src/DasherCore/DasherTypes.h
index 8deead7..1de308c 100644
--- a/Src/DasherCore/DasherTypes.h
+++ b/Src/DasherCore/DasherTypes.h
@@ -95,23 +95,15 @@ namespace Dasher {
   // user logging purposes.
   struct SymbolProb
   {
+  public:
+    SymbolProb(symbol _sym, const std::string &sDisp, double _prob)
+      : sym(_sym), strDisplay(sDisp), prob(_prob) {}
     symbol          sym;
-    double          prob;
-  };
-
-  // Keeps track of the display text and prob of a past symbol.
-  // We need to store this as the alphabet could change in the
-  // middle of a trial and we won't be able to convert symbols
-  // to text once it does.
-  struct SymbolProbDisplay
-  {
-    symbol          sym;
-    std::string     strDisplay;
+    std::string     strDisplay; //easiest to generate at source!
     double          prob;
   };
 
   typedef std::vector<SymbolProb>         VECTOR_SYMBOL_PROB;
-  typedef std::vector<SymbolProbDisplay>  VECTOR_SYMBOL_PROB_DISPLAY;
 
 }
 
diff --git a/Src/DasherCore/UserLog.cpp b/Src/DasherCore/UserLog.cpp
index 2ee8e3f..ca9cd95 100644
--- a/Src/DasherCore/UserLog.cpp
+++ b/Src/DasherCore/UserLog.cpp
@@ -44,14 +44,12 @@ static UserLogParamMask s_UserLogParamMaskTable [] = {
 
 CUserLog::CUserLog(Dasher::CEventHandler *pEventHandler, 
                    CSettingsStore *pSettingsStore, 
-                   int iLogTypeMask, 
-                   Dasher::CAlphabet* pAlphabet) : CUserLogBase(pEventHandler, pSettingsStore)
+                   int iLogTypeMask) : CUserLogBase(pEventHandler, pSettingsStore)
 {
   //CFunctionLogger f1("CUserLog::CUserLog", g_pLogger);
 
   InitMemberVars();
 
-  m_pAlphabet     = pAlphabet;
   m_iLevelMask    = iLogTypeMask;
 
   InitUsingMask(iLogTypeMask);
@@ -299,13 +297,7 @@ void CUserLog::AddSymbols(Dasher::VECTOR_SYMBOL_PROB* vpNewSymbols, eUserLogEven
       return;
     }
 
-    if (m_pAlphabet == NULL)
-    {
-      g_pLogger->Log("CUserLog::AddSymbols, can't do detailed logging of symbols without an alphabet!", logNORMAL);
-      return;
-    }
-
-    pTrial->AddSymbols(vpNewSymbols, iEvent, m_pAlphabet);
+    pTrial->AddSymbols(vpNewSymbols, iEvent);
   }
 }
 
@@ -629,16 +621,6 @@ void CUserLog::InitIsDone()
   m_bInitIsDone = true;
 }
 
-// Update our pointer to the alphabet we are using, we need th
-// alphabet in order to convert symbols into display strings
-// that we put in the log file.
-void CUserLog::SetAlphabetPtr(Dasher::CAlphabet* pAlphabet)
-{
-  //CFunctionLogger f1("CUserLog::SetAlphabetPtr", g_pLogger);
-
-  m_pAlphabet = pAlphabet;
-}
-
 // Sets our output filename based on the current date and time.
 // Or if a parameter is passed in, use that as the output name.
 void CUserLog::SetOuputFilename(const string& strFilename)
@@ -736,7 +718,6 @@ void CUserLog::InitMemberVars()
   m_bSimple               = false;
   m_bDetailed             = false;
   m_pSimpleLogger         = NULL;    
-  m_pAlphabet             = NULL;
   m_bIsWriting            = false;
   m_bInitIsDone           = false;
   m_bNeedToWriteCanvas    = false;
diff --git a/Src/DasherCore/UserLog.h b/Src/DasherCore/UserLog.h
index 9df9cb6..f3f07cf 100644
--- a/Src/DasherCore/UserLog.h
+++ b/Src/DasherCore/UserLog.h
@@ -76,7 +76,7 @@ typedef vector<VECTOR_STRING>::iterator     VECTOR_VECTOR_STRING_ITER;
 class CUserLog : public CUserLogBase
 {
 public:
-  CUserLog(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, int iLogTypeMask, Dasher::CAlphabet* pAlphabet = NULL);
+  CUserLog(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, int iLogTypeMask);
 
   ~CUserLog();
 
@@ -97,7 +97,6 @@ public:
   void                        AddMouseLocation(int iX, int iY, float dNats);
   void                        AddMouseLocationNormalized(int iX, int iY, bool bStoreIntegerRep, float dNats);
   void                        OutputFile();
-  void					              SetAlphabetPtr(Dasher::CAlphabet* pAlphabet);
   void                        InitIsDone();
   void                        SetOuputFilename(const string& strFilename = "");
   int                         GetLogLevelMask();
@@ -118,7 +117,6 @@ protected:
   bool                        m_bSimple;                  // Are we outputting the simple running log file?
   bool                        m_bDetailed;                // Are we outputting per session detailed logs?
   CFileLogger*                m_pSimpleLogger;            // Used to log the simple running log file
-  Dasher::CAlphabet*			    m_pAlphabet;		            // Pointer to Dasher alphabet object
   bool                        m_bIsWriting;               // Has StartWriting() been called but not StopWriting()?
   bool                        m_bInitIsDone;              // Set to true once the initialization of default values is done
   WindowSize                  m_sCanvasCoordinates;       // The size of our canvas from the last call to AddCanvasSize()
diff --git a/Src/DasherCore/UserLogBase.h b/Src/DasherCore/UserLogBase.h
index 4a7f9ed..cc8c356 100644
--- a/Src/DasherCore/UserLogBase.h
+++ b/Src/DasherCore/UserLogBase.h
@@ -26,7 +26,6 @@ class CUserLogBase : public Dasher::CDasherComponent {
   virtual void AddMouseLocation(int iX, int iY, float dNats) = 0;
   virtual void AddMouseLocationNormalized(int iX, int iY, bool bStoreIntegerRep, float dNats) = 0;
   virtual void OutputFile() = 0;
-  virtual void SetAlphabetPtr(Dasher::CAlphabet* pAlphabet = 0) = 0;
   virtual void InitIsDone() = 0;
   virtual void SetOuputFilename(const std::string& strFilename = "") = 0;
   virtual int GetLogLevelMask() = 0;
diff --git a/Src/DasherCore/UserLogTrial.cpp b/Src/DasherCore/UserLogTrial.cpp
index fcdcf36..094d236 100644
--- a/Src/DasherCore/UserLogTrial.cpp
+++ b/Src/DasherCore/UserLogTrial.cpp
@@ -84,7 +84,7 @@ CUserLogTrial::~CUserLogTrial()
             pSpan = NULL;
           }
 
-          Dasher::VECTOR_SYMBOL_PROB_DISPLAY* pVectorAdded = pLocation->pVectorAdded;
+          Dasher::VECTOR_SYMBOL_PROB* pVectorAdded = pLocation->pVectorAdded;
           if (pVectorAdded != NULL)
           {
             delete pVectorAdded;
@@ -252,24 +252,18 @@ void CUserLogTrial::StopWriting(double dBits)
 // The user has entered one or more new symbols.  UserLog object will
 // pass us the pointer to the current alphabet that is being used.
 void CUserLogTrial::AddSymbols(Dasher::VECTOR_SYMBOL_PROB* vpNewSymbolProbs, 
-                               eUserLogEventType iEvent, 
-                               Dasher::CAlphabet* pCurrentAlphabet)
+                               eUserLogEventType iEvent)
 {
   //CFunctionLogger f1("CUserLogTrial::AddSymbols", g_pLogger);
 
-  if (pCurrentAlphabet == NULL)
-  {
-    g_pLogger->Log("CUserLogTrial::AddSymbols, pCurrentAlphabet was NULL!", logNORMAL);
-    return;
-  }
   if (vpNewSymbolProbs == NULL)
   {
     g_pLogger->Log("CUserLogTrial::AddSymbols, vectorNewSymbolProbs was NULL!", logNORMAL);
     return;
   }
 
-  Dasher::VECTOR_SYMBOL_PROB_DISPLAY* pVectorAdded = NULL;
-  pVectorAdded = new Dasher::VECTOR_SYMBOL_PROB_DISPLAY;
+  Dasher::VECTOR_SYMBOL_PROB* pVectorAdded = NULL;
+  pVectorAdded = new Dasher::VECTOR_SYMBOL_PROB;
 
   if (pVectorAdded == NULL)
   {
@@ -277,26 +271,16 @@ void CUserLogTrial::AddSymbols(Dasher::VECTOR_SYMBOL_PROB* vpNewSymbolProbs,
     return;
   }
 
-  for (unsigned int i = 0; i < vpNewSymbolProbs->size(); i++)
-  {
-    Dasher::SymbolProb sNewSymbolProb   = (Dasher::SymbolProb) (*vpNewSymbolProbs)[i];
-
-    Dasher::SymbolProbDisplay sNewSymbolProbDisplay;
-
-    sNewSymbolProbDisplay.sym           = sNewSymbolProb.sym;
-    sNewSymbolProbDisplay.prob          = sNewSymbolProb.prob;
-    sNewSymbolProbDisplay.strDisplay    = pCurrentAlphabet->GetText(sNewSymbolProb.sym);
-
-    pVectorAdded->push_back(sNewSymbolProbDisplay);
-
-    // Add this symbol to our running total of symbols.  
-    // We track the symbols and not the display text
-    // since we may need to delete symbols later and 
-    // a given symbol might take up multiple chars.
-    // We also keep the probability around so we can
-    // calculate the average bits of the history.
-    m_vHistory.push_back(sNewSymbolProbDisplay);        
-  }
+  // Add the symbols to our running total of symbols.
+  
+  // ACL: Old comment said "We track the symbols and not the display text
+  // since we may need to delete symbols later and 
+  // a given symbol might take up multiple chars."
+  //   - yet stored the display text????
+  
+  // We also keep the probability around so we can
+  // calculate the average bits of the history.
+  m_vHistory.insert(m_vHistory.end(), vpNewSymbolProbs->begin(), vpNewSymbolProbs->end());
 
   StopPreviousTimer();
 
@@ -315,7 +299,7 @@ void CUserLogTrial::AddSymbols(Dasher::VECTOR_SYMBOL_PROB* vpNewSymbolProbs,
   pLocation->avgBits       = GetHistoryAvgBits();
   pLocation->event         = iEvent;
   pLocation->numDeleted    = 0;
-  pLocation->pVectorAdded  = pVectorAdded;
+  pLocation->pVectorAdded  = new std::vector<Dasher::SymbolProb>(*vpNewSymbolProbs);
 
   NavCycle* pCycle = GetCurrentNavCycle();
   if (pCycle != NULL)
@@ -559,7 +543,7 @@ string CUserLogTrial::GetHistoryDisplay()
 
   for (unsigned int i = 0; i < m_vHistory.size(); i++)
   {
-    Dasher::SymbolProbDisplay sItem = (Dasher::SymbolProbDisplay) m_vHistory[i];
+    Dasher::SymbolProb sItem = (Dasher::SymbolProb) m_vHistory[i];
     strResult += sItem.strDisplay;
   }
 
@@ -576,7 +560,7 @@ double CUserLogTrial::GetHistoryAvgBits()
   {
     for (unsigned int i = 0; i < m_vHistory.size(); i++)
     {
-      Dasher::SymbolProbDisplay sItem = (Dasher::SymbolProbDisplay) m_vHistory[i];
+      Dasher::SymbolProb sItem = (Dasher::SymbolProb) m_vHistory[i];
 
       dResult += log(sItem.prob);
     }
@@ -646,14 +630,14 @@ string CUserLogTrial::GetLocationXML(NavLocation* pLocation, const string& strPr
     strResult += m_szTempBuffer;
     strResult += "</NumAdded>\n";
 
-    Dasher::VECTOR_SYMBOL_PROB_DISPLAY* pVectorAdded = pLocation->pVectorAdded;
+    Dasher::VECTOR_SYMBOL_PROB* pVectorAdded = pLocation->pVectorAdded;
 
     if (pVectorAdded != NULL)
     {
       // Output the details of each add
       for (unsigned int j = 0; j < pVectorAdded->size(); j++)
       {            
-        Dasher::SymbolProbDisplay sItem = (Dasher::SymbolProbDisplay) (*pVectorAdded)[j];
+        Dasher::SymbolProb sItem = (Dasher::SymbolProb) (*pVectorAdded)[j];
 
         strResult += strPrefix;
         strResult += "\t<Add>\n";
@@ -1261,15 +1245,13 @@ CUserLogTrial::CUserLogTrial(const string& strXML, int iIgnored)
 
         // Handle the multiple <Add> tags that might exist
         vAdded                    = XMLUtil::GetElementStrings("Add", *iter2);                
-        pLocation->pVectorAdded   = new Dasher::VECTOR_SYMBOL_PROB_DISPLAY;
+        pLocation->pVectorAdded   = new Dasher::VECTOR_SYMBOL_PROB;
 
         for (VECTOR_STRING_ITER iter3 = vAdded.begin(); iter3 < vAdded.end(); iter3++)
         {
-          Dasher::SymbolProbDisplay sAdd;
-
-          sAdd.prob           = XMLUtil::GetElementFloat("Prob", *iter3);
-          sAdd.strDisplay     = XMLUtil::GetElementString("Text", *iter3);
-          sAdd.sym            = 0;    // We don't have the original integer symbol index
+          Dasher::SymbolProb sAdd(0, // We don't have the original integer symbol index
+                                  XMLUtil::GetElementString("Text", *iter3),
+                                  XMLUtil::GetElementFloat("Prob", *iter3));
 
           if (pLocation->pVectorAdded != NULL)
             pLocation->pVectorAdded->push_back(sAdd);
diff --git a/Src/DasherCore/UserLogTrial.h b/Src/DasherCore/UserLogTrial.h
index 2fe8593..1230858 100644
--- a/Src/DasherCore/UserLogTrial.h
+++ b/Src/DasherCore/UserLogTrial.h
@@ -15,7 +15,6 @@
 #include "TimeSpan.h"
 #include "UserButton.h"
 #include "UserLocation.h"
-#include "Alphabet/Alphabet.h"
 #include "DasherTypes.h"
 #include "UserLogParam.h"
 #include <algorithm>
@@ -56,7 +55,7 @@ struct NavLocation
   CTimeSpan*                              span;           // Track the time between this update and the one that comes next
   eUserLogEventType                       event;          // What triggered the adding or deleting of symbols
   int                                     numDeleted;     // How many symbols deleted (0 if it is an AddSymbols() call)
-  Dasher::VECTOR_SYMBOL_PROB_DISPLAY*     pVectorAdded;   // Info on all added symbols   
+  Dasher::VECTOR_SYMBOL_PROB*             pVectorAdded;   // Info on all added symbols   
   double                                  avgBits;        // Average bits required to write this history (assuming no errors)
 };
 
@@ -96,7 +95,7 @@ public:
   bool                        HasWritingOccured();
   void                        StartWriting();
   void                        StopWriting(double dBits);
-  void                        AddSymbols(Dasher::VECTOR_SYMBOL_PROB* vpNewSymbolProbs, eUserLogEventType iEvent, Dasher::CAlphabet* pCurrentAlphabet);
+  void                        AddSymbols(Dasher::VECTOR_SYMBOL_PROB* vpNewSymbolProbs, eUserLogEventType iEvent);
   void                        DeleteSymbols(int iNumToDelete, eUserLogEventType iEvent);  
   string                      GetXML(const string& strPrefix = "");
   void                        Done();
@@ -126,7 +125,7 @@ protected:
   string                              m_strCurrentTrial;          // Stores information passed to us from the UserTrial app
   WindowSize                          m_sWindowCoordinates;       // Records the window coordinates at the start of navigation
   WindowSize                          m_sCanvasCoordinates;       // The size of our canvas during navigation
-  Dasher::VECTOR_SYMBOL_PROB_DISPLAY  m_vHistory;                 // Tracks all the symbols, probs, display text entererd during this trial
+  Dasher::VECTOR_SYMBOL_PROB          m_vHistory;                 // Tracks all the symbols, probs, display text entererd during this trial
   VECTOR_USER_LOG_PARAM_PTR           m_vpParams;                 // Stores general parameters we want stored in each trial tag in the XML
   VECTOR_NAV_CYCLE_PTR                m_vpNavCycles;
   string                              m_strCurrentTrialFilename;  // Where to look for info on the current subject's trial



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