[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