[Avida-SVN] r1166 - development/source/main

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Wed Jan 3 11:31:01 PST 2007


Author: brysonda
Date: 2007-01-03 14:31:01 -0500 (Wed, 03 Jan 2007)
New Revision: 1166

Modified:
   development/source/main/cTaskEntry.h
   development/source/main/cTaskLib.cc
   development/source/main/cTaskLib.h
Log:
Implement Fibonacci sequence task.   Add support for storing task state within the cTaskEntry object.

Modified: development/source/main/cTaskEntry.h
===================================================================
--- development/source/main/cTaskEntry.h	2007-01-03 18:50:36 UTC (rev 1165)
+++ development/source/main/cTaskEntry.h	2007-01-03 19:31:01 UTC (rev 1166)
@@ -23,6 +23,16 @@
 
 typedef double (cTaskLib::*tTaskTest)(cTaskContext&) const;
 
+class cTaskState
+{
+protected:
+  cTaskState() { ; }
+  
+public:
+  virtual ~cTaskState() { ; }
+};
+
+
 class cTaskEntry
 {
 private:
@@ -31,13 +41,18 @@
   int m_id;
   tTaskTest m_test_fun;
   cArgContainer* m_args;
+  cTaskState* m_state;
 
 public:
-  cTaskEntry(const cString& name, const cString& desc, int in_id, tTaskTest fun, cArgContainer* args)
-    : m_name(name), m_desc(desc), m_id(in_id), m_test_fun(fun), m_args(args)
+  cTaskEntry(const cString& name, const cString& desc, int in_id, tTaskTest fun, cArgContainer* args, cTaskState* state = NULL)
+    : m_name(name), m_desc(desc), m_id(in_id), m_test_fun(fun), m_args(args), m_state(state)
   {
   }
-  ~cTaskEntry() { delete m_args; }
+  ~cTaskEntry()
+  {
+    delete m_args;
+    delete m_state;
+  }
 
   const cString& GetName() const { return m_name; }
   const cString& GetDesc() const { return m_desc; }
@@ -46,8 +61,7 @@
   
   bool HasArguments() const { return (m_args != NULL); }
   const cArgContainer& GetArguments() const { return *m_args; }
-  
-  
+  cTaskState* GetState() { return m_state; }
 };
 
 

Modified: development/source/main/cTaskLib.cc
===================================================================
--- development/source/main/cTaskLib.cc	2007-01-03 18:50:36 UTC (rev 1165)
+++ development/source/main/cTaskLib.cc	2007-01-03 19:31:01 UTC (rev 1166)
@@ -320,6 +320,8 @@
 
   if (name == "sort_inputs")
     Load_SortInputs(name, info, envreqs);
+  else if (name == "fibonacci_seq")
+    Load_FibonacciSequence(name, info, envreqs);
 
 	// Communication Tasks
   if (name == "comm_echo")
@@ -346,14 +348,14 @@
 }
 
 void cTaskLib::NewTask(const cString& name, const cString& desc, tTaskTest task_fun, int reqs,
-                       cArgContainer* args)
+                       cArgContainer* args, cTaskState* state)
 {
   if (reqs & REQ_NEIGHBOR_INPUT == true) use_neighbor_input = true;
   if (reqs & REQ_NEIGHBOR_OUTPUT == true) use_neighbor_output = true;
   
   const int id = task_array.GetSize();
   task_array.Resize(id + 1);
-  task_array[id] = new cTaskEntry(name, desc, id, task_fun, args);
+  task_array[id] = new cTaskEntry(name, desc, id, task_fun, args, state);
 }
 
 
@@ -2015,6 +2017,57 @@
 }
 
 
+
+
+class cFibSeqState : public cTaskState
+{
+public:
+  int seq[2];
+  int count;
+  
+  cFibSeqState() : count(0) { seq[0] = 1; seq[1] = 0; }
+};
+
+void cTaskLib::Load_FibonacciSequence(const cString& name, const cString& argstr, cEnvReqs& envreqs)
+{
+  cArgSchema schema(',',':');
+  
+  // Integer Arguments
+  schema.AddEntry("target", 0, cArgSchema::SCHEMA_INT);
+  // Double Arguments
+  schema.AddEntry("penalty", 0, 0.0);
+  
+  cArgContainer* args = cArgContainer::Load(argstr, schema);
+  cFibSeqState* state = new cFibSeqState();
+  
+  if (args) NewTask(name, "Fibonacci Sequence", &cTaskLib::Task_FibonacciSequence, 0, args, state);
+}
+
+double cTaskLib::Task_FibonacciSequence(cTaskContext& ctx) const
+{
+  double quality = 0.0;
+  const cArgContainer& args = ctx.GetTaskEntry()->GetArguments();
+  cFibSeqState* state = static_cast<cFibSeqState*>(ctx.GetTaskEntry()->GetState());
+
+  const int next = state->seq[0] + state->seq[1];
+  
+  // If output matches next in sequence
+  if (ctx.GetOutputBuffer()[0] == next) {
+    // Increment count and store next value
+    state->count++;
+    state->seq[state->count % 2] = next;
+    
+    // If past target sequence ending point, return the penalty setting
+    if (state->count > args.GetInt(0)) return args.GetDouble(0);
+    
+    return 1.0;
+  }
+  
+  return 0.0;
+}
+
+
+
 double cTaskLib::Task_CommEcho(cTaskContext& ctx) const
 {
   const int test_output = ctx.GetOutputBuffer()[0];

Modified: development/source/main/cTaskLib.h
===================================================================
--- development/source/main/cTaskLib.h	2007-01-03 18:50:36 UTC (rev 1165)
+++ development/source/main/cTaskLib.h	2007-01-03 19:31:01 UTC (rev 1166)
@@ -74,7 +74,7 @@
   
 private:  // Direct task related methods
   void NewTask(const cString& name, const cString& desc, tTaskTest task_fun, int reqs = 0,
-               cArgContainer* args = NULL);
+               cArgContainer* args = NULL, cTaskState* state = NULL);
 
   inline double FractionalReward(unsigned int supplied, unsigned int correct);  
 
@@ -228,6 +228,8 @@
 
   void Load_SortInputs(const cString& name, const cString& argstr, cEnvReqs& envreqs);
   double Task_SortInputs(cTaskContext& ctx) const;
+  void Load_FibonacciSequence(const cString& name, const cString& argstr, cEnvReqs& envreqs);
+  double Task_FibonacciSequence(cTaskContext& ctx) const;
 
   // Communication Tasks
   double Task_CommEcho(cTaskContext& ctx) const;




More information about the Avida-cvs mailing list