[Avida-SVN] r3138 - in development/source: cpu main
connel42 at myxo.css.msu.edu
connel42 at myxo.css.msu.edu
Fri Jan 30 08:01:07 PST 2009
Author: connel42
Date: 2009-01-30 11:01:06 -0500 (Fri, 30 Jan 2009)
New Revision: 3138
Modified:
development/source/cpu/cHardwareCPU.cc
development/source/cpu/cHardwareCPU.h
development/source/main/cDeme.cc
development/source/main/cDeme.h
development/source/main/cPhenotype.cc
development/source/main/cPhenotype.h
development/source/main/cPopulation.cc
Log:
Updated energy sharing instructions and logging
Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/cpu/cHardwareCPU.cc 2009-01-30 16:01:06 UTC (rev 3138)
@@ -228,6 +228,13 @@
tInstLibEntry<tMethod>("donate-energy", &cHardwareCPU::Inst_DonateEnergy, nInstFlag::STALL),
tInstLibEntry<tMethod>("update-metabolic-rate", &cHardwareCPU::Inst_UpdateMetabolicRate, nInstFlag::STALL),
tInstLibEntry<tMethod>("donate-energy-faced", &cHardwareCPU::Inst_DonateEnergyFaced, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced1", &cHardwareCPU::Inst_DonateEnergyFaced1, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced2", &cHardwareCPU::Inst_DonateEnergyFaced2, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced5", &cHardwareCPU::Inst_DonateEnergyFaced5, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced10", &cHardwareCPU::Inst_DonateEnergyFaced10, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced20", &cHardwareCPU::Inst_DonateEnergyFaced20, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced50", &cHardwareCPU::Inst_DonateEnergyFaced50, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("donate-energy-faced100", &cHardwareCPU::Inst_DonateEnergyFaced100, 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),
@@ -406,6 +413,8 @@
tInstLibEntry<tMethod>("if-faced-energy-more", &cHardwareCPU::Inst_IfFacedEnergyMore, 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),
+ tInstLibEntry<tMethod>("get-energy-level", &cHardwareCPU::Inst_GetEnergyLevel, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("get-faced-energy-level", &cHardwareCPU::Inst_GetFacedEnergyLevel, nInstFlag::STALL),
// Sleep and time
tInstLibEntry<tMethod>("sleep", &cHardwareCPU::Inst_Sleep, nInstFlag::STALL),
@@ -3541,49 +3550,63 @@
}
+void cHardwareCPU::DoEnergyDonatePercent(cOrganism* to_org, const double frac_energy_given)
+{
+ assert(to_org != NULL);
+ assert(frac_energy_given >= 0);
+ assert(frac_energy_given <= 1);
+
+ DoEnergyDonateAmount(to_org, m_organism->GetPhenotype().GetStoredEnergy() * frac_energy_given);
+
+} //End DoEnergyDonatePercent()
+
+
// The difference between this version and the previous is that this one allows energy to be placed
// into the recipient's incoming energy buffer and not be applied immediately. Also, some of the
// energy may be lost in transfer
-void cHardwareCPU::DoEnergyDonatePercent(cOrganism* to_org, const double frac_energy_given)
+void cHardwareCPU::DoEnergyDonateAmount(cOrganism* to_org, const double amount)
{
double losspct = m_world->GetConfig().ENERGY_SHARING_LOSS.Get();
assert(to_org != NULL);
- assert(frac_energy_given >= 0);
- assert(frac_energy_given <= 1);
+ assert(amount >= 0);
assert(losspct >= 0);
assert(losspct <= 1);
-
- double cur_energy = m_organism->GetPhenotype().GetStoredEnergy();
+
const int update_metabolic = m_world->GetConfig().ENERGY_SHARING_UPDATE_METABOLIC.Get();
- double energy_given = cur_energy * frac_energy_given;
+ double energy_given = min(m_organism->GetPhenotype().GetStoredEnergy(), amount);
//update energy store and merit of donor
m_organism->GetPhenotype().ReduceEnergy(energy_given);
+ m_organism->GetPhenotype().SetIsEnergyDonor();
m_organism->GetPhenotype().IncreaseEnergyDonated(energy_given);
-
+ m_organism->GetPhenotype().IncreaseNumEnergyDonations();
+
+ m_organism->GetDeme()->IncreaseEnergyDonated(energy_given);
+
if(update_metabolic == 1) {
double senderMerit = cMerit::EnergyToMerit(m_organism->GetPhenotype().GetStoredEnergy() * m_organism->GetPhenotype().GetEnergyUsageRatio(), m_world);
m_organism->UpdateMerit(senderMerit);
}
-
+
//apply loss in transfer
energy_given *= (1 - losspct);
//place energy into receiver's incoming energy buffer
to_org->GetPhenotype().ReceiveDonatedEnergy(energy_given);
+ to_org->GetDeme()->IncreaseEnergyReceived(energy_given); // Harder for phenotype to get the deme, so it's done here
//if we are using the push energy method, pass the new energy into the receiver's energy store and recalculate merit
if(m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) {
to_org->GetPhenotype().ApplyDonatedEnergy();
if(update_metabolic == 1) {
- double receiverMerit = cMerit::EnergyToMerit(to_org->GetPhenotype().GetStoredEnergy() * to_org->GetPhenotype().GetEnergyUsageRatio(), m_world);
- to_org->UpdateMerit(receiverMerit);
+ double receiverMerit = cMerit::EnergyToMerit(to_org->GetPhenotype().GetStoredEnergy() * to_org->GetPhenotype().GetEnergyUsageRatio(), m_world);
+ to_org->UpdateMerit(receiverMerit);
}
}
-} //End DoEnergyDonatePercent()
+} //End DoEnergyDonateAmount()
bool cHardwareCPU::Inst_DonateFacing(cAvidaContext& ctx) {
@@ -4087,7 +4110,6 @@
if(m_organism->GetPhenotype().GetEnergyInBufferAmount() > 0) {
m_organism->GetPhenotype().ApplyDonatedEnergy();
- m_organism->GetPhenotype().SetHasUsedDonatedEnergy();
if(m_world->GetConfig().ENERGY_SHARING_UPDATE_METABOLIC.Get() == 1) {
double receiverMerit = cMerit::EnergyToMerit(m_organism->GetPhenotype().GetStoredEnergy() * m_organism->GetPhenotype().GetEnergyUsageRatio(), m_world);
@@ -4130,8 +4152,6 @@
}
DoEnergyDonatePercent(energyReceiver, m_organism->GetFracEnergyDonating());
- m_organism->GetPhenotype().IncDonates();
- m_organism->GetPhenotype().SetIsEnergyDonor();
return true;
@@ -4163,8 +4183,6 @@
if ( (neighbor->GetPhenotype().HasOpenEnergyRequest()) || (m_world->GetConfig().ENERGY_SHARING_METHOD.Get() == 1) )
{
DoEnergyDonatePercent(neighbor, m_organism->GetFracEnergyDonating());
- m_organism->GetPhenotype().IncDonates();
- m_organism->GetPhenotype().SetIsEnergyDonor();
}
}
@@ -4173,6 +4191,160 @@
} //End Inst_DonateEnergyFaced()
+bool cHardwareCPU::Inst_DonateEnergyFaced1(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 1);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced1()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced2(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 2);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced2()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced5(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 5);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced5()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced10(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 10);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced10()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced20(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 20);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced20()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced50(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 50);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced50()
+
+
+bool cHardwareCPU::Inst_DonateEnergyFaced100(cAvidaContext& ctx)
+{
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_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_METHOD.Get() == 1) )
+ {
+ DoEnergyDonateAmount(neighbor, 100);
+ }
+ }
+
+ return true;
+
+} //End Inst_DonateEnergyFaced100()
+
+
// Rotate to face the most energy needy neighbor
bool cHardwareCPU::Inst_RotateToMostNeedy(cAvidaContext& ctx)
{
@@ -4227,6 +4399,7 @@
m_organism->BroadcastMessage(ctx, msg);
m_organism->GetPhenotype().SetIsEnergyRequestor();
+ m_organism->GetPhenotype().IncreaseNumEnergyRequests();
return true;
@@ -4241,7 +4414,9 @@
}
m_organism->GetPhenotype().SetIsEnergyRequestor();
+ m_organism->GetPhenotype().IncreaseNumEnergyRequests();
m_organism->GetPhenotype().SetHasOpenEnergyRequest();
+
return true;
} //End Inst_RequestEnergyFlagOn()
@@ -5432,6 +5607,40 @@
} //End Inst_IfEnergyNotInBuffer()
+bool cHardwareCPU::Inst_GetEnergyLevel(cAvidaContext& ctx) {
+
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ const int reg = FindModifiedRegister(REG_BX);
+ GetRegister(reg) = (int) floor(m_organism->GetPhenotype().GetStoredEnergy());
+
+ return true;
+
+} //End Inst_GetEnergyLevel()
+
+
+bool cHardwareCPU::Inst_GetFacedEnergyLevel(cAvidaContext& ctx) {
+
+ if(m_organism->GetCellID() < 0) {
+ return false;
+ }
+
+ cOrganism * neighbor = m_organism->GetNeighbor();
+
+ if( (neighbor == NULL) || (neighbor->IsDead()) ) {
+ return false;
+ }
+
+ const int reg = FindModifiedRegister(REG_BX);
+ GetRegister(reg) = (int) floor(neighbor->GetPhenotype().GetStoredEnergy());
+
+ return true;
+
+} //End Inst_GetFacedEnergyLevel()
+
+
bool cHardwareCPU::Inst_Sleep(cAvidaContext& ctx) {
cPopulation& pop = m_world->GetPopulation();
int cellID = m_organism->GetCellID();
Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/cpu/cHardwareCPU.h 2009-01-30 16:01:06 UTC (rev 3138)
@@ -480,6 +480,7 @@
void DoDonate(cOrganism * to_org);
void DoEnergyDonate(cOrganism* to_org);
void DoEnergyDonatePercent(cOrganism* to_org, const double frac_energy_given);
+ void DoEnergyDonateAmount(cOrganism* to_org, const double amount);
bool Inst_DonateRandom(cAvidaContext& ctx);
bool Inst_DonateKin(cAvidaContext& ctx);
bool Inst_DonateEditDist(cAvidaContext& ctx);
@@ -493,6 +494,13 @@
bool Inst_DonateEnergy(cAvidaContext& ctx);
bool Inst_UpdateMetabolicRate(cAvidaContext& ctx);
bool Inst_DonateEnergyFaced(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced1(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced2(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced5(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced10(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced20(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced50(cAvidaContext& ctx);
+ bool Inst_DonateEnergyFaced100(cAvidaContext& ctx);
bool Inst_RotateToMostNeedy(cAvidaContext& ctx);
bool Inst_RequestEnergy(cAvidaContext& ctx);
bool Inst_RequestEnergyFlagOn(cAvidaContext& ctx);
@@ -620,6 +628,8 @@
bool Inst_IfFacedEnergyLess(cAvidaContext& ctx);
bool Inst_IfEnergyInBuffer(cAvidaContext& ctx);
bool Inst_IfEnergyNotInBuffer(cAvidaContext& ctx);
+ bool Inst_GetEnergyLevel(cAvidaContext& ctx);
+ bool Inst_GetFacedEnergyLevel(cAvidaContext& ctx);
bool Inst_Sleep(cAvidaContext& ctx);
bool Inst_GetUpdate(cAvidaContext& ctx);
Modified: development/source/main/cDeme.cc
===================================================================
--- development/source/main/cDeme.cc 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cDeme.cc 2009-01-30 16:01:06 UTC (rev 3138)
@@ -76,6 +76,10 @@
last_org_reaction_count.ResizeClear(num_reactions);
last_org_reaction_count.SetAll(0);
+ total_energy_donated = 0.0;
+ total_energy_received = 0.0;
+ total_energy_applied = 0.0;
+
// If width is negative, set it to the full number of cells.
width = in_width;
if (width < 1) width = cell_ids.GetSize();
@@ -258,6 +262,10 @@
consecutiveSuccessfulEventPeriods = 0;
replicateDeme = false;
+
+ total_energy_donated = 0.0;
+ total_energy_received = 0.0;
+ total_energy_applied = 0.0;
cur_task_exe_count.SetAll(0);
cur_reaction_count.SetAll(0);
Modified: development/source/main/cDeme.h
===================================================================
--- development/source/main/cDeme.h 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cDeme.h 2009-01-30 16:01:06 UTC (rev 3138)
@@ -88,6 +88,10 @@
int sleeping_count; //!< Number of organisms currently sleeping
cDoubleSum energyUsage;
+ double total_energy_donated;
+ double total_energy_received;
+ double total_energy_applied;
+
tArray<int> cur_task_exe_count;
tArray<int> cur_reaction_count;
tArray<int> last_task_exe_count;
@@ -335,6 +339,14 @@
void ClearMigrationOut() { migrations_out = 0; }
void ClearMigrationIn() { migrations_in = 0; }
void ClearSuicides() { suicides = 0; }
+
+ // --- Energy Sharing --- //
+ double GetEnergyDonated() const { return total_energy_donated; }
+ double GetEnergyReceived() const { return total_energy_received; }
+ double GetEnergyApplied() const { return total_energy_applied; }
+ void IncreaseEnergyDonated(double amount) { assert(amount >=0); total_energy_donated += amount; }
+ void IncreaseEnergyReceived(double amount) { assert(amount >=0); total_energy_received += amount; }
+ void IncreaseEnergyApplied(double amount) { assert(amount >=0); total_energy_applied += amount; }
void GetSurroundingCellIds(tVector<int> &cells, const int absolute_cell_id, const int radius);
Modified: development/source/main/cPhenotype.cc
===================================================================
--- development/source/main/cPhenotype.cc 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cPhenotype.cc 2009-01-30 16:01:06 UTC (rev 3138)
@@ -1390,7 +1390,11 @@
SetEnergy(energy_store + energy_received_buffer);
}
+ IncreaseNumEnergyApplications();
+ SetHasUsedDonatedEnergy();
+
energy_received_buffer = 0.0;
+
} //End AppplyDonatedEnergy()
@@ -1398,7 +1402,8 @@
assert(donation >= 0.0);
energy_received_buffer += donation;
IncreaseEnergyReceived(donation);
- is_energy_receiver = true;
+ SetIsEnergyReceiver();
+ IncreaseNumEnergyReceptions();
} //End ReceiveDonatedEnergy()
Modified: development/source/main/cPhenotype.h
===================================================================
--- development/source/main/cPhenotype.h 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cPhenotype.h 2009-01-30 16:01:06 UTC (rev 3138)
@@ -114,6 +114,10 @@
double total_energy_donated; // Tota amount of energy that has been donated
double total_energy_received; // Total amount of energy received through donations
double total_energy_applied; // Total amount of received energy applied to energy store
+ int num_energy_requests; // Number of times organism has requested energy
+ int num_energy_donations; // Number of times energy has been donated
+ int num_energy_receptions; // Number of times organism has received energy donations
+ int num_energy_applications; // Number of times organism has applied donated energy to its energy store
int cur_num_errors; // Total instructions executed illeagally.
int cur_num_donates; // Number of donations so far
tArray<int> cur_task_count; // Total times each task was performed
@@ -462,9 +466,16 @@
void IncreaseEnergyDonated(double amount) { assert(amount >=0); total_energy_donated += amount; }
void IncreaseEnergyReceived(double amount) { assert(amount >=0); total_energy_received += amount; }
void IncreaseEnergyApplied(double amount) { assert(amount >=0); total_energy_applied += amount; }
+ void IncreaseNumEnergyRequests() { num_energy_requests++; }
+ void IncreaseNumEnergyDonations() { num_energy_donations++; }
+ void IncreaseNumEnergyApplications() { num_energy_applications++; }
+ void IncreaseNumEnergyReceptions() { num_energy_receptions++; }
double GetAmountEnergyDonated() { return total_energy_donated; }
double GetAmountEnergyReceived() { return total_energy_received; }
double GetAmountEnergyApplied() { return total_energy_applied; }
+ int GetNumEnergyDonations() { return num_energy_donations; }
+ int GetNumEnergyReceptions() { return num_energy_receptions; }
+ int GetNumEnergyApplications() { return num_energy_applications; }
void SetCurRBinsAvail(const tArray<double>& in_avail) { cur_rbins_avail = in_avail; }
void SetCurRbinsTotal(const tArray<double>& in_total) { cur_rbins_total = in_total; }
Modified: development/source/main/cPopulation.cc
===================================================================
--- development/source/main/cPopulation.cc 2009-01-28 20:33:34 UTC (rev 3137)
+++ development/source/main/cPopulation.cc 2009-01-30 16:01:06 UTC (rev 3138)
@@ -2642,6 +2642,9 @@
double num_requestors = 0;
double num_donors = 0;
double num_receivers = 0;
+ double num_donations = 0;
+ double num_receptions = 0;
+ double num_applications;
double amount_donated = 0.0;
double amount_received = 0.0;
double amount_applied = 0.0;
@@ -2656,14 +2659,21 @@
if(phenotype.IsEnergyRequestor()) num_requestors++;
if(phenotype.IsEnergyDonor()) num_donors++;
if(phenotype.IsEnergyReceiver()) num_receivers++;
+ num_donations += phenotype.GetNumEnergyDonations();
+ num_receptions += phenotype.GetNumEnergyReceptions();
+ num_applications += phenotype.GetNumEnergyApplications();
amount_donated += phenotype.GetAmountEnergyDonated();
amount_received += phenotype.GetAmountEnergyReceived();
amount_applied += phenotype.GetAmountEnergyApplied();
}
}
+
df_donor.Write(num_requestors/num_demes, "Average number of organisms that have requested energy");
df_donor.Write(num_donors/num_demes, "Average number of organisms that have donated energy");
df_donor.Write(num_receivers/num_demes, "Average number of organisms that have received energy");
+ df_donor.Write(num_donations/num_demes, "Average number of donations per deme");
+ df_donor.Write(num_receptions/num_demes, "Average number of receipts per deme");
+ df_donor.Write(num_applications/num_demes, "Average number of applications per deme");
df_donor.Write(amount_donated/num_demes, "Average total amount of energy donated per deme");
df_donor.Write(amount_received/num_demes, "Average total amount of energy received per deme");
df_donor.Write(amount_applied/num_demes, "Average total amount of donated energy applied per deme");
More information about the Avida-cvs
mailing list