[Avida-SVN] r1087 - in branches/uml/source: cpu main
hjg at myxo.css.msu.edu
hjg at myxo.css.msu.edu
Sun Nov 19 10:21:09 PST 2006
Author: hjg
Date: 2006-11-19 13:21:08 -0500 (Sun, 19 Nov 2006)
New Revision: 1087
Modified:
branches/uml/source/cpu/cHardwareCPU.cc
branches/uml/source/cpu/cHardwareCPU.h
branches/uml/source/main/cOrganism.h
branches/uml/source/main/cTaskLib.cc
branches/uml/source/main/cTaskLib.h
Log:
This version identifies states and transitions using integers. The tasks are set up for a static version of the brightness sensor with 7 states and 11 transitions.
Modified: branches/uml/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/uml/source/cpu/cHardwareCPU.cc 2006-11-16 22:09:49 UTC (rev 1086)
+++ branches/uml/source/cpu/cHardwareCPU.cc 2006-11-19 18:21:08 UTC (rev 1087)
@@ -268,15 +268,7 @@
"If copied label compl., exec next inst; else SKIP W/NOPS"),
cInstEntryCPU("set-flow", &cHardwareCPU::Inst_SetFlow, true,
"Set flow-head to position in ?CX?"),
-
- // UML Element Creation
- cInstEntryCPU("cr-state", &cHardwareCPU::Inst_CreateState, false,
- "Create a state"),
- cInstEntryCPU("cr-trans", &cHardwareCPU::Inst_CreateTransition, false,
- "Create a transition"),
- cInstEntryCPU("model-ch", &cHardwareCPU::Inst_ModelCheck, false,
- "Model check the model"),
-
+
cInstEntryCPU("h-copy2", &cHardwareCPU::Inst_HeadCopy2),
cInstEntryCPU("h-copy3", &cHardwareCPU::Inst_HeadCopy3),
cInstEntryCPU("h-copy4", &cHardwareCPU::Inst_HeadCopy4),
@@ -357,7 +349,17 @@
// Placebo instructions
// nop-x (included with nops)
- cInstEntryCPU("skip", &cHardwareCPU::Inst_Skip)
+ cInstEntryCPU("skip", &cHardwareCPU::Inst_Skip),
+
+ // UML Element Creation
+ cInstEntryCPU("cr-state", &cHardwareCPU::Inst_CreateState, false,
+ "Create a state"),
+ cInstEntryCPU("cr-trans", &cHardwareCPU::Inst_CreateTransition, false,
+ "Create a transition"),
+ cInstEntryCPU("model-ch", &cHardwareCPU::Inst_ModelCheck, false,
+ "Model check the model"),
+ cInstEntryCPU("cr-trans2", &cHardwareCPU::Inst_CreateTransitionIntStates, false,
+ "Create a transition; States read from registers")
};
const int n_size = sizeof(s_n_array)/sizeof(cNOPEntryCPU);
@@ -3105,6 +3107,8 @@
bool cHardwareCPU::Inst_HeadDivide(cAvidaContext& ctx)
{
+ // modified for UML branch
+ organism->ModelCheck(ctx);
return Inst_HeadDivideMut(ctx, 1);
}
@@ -3362,6 +3366,15 @@
return true;
}
+
+//// Placebo insts ////
+bool cHardwareCPU::Inst_Skip(cAvidaContext& ctx)
+{
+ IP().Advance();
+ return true;
+}
+
+
//// UML Element Construction ////
bool cHardwareCPU::Inst_CreateState(cAvidaContext& ctx)
{
@@ -3414,11 +3427,34 @@
}
+bool cHardwareCPU::Inst_CreateTransitionIntStates(cAvidaContext& ctx)
+{
-//// Placebo insts ////
-bool cHardwareCPU::Inst_Skip(cAvidaContext& ctx)
-{
- IP().Advance();
- return true;
+// a transition should consist of an integer in a nop.
+ int reg_used = FindModifiedRegister(REG_AX);
+ int trans = GetRegister(reg_used);
+
+// the origin and destination states are determined by the values in reg a and reg b.
+// both registers could be modified by a nop...
+ reg_used = FindModifiedRegister(REG_BX);
+ int orig_state = GetRegister(reg_used);
+ reg_used = FindNextRegister(reg_used);
+ int dest_state = GetRegister(reg_used);
+
+ // add states to set of states
+ organism->uml_state_set.insert(orig_state);
+ organism->uml_state_set.insert(dest_state);
+
+ // add trans to set of transitions
+ organism->uml_trans_set.insert(trans);
+
+ // add transition to multipmap
+ pair<int, int> st;
+ st = make_pair (orig_state, dest_state);
+ organism->uml_transitions.insert(pair<int, pair<int, int> >(trans, st));
+
+
+ return true;
+
}
Modified: branches/uml/source/cpu/cHardwareCPU.h
===================================================================
--- branches/uml/source/cpu/cHardwareCPU.h 2006-11-16 22:09:49 UTC (rev 1086)
+++ branches/uml/source/cpu/cHardwareCPU.h 2006-11-19 18:21:08 UTC (rev 1087)
@@ -468,13 +468,14 @@
bool Inst_HeadDivide0_01(cAvidaContext& ctx);
bool Inst_HeadDivide0_001(cAvidaContext& ctx);
- //// UML Element Construction ////
+ //// Placebo ////
+ bool Inst_Skip(cAvidaContext& ctx);
+
+ //// UML Element Construction ////
bool Inst_CreateState(cAvidaContext& ctx);
bool Inst_CreateTransition(cAvidaContext& ctx);
bool Inst_ModelCheck(cAvidaContext& ctx);
-
- //// Placebo ////
- bool Inst_Skip(cAvidaContext& ctx);
+ bool Inst_CreateTransitionIntStates(cAvidaContext& ctx);
};
Modified: branches/uml/source/main/cOrganism.h
===================================================================
--- branches/uml/source/main/cOrganism.h 2006-11-16 22:09:49 UTC (rev 1086)
+++ branches/uml/source/main/cOrganism.h 2006-11-19 18:21:08 UTC (rev 1087)
@@ -14,6 +14,7 @@
#include <fstream>
#include <map>
#include <utility>
+#include <set>
//#include <multimap>
//#include <string>
//using namespace std;
@@ -196,6 +197,8 @@
// UML Stuff
t_stateMap uml_states;
t_transitionMap uml_transitions;
+ std::set <int> uml_state_set;
+ std::set <int> uml_trans_set;
void ModelCheck(cAvidaContext& ctx);
Modified: branches/uml/source/main/cTaskLib.cc
===================================================================
--- branches/uml/source/main/cTaskLib.cc 2006-11-16 22:09:49 UTC (rev 1086)
+++ branches/uml/source/main/cTaskLib.cc 2006-11-19 18:21:08 UTC (rev 1087)
@@ -329,14 +329,21 @@
else if (name == "uml_stB")
NewTask(name, "Successfully Created State B", &cTaskLib::Task_CreateStateB);
else if (name == "uml_stC")
- NewTask(name, "Successfully Created State C", &cTaskLib::Task_CreateStateC);
+ NewTask(name, "Successfully Created State C", &cTaskLib::Task_CreateStateC);
+ else if (name == "uml_sts")
+ NewTask(name, "Successfully Created the right number of states", &cTaskLib::Task_CreateStates);
else if (name == "uml_trA")
NewTask(name, "Successfully Created Transition A", &cTaskLib::Task_CreateTransA);
else if (name == "uml_trB")
NewTask(name, "Successfully Created Transition B", &cTaskLib::Task_CreateTransB);
else if (name == "uml_trC")
NewTask(name, "Successfully Created Transition C", &cTaskLib::Task_CreateTransC);
+ else if (name == "uml_trX")
+ NewTask(name, "Successfully Created all transitions", &cTaskLib::Task_CreateTransX);
+ else if (name == "uml_trs")
+ NewTask(name, "Successfully Created the right number of transitions", &cTaskLib::Task_CreateTranss);
+
// Make sure we have actually found a task
if (task_array.GetSize() == start_size) {
cerr << "Unknown task entry '" << name << "'." << endl;
@@ -1876,10 +1883,58 @@
}
+double cTaskLib::Task_CreateStates(cTaskContext* ctx) const
+{
+ cOrganism* organism = ctx->organism;
+ double bonus = 0.0;
+
+ // reward for constructing 7 states - brightness sensor
+ if (organism->uml_state_set.size() <= 7) {
+ bonus += organism->uml_state_set.size();
+ }
+
+ return bonus;
+}
+
double cTaskLib::Task_CreateTransA(cTaskContext* ctx) const
{
+
std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
std::pair<int, int> st;
+ cOrganism* organism = ctx->organism;
+ cOrganism::tr_it i;
+ double bonus = 0.0;
+ std::set<int>::iterator it;
+ int state1, state2, state3, trans;
+
+
+ if ((organism->uml_state_set.size() > 3) && (organism->uml_trans_set.size() > 0)) {
+ // get the 3 states
+ it = organism->uml_state_set.begin();
+ state1 = *it;
+ it++;
+ state2 = *it;
+ it++;
+ state3 = *it;
+ it = organism->uml_trans_set.begin();
+ trans = *it;
+
+
+ // reward for each transition
+// int key_0 = organism->uml_transitions.begin()->first();
+ trans_range = organism->uml_transitions.equal_range(trans);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state1) && (st.second == state2)) {
+ bonus += 1.0;
+ break;
+ }
+ }
+ }
+ return bonus;
+/* std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
+ std::pair<int, int> st;
cOrganism* org = ctx->organism;
cOrganism::tr_it i;
@@ -1894,12 +1949,48 @@
}
return 0.0;
+*/
}
double cTaskLib::Task_CreateTransB(cTaskContext* ctx) const
{
std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
std::pair<int, int> st;
+ cOrganism* organism = ctx->organism;
+ cOrganism::tr_it i;
+ double bonus = 0.0;
+ std::set<int>::iterator it;
+ int state1, state2, state3, trans;
+
+
+ if ((organism->uml_state_set.size() > 3) && (organism->uml_trans_set.size() > 1)) {
+ // get the 3 states
+ it = organism->uml_state_set.begin();
+ state1 = *it;
+ it++;
+ state2 = *it;
+ it++;
+ state3 = *it;
+ it = organism->uml_trans_set.begin();
+ it++;
+ trans = *it;
+
+ // reward for each transition
+ trans_range = organism->uml_transitions.equal_range(trans);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state2) && (st.second == state3)) {
+ bonus += 1.0;
+ break;
+ }
+ }
+ }
+ return bonus;
+
+/*
+ std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
+ std::pair<int, int> st;
cOrganism* org = ctx->organism;
cOrganism::tr_it i;
@@ -1914,13 +2005,53 @@
}
return 0.0;
+*/
}
double cTaskLib::Task_CreateTransC(cTaskContext* ctx) const
{
+
std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
std::pair<int, int> st;
+ cOrganism* organism = ctx->organism;
+ cOrganism::tr_it i;
+ double bonus = 0.0;
+ std::set<int>::iterator it;
+ int state1, state2, state3, trans;
+
+
+ if ((organism->uml_state_set.size() > 3) && (organism->uml_trans_set.size() > 2)) {
+ // get the 3 states
+ it = organism->uml_state_set.begin();
+ state1 = *it;
+ it++;
+ state2 = *it;
+ it++;
+ state3 = *it;
+ it = organism->uml_trans_set.begin();
+ it++;
+ trans = *it;
+
+
+
+ // reward for each transition
+ trans_range = organism->uml_transitions.equal_range(trans);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state3) && (st.second == state1)) {
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ }
+
+ return bonus;
+
+/* std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
+ std::pair<int, int> st;
cOrganism* org = ctx->organism;
cOrganism::tr_it i;
@@ -1935,4 +2066,206 @@
}
return 0.0;
+*/
}
+
+double cTaskLib::Task_CreateTransX(cTaskContext* ctx) const
+{
+ std::pair<cOrganism::tr_it, cOrganism::tr_it> trans_range;
+ std::pair<int, int> st;
+ cOrganism* organism = ctx->organism;
+ cOrganism::tr_it i;
+ double bonus = 0.0;
+ std::set<int>::iterator it;
+ int state0, state1, state2, state3, state4, state5, state6;
+ int trans1, trans2, trans3, trans4, trans5, trans6, trans7;
+ int trans8, trans9, trans10, trans11;
+
+ if ((organism->uml_state_set.size() > 6) && (organism->uml_trans_set.size() > 10)){
+ // get the 7 states
+ it = organism->uml_state_set.begin();
+ state0 = *it;
+ it++;
+ state1 = *it;
+ it++;
+ state2 = *it;
+ it++;
+ state3 = *it;
+ it++;
+ state4 = *it;
+ it++;
+ state5 = *it;
+ it++;
+ state6 = *it;
+
+ it = organism->uml_trans_set.begin();
+ trans1 = *it;
+ it++;
+ trans2 = *it;
+ it++;
+ trans3 = *it;
+ it++;
+ trans4 = *it;
+ it++;
+ trans5 = *it;
+ it++;
+ trans6 = *it;
+ it++;
+ trans7 = *it;
+ it++;
+ trans8 = *it;
+ it++;
+ trans9 = *it;
+ it++;
+ trans11 = *it;
+
+
+ // reward for each transition
+ // transition 1
+ trans_range = organism->uml_transitions.equal_range(trans1);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state1) && (st.second == state2)) {
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 2
+ trans_range = organism->uml_transitions.equal_range(trans2);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state2) && (st.second == state1)) {
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 3
+ trans_range = organism->uml_transitions.equal_range(trans3);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state2) && (st.second == state1)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 4
+ trans_range = organism->uml_transitions.equal_range(trans4);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state1) && (st.second == state3)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 5
+ trans_range = organism->uml_transitions.equal_range(trans5);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state3) && (st.second == state4)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 6
+ trans_range = organism->uml_transitions.equal_range(trans6);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state4) && (st.second == state5)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 7
+ trans_range = organism->uml_transitions.equal_range(trans7);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state5) && (st.second == state6)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 8
+ trans_range = organism->uml_transitions.equal_range(trans8);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state5) && (st.second == state6)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 9
+ trans_range = organism->uml_transitions.equal_range(trans9);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state5) && (st.second == state6)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 10
+ trans_range = organism->uml_transitions.equal_range(trans10);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state6) && (st.second == state1)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ // transition 11
+ trans_range = organism->uml_transitions.equal_range(trans3);
+ for(i=trans_range.first; i!=trans_range.second; ++i) {
+ st = i->second;
+
+ if ((st.first == state0) && (st.second == state1)) {
+
+ bonus += 1.0;
+ break;
+ }
+ }
+
+ }
+
+ return bonus;
+}
+
+double cTaskLib::Task_CreateTranss(cTaskContext* ctx) const
+{
+ cOrganism* organism = ctx->organism;
+ double bonus = 0.0;
+
+ // reward for constructing 7 states - brightness sensor
+ if (organism->uml_trans_set.size() <= 11) {
+ bonus += organism->uml_trans_set.size();
+ }
+
+ return bonus;
+}
+
Modified: branches/uml/source/main/cTaskLib.h
===================================================================
--- branches/uml/source/main/cTaskLib.h 2006-11-16 22:09:49 UTC (rev 1086)
+++ branches/uml/source/main/cTaskLib.h 2006-11-19 18:21:08 UTC (rev 1087)
@@ -233,9 +233,12 @@
double Task_CreateStateA(cTaskContext* ctx) const;
double Task_CreateStateB(cTaskContext* ctx) const;
double Task_CreateStateC(cTaskContext* ctx) const;
+ double Task_CreateStates(cTaskContext* ctx) const;
double Task_CreateTransA(cTaskContext* ctx) const;
double Task_CreateTransB(cTaskContext* ctx) const;
double Task_CreateTransC(cTaskContext* ctx) const;
+ double Task_CreateTransX(cTaskContext* ctx) const;
+ double Task_CreateTranss(cTaskContext* ctx) const;
};
More information about the Avida-cvs
mailing list