[Avida-cvs] [Avida2-svn] r143 - trunk/source/tools

kaben at myxo.css.msu.edu kaben at myxo.css.msu.edu
Fri Apr 15 00:30:01 PDT 2005


Author: kaben
Date: 2005-04-15 03:30:01 -0400 (Fri, 15 Apr 2005)
New Revision: 143

Added:
   trunk/source/tools/change_list.hh
Modified:
   trunk/source/tools/const_schedule.cc
   trunk/source/tools/integrated_schedule.cc
   trunk/source/tools/prob_schedule.cc
   trunk/source/tools/schedule.cc
   trunk/source/tools/schedule.hh
Log:

* Code to keep track of changed population cells, per-update.



Added: trunk/source/tools/change_list.hh
===================================================================
--- trunk/source/tools/change_list.hh	2005-04-14 13:06:19 UTC (rev 142)
+++ trunk/source/tools/change_list.hh	2005-04-15 07:30:01 UTC (rev 143)
@@ -0,0 +1,121 @@
+//////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 1993 - 2005 California Institute of Technology             //
+//                                                                          //
+// Read the COPYING and README files, or contact 'avida at alife.org',         //
+// before continuing.  SOME RESTRICTIONS MAY APPLY TO USE OF THIS FILE.     //
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef CHANGE_LIST_HH
+#define CHANGE_LIST_HH
+
+#ifndef TARRAY_HH
+#include "tArray.hh"
+#endif
+
+/**
+ * This class provides an array of indices of changes to some list of
+ * objects. Entries in the array of indices have the same order as
+ * registered changes.
+ **/ 
+
+class cChangeList {
+protected:
+  /*
+  Note that size of m_change_list is size of m_change_tracking, and that
+  0 <= m_change_count <= size of m_change_tracking.
+  */
+  // Number of changes.
+  unsigned int m_change_count;
+  /*
+  List of changed indices. When n changes are listed, the first n
+  entries of m_change_list store the indices, and the remaining entries
+  are invalid.
+  */
+  tArray<unsigned int> m_change_list;
+  // m_change_tracking[i] is true iff i is in m_change_list.
+  tArray<bool> m_change_tracking;
+
+public:
+  void ResizeClear(unsigned int capacity){
+    m_change_list.ResizeClear(capacity);
+    m_change_tracking.ResizeClear(capacity);
+    m_change_list.SetAll(0);
+    m_change_tracking.SetAll(false);
+    m_change_count = 0;
+  }
+
+public:
+  // Constructor.
+  explicit cChangeList(unsigned int capacity = 0)
+  : m_change_list(0)
+  , m_change_tracking(0)
+  , m_change_count(0)
+  { ResizeClear(capacity); }
+
+  //// Assignment operator.
+  //cChangeList & operator= (const cChangeList & rhs) {
+  //  m_change_list = rhs.m_change_list;
+  //  m_change_tracking = rhs.m_change_tracking;
+  //  m_change_count = rhs.m_change_count;
+  //}
+
+  //// Copy constructor.
+  //explicit cChangeList(const cChangeList & rhs) : cChangeList(0) {
+  //  this->operator=(rhs);
+  //}
+
+  // Destructor.
+  //virtual ~cChangeList(){}
+
+  // Interface Methods ///////////////////////////////////////////////////////
+
+  unsigned int GetSize() const { return m_change_list.GetSize(); }
+
+  unsigned int GetChangeCount() const { return m_change_count; }
+
+  // Note that decreasing size invalidates stored changes.
+  void Resize(unsigned int capacity) {
+    if (capacity < m_change_list.GetSize()){
+      ResizeClear(capacity);
+    } else {
+      m_change_list.Resize(capacity);
+      m_change_tracking.Resize(capacity, false);
+    }
+  }
+  
+  // Unsafe version : assumes index is within change count.
+  unsigned int GetChangeAt(unsigned int index) const {
+    return m_change_list[index];
+  }
+
+  // Safe version : returns -1 if index is outside change count.
+  int CheckChangeAt(unsigned int index) const {
+    return (index < m_change_count) ? ((int) GetChangeAt(index)) : (-1);
+  }
+
+  // Unsafe version : assumes changed_index is within capacity.
+  void MarkChange(unsigned int changed_index) {
+    if (!m_change_tracking[changed_index]) {
+      m_change_tracking[changed_index] = true;
+      m_change_list[m_change_count++] = changed_index;
+    }
+  }
+
+  // Safe version : will resize to accommodate changed_index greater
+  // than capacity.
+  void PushChange(unsigned int changed_index) {
+    if (m_change_list.GetSize() <= changed_index) {
+      Resize(changed_index + 1);
+    }
+    MarkChange(changed_index);
+  }
+
+  void Reset() {
+    for (unsigned int i = 0; i < m_change_count; i++) {
+      m_change_tracking[m_change_list[i]] = false;
+    }
+    m_change_count = 0;
+  }
+};
+
+#endif

Modified: trunk/source/tools/const_schedule.cc
===================================================================
--- trunk/source/tools/const_schedule.cc	2005-04-14 13:06:19 UTC (rev 142)
+++ trunk/source/tools/const_schedule.cc	2005-04-15 07:30:01 UTC (rev 143)
@@ -7,6 +7,7 @@
 
 #include "const_schedule.hh"
 
+#include "change_list.hh"
 #include "merit.hh"
 
 
@@ -35,6 +36,9 @@
 {
   if (merit == 0.0) is_active[item_id] = false;
   else is_active[item_id] = true;
+  if (cChangeList *change_list = GetChangeList()) {
+    change_list->MarkChange(item_id);
+  }
 }
 
 

Modified: trunk/source/tools/integrated_schedule.cc
===================================================================
--- trunk/source/tools/integrated_schedule.cc	2005-04-14 13:06:19 UTC (rev 142)
+++ trunk/source/tools/integrated_schedule.cc	2005-04-15 07:30:01 UTC (rev 143)
@@ -7,6 +7,7 @@
 
 #include "integrated_schedule.hh"
 
+#include "change_list.hh"
 #include "functions.hh"
 #include "integrated_schedule_node.hh"
 #include "merit.hh"
@@ -86,6 +87,9 @@
       node_array[i]->Insert(item_id);
     }
   }
+  if (cChangeList *change_list = GetChangeList()) {
+    change_list->MarkChange(item_id);
+  }
 }
 
 

Modified: trunk/source/tools/prob_schedule.cc
===================================================================
--- trunk/source/tools/prob_schedule.cc	2005-04-14 13:06:19 UTC (rev 142)
+++ trunk/source/tools/prob_schedule.cc	2005-04-15 07:30:01 UTC (rev 143)
@@ -7,6 +7,7 @@
 
 #include "prob_schedule.hh"
 
+#include "change_list.hh"
 #include "merit.hh"
 #include "tools.hh"
 
@@ -38,4 +39,7 @@
 void cProbSchedule::Adjust(int item_id, const cMerit & item_merit)
 {
   chart.SetWeight(item_id, item_merit.GetDouble());
+  if (cChangeList *change_list = GetChangeList()) {
+    change_list->MarkChange(item_id);
+  }
 }

Modified: trunk/source/tools/schedule.cc
===================================================================
--- trunk/source/tools/schedule.cc	2005-04-14 13:06:19 UTC (rev 142)
+++ trunk/source/tools/schedule.cc	2005-04-15 07:30:01 UTC (rev 143)
@@ -5,18 +5,29 @@
 // before continuing.  SOME RESTRICTIONS MAY APPLY TO USE OF THIS FILE.     //
 //////////////////////////////////////////////////////////////////////////////
 
-#ifndef SCHEDULE_HH
 #include "schedule.hh"
-#endif
 
+#include "change_list.hh"
+
 ////////////////
 //  cSchedule
 ////////////////
 
-cSchedule::cSchedule(int _item_count) : item_count(_item_count)
+cSchedule::cSchedule(int _item_count)
+: item_count(_item_count)
+, m_change_list(0)
 {
 }
 
 cSchedule::~cSchedule()
 {
 }
+
+void cSchedule::SetChangeList(cChangeList *change_list) {
+  m_change_list = change_list;
+  if (m_change_list) m_change_list->Resize(item_count);
+}
+void cSchedule::SetSize(int _item_count) {
+  item_count = _item_count;
+  if (m_change_list) m_change_list->Resize(_item_count);
+}

Modified: trunk/source/tools/schedule.hh
===================================================================
--- trunk/source/tools/schedule.hh	2005-04-14 13:06:19 UTC (rev 142)
+++ trunk/source/tools/schedule.hh	2005-04-15 07:30:01 UTC (rev 143)
@@ -15,10 +15,11 @@
  **/
 
 class cMerit;
-
+class cChangeList;
 class cSchedule {
 protected:
   int item_count;
+  cChangeList *m_change_list;
 public:
   cSchedule(int _item_count);
   virtual ~cSchedule();
@@ -27,8 +28,10 @@
   virtual void Adjust(int item_id, const cMerit & merit) { ; }
   virtual int GetNextID() = 0;
   virtual double GetStatus(int id) { return 0.0; }
+  void SetChangeList(cChangeList *change_list);
+  cChangeList *GetChangeList() { return m_change_list; }
 
-  inline void SetSize(int _item_count)  { item_count = _item_count; }
+  void SetSize(int _item_count);
 };
 
 #endif




More information about the Avida-cvs mailing list