1 /*
2  *  cStats.h
3  *  Avida
4  *
5  *  Called "stats.hh" prior to 12/5/05.
6  *  Copyright 1999-2011 Michigan State University. All rights reserved.
7  *  Copyright 1993-2002 California Institute of Technology.
8  *
9  *
10  *  This file is part of Avida.
11  *
12  *  Avida is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
13  *  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
14  *
15  *  Avida is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
17  *
18  *  You should have received a copy of the GNU Lesser General Public License along with Avida.
19  *  If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22 
23 #ifndef cStats_h
24 #define cStats_h
25 
26 #include "avida/Avida.h"
27 
28 #include "AvidaTools.h"
29 
30 #include "avida/core/Sequence.h"
31 #include "avida/data/Provider.h"
32 
33 #include "cBioGroupListener.h"
34 #include "cBirthEntry.h"
35 #include "cDoubleSum.h"
36 #include "cGenomeUtil.h"
37 #include "cIntSum.h"
38 #include "cOrganism.h"
39 #include "cRunningAverage.h"
40 #include "cRunningStats.h"
41 #include "nGeometry.h"
42 #include "tArray.h"
43 #include "tArrayMap.h"
44 #include "tDataManager.h"
45 #include "tMatrix.h"
46 
47 #include <cassert>
48 #include <fstream>
49 #include <iostream>
50 #include <vector>
51 #include <map>
52 #include <set>
53 #include <utility>
54 
55 class cWorld;
56 class cOrganism;
57 class cOrgMessage;
58 class cOrgMessagePredicate;
59 class cOrgMovementPredicate;
60 class cDeme;
61 class cGermline;
62 
63 using namespace Avida;
64 
65 
66 struct flow_rate_tuple {
67   cIntSum orgCount;
68   cIntSum eventsKilled;
69   cIntSum attemptsToKillEvents;
70   cDoubleSum AvgEnergyUsageRatio;
71   cIntSum totalBirths;
72   cIntSum currentSleeping;
73 };
74 
75 struct s_inst_circumstances {
76   int update;
77   int inst;
78   int gr_id;
79   int gr_size;
80   double res_level;
81   double odds_immigrants;
82   double odds_offspring_own;
83   double odds_offspring_others;
84   int tol_immigrants;
85   int tol_own;
86   int tol_others;
87   int tol_max;
88 }; // @JJB
89 
90 struct sDonateSpecificCircumstances {
91   int update;
92   int org_id;
93   int cell_id;
94   int recipient_id;
95   int recipient_cell_id;
96   int relatedness;
97   bool recip_is_beggar;
98   int num_donates;
99 };
100 
101 class cStats : public cBioGroupListener, public Data::Provider
102 {
103 private:
104   cWorld* m_world;
105 
106   tDataManager<cStats> m_data_manager;
107 
108 
109   // --------  Data Provider Support  ---------
110   struct ProvidedData
111   {
112     Apto::String description;
113     Apto::Functor<Data::PackagePtr, Apto::NullType> GetData;
114 
ProvidedDataProvidedData115     ProvidedData() { ; }
ProvidedDataProvidedData116     ProvidedData(const Apto::String& desc, Apto::Functor<Data::PackagePtr, Apto::NullType> func)
117       : description(desc), GetData(func) { ; }
118   };
119   Apto::Map<Apto::String, ProvidedData> m_provided_data;
120   mutable Data::ConstDataSetPtr m_provides;
121 
122 
123   // --------  Time scales  ---------
124   int m_update;
125   double avida_time;
126 
127 
128 
129   // --------  Organism Sums  ---------  (Cleared and resummed by population each update)
130   cDoubleSum sum_merit;
131   cDoubleSum sum_mem_size;
132   cDoubleSum sum_creature_age;
133   cDoubleSum sum_generation;
134 
135   cDoubleSum sum_neutral_metric;
136   cDoubleSum sum_lineage_label;
137 
138   cRunningStats sum_copy_mut_rate;
139   cRunningStats sum_log_copy_mut_rate;
140 
141   cRunningStats sum_div_mut_rate;
142   cRunningStats sum_log_div_mut_rate;
143 
144 
145   // --------  Genotype Sums  ---------  (Cleared and resummed by population each update)
146   cDoubleSum sum_gestation;
147   cDoubleSum sum_fitness;
148   cDoubleSum sum_repro_rate;
149 
150   // calculates a running average over the actual replication rate
151   // given by the number of births per update
152   cRunningAverage rave_true_replication_rate;
153 
154   cDoubleSum sum_size;
155   cDoubleSum sum_copy_size;
156   cDoubleSum sum_exe_size;
157 
158   cDoubleSum sum_genotype_age;
159 
160   cDoubleSum sum_abundance;
161   cDoubleSum sum_genotype_depth;
162 
163   cDoubleSum sum_threshold_age;
164 
165 
166   // --------  Instruction Counts  ---------
167   tArrayMap<cString, tArray<cString> > m_is_inst_names_map;
168   tArrayMap<cString, tArray<cIntSum> > m_is_exe_inst_map;
169   tArray<pair<int,int> > m_is_tolerance_exe_counts;
170   tSmartArray<s_inst_circumstances> m_is_tolerance_exe_insts;
171   tSmartArray<sDonateSpecificCircumstances> m_donate_specific;
172   tArrayMap<cString, tArray<cIntSum> > m_is_prey_exe_inst_map;
173   tArrayMap<cString, tArray<cIntSum> > m_is_pred_exe_inst_map;
174   tArrayMap<cString, tArray<cIntSum> > m_is_male_exe_inst_map;
175   tArrayMap<cString, tArray<cIntSum> > m_is_female_exe_inst_map;
176 
177   // --------  Calculated Stats  ---------
178   double entropy;
179   double species_entropy;
180   double energy;
181   double dom_fidelity;
182   double ave_fidelity;
183 
184   // For tracking of advantageous mutations
185   double max_viable_fitness;
186 
187   // --------  Dominant Genotype  ---------
188   double dom_merit;
189   double dom_gestation;
190   double dom_repro_rate;
191   double dom_fitness;
192   int dom_size;
193   double dom_copied_size;
194   double dom_exe_size;
195   double max_fitness;
196   double max_merit;
197   int max_gestation_time;
198   int max_genome_length;
199   double min_fitness;
200   double min_merit;
201   int min_gestation_time;
202   int min_genome_length;
203   int dom_genotype_id;
204   cString dom_name;
205   int dom_births;
206   int dom_breed_true;
207   int dom_breed_in;
208   int dom_breed_out;
209   int dom_abundance;
210   int dom_gene_depth;
211   cString dom_sequence;
212 
213   int dom_last_birth_cell;
214   int dom_last_forager_type;
215   int dom_last_group_id;
216 
217   int coal_depth;
218 
219   // --------  Population Stats  ---------
220   int num_births;
221   int num_deaths;
222   int num_breed_in;
223   int num_breed_true;
224   int num_breed_true_creatures;
225   int num_creatures;
226   int num_genotypes;
227   int num_genotypes_historic;
228   int num_threshold;
229   int num_lineages;
230   int num_executed;
231   int num_parasites;
232   int num_no_birth_creatures;
233   int num_single_thread_creatures;
234   int num_multi_thread_creatures;
235   int m_num_threads;
236   int num_modified;
237 
238   int num_genotypes_last;
239 
240   int tot_organisms;
241   int tot_genotypes;
242   int tot_threshold;
243   int tot_lineages;
244   int tot_executed;
245 
246   // --------  Parasite Task Stats  ---------
247   tArray<int> tasks_host_current;
248   tArray<int> tasks_host_last;
249   tArray<int> tasks_parasite_current;
250   tArray<int> tasks_parasite_last;
251 
252   // ------- Kaboom Stats --------------------
253     int num_kabooms;
254     int num_kaboom_kills;
255     tArray<int> hd_list;
256   // ------- Division of Labor Stats ---------
257     //TODO: Right place for this?
258     int juv_killed;
259 
260 
261   // --------  Organism Task Stats  ---------
262   tArray<int> task_cur_count;
263   tArray<int> task_last_count;
264   tArray<double> task_cur_quality;
265   tArray<double> task_last_quality;
266   tArray<double> task_cur_max_quality;
267   tArray<double> task_last_max_quality;
268   tArray<int> task_exe_count;
269   tArray<int> new_task_count;
270   tArray<int> prev_task_count;
271   tArray<int> cur_task_count;
272   tArray<int> new_reaction_count;
273 
274   tArray<int> task_internal_cur_count;
275   tArray<int> task_internal_last_count;
276   tArray<double> task_internal_cur_quality;
277   tArray<double> task_internal_last_quality;
278   tArray<double> task_internal_cur_max_quality;
279   tArray<double> task_internal_last_max_quality;
280 
281   tArray<int> m_reaction_cur_count;
282   tArray<int> m_reaction_last_count;
283   tArray<double> m_reaction_cur_add_reward;
284   tArray<double> m_reaction_last_add_reward;
285   tArray<int> m_reaction_exe_count;
286 
287   tArray<double> resource_count;
288   tArray<int> resource_geometry;
289   tArray< tArray<double> > spatial_res_count;
290 
291   tArray<cString> task_names;
292   tArray<cString> reaction_names;
293   tArray<cString> resource_names;
294 
295   // --------  Resampling Stats  ---------
296   int num_resamplings;
297   int num_failedResamplings;
298 
299 
300   // --------  State Variables  ---------
301   int last_update;
302 
303 
304   // --------  Market Stats  ---------
305   int num_bought;
306   int num_sold;
307   int num_used;
308   int num_own_used;
309 
310 
311   // --------  Sense Instruction Stats  ---------
312   int sense_size;
313   tArray<int> sense_last_count;
314   tArray<int> sense_last_exe_count;
315   tArray<cString> sense_names;
316 
317 
318   // --------  Competition Stats  ---------
319   tArray<double> avg_trial_fitnesses;
320   double avg_competition_fitness;
321   double min_competition_fitness;
322   double max_competition_fitness;
323   double avg_competition_copied_fitness;
324   double min_competition_copied_fitness;
325   double max_competition_copied_fitness;
326   int num_orgs_replicated;
327 
328 
329   // --------  Deme Stats  ---------
330   cIntSum sum_deme_age;
331   cIntSum sum_deme_birth_count;
332   cIntSum sum_deme_last_birth_count;
333   cIntSum sum_deme_org_count;
334   cIntSum sum_deme_last_org_count;
335   cIntSum sum_deme_generation;
336   cIntSum sum_deme_gestation_time;
337   cDoubleSum sum_deme_normalized_time_used;
338   cDoubleSum sum_deme_merit;
339   cDoubleSum sum_deme_generations_per_lifetime;
340   int m_num_occupied_demes;
341 
342   cIntSum sum_deme_events_killed;
343   cIntSum sum_deme_events_kill_attempts;
344 
345   cDoubleSum EnergyTestamentToFutureDeme;
346   cDoubleSum EnergyTestamentToNeighborOrganisms;
347   cDoubleSum EnergyTestamentToDemeOrganisms;
348   cDoubleSum EnergyTestamentAcceptedByOrganisms;
349   cDoubleSum EnergyTestamentAcceptedByDeme;
350 
351   //(event flow rate, (deme pop size, events killed))
352   std::map<int, flow_rate_tuple > flow_rate_tuples;
353 
354 
355   // --------  Deme Predicate Stats  ---------
356   tMatrix<int> relative_pos_event_count;
357   tMatrix<int> relative_pos_pred_sat;
358 	std::map<cString, int> demeResourceThresholdPredicateMap;
359 
360 
361   // --------  Speculative Execution Stats  ---------
362   int m_spec_total;
363   int m_spec_num;
364   int m_spec_waste;
365 
366 
367   // --------  Organism Kill Stats  ---------
368   cIntSum sum_orgs_killed;
369   cIntSum sum_unoccupied_cell_kill_attempts;
370   cIntSum sum_cells_scanned_at_kill;
371 
372 
373   // --------  Migration Stats  ---------
374   int num_migrations;
375 
376 
377   cStats(); // @not_implemented
378   cStats(const cStats&); // @not_implemented
379   cStats& operator=(const cStats&); // @not_implemented
380 
381   // --------  Sexual Selection Stats  ---------
382   tArray<cBirthEntry> m_successful_mates;
383   tArray<cBirthEntry> m_choosers;
384   int m_num_successful_mates;
385 
386   // --------  Pred-prey Stats  ---------
387   cDoubleSum sum_prey_fitness;
388   cDoubleSum sum_prey_gestation;
389   cDoubleSum sum_prey_merit;
390   cDoubleSum sum_prey_creature_age;
391   cDoubleSum sum_prey_generation;
392   cDoubleSum sum_prey_size;
393 
394   cDoubleSum sum_pred_fitness;
395   cDoubleSum sum_pred_gestation;
396   cDoubleSum sum_pred_merit;
397   cDoubleSum sum_pred_creature_age;
398   cDoubleSum sum_pred_generation;
399   cDoubleSum sum_pred_size;
400 
401   double prey_entropy;
402   double pred_entropy;
403 
404   // --------  Mating type (male/female) Stats  ---------
405   cDoubleSum sum_male_fitness;
406   cDoubleSum sum_male_gestation;
407   cDoubleSum sum_male_merit;
408   cDoubleSum sum_male_creature_age;
409   cDoubleSum sum_male_generation;
410   cDoubleSum sum_male_size;
411 
412   cDoubleSum sum_female_fitness;
413   cDoubleSum sum_female_gestation;
414   cDoubleSum sum_female_merit;
415   cDoubleSum sum_female_creature_age;
416   cDoubleSum sum_female_generation;
417   cDoubleSum sum_female_size;
418 
419   // --------  TopNavTrace Stats  ---------
420   tArray<char> toptrace;
421   tArray<int> topnavtraceupdate;
422   tArray<int> topnavtraceloc;
423   tArray<int> topnavtracefacing;
424   tArray<int> topreactions;
425   tArray<int> topreactioncycles;
426   tArray<int> topreactionexecs;
427   int topreac;
428   int topcycle;
429   int topid;
430   int topgenid;
431 
432 
433 
434 public:
435   cStats(cWorld* world);
~cStats()436   ~cStats() { ; }
437 
438   // cBioGroupListener
439   void NotifyBGEvent(cBioGroup* bg, eBGEventType type, cBioUnit* bu);
440 
441 
442   // Data::Provider
443   Data::ConstDataSetPtr Provides() const;
444   void UpdateProvidedValues(Update current_update);
445   Data::PackagePtr GetProvidedValue(const Apto::String& data_id) const;
446   Apto::String DescribeProvidedValue(const Apto::String& data_id) const;
447 
448   // cStats
449   void ProcessUpdate();
450 
SetCurrentUpdate(int new_update)451   inline void SetCurrentUpdate(int new_update) { m_update = new_update; }
IncCurrentUpdate()452   inline void IncCurrentUpdate() { m_update++; }
453 
454   // Accessors...
GetUpdate()455   int GetUpdate() const { return m_update; }
GetGeneration()456   double GetGeneration() const { return SumGeneration().Average(); }
457 
GetDomMerit()458   double GetDomMerit() const { return dom_merit; }
GetDomGestation()459   double GetDomGestation() const { return dom_gestation; }
GetDomReproRate()460   double GetDomReproRate() const { return dom_repro_rate; }
GetDomFitness()461   double GetDomFitness() const { return dom_fitness; }
GetDomCopySize()462   double GetDomCopySize() const { return dom_copied_size; }
GetDomExeSize()463   double GetDomExeSize() const { return dom_exe_size; }
464 
GetDomSize()465   int GetDomSize() const { return dom_size; }
GetDomID()466   int GetDomID() const { return dom_genotype_id; }
GetDomName()467   const cString & GetDomName() const { return dom_name; }
GetDomBirths()468   int GetDomBirths() const { return dom_births; }
GetDomBreedTrue()469   int GetDomBreedTrue() const { return dom_breed_true; }
GetDomBreedIn()470   int GetDomBreedIn() const { return dom_breed_in; }
GetDomBreedOut()471   int GetDomBreedOut() const { return dom_breed_out; }
GetDomAbundance()472   int GetDomAbundance() const { return dom_abundance; }
GetDomGeneDepth()473   int GetDomGeneDepth() const { return dom_gene_depth; }
GetDomSequence()474   const cString& GetDomSequence() const { return dom_sequence; }
475 
GetDomLastBirthCell()476   int GetDomLastBirthCell() const { return dom_last_birth_cell; }
GetDomLastGroup()477   int GetDomLastGroup() const { return dom_last_group_id; }
GetDomLastForagerType()478   int GetDomLastForagerType() const { return dom_last_forager_type; }
479 
GetSenseSize()480   int GetSenseSize() const { return sense_size; }
481 
482   // Settings...
SetDomMerit(double in_merit)483   void SetDomMerit(double in_merit) { dom_merit = in_merit; }
SetDomGestation(double in_gest)484   void SetDomGestation(double in_gest) { dom_gestation = in_gest; }
SetDomReproRate(double in_rate)485   void SetDomReproRate(double in_rate) { dom_repro_rate = in_rate; }
SetDomFitness(double in_fit)486   void SetDomFitness(double in_fit) { dom_fitness = in_fit; }
SetDomCopiedSize(double in_size)487   void SetDomCopiedSize(double in_size) { dom_copied_size = in_size; }
SetDomExeSize(double in_size)488   void SetDomExeSize(double in_size) { dom_exe_size = in_size; }
489 
SetDomSize(int in_size)490   void SetDomSize(int in_size) { dom_size = in_size; }
SetDomID(int in_id)491   void SetDomID(int in_id) { dom_genotype_id = in_id; }
SetDomName(const cString & in_name)492   void SetDomName(const cString & in_name) { dom_name = in_name; }
SetDomBirths(int in_births)493   void SetDomBirths(int in_births) { dom_births = in_births; }
SetDomBreedTrue(int in_bt)494   void SetDomBreedTrue(int in_bt) { dom_breed_true = in_bt; }
SetDomBreedIn(int in_bi)495   void SetDomBreedIn(int in_bi) { dom_breed_in = in_bi; }
SetDomBreedOut(int in_bo)496   void SetDomBreedOut(int in_bo) { dom_breed_out = in_bo; }
SetDomAbundance(int in_abund)497   void SetDomAbundance(int in_abund) { dom_abundance = in_abund; }
SetDomGeneDepth(int in_depth)498   void SetDomGeneDepth(int in_depth) { dom_gene_depth = in_depth; }
SetDomSequence(const cString & in_seq)499   void SetDomSequence(const cString & in_seq) { dom_sequence = in_seq; }
500 
SetDomLastBirthCell(int in_lbc)501   void SetDomLastBirthCell(int in_lbc) { dom_last_birth_cell = in_lbc; }
SetDomLastGroup(int in_lg)502   void SetDomLastGroup(int in_lg) { dom_last_group_id = in_lg; }
SetDomLastForagerType(int in_lfg)503   void SetDomLastForagerType(int in_lfg) { dom_last_forager_type = in_lfg; }
504 
SetCoalescentGenotypeDepth(int in_depth)505   void SetCoalescentGenotypeDepth(int in_depth) {coal_depth = in_depth;}
506 
507   inline void SetNumGenotypes(int new_genotypes, int num_historic);
SetNumCreatures(int new_creatures)508   inline void SetNumCreatures(int new_creatures) { num_creatures = new_creatures; }
509   inline void SetBreedTrueCreatures(int in_num_breed_true_creatures);
510   inline void SetNumParasites(int in_num_parasites);
511   inline void SetNumNoBirthCreatures(int in_num_no_birth_creatures);
512   inline void SetNumSingleThreadCreatures(int in_num_single_thread_creatures);
513   inline void SetNumMultiThreadCreatures(int in_num_multi_thread_creatures);
SetNumThreads(int in_num_threads)514   inline void SetNumThreads(int in_num_threads) { m_num_threads = in_num_threads; }
515   inline void SetNumModified(int in_num_modified);
516 
SetMaxFitness(double in_max_fitness)517   void SetMaxFitness(double in_max_fitness) { max_fitness = in_max_fitness; }
SetMaxMerit(double in_max_merit)518   void SetMaxMerit(double in_max_merit) { max_merit = in_max_merit; }
SetMaxGestationTime(int in_max_gestation_time)519   void SetMaxGestationTime(int in_max_gestation_time) { max_gestation_time = in_max_gestation_time; }
SetMaxGenomeLength(int in_max_genome_length)520   void SetMaxGenomeLength(int in_max_genome_length) { max_genome_length = in_max_genome_length; }
521 
SetMinFitness(double in_min_fitness)522   void SetMinFitness(double in_min_fitness) { min_fitness = in_min_fitness; }
SetMinMerit(double in_min_merit)523   void SetMinMerit(double in_min_merit) { min_merit = in_min_merit; }
SetMinGestationTime(int in_min_gestation_time)524   void SetMinGestationTime(int in_min_gestation_time) { min_gestation_time = in_min_gestation_time; }
SetMinGenomeLength(int in_min_genome_length)525   void SetMinGenomeLength(int in_min_genome_length) { min_genome_length = in_min_genome_length; }
526 
SetEntropy(double in_entropy)527   void SetEntropy(double in_entropy) { entropy = in_entropy; }
SetPreyEntropy(double in_prey_entropy)528   void SetPreyEntropy(double in_prey_entropy) { prey_entropy = in_prey_entropy; }
SetPredEntropy(double in_pred_entropy)529   void SetPredEntropy(double in_pred_entropy) { pred_entropy = in_pred_entropy; }
530 
SetSpeciesEntropy(double in_ent)531   void SetSpeciesEntropy(double in_ent) { species_entropy = in_ent; }
532 
SumFitness()533   cDoubleSum& SumFitness()       { return sum_fitness; }
SumGestation()534   cDoubleSum& SumGestation()     { return sum_gestation; }
SumMerit()535   cDoubleSum& SumMerit()         { return sum_merit; }
SumReproRate()536   cDoubleSum& SumReproRate()     { return sum_repro_rate; }
537 
SumCreatureAge()538   cDoubleSum& SumCreatureAge()   { return sum_creature_age; }
SumGenotypeAge()539   cDoubleSum& SumGenotypeAge()   { return sum_genotype_age; }
SumGeneration()540   cDoubleSum& SumGeneration()    { return sum_generation; }
SumAbundance()541   cDoubleSum& SumAbundance()     { return sum_abundance; }
SumGenotypeDepth()542   cDoubleSum& SumGenotypeDepth() { return sum_genotype_depth; }
SumThresholdAge()543   cDoubleSum& SumThresholdAge()  { return sum_threshold_age; }
544 
SumNeutralMetric()545   cDoubleSum& SumNeutralMetric() { return sum_neutral_metric; }
SumLineageLabel()546   cDoubleSum& SumLineageLabel()  { return sum_lineage_label; }
SumCopyMutRate()547   cRunningStats& SumCopyMutRate()   { return sum_copy_mut_rate; }
SumLogCopyMutRate()548   cRunningStats& SumLogCopyMutRate()   { return sum_log_copy_mut_rate; }
SumDivMutRate()549   cRunningStats& SumDivMutRate()   { return sum_div_mut_rate; }
SumLogDivMutRate()550   cRunningStats& SumLogDivMutRate()   { return sum_log_div_mut_rate; }
551 
SumSize()552   cDoubleSum& SumSize()          { return sum_size; }
SumCopySize()553   cDoubleSum& SumCopySize()      { return sum_copy_size; }
SumExeSize()554   cDoubleSum& SumExeSize()       { return sum_exe_size; }
SumMemSize()555   cDoubleSum& SumMemSize()       { return sum_mem_size; }
556 
557   //deme
SumDemeAge()558   cIntSum& SumDemeAge()          { return sum_deme_age; }
SumDemeBirthCount()559   cIntSum& SumDemeBirthCount()   { return sum_deme_birth_count; }
SumDemeLastBirthCount()560   cIntSum& SumDemeLastBirthCount()   { return sum_deme_last_birth_count; }
SumDemeOrgCount()561   cIntSum& SumDemeOrgCount()     { return sum_deme_org_count; }
SumDemeLastOrgCount()562   cIntSum& SumDemeLastOrgCount()     { return sum_deme_last_org_count; }
SumDemeGeneration()563   cIntSum& SumDemeGeneration()   { return sum_deme_generation; }
SumDemeGestationTime()564   cIntSum& SumDemeGestationTime()   { return sum_deme_gestation_time; }
SumDemeNormalizedTimeUsed()565   cDoubleSum& SumDemeNormalizedTimeUsed()   { return sum_deme_normalized_time_used; }
SumDemeMerit()566   cDoubleSum& SumDemeMerit()   { return sum_deme_merit; }
SumDemeGenerationsPerLifetime()567   cDoubleSum& SumDemeGenerationsPerLifetime()   { return sum_deme_generations_per_lifetime; }
568 
SumDemeEventsKilled()569   cIntSum& SumDemeEventsKilled()          { return sum_deme_events_killed; }
SumDemeAttemptsToKillEvents()570   cIntSum& SumDemeAttemptsToKillEvents()          { return sum_deme_events_kill_attempts; }
571 
SumEnergyTestamentToFutureDeme()572   cDoubleSum& SumEnergyTestamentToFutureDeme() { return EnergyTestamentToFutureDeme;}
SumEnergyTestamentToNeighborOrganisms()573   cDoubleSum& SumEnergyTestamentToNeighborOrganisms() { return EnergyTestamentToNeighborOrganisms; }
SumEnergyTestamentToDemeOrganisms()574   cDoubleSum& SumEnergyTestamentToDemeOrganisms() { return EnergyTestamentToDemeOrganisms; }
SumEnergyTestamentAcceptedByOrganisms()575   cDoubleSum& SumEnergyTestamentAcceptedByOrganisms() { return EnergyTestamentAcceptedByOrganisms; }
SumEnergyTestamentAcceptedByDeme()576   cDoubleSum& SumEnergyTestamentAcceptedByDeme() { return EnergyTestamentAcceptedByDeme; }
577 
578   //pred-prey
SumPreyFitness()579   cDoubleSum& SumPreyFitness()       { return sum_prey_fitness; }
SumPreyGestation()580   cDoubleSum& SumPreyGestation()     { return sum_prey_gestation; }
SumPreyMerit()581   cDoubleSum& SumPreyMerit()         { return sum_prey_merit; }
SumPreyCreatureAge()582   cDoubleSum& SumPreyCreatureAge()   { return sum_prey_creature_age; }
SumPreyGeneration()583   cDoubleSum& SumPreyGeneration()    { return sum_prey_generation; }
SumPreySize()584   cDoubleSum& SumPreySize()          { return sum_prey_size; }
InstPreyExeCountsForInstSet(const cString & inst_set)585   tArray<cIntSum>& InstPreyExeCountsForInstSet(const cString& inst_set) { return m_is_prey_exe_inst_map[inst_set]; }
586 
SumPredFitness()587   cDoubleSum& SumPredFitness()       { return sum_pred_fitness; }
SumPredGestation()588   cDoubleSum& SumPredGestation()     { return sum_pred_gestation; }
SumPredMerit()589   cDoubleSum& SumPredMerit()         { return sum_pred_merit; }
SumPredCreatureAge()590   cDoubleSum& SumPredCreatureAge()   { return sum_pred_creature_age; }
SumPredGeneration()591   cDoubleSum& SumPredGeneration()    { return sum_pred_generation; }
SumPredSize()592   cDoubleSum& SumPredSize()          { return sum_pred_size; }
InstPredExeCountsForInstSet(const cString & inst_set)593   tArray<cIntSum>& InstPredExeCountsForInstSet(const cString& inst_set) { return m_is_pred_exe_inst_map[inst_set]; }
594   void ZeroFTInst();
595 
596   //mating type/male-female accessors
SumMaleFitness()597   cDoubleSum& SumMaleFitness()       { return sum_male_fitness; }
SumMaleGestation()598   cDoubleSum& SumMaleGestation()     { return sum_male_gestation; }
SumMaleMerit()599   cDoubleSum& SumMaleMerit()         { return sum_male_merit; }
SumMaleCreatureAge()600   cDoubleSum& SumMaleCreatureAge()   { return sum_male_creature_age; }
SumMaleGeneration()601   cDoubleSum& SumMaleGeneration()    { return sum_male_generation; }
SumMaleSize()602   cDoubleSum& SumMaleSize()          { return sum_male_size; }
InstMaleExeCountsForInstSet(const cString & inst_set)603   tArray<cIntSum>& InstMaleExeCountsForInstSet(const cString& inst_set) { return m_is_male_exe_inst_map[inst_set]; }
604 
SumFemaleFitness()605   cDoubleSum& SumFemaleFitness()       { return sum_female_fitness; }
SumFemaleGestation()606   cDoubleSum& SumFemaleGestation()     { return sum_female_gestation; }
SumFemaleMerit()607   cDoubleSum& SumFemaleMerit()         { return sum_female_merit; }
SumFemaleCreatureAge()608   cDoubleSum& SumFemaleCreatureAge()   { return sum_female_creature_age; }
SumFemaleGeneration()609   cDoubleSum& SumFemaleGeneration()    { return sum_female_generation; }
SumFemaleSize()610   cDoubleSum& SumFemaleSize()          { return sum_female_size; }
InstFemaleExeCountsForInstSet(const cString & inst_set)611   tArray<cIntSum>& InstFemaleExeCountsForInstSet(const cString& inst_set) { return m_is_female_exe_inst_map[inst_set]; }
612   void ZeroMTInst();
613 
FlowRateTuples()614   std::map<int, flow_rate_tuple >&  FlowRateTuples() { return flow_rate_tuples; }
615 
616   void ZeroInst();
InstExeCountsForInstSet(const cString & inst_set)617   tArray<cIntSum>& InstExeCountsForInstSet(const cString& inst_set) { return m_is_exe_inst_map[inst_set]; }
618 
619   // And constant versions of the above...
SumFitness()620   const cDoubleSum& SumFitness() const       { return sum_fitness; }
SumGestation()621   const cDoubleSum& SumGestation() const     { return sum_gestation; }
SumMerit()622   const cDoubleSum& SumMerit() const         { return sum_merit; }
SumReproRate()623   const cDoubleSum& SumReproRate() const     { return sum_repro_rate; }
624 
SumCreatureAge()625   const cDoubleSum& SumCreatureAge() const   { return sum_creature_age; }
SumGenotypeAge()626   const cDoubleSum& SumGenotypeAge() const   { return sum_genotype_age; }
SumGeneration()627   const cDoubleSum& SumGeneration() const    { return sum_generation; }
SumAbundance()628   const cDoubleSum& SumAbundance() const     { return sum_abundance; }
SumGenotypeDepth()629   const cDoubleSum& SumGenotypeDepth() const { return sum_genotype_depth; }
SumThresholdAge()630   const cDoubleSum& SumThresholdAge() const  { return sum_threshold_age; }
631 
SumNeutralMetric()632   const cDoubleSum& SumNeutralMetric() const { return sum_neutral_metric; }
SumLineageLabel()633   const cDoubleSum& SumLineageLabel() const  { return sum_lineage_label; }
SumCopyMutRate()634   const cRunningStats& SumCopyMutRate() const   { return sum_copy_mut_rate; }
SumLogCopyMutRate()635   const cRunningStats& SumLogCopyMutRate() const{ return sum_log_copy_mut_rate; }
SumDivMutRate()636   const cRunningStats& SumDivMutRate() const   { return sum_div_mut_rate; }
SumLogDivMutRate()637   const cRunningStats& SumLogDivMutRate() const{ return sum_log_div_mut_rate; }
638 
SumSize()639   const cDoubleSum& SumSize() const          { return sum_size; }
SumCopySize()640   const cDoubleSum& SumCopySize() const      { return sum_copy_size; }
SumExeSize()641   const cDoubleSum& SumExeSize() const       { return sum_exe_size; }
SumMemSize()642   const cDoubleSum& SumMemSize() const       { return sum_mem_size; }
643 
644   //deme
SumDemeAge()645   const cIntSum& SumDemeAge() const          { return sum_deme_age; }
SumDemeBirthCount()646   const cIntSum& SumDemeBirthCount() const   { return sum_deme_birth_count; }
SumDemeLastBirthCount()647   const cIntSum& SumDemeLastBirthCount() const   { return sum_deme_last_birth_count; }
SumDemeOrgCount()648   const cIntSum& SumDemeOrgCount() const     { return sum_deme_org_count; }
SumDemeLastOrgCount()649   const cIntSum& SumDemeLastOrgCount() const     { return sum_deme_last_org_count; }
SumDemeGeneration()650   const cIntSum& SumDemeGeneration() const   { return sum_deme_generation; }
SumDemeGestationTime()651   const cIntSum& SumDemeGestationTime() const  { return sum_deme_generation; }
SumDemeNormalizedTimeUsed()652   const cDoubleSum& SumDemeNormalizedTimeUsed() const  { return sum_deme_normalized_time_used; }
SumDemeMerit()653   const cDoubleSum& SumDemeMerit()  const  { return sum_deme_merit; }
SumDemeGenerationsPerLifetime()654   const cDoubleSum& SumDemeGenerationsPerLifetime() const  { return sum_deme_generations_per_lifetime; }
655 
SumDemeEventsKilled()656   const cIntSum& SumDemeEventsKilled() const          { return sum_deme_events_killed; }
SumDemeAttemptsToKillEvents()657   const cIntSum& SumDemeAttemptsToKillEvents() const  { return sum_deme_events_kill_attempts; }
658 
SumEnergyTestamentToFutureDeme()659   const cDoubleSum& SumEnergyTestamentToFutureDeme() const { return EnergyTestamentToFutureDeme;}
SumEnergyTestamentToNeighborOrganisms()660   const cDoubleSum& SumEnergyTestamentToNeighborOrganisms() const { return EnergyTestamentToNeighborOrganisms; }
SumEnergyTestamentToDemeOrganisms()661   const cDoubleSum& SumEnergyTestamentToDemeOrganisms() const { return EnergyTestamentToDemeOrganisms; }
SumEnergyTestamentAcceptedByOrganisms()662   const cDoubleSum& SumEnergyTestamentAcceptedByOrganisms() const { return EnergyTestamentAcceptedByOrganisms; }
SumEnergyTestamentAcceptedByDeme()663   const cDoubleSum& SumEnergyTestamentAcceptedByDeme() const { return EnergyTestamentAcceptedByDeme; }
664 
665   //pred-prey
SumPreyFitness()666   const cDoubleSum& SumPreyFitness() const       { return sum_prey_fitness; }
SumPreyGestation()667   const cDoubleSum& SumPreyGestation() const     { return sum_prey_gestation; }
SumPreyMerit()668   const cDoubleSum& SumPreyMerit() const         { return sum_prey_merit; }
SumPreyCreatureAge()669   const cDoubleSum& SumPreyCreatureAge() const   { return sum_prey_creature_age; }
SumPreyGeneration()670   const cDoubleSum& SumPreyGeneration() const    { return sum_prey_generation; }
SumPreySize()671   const cDoubleSum& SumPreySize() const          { return sum_prey_size; }
672 
SumPredFitness()673   const cDoubleSum& SumPredFitness() const       { return sum_pred_fitness; }
SumPredGestation()674   const cDoubleSum& SumPredGestation() const     { return sum_pred_gestation; }
SumPredMerit()675   const cDoubleSum& SumPredMerit() const         { return sum_pred_merit; }
SumPredCreatureAge()676   const cDoubleSum& SumPredCreatureAge() const   { return sum_pred_creature_age; }
SumPredGeneration()677   const cDoubleSum& SumPredGeneration() const    { return sum_pred_generation; }
SumPredSize()678   const cDoubleSum& SumPredSize() const          { return sum_pred_size; }
679 
FlowRateTuples()680   const std::map<int, flow_rate_tuple >&  FlowRateTuples() const { return flow_rate_tuples; }
681 
IncResamplings()682   void IncResamplings() { ++num_resamplings; }
IncFailedResamplings()683   void IncFailedResamplings() { ++num_failedResamplings; }
684 
685   void CalcEnergy();
686   void CalcFidelity();
687 
688   void RecordBirth(bool breed_true);
RecordDeath()689   void RecordDeath() { num_deaths++; }
AddGenotype()690   void AddGenotype() { tot_genotypes++; }
691   void RemoveGenotype(int id_num, int parent_id, int parent_distance, int depth, int max_abundance,
692                       int parasite_abundance, int age, int length);
AddLineage()693   void AddLineage() { tot_lineages++; num_lineages++; }
694   void RemoveLineage(int id_num, int parent_id, int update_born, double generation_born, int total_CPUs,
695                      int total_genotypes, double fitness, double lineage_stat1, double lineage_stat2 );
696 
IncExecuted()697   void IncExecuted() { num_executed++; }
698 
AddNumOrgsKilled(long num)699   void AddNumOrgsKilled(long num) { sum_orgs_killed.Add(num); }
AddNumUnoccupiedCellAttemptedToKill(long num)700 	void AddNumUnoccupiedCellAttemptedToKill(long num) { sum_unoccupied_cell_kill_attempts.Add(num); }
AddNumCellsScannedAtKill(long num)701   void AddNumCellsScannedAtKill(long num) { sum_cells_scanned_at_kill.Add(num); }
IncNumMigrations()702   void IncNumMigrations() { num_migrations++; }
703 
AddCurTask(int task_num)704   void AddCurTask(int task_num) { task_cur_count[task_num]++; }
AddCurHostTask(int task_num)705   void AddCurHostTask(int task_num) { tasks_host_current[task_num]++; }
AddCurParasiteTask(int task_num)706   void AddCurParasiteTask(int task_num) { tasks_parasite_current[task_num]++; }
707 
AddCurTaskQuality(int task_num,double quality)708   void AddCurTaskQuality(int task_num, double quality)
709   {
710 	  task_cur_quality[task_num] += quality;
711 	  if (quality > task_cur_max_quality[task_num]) task_cur_max_quality[task_num] = quality;
712   }
AddLastTask(int task_num)713   void AddLastTask(int task_num) { task_last_count[task_num]++; }
AddLastHostTask(int task_num)714   void AddLastHostTask(int task_num) { tasks_host_last[task_num]++; }
AddLastParasiteTask(int task_num)715   void AddLastParasiteTask(int task_num) { tasks_parasite_last[task_num]++; }
716 
AddLastTaskQuality(int task_num,double quality)717   void AddLastTaskQuality(int task_num, double quality)
718   {
719 	  task_last_quality[task_num] += quality;
720 	  if (quality > task_last_max_quality[task_num]) task_last_max_quality[task_num] = quality;
721   }
AddNewTaskCount(int task_num)722   void AddNewTaskCount(int task_num) {new_task_count[task_num]++; }
AddOtherTaskCounts(int task_num,int prev_tasks,int cur_tasks)723   void AddOtherTaskCounts(int task_num, int prev_tasks, int cur_tasks) {
724 	  prev_task_count[task_num] += prev_tasks;
725 	  cur_task_count[task_num] += cur_tasks;
726   }
AddNewReactionCount(int reaction_num)727   void AddNewReactionCount(int reaction_num) {new_reaction_count[reaction_num]++; }
IncTaskExeCount(int task_num,int task_count)728   void IncTaskExeCount(int task_num, int task_count) { task_exe_count[task_num] += task_count; }
729   void ZeroTasks();
730 
AddLastSense(int res_comb_index)731   void AddLastSense(int res_comb_index) { /*sense_last_count[res_comb_index]++;*/ }
IncLastSenseExeCount(int res_comb_index,int count)732   void IncLastSenseExeCount(int res_comb_index, int count) { /*sense_last_exe_count[res_comb_index]+= count;*/ }
733 
734   // internal resource bins and use of internal resources
AddCurInternalTask(int task_num)735   void AddCurInternalTask(int task_num) { task_internal_cur_count[task_num]++; }
AddCurInternalTaskQuality(int task_num,double quality)736   void AddCurInternalTaskQuality(int task_num, double quality)
737   {
738   	task_internal_cur_quality[task_num] += quality;
739   	if(quality > task_internal_cur_max_quality[task_num])	task_internal_cur_max_quality[task_num] = quality;
740   }
AddLastInternalTask(int task_num)741   void AddLastInternalTask(int task_num) { task_internal_last_count[task_num]++; }
AddLastInternalTaskQuality(int task_num,double quality)742   void AddLastInternalTaskQuality(int task_num, double quality)
743   {
744   	task_internal_last_quality[task_num] += quality;
745   	if(quality > task_internal_last_max_quality[task_num]) task_internal_last_max_quality[task_num] = quality;
746   }
747 
AddCurReaction(int reaction)748   void AddCurReaction(int reaction) { m_reaction_cur_count[reaction]++; }
AddLastReaction(int reaction)749   void AddLastReaction(int reaction) { m_reaction_last_count[reaction]++; }
AddCurReactionAddReward(int reaction,double reward)750   void AddCurReactionAddReward(int reaction, double reward) { m_reaction_cur_add_reward[reaction] += reward; }
AddLastReactionAddReward(int reaction,double reward)751   void AddLastReactionAddReward(int reaction, double reward) { m_reaction_last_add_reward[reaction] += reward; }
IncReactionExeCount(int reaction,int count)752   void IncReactionExeCount(int reaction, int count) { m_reaction_exe_count[reaction] += count; }
753   void ZeroReactions();
754 
SetResources(const tArray<double> & _in)755   void SetResources(const tArray<double> &_in) { resource_count = _in; }
SetResourcesGeometry(const tArray<int> & _in)756   void SetResourcesGeometry(const tArray<int> &_in) { resource_geometry = _in;}
SetSpatialRes(const tArray<tArray<double>> & _in)757   void SetSpatialRes(const tArray< tArray<double> > &_in) { spatial_res_count = _in; }
758 
SetInstNames(const cString & inst_set,const tArray<cString> & names)759   void SetInstNames(const cString& inst_set, const tArray<cString>& names) { m_is_inst_names_map[inst_set] = names; }
SetReactionName(int id,const cString & name)760   void SetReactionName(int id, const cString & name) { reaction_names[id] = name; }
SetResourceName(int id,const cString & name)761   void SetResourceName(int id, const cString & name) { resource_names[id] = name; }
762 
SetCompetitionTrialFitnesses(tArray<double> _in)763   void SetCompetitionTrialFitnesses(tArray<double> _in) { avg_trial_fitnesses = _in; }
SetCompetitionFitnesses(double _in_avg,double _in_min,double _in_max,double _in_cp_avg,double _in_cp_min,double _in_cp_max)764   void SetCompetitionFitnesses(double _in_avg, double _in_min, double _in_max, double _in_cp_avg, double _in_cp_min, double _in_cp_max)
765     { avg_competition_fitness = _in_avg; min_competition_fitness = _in_min; max_competition_fitness = _in_max;
766       avg_competition_copied_fitness = _in_cp_avg; min_competition_copied_fitness = _in_cp_min; max_competition_copied_fitness = _in_cp_max; }
SetCompetitionOrgsReplicated(int _in)767   void SetCompetitionOrgsReplicated(int _in) { num_orgs_replicated = _in; }
768 
769   //market info
AddMarketItemBought()770   void AddMarketItemBought() { num_bought++;}
AddMarketItemSold()771   void AddMarketItemSold() { num_sold++; }
AddMarketItemUsed()772   void AddMarketItemUsed() { num_used++; }
AddMarketOwnItemUsed()773   void AddMarketOwnItemUsed() { num_own_used++; }
774 
775 
AddSpeculative(int spec)776   void AddSpeculative(int spec) { m_spec_total += spec; m_spec_num++; }
AddSpeculativeWaste(int waste)777   void AddSpeculativeWaste(int waste) { m_spec_waste += waste; }
778 
779   // Sexual selection recording
780   void RecordSuccessfulMate(cBirthEntry& successful_mate, cBirthEntry& chooser);
781 
782   // Information retrieval section...
783 
GetNumBirths()784   int GetNumBirths() const          { return num_births; }
GetNumDeaths()785   int GetNumDeaths() const          { return num_deaths; }
GetBreedIn()786   int GetBreedIn() const            { return num_breed_in; }
GetBreedTrue()787   int GetBreedTrue() const          { return num_breed_true; }
GetBreedTrueCreatures()788   int GetBreedTrueCreatures() const { return num_breed_true_creatures; }
GetNumCreatures()789   int GetNumCreatures() const       { return num_creatures; }
GetNumGenotypes()790   int GetNumGenotypes() const       { return num_genotypes; }
GetNumGenotypesHistoric()791   int GetNumGenotypesHistoric() const { return num_genotypes_historic; }
GetNumThreshold()792   int GetNumThreshold() const       { return num_threshold; }
GetNumLineages()793   int GetNumLineages() const        { return num_lineages; }
GetNumParasites()794   int GetNumParasites() const       { return num_parasites; }
GetNumNoBirthCreatures()795   int GetNumNoBirthCreatures() const{ return num_no_birth_creatures; }
GetNumSingleThreadCreatures()796   int GetNumSingleThreadCreatures() const { return num_single_thread_creatures; }
GetNumMultiThreadCreatures()797   int GetNumMultiThreadCreatures() const { return num_multi_thread_creatures; }
GetNumThreads()798   int GetNumThreads() const { return m_num_threads; }
GetNumModified()799   int GetNumModified() const { return num_modified;}
800 
GetTotCreatures()801   int GetTotCreatures() const       { return tot_organisms; }
GetTotGenotypes()802   int GetTotGenotypes() const       { return tot_genotypes; }
GetTotThreshold()803   int GetTotThreshold() const       { return tot_threshold; }
GetTotLineages()804   int GetTotLineages() const        { return tot_lineages; }
805 
GetTaskCurCount(int task_num)806   int GetTaskCurCount(int task_num) const { return task_cur_count[task_num]; }
GetTaskHostCurCount(int task_num)807   int GetTaskHostCurCount(int task_num) const { return tasks_host_current[task_num]; }
GetTaskParasiteCurCount(int task_num)808   int GetTaskParasiteCurCount(int task_num) const { return tasks_parasite_current[task_num]; }
GetTaskCurQuality(int task_num)809   double GetTaskCurQuality(int task_num) const { return task_cur_quality[task_num]/(double)task_cur_count[task_num]; }
810 
GetTaskLastCount(int task_num)811   int GetTaskLastCount(int task_num) const {return task_last_count[task_num];}
GetTaskLastHostCount(int task_num)812   int GetTaskLastHostCount(int task_num) const {return tasks_host_last[task_num];}
GetTaskLastParasiteCount(int task_num)813   int GetTaskLastParasiteCount(int task_num) const {return tasks_parasite_last[task_num];}
GetTaskLastQuality(int task_num)814   double GetTaskLastQuality(int task_num) const {return task_last_quality[task_num]/(double)task_last_count[task_num];}
815 
GetTaskMaxCurQuality(int task_num)816   double GetTaskMaxCurQuality(int task_num) const { return task_cur_max_quality[task_num];}
GetTaskMaxLastQuality(int task_num)817   double GetTaskMaxLastQuality(int task_num) const { return task_last_max_quality[task_num];}
GetTaskExeCount(int task_num)818   int GetTaskExeCount(int task_num) const { return task_exe_count[task_num]; }
819 
820   // internal resource bins and use of internal resources
GetInternalTaskCurCount(int task_num)821   int GetInternalTaskCurCount(int task_num) const { return task_internal_cur_count[task_num]; }
GetInternalTaskCurQuality(int task_num)822   double GetInternalTaskCurQuality(int task_num) const { return task_internal_cur_quality[task_num]/(double)task_internal_cur_count[task_num]; }
GetInternalTaskMaxCurQuality(int task_num)823   double GetInternalTaskMaxCurQuality(int task_num) const { return task_internal_cur_max_quality[task_num]; }
GetInternalTaskLastCount(int task_num)824   int GetInternalTaskLastCount(int task_num) const { return task_internal_last_count[task_num]; }
GetInternalTaskLastQuality(int task_num)825   double GetInternalTaskLastQuality(int task_num) const { return task_internal_last_quality[task_num]/(double)task_internal_last_count[task_num]; }
GetInternalTaskMaxLastQuality(int task_num)826   double GetInternalTaskMaxLastQuality(int task_num) const { return task_internal_last_max_quality[task_num]; }
827 
GetReactions()828   const tArray<int>& GetReactions() const { return m_reaction_last_count; }
GetResources()829   const tArray<double> & GetResources() const { return resource_count; }
830 
831   // market info
GetMarketNumBought()832   int GetMarketNumBought() const { return num_bought; }
GetMarketNumSold()833   int GetMarketNumSold() const { return num_sold; }
GetMarketNumUsed()834   int GetMarketNumUsed() const { return num_used; }
GetMarketNumOwnUsed()835   int GetMarketNumOwnUsed() const { return num_own_used; }
836 
GetAveReproRate()837   double GetAveReproRate() const  { return sum_repro_rate.Average(); }
838 
GetAveMerit()839   double GetAveMerit() const      { return sum_merit.Average(); }
GetAveCreatureAge()840   double GetAveCreatureAge() const{ return sum_creature_age.Average(); }
GetAveMemSize()841   double GetAveMemSize() const    { return sum_mem_size.Average(); }
842 
GetAveNeutralMetric()843   double GetAveNeutralMetric() const { return sum_neutral_metric.Average(); }
GetAveLineageLabel()844   double GetAveLineageLabel() const  { return sum_lineage_label.Average(); }
GetAveCopyMutRate()845   double GetAveCopyMutRate() const   { return sum_copy_mut_rate.Mean(); }
GetAveLogCopyMutRate()846   double GetAveLogCopyMutRate() const{ return sum_log_copy_mut_rate.Mean();}
GetAveDivMutRate()847   double GetAveDivMutRate() const   { return sum_div_mut_rate.Mean(); }
GetAveLogDivMutRate()848   double GetAveLogDivMutRate() const{ return sum_log_div_mut_rate.Mean();}
849 
GetAveGestation()850   double GetAveGestation() const { return sum_gestation.Average(); }
GetAveFitness()851   double GetAveFitness() const   { return sum_fitness.Average(); }
852 
GetAveGenotypeAge()853   double GetAveGenotypeAge() const { return sum_genotype_age.Average();}
854 
GetAveSize()855   double GetAveSize() const       { return sum_size.Average(); }
GetAveCopySize()856   double GetAveCopySize() const   { return sum_copy_size.Average(); }
GetAveExeSize()857   double GetAveExeSize() const    { return sum_exe_size.Average(); }
858 
GetEntropy()859   double GetEntropy() const        { return entropy; }
GetSpeciesEntropy()860   double GetSpeciesEntropy() const { return species_entropy; }
GetEnergy()861   double GetEnergy() const         { return energy; }
GetEvenness()862   double GetEvenness() const       { return entropy / AvidaTools::Log(num_genotypes); }
GetCoalescentDepth()863   int GetCoalescentDepth() const   { return coal_depth; }
864 
GetAveThresholdAge()865   double GetAveThresholdAge() const { return sum_threshold_age.Average(); }
866 
GetMaxFitness()867   double GetMaxFitness() const { return max_fitness; }
GetMaxMerit()868   double GetMaxMerit() const { return max_merit; }
GetMaxGestationTime()869   int GetMaxGestationTime() const { return max_gestation_time; }
GetMaxGenomeLength()870   int GetMaxGenomeLength() const { return max_genome_length; }
871 
GetMinFitness()872   double GetMinFitness() const { return min_fitness; }
GetMinMerit()873   double GetMinMerit() const { return min_merit; }
GetMinGestationTime()874   int GetMinGestationTime() const { return min_gestation_time; }
GetMinGenomeLength()875   int GetMinGenomeLength() const { return min_genome_length; }
876 
GetResamplings()877   int GetResamplings() const { return num_resamplings;}  //AWC 06/29/06
GetFailedResamplings()878   int GetFailedResamplings() const { return num_failedResamplings;}  //AWC 06/29/06
879 
880   int GetNumSenseSlots();
881 
GetAveSpeculative()882   double GetAveSpeculative() const { return (m_spec_num) ? ((double)m_spec_total / (double)m_spec_num) : 0.0; }
GetSpeculativeWaste()883   int GetSpeculativeWaste() const { return m_spec_waste; }
884 
GetAvgNumOrgsKilled()885   double GetAvgNumOrgsKilled() const { return sum_orgs_killed.Average(); }
GetAvgNumCellsScannedAtKill()886   double GetAvgNumCellsScannedAtKill() const { return sum_cells_scanned_at_kill.Average(); }
GetNumMigrations()887   int GetNumMigrations() const { return num_migrations; }
888 
889   // Pred-Prey
890   int GetNumPreyCreatures() const;
891   int GetNumPredCreatures() const;
892 
893   // this value gets recorded when a creature with the particular
894   // fitness value gets born. It will never change to a smaller value,
895   // i.e., when the maximum fitness in the population drops, this value will
896   // still stay up.
GetMaxViableFitness()897   double GetMaxViableFitness() const { return max_viable_fitness; }
898 
899   // User-defined datafile...
900   void PrintDataFile(const cString& filename, const cString& format, char sep=' ');
901 
902   // Public calls to output data files (for events)
903   void PrintAverageData(const cString& filename);
904   void PrintDemeAverageData(const cString& filename);
905   void PrintFlowRateTuples(const cString& filename);
906   void PrintErrorData(const cString& filename);
907   void PrintVarianceData(const cString& filename);
908   void PrintDominantData(const cString& filename);
909   void PrintParasiteData(const cString& filename);
910   void PrintPreyAverageData(const cString& filename);
911   void PrintPredatorAverageData(const cString& filename);
912   void PrintPreyErrorData(const cString& filename);
913   void PrintPredatorErrorData(const cString& filename);
914   void PrintPreyVarianceData(const cString& filename);
915   void PrintPredatorVarianceData(const cString& filename);
916   void PrintMinPreyFailedAttacks(const cString& filename);
917   void PrintPreyInstructionData(const cString& filename, const cString& inst_set);
918   void PrintPredatorInstructionData(const cString& filename, const cString& inst_set);
919   void PrintStatsData(const cString& filename);
920   void PrintCountData(const cString& filename);
921   void PrintThreadsData(const cString& filename);
922 	void PrintMessageData(const cString& filename);
923   void PrintInterruptData(const cString& filename);
924   void PrintTotalsData(const cString& filename);
925   void PrintTasksData(const cString& filename);
926   void PrintHostTasksData(const cString& filename);
927   void PrintParasiteTasksData(const cString& filename);
928   void PrintTasksExeData(const cString& filename);
929   void PrintTasksQualData(const cString& filename);
930   void PrintDynamicMaxMinData(const cString& filename);
931   void PrintNewTasksData(const cString& filename);
932   void PrintNewReactionData(const cString& filename);
933   void PrintNewTasksDataPlus(const cString& filename);
934   void PrintReactionData(const cString& filename);
935   void PrintReactionExeData(const cString& filename);
936   void PrintCurrentReactionData(const cString& filename);
937   void PrintReactionRewardData(const cString& filename);
938   void PrintCurrentReactionRewardData(const cString& filename);
939   void PrintResourceData(const cString& filename);
940   void PrintResourceLocData(const cString& filename, cAvidaContext& ctx);
941   void PrintResWallLocData(const cString& filename, cAvidaContext& ctx);
942   void PrintSpatialResData(const cString& filename, int i);
943   void PrintTimeData(const cString& filename);
944   void PrintDivideMutData(const cString& filename);
945   void PrintMutationRateData(const cString& filename);
946   void PrintInstructionData(const cString& filename, const cString& inst_set);
947   void PrintMarketData(const cString& filename);
948   void PrintSenseData(const cString& filename);
949   void PrintSenseExeData(const cString& filename);
950   void PrintInternalTasksData(const cString& filename);
951   void PrintInternalTasksQualData(const cString& filename);
952   void PrintSleepData(const cString& filename);
953   void PrintCompetitionData(const cString& filename);
954   void PrintCellVisitsData(const cString& filename);
955   void PrintExtendedTimeData(const cString& filename);
956   void PrintNumOrgsKilledData(const cString& filename);
957   void PrintMigrationData(const cString& filename);
958   void PrintGroupsFormedData(const cString& filename);
959   void PrintGroupIds(const cString& filename);
960   void PrintTargets(const cString& filename);
961   void PrintGroupTolerance(const cString& filename);
962   void PrintGroupMTTolerance(const cString& filename);
963   void PrintToleranceInstructionData(const cString& filename);
964   void PrintToleranceData(const cString& filename);
965   void PrintDonateSpecificData(const cString& filename);
966   void PrintMaleAverageData(const cString& filename);
967   void PrintFemaleAverageData(const cString& filename);
968   void PrintMaleErrorData(const cString& filename);
969   void PrintFemaleErrorData(const cString& filename);
970   void PrintMaleVarianceData(const cString& filename);
971   void PrintFemaleVarianceData(const cString& filename);
972   void PrintMaleInstructionData(const cString& filename, const cString& inst_set);
973   void PrintFemaleInstructionData(const cString& filename, const cString& inst_set);
974 
975   void PrintMiniTraceReactions(cOrganism* org);
976   void PrintMicroTraces(tSmartArray<char>& exec_trace, int birth_update, int org_id, int ft, int gen_id);
977   void UpdateTopNavTrace(cOrganism* org);
978   void PrintTopNavTrace();
979   void PrintReproData(cOrganism* org);
980 
981  // Kaboom stats
IncKaboom()982   void IncKaboom() { num_kabooms++; }
IncKaboomKills()983     void IncKaboomKills() {num_kaboom_kills++;}
AddHamDistance(int distance)984   void AddHamDistance(int distance) { hd_list.Push(distance); }
985   void PrintKaboom(const cString& filename);
986 
987  // Division of Labor Stats
IncJuvKilled()988     void IncJuvKilled() { juv_killed++; }
989 
990 
991   // deme predicate stats
992   void IncEventCount(int x, int y);
993   void IncPredSat(int cell_id);
994   void PrintPredSatFracDump(const cString& filename);
995 
996 	void AddDemeResourceThresholdPredicate(cString& name);
997 	void IncDemeResourceThresholdPredicate(cString& name);
998 	void PrintDemeResourceThresholdPredicate(const cString& filename);
999 
1000   void addOrgLocations(std::vector<std::pair<int, int> >);
1001   void PrintDemeRepOrgLocation(const cString& filename);
1002 
1003   // ----------- Sexual selection output -----------
1004 public:
1005   void PrintSuccessfulMates(cString& filename);
1006   // ----------- End sexual selection output -----------
1007 
1008   // -------- Messaging support --------
1009 public:
1010   //! Type for a list of pointers to message predicates.
1011   typedef std::vector<cOrgMessagePredicate*> message_pred_ptr_list;
1012 
1013   //! Called for every message successfully sent anywhere in the population.
1014   void SentMessage(const cOrgMessage& msg);
1015   //! Adds a predicate that will be evaluated for each message.
1016   void AddMessagePredicate(cOrgMessagePredicate* predicate);
1017   //! Removes a predicate.
1018   void RemoveMessagePredicate(cOrgMessagePredicate* predicate);
1019   //! Prints information regarding messages that "passed" their predicate.
1020   void PrintPredicatedMessages(const cString& filename);
1021   //! Log a message.
1022   void LogMessage(const cOrgMessage& msg, bool dropped, bool lost);
1023   //! Prints logged messages.
1024   void PrintMessageLog(const cString& filename);
1025 
1026 protected:
1027   /*! List of all active message predicates.  The idea here is that the predicates,
1028   rather than cStats / cOrgMessage / etc., do the tracking of particular messages
1029   of interest. */
1030   message_pred_ptr_list m_message_predicates;
1031   //! Type to store logged messages.
1032   struct message_log_entry_t {
message_log_entry_tmessage_log_entry_t1033     message_log_entry_t(int u, int de, int s, int d, int t, unsigned int md, unsigned int ml, bool dr, bool l)
1034       :	update(u), deme(de), src_cell(s), dst_cell(d), transmit_cell(t), msg_data(md), msg_label(ml), dropped(dr), lost(l) {
1035     }
1036     int update, deme, src_cell, dst_cell, transmit_cell;
1037     unsigned int msg_data, msg_label;
1038     bool dropped, lost;
1039   };
1040   typedef std::vector<message_log_entry_t> message_log_t; //!< Type for message log.
1041   message_log_t m_message_log; //!< Log for messages.
1042 
1043   // -------- End messaging support --------
1044 
1045 
1046   // -------- Movement support -------------
1047 public:
1048   //! Type for a list of pointers to movement predicates.
1049   typedef std::vector<cOrgMovementPredicate*> movement_pred_ptr_list;
1050   void Move(cOrganism& org);
1051   void AddMovementPredicate(cOrgMovementPredicate* predicate);
1052 protected:
1053   movement_pred_ptr_list m_movement_predicates;
1054   // -------- End movement support --------
1055 
1056   //--------- Donate Specific support---------
1057 public:
1058   void PushDonateSpecificInstExe(int org_id, int cell_id, int recipient_id, int recipient_cell_id, int relatedness, int recip_is_beggar, int num_donates);
1059   void ZeroDonateSpceificInst();
1060 
1061   // -------- Tolerance support --------
1062 public:
1063   void PushToleranceInstExe(int tol_inst);
1064   void PushToleranceInstExe(int tol_inst, int group_id, int group_size, double resource_level, double odds_immi,
1065               double odds_own, double odds_others, int tol_immi, int tol_own, int tol_others, int tol_max);
1066   void ZeroToleranceInst();
1067 
1068 
1069   // -------- Deme replication support --------
1070 public:
1071   //! Called immediately prior to deme replacement.
1072   void DemePreReplication(cDeme& source_deme, cDeme& target_deme);
1073   //! Called immediately after deme replacement.
1074   void DemePostReplication(cDeme& source_deme, cDeme& target_deme);
1075   //! Called immediately prior to germline replacement.
1076   void GermlineReplication(cGermline& source_germline, cGermline& target_germline);
1077   //! Print statistics about deme replication.
1078   void PrintDemeReplicationData(const cString& filename);
1079   //! Print statistics regarding germline sequestration
1080   void PrintDemeGermlineSequestration(const cString& filename);
1081   //! Print germline sequestration for every individual in every deme
1082   void PrintDemeOrgGermlineSequestration(const cString& filename);
1083   //! Print genotype IDs and genotypes for GLS deme founders
1084   void PrintDemeGLSFounders(const cString& filename);
1085   //! Track GLS Deme Founder Data
1086   typedef std::map<std::pair<int, int>, std::vector<std::pair<int, std::string> > > t_gls_founder_map;
1087   void TrackDemeGLSReplication(int source_deme_id, int target_deme_id,   std::vector<std::pair<int, std::string> > founders);
1088 
1089 
1090 	void PrintDemeTreatableReplicationData(const cString& filename);
1091 	void PrintDemeUntreatableReplicationData(const cString& filename);
1092 	void PrintDemeTreatableCount(const cString& filename);
1093 
1094   //! Print statistics about germlines.
1095   void PrintGermlineData(const cString& filename);
1096   //! Accessor for average "generation" of germlines.
GetAveGermlineGeneration()1097   double GetAveGermlineGeneration() const { return m_germline_generation.Average(); }
1098   /*! Typedef of a data structure to track deme founders.
1099     * Map of deme id -> {founder genotype id_0, id_1,... id_{deme propagule size}} */
1100   typedef std::map<int, std::vector<int> > t_founder_map;
1101   //! Print the genotype IDs for the founders of demes that have recently been "born."
1102   void PrintDemeFoundersData(const cString& filename);
1103 
1104   void PrintPerDemeTasksData(const cString& filename);
1105   void PrintPerDemeTasksExeData(const cString& filename);
1106   void PrintAvgDemeTasksExeData(const cString& filename);
1107   void PrintAvgTreatableDemeTasksExeData(const cString& filename);
1108   void PrintAvgUntreatableDemeTasksExeData(const cString& filename);
1109   void PrintPerDemeReactionData(const cString& filename);
1110   void PrintDemeTasksData(const cString& filename);
1111   void PrintDemeTasksExeData(const cString& filename);
1112   void PrintDemeReactionData(const cString& filename);
1113   void PrintDemeOrgTasksData(const cString& filename);
1114   void PrintDemeOrgTasksExeData(const cString& filename);
1115   void PrintDemeOrgReactionData(const cString& filename);
1116   void PrintDemeCurrentTaskExeData(const cString& filename);
1117   void PrintCurrentTaskCounts(const cString& filename);
1118   void PrintPerDemeGenPerFounderData(const cString& filename);
1119 	void PrintDemeMigrationSuicidePoints(const cString& filename);
1120 	void PrintDemeReactionDiversityReplicationData(const cString& filename);
1121   void PrintWinningDeme(const cString& filename);
1122   void PrintDemeGermResourcesData(const cString& filename);
1123 
1124   void PrintDemesTasksData(const cString& filename); //@JJB**
1125   void PrintDemesReactionsData(const cString& filename); //@JJB**
1126   void PrintDemesFitnessData(const cString& filename); //@JJB**
1127 
IncNumOccupiedDemes()1128   void IncNumOccupiedDemes() { m_num_occupied_demes++; }
ClearNumOccupiedDemes()1129   void ClearNumOccupiedDemes() { m_num_occupied_demes = 0; }
GetNumOccupiedDemes()1130   int GetNumOccupiedDemes() { return m_num_occupied_demes; }
1131 
1132 
1133 
1134 protected:
1135   int m_deme_num_repls; //!< Number of deme replications since last PrintDemeReplicationData.
1136 	int m_total_deme_num_repls; //!< Total number of deme replications ever.
1137   cDoubleSum m_deme_gestation_time; //!< Gestation time for demes - mean age at deme replication.
1138   cDoubleSum m_deme_births; //!< Mean number of births in replicated demes.
1139   cDoubleSum m_deme_merit; //!< Mean merit of replicated demes.
1140   cDoubleSum m_deme_generation; //!< Mean generation of replicated demes.
1141 	cDoubleSum m_deme_density; //!< Mean density of replicated demes.
1142   cDoubleSum m_germline_generation; //!< Mean germline generation of replicated germlines
1143   std::deque<double> m_ave_germ_mut; //!< Mean number of mutations that occurred as a result of damage related to performing metabolic work (does not include mutations that occur as part of replication).
1144   std::deque<double> m_var_germ_mut;
1145   std::deque<double> m_ave_soma_mut;
1146   std::deque<double> m_var_soma_mut;
1147   std::deque<double> m_ave_germ_size;
1148   std::deque<double> m_ave_germ_percent;
1149   std::deque<double> m_ave_soma_work;
1150   std::deque<double> m_var_soma_work;
1151   std::deque<double> m_ave_germ_work;
1152   std::deque<double> m_var_germ_work;
1153 
1154   t_gls_founder_map m_gls_deme_founders; //! Data structure to track the founders of gls demes.
1155 
1156 
1157 	int m_deme_num_repls_treatable; //!< Number of deme replications in treatable demes since last PrintDemeReplicationData.
1158   cDoubleSum m_deme_gestation_time_treatable; //!< Gestation time for treatable demes - mean age at deme replication.
1159   cDoubleSum m_deme_births_treatable; //!< Mean number of births in replicated treatable demes.
1160   cDoubleSum m_deme_merit_treatable; //!< Mean merit of replicated treatable demes.
1161   cDoubleSum m_deme_generation_treatable; //!< Mean generation of replicated treatable demes.
1162 	cDoubleSum m_deme_density_treatable; //!< Mean density of replicated treatable demes.
1163 
1164 	int m_deme_num_repls_untreatable; //!< Number of deme replications in untreatable demes since last PrintDemeReplicationData.
1165   cDoubleSum m_deme_gestation_time_untreatable; //!< Gestation time for untreatable demes - mean age at deme replication.
1166   cDoubleSum m_deme_births_untreatable; //!< Mean number of births in replicated untreatable demes.
1167   cDoubleSum m_deme_merit_untreatable; //!< Mean merit of replicated untreatable demes.
1168   cDoubleSum m_deme_generation_untreatable; //!< Mean generation of replicated untreatable demes.
1169 	cDoubleSum m_deme_density_untreatable; //!< Mean density of replicated untreatable demes.
1170 
1171 	t_founder_map m_deme_founders; //!< Data structure to track the founders of demes.
1172 
1173 
1174   // -------- Deme competition support --------
1175 public:
1176   //! Called immediately prior to deme competition.
1177   void CompeteDemes(const std::vector<double>& fitness);
1178   //! Print data regarding deme competition.
1179   void PrintDemeCompetitionData(const cString& filename);
1180 
1181 private:
1182   std::vector<double> m_deme_fitness; //!< Fitness of each deme during last deme competition.
1183 
1184 	// -------- Cell data support --------
1185 public:
1186 	//! Prints the cell data from every cell in the population.
1187 	void PrintCellData(const cString& filename);
1188 
1189 	// -------- Opinion support --------
1190 public:
1191 	//! Prints the current opinions of all organisms in the population.
1192 	void PrintCurrentOpinions(const cString& filename);
1193 	//! Prints the average number of organism with set opinions
1194 	void PrintOpinionsSetPerDeme(const cString& filename);
1195 
1196 	// -------- Synchronization support --------
1197 public:
1198 	typedef std::vector<int> CellFlashes; //!< Typedef for a list of cell IDs.
1199 	typedef std::map<int, CellFlashes> DemeFlashes; //!< Typedef for cell IDs (in this deme) -> list of cell IDs.
1200 	typedef std::map<int, DemeFlashes> PopulationFlashes; //!< Typedef for deme IDs -> flashes in that deme.
1201   //! Called immediately after an organism has issued a "flash" to its neighbors.
1202   void SentFlash(cOrganism& organism);
1203 	//! Retrieve the cell ID -> flash time map.
GetFlashTimes()1204 	const PopulationFlashes& GetFlashTimes() { return m_flash_times; }
1205   //! Print statistics about synchronization flashes.
1206   void PrintSynchronizationData(const cString& filename);
1207   //! Print detailed information regarding synchronization flashes.
1208   void PrintDetailedSynchronizationData(const cString& filename);
1209 protected:
1210   int m_flash_count; //!< Number of flashes that have occured since last PrintSynchronizationData.
1211 	PopulationFlashes m_flash_times; //!< For tracking flashes that have occurred throughout this population.
1212 
1213 	// -------- Consensus support --------
1214 public:
1215 	struct ConsensusRecord {
ConsensusRecordConsensusRecord1216 		ConsensusRecord(int u, int d, cOrganism::Opinion c, int cell) : update(u), deme_id(d), consensus(c), cell_id(cell) {
1217 		}
1218 		int update;
1219 		int deme_id;
1220 		cOrganism::Opinion consensus;
1221 		int cell_id;
1222 	};
1223 
1224 	typedef std::vector<ConsensusRecord> Consensi; //!< Typedef for a map of update -> Consensus records.
1225 	//! Called when a deme reaches consensus.
1226 	void ConsensusReached(const cDeme& deme, cOrganism::Opinion consensus, int cellid);
1227 	//! Print information about demes that have reached consensus.
1228 	void PrintConsensusData(const cString& filename);
1229 	//! Print "simple" (summary) consensus information.
1230 	void PrintSimpleConsensusData(const cString& filename);
1231 protected:
1232 	Consensi m_consensi; //!< Tracks when demes have reached consensus.
1233 
1234 // ----------Division of Labor support --------
1235 protected:
1236 	typedef std::deque<double> dblq;
1237 	dblq m_switching;
1238 	dblq m_deme_diversity;
1239 	dblq m_shannon_div;
1240   dblq m_shannon_div_norm;
1241 	dblq m_num_orgs_perf_reaction;
1242   dblq m_percent_reproductives;
1243   int m_resource_print_thresh;
1244 
1245 public:
IncDemeReactionDiversityReplicationData(double deme_div,double switch_pen,double shannon_div,double num_orgs_perf_reaction,double per_repro)1246 	void IncDemeReactionDiversityReplicationData(double deme_div, double switch_pen,  \
1247 																							  double shannon_div, double num_orgs_perf_reaction, double per_repro) {
1248 		m_switching.push_back(switch_pen); m_deme_diversity.push_back(deme_div);
1249 		m_shannon_div.push_back(shannon_div);
1250 		m_num_orgs_perf_reaction.push_back(num_orgs_perf_reaction);
1251     double norm_shan = shannon_div / (log((double)num_orgs_perf_reaction));
1252     m_shannon_div_norm.push_back(norm_shan);
1253     m_percent_reproductives.push_back(per_repro);
1254 
1255 	}
1256 	void PrintIntrinsicTaskSwitchingCostData(const cString& filename);
1257 	void PrintAgePolyethismData(const cString& filename);
1258 	void AgeTaskEvent(int org_id, int task_id, int org_age);
1259 	//! Get number of deme replications
GetNumDemeReplications()1260 	int GetNumDemeReplications() { return m_total_deme_num_repls; }
1261   //! Add a task time tracking event
1262   void AddTaskSwitchTime(int t1, int t2, int time);
1263 
1264   //! Figure out how many juveniles and guards there are in the den
1265   void PrintDenData(const cString& filename);
1266 
1267 
1268 
1269 
1270 protected:
1271 	std::map<int, cDoubleSum> reaction_age_map;
1272   std::map<std::pair<int,int>, cDoubleSum> intrinsic_task_switch_time;
1273 
1274 
1275 // -------- Reputation support ---------
1276 public:
1277 	// Print statistics about reputation
1278 	void PrintReputationData(const cString& filename);
1279 	void PrintDirectReciprocityData(const cString& filename);
IncDonateToDonor()1280 	void IncDonateToDonor() { m_donate_to_donor++; }
IncDonateToFacing()1281 	void IncDonateToFacing() { m_donate_to_facing++; }
1282 	void PrintStringMatchData(const cString& filename);
AddStringBitsMatchedValue(cString name,int value)1283 	void AddStringBitsMatchedValue(cString name, int value) { m_string_bits_matched[name].Add(value); }
AddTag(int tag,int value)1284 	void AddTag(int tag, int value) { m_tags[tag] = m_tags[tag] + value; }
IncPerfectMatch(int amount)1285 	void IncPerfectMatch(int amount) { m_perfect_match.Add(amount); }
IncPerfectMatchOrg()1286 	void IncPerfectMatchOrg() { m_perfect_match_org.Add(1); }
1287 	void PrintShadedAltruists(const cString& filename);
1288 
1289 protected:
1290 	int m_donate_to_donor;
1291 	int m_donate_to_facing;
1292 	std::map <cString, cDoubleSum> m_string_bits_matched;
1293 	cDoubleSum m_perfect_match;
1294 	cDoubleSum m_perfect_match_org;
1295 	std::map <int, int> m_tags;
1296 
1297 	// -------- Deme network support --------
1298 public:
1299 	typedef std::map<std::string, double> network_stats_t; //!< Structure to hold statistics for one network.
1300 	typedef std::map<std::string, cDoubleSum> avg_network_stats_t; //!< Structure to hold average statistics for many networks.
1301 
1302 	//! Track named network stats.
1303 	void NetworkTopology(const network_stats_t& ns);
1304 
1305 	//! Print network statistics.
1306 	void PrintDemeNetworkData(const cString& filename);
1307 
1308 	//! Print the topologies of all demes.
1309 	void PrintDemeNetworkTopology(const cString& filename);
1310 
1311 protected:
1312 	avg_network_stats_t m_network_stats; //!< Network statistics.
1313 
1314 	// -------- HGT support --------
1315 private:
1316 	cDoubleSum m_hgt_metabolized; //!< Total length of metabolized genome fragments.
1317 	cDoubleSum m_hgt_inserted; //!< Total length of inserted genome fragments.
1318 public:
1319 	//! Called when an organism metabolizes a genome fragment.
1320 	void GenomeFragmentMetabolized(cOrganism* organism, const Sequence& fragment);
1321 	//! Called when an organism inserts a genome fragment.
1322 	void GenomeFragmentInserted(cOrganism* organism, const Sequence& fragment, const cGenomeUtil::substring_match& location);
1323 	//! Print HGT statistics.
1324 	void PrintHGTData(const cString& filename);
1325 
1326 	// -------- Multiprocess support --------
1327 private:
1328 	cDoubleSum m_outgoing; //!< Number of outgoing migration events.
1329 	cDoubleSum m_incoming; //!< Number of incoming migration events.
1330 
1331 public:
1332 	typedef std::map<std::string, double> profiling_stats_t; //!< Structure to hold average profiling statistics.
1333 	typedef std::map<std::string, cDoubleSum> avg_profiling_stats_t; //!< Structure to hold statistics for one network.
1334 
1335 	//! Record information about an organism migrating from this population.
1336 	void OutgoingMigrant(const cOrganism* org);
1337 
1338 	//! Record information about an organism migrating into this population.
1339 	void IncomingMigrant(const cOrganism* org);
1340 
1341 	//! Print multiprocess data.
1342 	void PrintMultiProcessData(const cString& filename);
1343 
1344 	//! Track profiling data.
1345 	void ProfilingData(const profiling_stats_t& pf);
1346 
1347 	//! Print profiling data.
1348 	void PrintProfilingData(const cString& filename);
1349 
1350 protected:
1351 	avg_profiling_stats_t m_profiling; //!< Profiling statistics.
1352 
1353 	// -------- Support for organism locations --------
1354 public:
1355 	//! Print organism locations.
1356 	void PrintOrganismLocation(const cString& filename);
1357 
1358 private:
1359   // Initialization
1360   void setupProvidedData();
1361 
1362   // Helper Methods
1363   template <class T> Data::PackagePtr packageData(T (cStats::*)() const) const;
1364 };
1365 
1366 
SetNumGenotypes(int new_genotypes,int num_historic)1367 inline void cStats::SetNumGenotypes(int new_genotypes, int num_historic)
1368 {
1369   num_genotypes_last = num_genotypes;
1370   num_genotypes = new_genotypes;
1371   num_genotypes_historic = num_historic;
1372 }
1373 
SetBreedTrueCreatures(int in_num_breed_true_creatures)1374 inline void cStats::SetBreedTrueCreatures(int in_num_breed_true_creatures)
1375 {
1376   num_breed_true_creatures = in_num_breed_true_creatures;
1377 }
1378 
SetNumParasites(int in_num_parasites)1379 inline void cStats::SetNumParasites(int in_num_parasites)
1380 {
1381   num_parasites = in_num_parasites;
1382 }
1383 
SetNumNoBirthCreatures(int in_num_no_birth_creatures)1384 inline void cStats::SetNumNoBirthCreatures(int in_num_no_birth_creatures)
1385 {
1386   num_no_birth_creatures = in_num_no_birth_creatures;
1387 }
1388 
SetNumSingleThreadCreatures(int in_num_single_thread_creatures)1389 inline void cStats::SetNumSingleThreadCreatures(int in_num_single_thread_creatures)
1390 {
1391   num_single_thread_creatures = in_num_single_thread_creatures;
1392 }
1393 
SetNumMultiThreadCreatures(int in_num_multi_thread_creatures)1394 inline void cStats::SetNumMultiThreadCreatures(int in_num_multi_thread_creatures)
1395 {
1396   num_multi_thread_creatures = in_num_multi_thread_creatures;
1397 }
1398 
SetNumModified(int in_num_modified)1399 inline void cStats::SetNumModified(int in_num_modified)
1400 {
1401   num_modified = in_num_modified;
1402 }
1403 
1404 #endif
1405