[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