diff AgentList.cpp @ 16:33d0b18b2509

Allocate Agents separately on the heap and make AgentList contain pointers only (much quicker)
author Chris Cannam
date Wed, 12 Oct 2011 17:01:57 +0100
parents 887c629502a9
children 6afcb5edd7ab
line wrap: on
line diff
--- a/AgentList.cpp	Wed Oct 12 10:55:52 2011 +0100
+++ b/AgentList.cpp	Wed Oct 12 17:01:57 2011 +0100
@@ -23,30 +23,31 @@
 {
     sort();
     for (iterator itr = begin(); itr != end(); ++itr) {
-        if (itr->phaseScore < 0.0) // already flagged for deletion
+        if ((*itr)->phaseScore < 0.0) // already flagged for deletion
             continue;
         iterator itr2 = itr;
         for (++itr2; itr2 != end(); ++itr2) {
-            if (itr2->beatInterval - itr->beatInterval > DEFAULT_BI)
+            if ((*itr2)->beatInterval - (*itr)->beatInterval > DEFAULT_BI)
                 break;
-            if (fabs(itr->beatTime - itr2->beatTime) > DEFAULT_BT)
+            if (fabs((*itr)->beatTime - (*itr2)->beatTime) > DEFAULT_BT)
                 continue;
-            if (itr->phaseScore < itr2->phaseScore) {
-                itr->phaseScore = -1.0;	// flag for deletion
-                if (itr2->topScoreTime < itr->topScoreTime)
-                    itr2->topScoreTime = itr->topScoreTime;
+            if ((*itr)->phaseScore < (*itr2)->phaseScore) {
+                (*itr)->phaseScore = -1.0;	// flag for deletion
+                if ((*itr2)->topScoreTime < (*itr)->topScoreTime)
+                    (*itr2)->topScoreTime = (*itr)->topScoreTime;
                 break;
             } else {
-                itr2->phaseScore = -1.0;	// flag for deletion
-                if (itr->topScoreTime < itr2->topScoreTime)
-                    itr->topScoreTime = itr2->topScoreTime;
+                (*itr2)->phaseScore = -1.0;	// flag for deletion
+                if ((*itr)->topScoreTime < (*itr2)->topScoreTime)
+                    (*itr)->topScoreTime = (*itr2)->topScoreTime;
             }
         }
     }
     int removed = 0;
     for (iterator itr = begin(); itr != end(); ) {
-        if (itr->phaseScore < 0.0) {
+        if ((*itr)->phaseScore < 0.0) {
             ++removed;
+            delete *itr;
             list.erase(itr);
         } else {
             ++itr;
@@ -59,7 +60,7 @@
     }
     int n = 0;
     for (Container::iterator i = list.begin(); i != list.end(); ++i) {
-        std::cerr << "agent " << n++ << ": time " << i->beatTime << std::endl;
+        std::cerr << "agent " << n++ << ": time " << (*i)->beatTime << std::endl;
     }
 #endif
 } // removeDuplicates()
@@ -68,7 +69,7 @@
 void AgentList::beatTrack(EventList el, double stop)
 {
     EventList::iterator ei = el.begin();
-    bool phaseGiven = !empty() && (begin()->beatTime >= 0); // if given for one, assume given for others
+    bool phaseGiven = !empty() && ((*begin())->beatTime >= 0); // if given for one, assume given for others
     while (ei != el.end()) {
         Event ev = *ei;
         ++ei;
@@ -85,22 +86,22 @@
         list.clear();
         for (Container::iterator ai = currentAgents.begin();
              ai != currentAgents.end(); ++ai) {
-            Agent currentAgent = *ai;
-            if (currentAgent.beatInterval != prevBeatInterval) {
+            Agent *currentAgent = *ai;
+            if (currentAgent->beatInterval != prevBeatInterval) {
                 if ((prevBeatInterval>=0) && !created && (ev.time<5.0)) {
 #ifdef DEBUG_BEATROOT
                     std::cerr << "Creating a new agent" << std::endl;
 #endif
                     // Create new agent with different phase
-                    Agent newAgent(prevBeatInterval);
+                    Agent *newAgent = new Agent(prevBeatInterval);
                     // This may add another agent to our list as well
-                    newAgent.considerAsBeat(ev, *this);
+                    newAgent->considerAsBeat(ev, *this);
                     add(newAgent);
                 }
-                prevBeatInterval = currentAgent.beatInterval;
+                prevBeatInterval = currentAgent->beatInterval;
                 created = phaseGiven;
             }
-            if (currentAgent.considerAsBeat(ev, *this))
+            if (currentAgent->considerAsBeat(ev, *this))
                 created = true;
             add(currentAgent);
         } // loop for each agent
@@ -113,12 +114,12 @@
     double best = -1.0;
     Agent *bestAg = 0;
     for (iterator itr = begin(); itr != end(); ++itr) {
-        if (itr->events.empty()) continue;
-        double startTime = itr->events.begin()->time;
-        double conf = (itr->phaseScore + itr->tempoScore) /
-            (useAverageSalience? (double)itr->beatCount: 1.0);
+        if ((*itr)->events.empty()) continue;
+        double startTime = (*itr)->events.begin()->time;
+        double conf = ((*itr)->phaseScore + (*itr)->tempoScore) /
+            (useAverageSalience? (double)(*itr)->beatCount: 1.0);
         if (conf > best) {
-            bestAg = &(*itr);
+            bestAg = *itr;
             best = conf;
         }
     }