[Avida-SVN] r2956 - in development/source: cpu main
connel42 at myxo.css.msu.edu
connel42 at myxo.css.msu.edu
Thu Nov 20 12:24:09 PST 2008
Author: connel42
Date: 2008-11-20 15:24:09 -0500 (Thu, 20 Nov 2008)
New Revision: 2956
Modified:
development/source/cpu/cHardwareCPU.cc
development/source/cpu/cHardwareCPU.h
development/source/main/cAvidaConfig.h
development/source/main/cPhenotype.cc
development/source/main/cPhenotype.h
Log:
Added neighbor-based energy sharing
Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc 2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/cpu/cHardwareCPU.cc 2008-11-20 20:24:09 UTC (rev 2956)
@@ -225,8 +225,11 @@
tInstLibEntry<tMethod>("donate-facing", &cHardwareCPU::Inst_DonateFacing),
tInstLibEntry<tMethod>("receive-donated-energy", &cHardwareCPU::Inst_ReceiveDonatedEnergy, nInstFlag::STALL),
tInstLibEntry<tMethod>("donate-energy", &cHardwareCPU::Inst_DonateEnergy, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced", &cHardwareCPU::Inst_DonateEnergyFaced, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("rotate-to-most-needy", &cHardwareCPU::Inst_RotateToMostNeedy, nInstFlag::STALL),
tInstLibEntry<tMethod>("request-energy", &cHardwareCPU::Inst_RequestEnergy, nInstFlag::STALL),
-
+ tInstLibEntry<tMethod>("request-energy-on", &cHardwareCPU::Inst_RequestEnergyFlagOn, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("request-energy-off", &cHardwareCPU::Inst_RequestEnergyFlagOff, nInstFlag::STALL),
tInstLibEntry<tMethod>("IObuf-add1", &cHardwareCPU::Inst_IOBufAdd1, nInstFlag::STALL),
tInstLibEntry<tMethod>("IObuf-add0", &cHardwareCPU::Inst_IOBufAdd0, nInstFlag::STALL),
@@ -375,9 +378,14 @@
// Energy level detection
tInstLibEntry<tMethod>("if-energy-low", &cHardwareCPU::Inst_IfEnergyLow, nInstFlag::STALL),
tInstLibEntry<tMethod>("if-energy-not-low", &cHardwareCPU::Inst_IfEnergyNotLow, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("if-faced-energy-low", &cHardwareCPU::Inst_IfFacedEnergyLow, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("if-faced-energy-not-low", &cHardwareCPU::Inst_IfFacedEnergyNotLow, nInstFlag::STALL),
tInstLibEntry<tMethod>("if-energy-high", &cHardwareCPU::Inst_IfEnergyHigh, nInstFlag::STALL),
tInstLibEntry<tMethod>("if-energy-not-high", &cHardwareCPU::Inst_IfEnergyNotHigh, nInstFlag::STALL),
- tInstLibEntry<tMethod>("if-energy-med", &cHardwareCPU::Inst_IfEnergyMed, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("if-faced-energy-high", &cHardwareCPU::Inst_IfFacedEnergyHigh, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("if-faced-energy-not-high", &cHardwareCPU::Inst_IfFacedEnergyNotHigh, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("if-energy-med", &cHardwareCPU::Inst_IfEnergyMed, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("if-faced-energy-med", &cHardwareCPU::Inst_IfFacedEnergyMed, nInstFlag::STALL),
tInstLibEntry<tMethod>("if-energy-in-buffer", &cHardwareCPU::Inst_IfEnergyInBuffer, nInstFlag::STALL),
tInstLibEntry<tMethod>("if-energy-not-in-buffer", &cHardwareCPU::Inst_IfEnergyNotInBuffer, nInstFlag::STALL),
@@ -4112,14 +4120,82 @@
DoEnergyDonatePercent(receiver, m_world->GetConfig().ENERGY_SHARING_PCT.Get());
organism->GetPhenotype().IncDonates();
- GetOrganism()->GetOrgInterface().GetDeme()->IncEnergyDonationsMade();
- GetOrganism()->GetPhenotype().SetIsEnergyDonor();
+ organism->GetOrgInterface().GetDeme()->IncEnergyDonationsMade();
+ organism->GetPhenotype().SetIsEnergyDonor();
return true;
} //End Inst_DonateEnergy()
+//Donate a fraction of organism's energy to faced organism.
+bool cHardwareCPU::Inst_DonateEnergyFaced(cAvidaContext& ctx)
+{
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = organism->GetNeighbor();
+
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+
+ // If the neighbor has requested energy or if we're allowing push sharing, share energy
+ if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_PCT.Get() == 1) )
+ {
+ DoEnergyDonatePercent(neighbor, m_world->GetConfig().ENERGY_SHARING_PCT.Get());
+ organism->GetPhenotype().IncDonates();
+ organism->GetOrgInterface().GetDeme()->IncEnergyDonationsMade();
+ organism->GetPhenotype().SetIsEnergyDonor();
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced()
+
+
+// Rotate to face the most energy needy neighbor
+bool cHardwareCPU::Inst_RotateToMostNeedy(cAvidaContext& ctx)
+{
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cPopulation& pop = m_world->GetPopulation();
+ cPopulationCell& mycell = pop.GetCell(organism->GetCellID());
+
+ double min_energy = m_world->GetConfig().ENERGY_CAP.Get();
+ int num_rotations = 0;
+ cOrganism *neighbor;
+ double neighbor_energy;
+
+ // Look at the energy levels of neighbors
+ for(int i = 0; i < mycell.ConnectionList().GetSize(); i++) {
+ mycell.ConnectionList().CircNext();
+ neighbor = organism->GetNeighbor();
+
+ // If this neighbor is alive and has a request for energy or we're allowing pushing of energy, look at it
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) &&
+ ((neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1)) ) {
+ neighbor_energy = neighbor->GetPhenotype().GetStoredEnergy();
+
+ if( (neighbor_energy > 0) && (neighbor_energy < min_energy) ) {
+ num_rotations = i;
+ }
+ }
+
+ }
+
+ //Rotate to face the most needy neighbor
+ for(int i = 0; i < num_rotations; i++) {
+ mycell.ConnectionList().CircNext();
+ }
+
+ return true;
+
+} //End Inst_RotateToMostNeedy()
+
+
//Broadcast a request for energy
bool cHardwareCPU::Inst_RequestEnergy(cAvidaContext& ctx)
{
@@ -4133,14 +4209,40 @@
// Could set the data field of the message to be the multiplier
organism->BroadcastMessage(ctx, msg);
- GetOrganism()->GetOrgInterface().GetDeme()->IncEnergyRequestsMade();
- GetOrganism()->GetPhenotype().SetIsEnergyRequestor();
+ organism->GetOrgInterface().GetDeme()->IncEnergyRequestsMade();
+ organism->GetPhenotype().SetIsEnergyRequestor();
return true;
} //End Inst_RequestEnergy()
+//Set the request energy flag
+bool cHardwareCPU::Inst_RequestEnergyFlagOn(cAvidaContext& ctx)
+{
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ organism->GetOrgInterface().GetDeme()->IncEnergyRequestsMade();
+ organism->GetPhenotype().SetIsEnergyRequestor();
+ organism->GetPhenotype().SetHasOpenEnergyRequest();
+ return true;
+} //End Inst_RequestEnergyFlagOn()
+
+
+//Set the request energy flag to off
+bool cHardwareCPU::Inst_RequestEnergyFlagOff(cAvidaContext& ctx)
+{
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ organism->GetPhenotype().ClearHasOpenEnergyRequest();
+ return true;
+} //End Inst_RequestEnergyFlagOff()
+
+
bool cHardwareCPU::Inst_SearchF(cAvidaContext& ctx)
{
ReadLabel();
@@ -4941,6 +5043,50 @@
} //End Inst_IfEnergyNotLow()
+/* Execute the next instruction if the faced organism's energy level is low */
+bool cHardwareCPU::Inst_IfFacedEnergyLow(cAvidaContext& ctx) {
+
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ // Get faced neighbor
+ cOrganism * neighbor = organism->GetNeighbor();
+
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) ){
+ // Note: these instructions should probably also make sure the returned energy level is not -1.
+ if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() != cPhenotype::ENERGY_LEVEL_LOW) {
+ IP().Advance();
+ }
+ }
+
+ return true;
+
+} //End Inst_IfFacedEnergyLow()
+
+
+/* Execute the next instruction if the faced organism's energy level is low */
+bool cHardwareCPU::Inst_IfFacedEnergyNotLow(cAvidaContext& ctx) {
+
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ // Get faced neighbor
+ cOrganism * neighbor = organism->GetNeighbor();
+
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+ // Note: these instructions should probably also make sure the returned energy level is not -1.
+ if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() == cPhenotype::ENERGY_LEVEL_LOW) {
+ IP().Advance();
+ }
+ }
+
+ return true;
+
+} //End Inst_IfFacedEnergyNotLow()
+
+
/* Execute the next instruction if the organism's energy level is high */
bool cHardwareCPU::Inst_IfEnergyHigh(cAvidaContext& ctx) {
@@ -4973,6 +5119,50 @@
} //End Inst_IfEnergyNotHigh()
+/* Execute the next instruction if the faced organism's energy level is high */
+bool cHardwareCPU::Inst_IfFacedEnergyHigh(cAvidaContext& ctx) {
+
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ // Get faced neighbor
+ cOrganism * neighbor = organism->GetNeighbor();
+
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+ // Note: these instructions should probably also make sure the returned energy level is not -1.
+ if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() != cPhenotype::ENERGY_LEVEL_HIGH) {
+ IP().Advance();
+ }
+ }
+
+ return true;
+
+} //End Inst_IfFacedEnergyHigh()
+
+
+/* Execute the next instruction if the faced organism's energy level is not high */
+bool cHardwareCPU::Inst_IfFacedEnergyNotHigh(cAvidaContext& ctx) {
+
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ // Get faced neighbor
+ cOrganism * neighbor = organism->GetNeighbor();
+
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+ // Note: these instructions should probably also make sure the returned energy level is not -1.
+ if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() == cPhenotype::ENERGY_LEVEL_HIGH) {
+ IP().Advance();
+ }
+ }
+
+ return true;
+
+} //End Inst_IfFacedEnergyNotHigh()
+
+
/* Execute the next instruction if the organism's energy level is medium */
bool cHardwareCPU::Inst_IfEnergyMed(cAvidaContext& ctx) {
@@ -4989,6 +5179,28 @@
} //End Inst_IfEnergyMed()
+/* Execute the next instruction if the faced organism's energy level is medium */
+bool cHardwareCPU::Inst_IfFacedEnergyMed(cAvidaContext& ctx) {
+
+ if(organism->GetCellID() < 0) {
+ return false;
+ }
+
+ // Get faced neighbor
+ cOrganism * neighbor = organism->GetNeighbor();
+
+ if ( (neighbor != NULL) && (!neighbor->IsDead()) ) {
+ // Note: these instructions should probably also make sure the returned energy level is not -1.
+ if(neighbor->GetPhenotype().GetDiscreteEnergyLevel() != cPhenotype::ENERGY_LEVEL_MEDIUM) {
+ IP().Advance();
+ }
+ }
+
+ return true;
+
+} //End Inst_IfFacedEnergyMed()
+
+
/* Execute the next instruction if the organism has received energy */
bool cHardwareCPU::Inst_IfEnergyInBuffer(cAvidaContext& ctx) {
Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h 2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/cpu/cHardwareCPU.h 2008-11-20 20:24:09 UTC (rev 2956)
@@ -485,9 +485,12 @@
bool Inst_DonateFacing(cAvidaContext& ctx);
bool Inst_ReceiveDonatedEnergy(cAvidaContext& ctx);
bool Inst_DonateEnergy(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced(cAvidaContext& ctx);
+ bool Inst_RotateToMostNeedy(cAvidaContext& ctx);
bool Inst_RequestEnergy(cAvidaContext& ctx);
+ bool Inst_RequestEnergyFlagOn(cAvidaContext& ctx);
+ bool Inst_RequestEnergyFlagOff(cAvidaContext& ctx);
-
bool Inst_SearchF(cAvidaContext& ctx);
bool Inst_SearchB(cAvidaContext& ctx);
bool Inst_MemSize(cAvidaContext& ctx);
@@ -590,9 +593,14 @@
bool Inst_IfEnergyLow(cAvidaContext& ctx);
bool Inst_IfEnergyNotLow(cAvidaContext& ctx);
+ bool Inst_IfFacedEnergyLow(cAvidaContext& ctx);
+ bool Inst_IfFacedEnergyNotLow(cAvidaContext& ctx);
bool Inst_IfEnergyHigh(cAvidaContext& ctx);
bool Inst_IfEnergyNotHigh(cAvidaContext& ctx);
+ bool Inst_IfFacedEnergyHigh(cAvidaContext& ctx);
+ bool Inst_IfFacedEnergyNotHigh(cAvidaContext& ctx);
bool Inst_IfEnergyMed(cAvidaContext& ctx);
+ bool Inst_IfFacedEnergyMed(cAvidaContext& ctx);
bool Inst_IfEnergyInBuffer(cAvidaContext& ctx);
bool Inst_IfEnergyNotInBuffer(cAvidaContext& ctx);
Modified: development/source/main/cAvidaConfig.h
===================================================================
--- development/source/main/cAvidaConfig.h 2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/main/cAvidaConfig.h 2008-11-20 20:24:09 UTC (rev 2956)
@@ -509,7 +509,7 @@
CONFIG_ADD_VAR(ENERGY_THRESH_HIGH, double, .75, "Threshold percent above which energy level is considered high. Requires ENERGY_CAP.");
CONFIG_ADD_GROUP(ENERGY_SHARING_GROUP, "Energy Sharing Settings");
- CONFIG_ADD_VAR(ENERGY_SHARING_METHOD, int, 0, "Method for sharing energy. 0=receiver must actively receive, 1=energy pushed on receiver");
+ CONFIG_ADD_VAR(ENERGY_SHARING_METHOD, int, 0, "Method for sharing energy. 0=receiver must actively receive/request, 1=energy pushed on receiver");
CONFIG_ADD_VAR(ENERGY_SHARING_PCT, double, 0.0, "Percent of energy to share");
CONFIG_ADD_VAR(ENERGY_SHARING_LOSS, double, 0.0, "Percent of shared energy lost in transfer");
Modified: development/source/main/cPhenotype.cc
===================================================================
--- development/source/main/cPhenotype.cc 2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/main/cPhenotype.cc 2008-11-20 20:24:09 UTC (rev 2956)
@@ -227,6 +227,7 @@
is_energy_donor = in_phen.is_energy_donor;
is_energy_receiver = in_phen.is_energy_receiver;
has_used_donated_energy = in_phen.has_used_donated_energy;
+ has_open_energy_request = in_phen.has_open_energy_request;
total_energy_donated = in_phen.total_energy_donated;
total_energy_received = in_phen.total_energy_received;
total_energy_applied = in_phen.total_energy_applied;
@@ -424,6 +425,7 @@
is_energy_donor = false;
is_energy_receiver = false;
has_used_donated_energy = false;
+ has_open_energy_request = false;
total_energy_donated = 0.0;
total_energy_received = 0.0;
total_energy_applied = 0.0;
@@ -579,6 +581,7 @@
is_energy_donor = false;
is_energy_receiver = false;
has_used_donated_energy = false;
+ has_open_energy_request = false;
total_energy_donated = 0.0;
total_energy_received = 0.0;
total_energy_applied = 0.0;
@@ -1039,6 +1042,7 @@
is_energy_donor = false;
is_energy_receiver = false;
has_used_donated_energy = false;
+ has_open_energy_request = false;
// Setup child info...
copy_true = false;
Modified: development/source/main/cPhenotype.h
===================================================================
--- development/source/main/cPhenotype.h 2008-11-20 17:52:32 UTC (rev 2955)
+++ development/source/main/cPhenotype.h 2008-11-20 20:24:09 UTC (rev 2956)
@@ -196,6 +196,7 @@
bool is_energy_donor; // Has this organism donated energy?
bool is_energy_receiver; // Has this organism received an energy donation?
bool has_used_donated_energy; // Has the organism actively used an energy donation?
+ bool has_open_energy_request; // Does the organism have an energy request that hasn't been answered?
int num_thresh_gb_donations; // Num times this organism threshgb_donated (thresh green beard)?
int num_thresh_gb_donations_last; // Num times this org's parent thresh_donated?
int num_quanta_thresh_gb_donations; // Num times this organism threshgb_donated (thresh green beard)?
@@ -394,6 +395,7 @@
bool IsEnergyDonor() const { assert(initialized == true); return is_energy_donor; }
bool IsEnergyReceiver() const { assert(initialized == true); return is_energy_receiver; }
bool HasUsedEnergyDonation() const { assert(initialized == true); return has_used_donated_energy; }
+ bool HasOpenEnergyRequest() const { assert(initialized == true); return has_open_energy_request; }
bool IsReceiver() const { assert(initialized == true); return is_receiver; }
bool IsReceiverLast() const { assert(initialized == true); return is_receiver_last; }
bool IsReceiverRand() const { assert(initialized == true); return is_receiver_rand; }
@@ -481,6 +483,8 @@
void SetIsEnergyDonor() { is_energy_donor = true; }
void SetIsEnergyReceiver() { is_energy_receiver = true; }
void SetHasUsedDonatedEnergy() {has_used_donated_energy = true; }
+ void SetHasOpenEnergyRequest() { has_open_energy_request = true; }
+ void ClearHasOpenEnergyRequest() { has_open_energy_request = false; }
void SetCurBonus(double _bonus) { cur_bonus = _bonus; }
void SetCurBonusInstCount(int _num_bonus_inst) {bonus_instruction_count = _num_bonus_inst;}
More information about the Avida-cvs
mailing list