[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