[Avida-SVN] r2514 - in branches/jobScheduling/source: actions cpu main
beckma24 at myxo.css.msu.edu
beckma24 at myxo.css.msu.edu
Wed Apr 2 21:56:50 PDT 2008
Author: beckma24
Date: 2008-04-03 00:56:49 -0400 (Thu, 03 Apr 2008)
New Revision: 2514
Modified:
branches/jobScheduling/source/actions/EnvironmentActions.cc
branches/jobScheduling/source/actions/PrintActions.cc
branches/jobScheduling/source/cpu/cHardwareBase.h
branches/jobScheduling/source/cpu/cHardwareCPU.cc
branches/jobScheduling/source/cpu/cHardwareCPU.h
branches/jobScheduling/source/cpu/cTestCPUInterface.h
branches/jobScheduling/source/main/cDeme.cc
branches/jobScheduling/source/main/cDeme.h
branches/jobScheduling/source/main/cDemeCellEvent.cc
branches/jobScheduling/source/main/cDemeCellEvent.h
branches/jobScheduling/source/main/cOrgInterface.h
branches/jobScheduling/source/main/cOrganism.cc
branches/jobScheduling/source/main/cOrganism.h
branches/jobScheduling/source/main/cPopulationInterface.cc
branches/jobScheduling/source/main/cPopulationInterface.h
branches/jobScheduling/source/main/cStats.cc
branches/jobScheduling/source/main/cStats.h
Log:
Added alarm bit cons instruction and lots of data logging code so that I can see population size and event killing relative to event inflow rate. Plus some more...I think...maybe not...
Modified: branches/jobScheduling/source/actions/EnvironmentActions.cc
===================================================================
--- branches/jobScheduling/source/actions/EnvironmentActions.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/actions/EnvironmentActions.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -770,9 +770,63 @@
}
};
+class cActionDelayedDemeEventsPerSlots : public cAction
+{
+private:
+ int m_x1, m_y1, m_x2, m_y2; // bounding box of event in deme
+ int m_delay; // deme age when event occurs
+ int m_duration; // length of event; subverted when deme is reset
+ int m_total_slots; // total number of slots
+ int m_total_events_per_slot_max; // maximum number of unique event to create per slot; they may overlab
+ int m_total_events_per_slot_min; // minimum number of unique event to create per slot; they may overlab
+ int m_tolal_event_flow_levels; // total number of evenly spaced event flow levels; not all flow levels will be represented in a single deme
+ bool m_static_position;
+
+public:
+ cActionDelayedDemeEventsPerSlots(cWorld* world, const cString& args) :
+ cAction(world, args)
+ , m_x1(-1)
+ , m_y1(-1)
+ , m_x2(-1)
+ , m_y2(-1)
+ , m_delay(-1)
+ , m_duration(-1)
+ , m_total_slots(1)
+ , m_total_events_per_slot_max(1)
+ , m_total_events_per_slot_min(1)
+ , m_tolal_event_flow_levels(1)
+ , m_static_position(true)
+ {
+ cString largs(args);
+ if (largs.GetSize()) m_x1 = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_y1 = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_x2 = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_y2 = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_delay = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_duration = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_static_position = static_cast<bool>(largs.PopWord().AsInt());
+ if (largs.GetSize()) m_total_slots = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_total_events_per_slot_max = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_total_events_per_slot_min = largs.PopWord().AsInt();
+ if (largs.GetSize()) m_tolal_event_flow_levels = largs.PopWord().AsInt();
+ }
+
+ static const cString GetDescription() { return "Arguments: <int x1> <int y1> <int x2> <int y2> <int delay> <int duraion> <bool static_position> <int total_slots_per_deme> <int total_events_per_slot_max> <int total_events_per_slot_min> <int tolal_event_flow_levels>"; }
+
+ void Process(cAvidaContext& ctx)
+ {
+ cPopulation& pop = m_world->GetPopulation();
+ int numDemes = pop.GetNumDemes();
+ for(int i = 0; i < numDemes; i++) {
+ pop.GetDeme(i).SetCellEventSlots(m_x1, m_y1, m_x2, m_y2, m_delay, m_duration, m_static_position, m_total_slots, m_total_events_per_slot_max, m_total_events_per_slot_min, m_tolal_event_flow_levels);
+ }
+ }
+};
+
void RegisterEnvironmentActions(cActionLibrary* action_lib)
{
action_lib->Register<cActionDelayedDemeEvent>("DelayedDemeEvent");
+ action_lib->Register<cActionDelayedDemeEventsPerSlots>("DelayedDemeEventsPerSlots");
action_lib->Register<cActionInjectResource>("InjectResource");
action_lib->Register<cActionInjectScaledResource>("InjectScaledResource");
action_lib->Register<cActionOutflowScaledResource>("OutflowScaledResource");
Modified: branches/jobScheduling/source/actions/PrintActions.cc
===================================================================
--- branches/jobScheduling/source/actions/PrintActions.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/actions/PrintActions.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -99,6 +99,7 @@
STATS_OUT_FILE(PrintGermlineData, germline.dat );
// @WRE: Added output event for collected visit counts
STATS_OUT_FILE(PrintCellVisitsData, visits.dat );
+STATS_OUT_FILE(PrintFlowRateTuples, flow_rate_tuples.dat);
#define POP_OUT_FILE(METHOD, DEFAULT) /* 1 */ \
@@ -2638,6 +2639,7 @@
// Stats Out Files
action_lib->Register<cActionPrintAverageData>("PrintAverageData");
action_lib->Register<cActionPrintDemeAverageData>("PrintDemeAverageData");
+ action_lib->Register<cActionPrintFlowRateTuples>("PrintFlowRateTuples");
action_lib->Register<cActionPrintErrorData>("PrintErrorData");
action_lib->Register<cActionPrintVarianceData>("PrintVarianceData");
action_lib->Register<cActionPrintDominantData>("PrintDominantData");
Modified: branches/jobScheduling/source/cpu/cHardwareBase.h
===================================================================
--- branches/jobScheduling/source/cpu/cHardwareBase.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cHardwareBase.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -191,7 +191,7 @@
virtual void InheritState(cHardwareBase& in_hardware){ ; }
//alarm
- virtual bool Jump_To_Alarm_Label() { return false; }
+ virtual bool Jump_To_Alarm_Label(int jump_label) { return false; }
protected:
// -------- No-Operation Instruction --------
Modified: branches/jobScheduling/source/cpu/cHardwareCPU.cc
===================================================================
--- branches/jobScheduling/source/cpu/cHardwareCPU.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cHardwareCPU.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -395,7 +395,9 @@
// Alarms
tInstLibEntry<tMethod>("send-alarm-msg", &cHardwareCPU::Inst_Alarm_MSG, nInstFlag::STALL),
- tInstLibEntry<tMethod>("alarm-label", &cHardwareCPU::Inst_Alarm_Label),
+ tInstLibEntry<tMethod>("send-alarm-msg-bit-cons24", &cHardwareCPU::Inst_Alarm_MSG_Bit_Cons24, nInstFlag::STALL),
+ tInstLibEntry<tMethod>("alarm-label-high", &cHardwareCPU::Inst_Alarm_Label),
+ tInstLibEntry<tMethod>("alarm-label-low", &cHardwareCPU::Inst_Alarm_Label),
// Placebo instructions
@@ -4788,16 +4790,34 @@
}
bool cHardwareCPU::Inst_Alarm_MSG(cAvidaContext& ctx) {
- return organism->BcastAlarmMSG(ctx);
+ return organism->BcastAlarmMSG(ctx, 1); // jump to Alarm-label-high
}
+bool cHardwareCPU::Inst_Alarm_MSG_Bit_Cons24(cAvidaContext& ctx) {
+ const int reg_used = FindModifiedRegister(REG_BX);
+ const int op1 = FindModifiedNextRegister(reg_used);
+ GetRegister(reg_used) = (BitCount(GetRegister(op1) & MASK24) >= CONSENSUS24) ? 1 : 0;
+
+ return organism->BcastAlarmMSG(ctx, GetRegister(reg_used));// jump to Alarm-label-high OR Alarm-label-low
+}
+
bool cHardwareCPU::Inst_Alarm_Label(cAvidaContext& ctx) {
return true;
}
-bool cHardwareCPU::Jump_To_Alarm_Label() {
- static cInstruction label_inst = GetInstSet().GetInst(cStringUtil::Stringf("alarm-label"));
+bool cHardwareCPU::Jump_To_Alarm_Label(int jump_label) {
+ cString channel;
+ if(jump_label == 1) {
+ channel = "high";
+ } else if(jump_label == 0) {
+ channel = "low";
+ } else {
+ assert(false);
+ }
+
+ cInstruction label_inst = GetInstSet().GetInst(cStringUtil::Stringf("alarm-label-")+channel);
+
cHeadCPU search_head(IP());
int start_pos = search_head.GetPosition();
search_head++;
Modified: branches/jobScheduling/source/cpu/cHardwareCPU.h
===================================================================
--- branches/jobScheduling/source/cpu/cHardwareCPU.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cHardwareCPU.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -598,8 +598,9 @@
//// Alarm ////
bool Inst_Alarm_MSG(cAvidaContext& ctx);
+ bool Inst_Alarm_MSG_Bit_Cons24(cAvidaContext& ctx);
bool Inst_Alarm_Label(cAvidaContext& ctx);
- bool Jump_To_Alarm_Label();
+ bool Jump_To_Alarm_Label(int jump_label);
//// Placebo ////
Modified: branches/jobScheduling/source/cpu/cTestCPUInterface.h
===================================================================
--- branches/jobScheduling/source/cpu/cTestCPUInterface.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/cpu/cTestCPUInterface.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -81,7 +81,7 @@
int GetFacing() { return 0; }
bool SendMessage(cOrgMessage& msg) { return false; }
- bool BcastAlarm() { return false; }
+ bool BcastAlarm(int jump_label) { return false; }
};
Modified: branches/jobScheduling/source/main/cDeme.cc
===================================================================
--- branches/jobScheduling/source/main/cDeme.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDeme.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -29,6 +29,7 @@
#include "cPopulation.h"
#include "cPopulationCell.h"
#include "cResource.h"
+#include "cStats.h"
#include "cWorld.h"
void cDeme::Setup(int id, const tArray<int> & in_cells, int in_width, cWorld* world)
@@ -98,6 +99,17 @@
event.DeactivateEvent(); //event over
}
}
+
+ for(vector<pair<int, int> >::iterator iter = event_slot_end_points.begin(); iter < event_slot_end_points.end(); iter++) {
+ cerr<<(*iter).first << " " << _age << endl;
+ if(_age == (*iter).first) {
+ // at end point
+ (m_world->GetStats().FlowRateTuple())[(*iter).second].first.Add(GetSize());
+ (m_world->GetStats().FlowRateTuple())[(*iter).second].second.Add(GetEventsKilled());
+
+ break;
+ }
+ }
++_age;
}
@@ -257,6 +269,39 @@
}
}
+void cDeme::SetCellEventSlots(int x1, int y1, int x2, int y2, int delay, int duration,
+ bool static_position, int m_total_slots, int m_total_events_per_slot_max,
+ int m_total_events_per_slot_min, int m_tolal_event_flow_levels) {
+ assert(cell_events.GetSize() == 0); // not designed to be used with other cell events
+ assert(m_world->GetConfig().DEMES_MAX_AGE.Get() >= m_total_slots);
+
+ int flow_level_increment = (m_total_events_per_slot_max - m_total_events_per_slot_min) / (m_tolal_event_flow_levels-1);
+ int slot_length = m_world->GetConfig().DEMES_MAX_AGE.Get() / m_total_slots;
+
+ // setup stats tuples
+
+ for(int i = 0; i < m_total_slots; i++) {
+ int slot_flow_level = flow_level_increment * m_world->GetRandom().GetInt(m_tolal_event_flow_levels) + m_total_events_per_slot_min; // number of event during this slot
+ int slot_delay = i * slot_length;
+ cell_events.Resize(cell_events.GetSize() + slot_flow_level);
+ int cell_events_size = cell_events.GetSize();
+ event_slot_end_points.push_back(make_pair(slot_delay+slot_length, slot_flow_level)); // last slot is never reached it is == to MAX_AGE
+
+ for(int k = 0; k < slot_flow_level; k++) {
+ cDemeCellEvent demeEvent = cDemeCellEvent(x1, y1, x2, y2, delay, duration, width, GetHeight(), static_position, m_world);
+ demeEvent.ConfineToTimeSlot(slot_delay, slot_delay+slot_length);
+ cell_events[cell_events_size-k-1] = demeEvent;
+ }
+ }
+
+ // setup stats.flow_rate_tuples
+ cStats& stats = m_world->GetStats();
+ for(int i = m_total_events_per_slot_min; i <= m_total_events_per_slot_max; i+=flow_level_increment) {
+ (stats.FlowRateTuple())[i].first.Clear();
+ (stats.FlowRateTuple())[i].second.Clear();
+ }
+}
+
void cDeme::KillCellEvent(const int eventID) {
for(int i = 0; i < cell_events.GetSize(); i++) {
cDemeCellEvent& event = cell_events[i];
Modified: branches/jobScheduling/source/main/cDeme.h
===================================================================
--- branches/jobScheduling/source/main/cDeme.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDeme.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -24,6 +24,8 @@
#ifndef cDeme_h
#define cDeme_h
+#include <vector>
+
#include "cDemeCellEvent.h"
#include "cGermline.h"
#include "cMerit.h"
@@ -70,6 +72,7 @@
tArray<int> energy_res_ids; //!< IDs of energy resources
tArray<cDemeCellEvent> cell_events;
+ std::vector<std::pair<int, int> > event_slot_end_points; // (slot end point, slot flow rate)
int m_germline_genotype_id; // Genotype id of germline (if in use)
tArray<int> m_founder_genotype_ids; // List of genotype ids used to found deme.
@@ -154,6 +157,10 @@
int GetRelativeCellID(int absolute_cell_id) { return absolute_cell_id % GetSize(); } //!< assumes all demes are the same size
void SetCellEvent(int x1, int y1, int x2, int y2, int delay, int duration, bool static_position, int total_events);
+ void SetCellEventSlots(int x1, int y1, int x2, int y2, int delay, int duration,
+ bool static_position, int m_total_slots, int m_total_events_per_slot_max,
+ int m_total_events_per_slot_min, int m_tolal_event_flow_levels);
+
void KillCellEvent(const int eventID);
double CalculateTotalEnergy();
Modified: branches/jobScheduling/source/main/cDemeCellEvent.cc
===================================================================
--- branches/jobScheduling/source/main/cDemeCellEvent.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDemeCellEvent.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -65,3 +65,11 @@
void cDemeCellEvent::DeactivateEvent() {
m_active = false;
}
+
+// should be called before organisms in deme are running
+void cDemeCellEvent::ConfineToTimeSlot(int min_delay, int max_delay) {
+ assert(!m_active);
+ assert(max_delay > min_delay);
+
+ m_delay = (m_delay % (max_delay - min_delay)) + min_delay;
+}
\ No newline at end of file
Modified: branches/jobScheduling/source/main/cDemeCellEvent.h
===================================================================
--- branches/jobScheduling/source/main/cDemeCellEvent.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cDemeCellEvent.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -23,5 +23,7 @@
void ActivateEvent();
void DeactivateEvent();
+
+ void ConfineToTimeSlot(int min_delay, int max_delay);
};
#endif
Modified: branches/jobScheduling/source/main/cOrgInterface.h
===================================================================
--- branches/jobScheduling/source/main/cOrgInterface.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cOrgInterface.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -90,7 +90,7 @@
virtual bool TestOnDivide() = 0;
virtual bool SendMessage(cOrgMessage& msg) = 0;
- virtual bool BcastAlarm() = 0;
+ virtual bool BcastAlarm(int jump_jabel) = 0;
};
Modified: branches/jobScheduling/source/main/cOrganism.cc
===================================================================
--- branches/jobScheduling/source/main/cOrganism.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cOrganism.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -668,11 +668,11 @@
}
-bool cOrganism::BcastAlarmMSG(cAvidaContext& ctx) {
+bool cOrganism::BcastAlarmMSG(cAvidaContext& ctx, int jump_label) {
assert(m_interface);
// If we're able to succesfully send an alarm...
- if(m_interface->BcastAlarm()) {
+ if(m_interface->BcastAlarm(jump_label)) {
// check to see if we've performed any tasks...
DoOutput(ctx);
return true;
@@ -680,7 +680,7 @@
return false;
}
-void cOrganism::moveIPtoAlarmLabel() {
+void cOrganism::moveIPtoAlarmLabel(int jump_label) {
// move IP to alarm_label
- m_hardware->Jump_To_Alarm_Label();
+ m_hardware->Jump_To_Alarm_Label(jump_label);
}
Modified: branches/jobScheduling/source/main/cOrganism.h
===================================================================
--- branches/jobScheduling/source/main/cOrganism.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cOrganism.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -355,8 +355,8 @@
/***** context switch********/
public:
- bool BcastAlarmMSG(cAvidaContext& ctx);
- void moveIPtoAlarmLabel();
+ bool BcastAlarmMSG(cAvidaContext& ctx, int jump_label);
+ void moveIPtoAlarmLabel(int jump_label);
};
Modified: branches/jobScheduling/source/main/cPopulationInterface.cc
===================================================================
--- branches/jobScheduling/source/main/cPopulationInterface.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cPopulationInterface.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -266,7 +266,7 @@
}
-bool cPopulationInterface::BcastAlarm() {
+bool cPopulationInterface::BcastAlarm(int jump_label) {
cPopulationCell& cell = m_world->GetPopulation().GetCell(m_cell_id);
assert(cell.IsOccupied()); // This organism; sanity.
@@ -279,7 +279,7 @@
continue;
cOrganism* recvr = rcell->GetOrganism();
assert(recvr != NULL);
- recvr->moveIPtoAlarmLabel();
+ recvr->moveIPtoAlarmLabel(jump_label);
}
return true;
}
Modified: branches/jobScheduling/source/main/cPopulationInterface.h
===================================================================
--- branches/jobScheduling/source/main/cPopulationInterface.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cPopulationInterface.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -92,7 +92,7 @@
bool TestOnDivide();
//! Send a message to the faced organism.
bool SendMessage(cOrgMessage& msg);
- bool BcastAlarm();
+ bool BcastAlarm(int jump_label);
};
Modified: branches/jobScheduling/source/main/cStats.cc
===================================================================
--- branches/jobScheduling/source/main/cStats.cc 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cStats.cc 2008-04-03 04:56:49 UTC (rev 2514)
@@ -44,6 +44,7 @@
#include <cfloat>
#include <cmath>
+#include <sstream>
cStats::cStats(cWorld* world)
@@ -589,6 +590,35 @@
df.Endl();
}
+void cStats::PrintFlowRateTuples(const cString& filename) {
+ cDataFile& df = m_world->GetDataFile(filename);
+
+ df.WriteComment("Flow Rate Tuples");
+ df.WriteTimeStamp();
+
+ df.Write(m_update, "Update");
+ // write each tuple
+ for(map<int, pair<cIntSum, cIntSum> >::iterator iter = flow_rate_tuple.begin(); iter != flow_rate_tuple.end(); iter++) {
+ ostringstream oss;
+ oss << "flow rate " << (*iter).first;
+ string flow_rate_str(oss.str());
+ string flow_rate_pop_size_str(flow_rate_str+" deme pop size");
+ string flow_rate_events_killed_str(flow_rate_str+" events killed");
+
+ df.Write((*iter).first, flow_rate_str.c_str());
+ df.Write((*iter).second.first.Average(), flow_rate_pop_size_str.c_str());
+ df.Write((*iter).second.second.Average(), flow_rate_events_killed_str.c_str());
+
+ }
+ df.Endl();
+
+ // reset all tuples
+ for(map<int, pair<cIntSum, cIntSum> >::iterator iter = flow_rate_tuple.begin(); iter != flow_rate_tuple.end(); iter++) {
+ (*iter).second.first.Clear();
+ (*iter).second.second.Clear();
+ }
+}
+
void cStats::PrintErrorData(const cString& filename)
{
cDataFile& df = m_world->GetDataFile(filename);
Modified: branches/jobScheduling/source/main/cStats.h
===================================================================
--- branches/jobScheduling/source/main/cStats.h 2008-04-01 20:58:47 UTC (rev 2513)
+++ branches/jobScheduling/source/main/cStats.h 2008-04-03 04:56:49 UTC (rev 2514)
@@ -275,6 +275,9 @@
cDoubleSum sum_deme_normalized_time_used;
cDoubleSum sum_deme_merit;
cIntSum sum_deme_events_killed;
+
+ //(event flow rate, (deme pop size, events killed))
+ std::map<int, std::pair<cIntSum, cIntSum> > flow_rate_tuple;
// Speculative Execution Stats
int m_spec_total;
@@ -420,6 +423,8 @@
cDoubleSum& SumDemeNormalizedTimeUsed() { return sum_deme_normalized_time_used; }
cDoubleSum& SumDemeMerit() { return sum_deme_merit; }
cIntSum& SumDemeEventsKilled() { return sum_deme_events_killed; }
+
+ std::map<int, std::pair<cIntSum, cIntSum> >& FlowRateTuple() { return flow_rate_tuple; }
#if INSTRUCTION_COUNT
void ZeroInst();
@@ -461,6 +466,7 @@
const cDoubleSum& SumDemeNormalizedTimeUsed() const { return sum_deme_normalized_time_used; }
const cDoubleSum& SumDemeMerit() const { return sum_deme_merit; }
const cIntSum& SumDemeEventsKilled() const { return sum_deme_events_killed; }
+ const std::map<int, std::pair<cIntSum, cIntSum> >& FlowRateTuple() const { return flow_rate_tuple; }
void IncResamplings() { ++num_resamplings; } // @AWC 06/29/06
@@ -654,6 +660,7 @@
// Public calls to output data files (for events)
void PrintAverageData(const cString& filename);
void PrintDemeAverageData(const cString& filename);
+ void PrintFlowRateTuples(const cString& filename);
void PrintErrorData(const cString& filename);
void PrintVarianceData(const cString& filename);
void PrintDominantData(const cString& filename);
More information about the Avida-cvs
mailing list