[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