[Avida-SVN] r3086 - in branches/hjg-dev/source: cpu main

hjg at myxo.css.msu.edu hjg at myxo.css.msu.edu
Wed Dec 31 08:20:23 PST 2008


Author: hjg
Date: 2008-12-31 11:20:23 -0500 (Wed, 31 Dec 2008)
New Revision: 3086

Modified:
   branches/hjg-dev/source/cpu/cHardwareCPU.cc
   branches/hjg-dev/source/cpu/cHardwareCPU.h
   branches/hjg-dev/source/main/cOrganism.cc
   branches/hjg-dev/source/main/cOrganism.h
   branches/hjg-dev/source/main/cStats.cc
   branches/hjg-dev/source/main/cStats.h
   branches/hjg-dev/source/main/cTaskLib.cc
   branches/hjg-dev/source/main/cTaskLib.h
Log:
Added a new create perfect strings task. Finished modifying stats to use the new string storage mechanisms.

Modified: branches/hjg-dev/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/hjg-dev/source/cpu/cHardwareCPU.cc	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/cpu/cHardwareCPU.cc	2008-12-31 16:20:23 UTC (rev 3086)
@@ -461,7 +461,9 @@
   	tInstLibEntry<tMethod>("donate-spec", &cHardwareCPU::Inst_DonateFacingRawMaterialsOtherSpecies, nInstFlag::STALL),
 		tInstLibEntry<tMethod>("donate-k", &cHardwareCPU::Inst_DonateFacingConditionalOnK, nInstFlag::STALL),
   	tInstLibEntry<tMethod>("donate-if-donor", &cHardwareCPU::Inst_DonateIfDonor, nInstFlag::STALL),		
+  	tInstLibEntry<tMethod>("donate-string", &cHardwareCPU::Inst_DonateFacingString, nInstFlag::STALL),		
 
+		
     tInstLibEntry<tMethod>("get-neighbors-reputation", &cHardwareCPU::Inst_GetNeighborsReputation, nInstFlag::STALL),
     tInstLibEntry<tMethod>("get-reputation", &cHardwareCPU::Inst_GetReputation, nInstFlag::STALL),
     tInstLibEntry<tMethod>("get-raw-mat-amount", &cHardwareCPU::Inst_GetAmountOfRawMaterials, nInstFlag::STALL),
@@ -480,6 +482,7 @@
 		tInstLibEntry<tMethod>("if-donor",  &cHardwareCPU::Inst_IfDonor, nInstFlag::STALL),
 		tInstLibEntry<tMethod>("prod-string",  &cHardwareCPU::Inst_ProduceString, nInstFlag::STALL),
 
+
     // Must always be the last instruction in the array
     tInstLibEntry<tMethod>("NULL", &cHardwareCPU::Inst_Nop, 0, "True no-operation instruction: does nothing"),
   };
@@ -7002,12 +7005,57 @@
 		int spec_neighbor = neighbor->GetLineageLabel();
 		
 		if (spec_self != spec_neighbor) {
-			Inst_DonateFacingRawMaterials(ctx);	
+			Inst_DonateFacingString(ctx);	
 		}
 	}
 	return true;
 }
 
+/* Donate a string that you have produced to the facing organism */
+bool cHardwareCPU::Inst_DonateFacingString(cAvidaContext& ctx)
+{
+	// Get faced neighbor
+  cOrganism * neighbor = organism->GetNeighbor();
+	int cost = m_world->GetConfig().ALT_COST.Get(); 
+	int my_string = organism->GetLineageLabel();
+	
+	
+  // Donate only if we have found a neighbor.
+  if (neighbor != NULL) {
+		
+    // Check if the organism has enough of this string on hand.
+		int num = organism->GetNumberStringsOnHand(my_string); 
+		int num2 = organism->GetNumberStringsOnHand(0); 
+		
+		if ((organism->GetNumberStringsOnHand(my_string) >= cost) && (neighbor->CanReceiveString(my_string, cost))) { 
+			
+			// sometimes the donation will fail. 
+			// get the probability of failure
+			int prob_fail = m_world->GetConfig().DONATION_FAILURE_PERCENT.Get(); 
+			unsigned int rand_num = m_world->GetRandom().GetUInt(0, 100); 
+			// neighbor donates to organism.
+			if (rand_num < prob_fail) { 
+				// EXIT
+				return true; 
+			}
+			
+			
+			organism->DonateString(my_string, cost);
+			neighbor->AddOtherRawMaterials(cost, organism->GetID()); 
+			neighbor->ReceiveString(my_string, cost, organism->GetID()); 
+			neighbor->AddDonatedLineage(organism->GetLineageLabel());
+				
+			// track stats
+			organism->Donated();
+			
+			ComputeReputation();			
+		}
+  }
+  return true;
+	
+	
+}
+
 /* Donate raw materials to the facing organism. */
 bool cHardwareCPU::Inst_DonateFacingRawMaterials(cAvidaContext& ctx)
 {

Modified: branches/hjg-dev/source/cpu/cHardwareCPU.h
===================================================================
--- branches/hjg-dev/source/cpu/cHardwareCPU.h	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/cpu/cHardwareCPU.h	2008-12-31 16:20:23 UTC (rev 3086)
@@ -695,6 +695,8 @@
 	bool Inst_DonateStringIfDonorRep(cAvidaContext& ctx);		
 	// Donate a raw material to the neighbor, if its reputation > k
 	bool Inst_DonateFacingConditionalOnK(cAvidaContext& ctx);
+	// Donate a string to a neighbor
+	bool Inst_DonateFacingString(cAvidaContext& ctx);
 
 	
 	// Rotate to the organims with the greatest reputation

Modified: branches/hjg-dev/source/main/cOrganism.cc
===================================================================
--- branches/hjg-dev/source/main/cOrganism.cc	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/main/cOrganism.cc	2008-12-31 16:20:23 UTC (rev 3086)
@@ -946,3 +946,46 @@
 	}
 	return val;
 }
+
+/* Donate a string*/
+bool cOrganism::DonateString(int string_tag, int amount)
+{
+	bool val = false; 
+	if (m_string_map[string_tag].on_hand >= amount) {
+		val = true;
+		m_string_map[string_tag].on_hand -= amount;
+	}
+	return val;
+	
+}
+
+/* Receive a string*/
+bool cOrganism::ReceiveString(int string_tag, int amount, int donor_id)
+{
+	bool val = false; 
+	int cap = m_world->GetConfig().STRING_AMOUNT_CAP.Get(); 
+	if ((cap == -1) || (m_string_map[string_tag].on_hand < cap)) 
+	{
+		m_string_map[string_tag].received_string++; 
+		m_string_map[string_tag].on_hand++;
+		donor_list.insert(donor_id);	
+		m_num_donate_received += amount;
+		m_amount_donate_received++;
+		val = true;
+	}
+	return val;
+}
+
+/* Check to see if this amount is below the organism's cap*/
+bool cOrganism::CanReceiveString(int string_tag, int amount)
+{
+	bool val = false; 
+	int cap = m_world->GetConfig().STRING_AMOUNT_CAP.Get(); 
+	if ((cap == -1) || (m_string_map[string_tag].on_hand < cap)) 
+	{
+		val = true;
+	}
+	return val;
+	
+}
+

Modified: branches/hjg-dev/source/main/cOrganism.h
===================================================================
--- branches/hjg-dev/source/main/cOrganism.h	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/main/cOrganism.h	2008-12-31 16:20:23 UTC (rev 3086)
@@ -526,6 +526,9 @@
 	bool ProduceString(int i);  
 	int GetNumberStringsProduced(int i) { return  m_string_map[i].prod_string; }
 	int GetNumberStringsOnHand(int i) { return m_string_map[i].on_hand; }
+	bool DonateString(int string_tag, int amount); 
+	bool ReceiveString(int string_tag, int amount, int donor_id); 
+	bool CanReceiveString(int string_tag, int amount); 
 	
 protected:
 	// The organism's own raw materials

Modified: branches/hjg-dev/source/main/cStats.cc
===================================================================
--- branches/hjg-dev/source/main/cStats.cc	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/main/cStats.cc	2008-12-31 16:20:23 UTC (rev 3086)
@@ -1817,22 +1817,33 @@
 	std::map <int, cDoubleSum> m_strings_stored; 
 	std::map <int, cDoubleSum> m_strings_produced; 
 	cDoubleSum total; 
-	int perfect;
+	int min = -1; 
+	int onhand = 0;
+	int instant_perfect_match = 0;
+	int instant_perfect_match_org = 0;
+	
 	// Get the number of strings
 	int num = m_world->GetEnvironment().GetNumberOfMatchStrings();
 	for(int i=0; i<m_world->GetPopulation().GetSize(); ++i) {
     cPopulationCell& cell = m_world->GetPopulation().GetCell(i);
 		org = cell.GetOrganism();
+		min = -1; 
+		onhand = 0;
 		
     if(cell.IsOccupied()) {
-			perfect = 1;
 			for (unsigned int j = 0; j<num; j++) {
-				m_strings_stored[j].Add(org->GetNumberStringsOnHand(j)); 
-				perfect = perfect && org->GetNumberStringsOnHand(j);
-				total.Add(org->GetNumberStringsOnHand(j));
+				onhand = org->GetNumberStringsOnHand(j);
+				if ((min == -1) || (onhand < min)){
+					min = onhand;
+				}
+				m_strings_stored[j].Add(onhand); 
+				total.Add(onhand);
 				m_strings_produced[j].Add(org->GetNumberStringsProduced(j)); 
 			}
-			if (perfect) m_perfect_match.Add(1);
+			
+			instant_perfect_match += min;
+			if (min > 0) instant_perfect_match_org++;
+			
 		}
 	}
 	
@@ -1850,8 +1861,14 @@
 	df.Write(total.Average(), "totalStoredAverage");
 	
 	// Print number of perfect matches
-	df.Write(m_perfect_match.Sum(), "PerfectMatch"); 
+	df.Write(m_perfect_match.Sum(), "PerfectMatchStringElapse[ps]"); 
 	m_perfect_match.Clear();
+	// Print number of perfect matches
+	df.Write(m_perfect_match_org.Sum(), "PerfectMatchOrgElapse[pso]"); 
+	m_perfect_match_org.Clear();
+	df.Write(instant_perfect_match, "PerfectMatchStringInstant[psi]"); 
+	// Print number of perfect matches
+	df.Write(instant_perfect_match_org, "PerfectMatchOrgInstant[psoi]"); 
 	
 	
   df.Endl();
@@ -1921,7 +1938,7 @@
 		if (org->GetNumberOfDonations() > 0) num_alt++;
 		if ((org->GetNumberOfDonationsReceived() && org->GetNumberOfDonations()) > 0) num_coop++;
 		
-		if (org->GetNumberOfDonatedLineages() == num_strings) num_all_strings++;
+//		if (org->GetNumberOfDonatedLineages() == num_strings) num_all_strings++;
 			
 	  }
 	}
@@ -1943,7 +1960,7 @@
 	df.Write(num_coop, "Number of cooperators [cooperators]");
 	df.Write(own_raw_mat.Average(), "Avg. own raw mat [ownrawmat]");
 	df.Write(other_raw_mat.Average(), "Avg. other raw mat [otherrawmat]");
-	df.Write(num_all_strings, "Number of orgs with all strings [allstrings]");
+//	df.Write(num_all_strings, "Number of orgs with all strings [allstrings]");
 	
 //	df.Write(k.Average(), "Avg. k of organisms [k]");
 //	df.Write(m_donate_to_donor, "Number of donate to donor [donatedonor]");

Modified: branches/hjg-dev/source/main/cStats.h
===================================================================
--- branches/hjg-dev/source/main/cStats.h	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/main/cStats.h	2008-12-31 16:20:23 UTC (rev 3086)
@@ -794,12 +794,15 @@
 	void PrintStringMatchData(const cString& filename);
 	void AddStringBitsMatchedValue(cString name, int value) { m_string_bits_matched[name].Add(value); }
 	void AddTag(int tag, int value) { m_tags[tag] = m_tags[tag] + value; }
-	void IncPerfectMatch() { m_perfect_match.Add(1); }
+	void IncPerfectMatch(int amount) { m_perfect_match.Add(amount); }
+	void IncPerfectMatchOrg() { m_perfect_match_org.Add(1); }
+
 protected: 
 	int m_donate_to_donor; 
 	int m_donate_to_facing;
 	std::map <cString, cDoubleSum> m_string_bits_matched;
 	cDoubleSum m_perfect_match;
+	cDoubleSum m_perfect_match_org;
 	std::map <int, int> m_tags;
 	
   

Modified: branches/hjg-dev/source/main/cTaskLib.cc
===================================================================
--- branches/hjg-dev/source/main/cTaskLib.cc	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/main/cTaskLib.cc	2008-12-31 16:20:23 UTC (rev 3086)
@@ -431,6 +431,8 @@
     NewTask(name, "Save raw materials", &cTaskLib::Task_SaveRawMaterials);	
 	else if(name == "store_strings") 
 		NewTask(name, "Produce and store strings", &cTaskLib::Task_StoreStrings);	
+	else if(name == "perfect_strings") 
+		NewTask(name, "Produce and store perfect strings", &cTaskLib::Task_CreatePerfectStrings);		
 
 
 
@@ -3216,3 +3218,40 @@
 	}
 	return count; 
 }
+
+
+/* This task provides major points for perfect strings and some points for just
+ storing stuff. */
+double cTaskLib::Task_CreatePerfectStrings(cTaskContext& ctx) const {
+	double bonus = 0.0;
+	int min = -1;
+	int temp = 0;
+	for (unsigned int i = 0; i<m_strings.size(); i++) {
+		temp = ctx.GetOrganism()->GetNumberStringsOnHand(i); 
+		
+		// Figure out what the minimum amount of a string is.
+		if ((min == -1) || (temp < min)){
+			min = temp;
+		}
+	}
+	
+	// Double bonus for creating perfect strings!
+	bonus = min * 4; 
+	
+	// Add in some value for just creating stuff
+	for (unsigned int i = 0; i<m_strings.size(); i++) {
+		temp = ctx.GetOrganism()->GetNumberStringsOnHand(i); 
+		
+		if (temp > min) { 
+			bonus += (temp - min); 
+		}
+	}
+	
+	// Update stats
+	m_world->GetStats().IncPerfectMatch(min);
+	if (min > 0) m_world->GetStats().IncPerfectMatchOrg();
+	
+	return bonus; 
+}
+
+

Modified: branches/hjg-dev/source/main/cTaskLib.h
===================================================================
--- branches/hjg-dev/source/main/cTaskLib.h	2008-12-30 22:09:18 UTC (rev 3085)
+++ branches/hjg-dev/source/main/cTaskLib.h	2008-12-31 16:20:23 UTC (rev 3086)
@@ -314,6 +314,7 @@
   double Task_UseRawMaterials(cTaskContext& ctx) const;
   double Task_SaveRawMaterials(cTaskContext& ctx) const;
 	double Task_StoreStrings(cTaskContext& ctx) const;
+	double Task_CreatePerfectStrings(cTaskContext& ctx) const; 
 
 		
 




More information about the Avida-cvs mailing list