1 /*
2  *  cReactionResult.cc
3  *  Avida
4  *
5  *  Called "reaction_result.cc" prior to 12/5/05.
6  *  Copyright 1999-2011 Michigan State University. All rights reserved.
7  *  Copyright 1993-2004 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 #include "cReactionResult.h"
24 
25 
cReactionResult(const int num_resources,const int num_tasks,const int num_reactions)26 cReactionResult::cReactionResult(const int num_resources,
27 				 const int num_tasks,
28 				 const int num_reactions)
29   : resources_consumed(num_resources)
30   , resources_produced(num_resources)
31   , resources_detected(num_resources)
32   , internal_resources_consumed(num_resources)
33   , internal_resources_produced(num_resources)
34   , tasks_done(num_tasks)
35   , tasks_quality(num_tasks)
36   , tasks_value(num_tasks)
37   , reactions_triggered(num_reactions)
38   , reaction_add_bonus(num_reactions)
39   , active_reaction(false)
40 {
41 }
42 
ActivateReaction()43 void cReactionResult::ActivateReaction()
44 {
45   // If this reaction is already active, don't worry about it.
46   if (active_reaction == true) return;
47 
48   // To activate the reaction, we must initialize all counter settings.
49   resources_consumed.SetAll(0.0);
50   resources_produced.SetAll(0.0);
51   resources_detected.SetAll(-1.0);
52   internal_resources_consumed.SetAll(0.0);
53   internal_resources_produced.SetAll(0.0);
54   tasks_done.SetAll(false);
55   tasks_quality.SetAll(0.0);
56   tasks_value.SetAll(0.0);
57   reactions_triggered.SetAll(false);
58   reaction_add_bonus.SetAll(0.0);
59   task_plasticity.SetAll(0.0);
60   energy_add = 0.0;
61   bonus_add = 0.0;
62   bonus_mult = 1.0;
63   germline_add = 0.0;
64   germline_mult = 1.0;
65   insts_triggered.Resize(0);
66   lethal = false;
67   sterilize = false;
68   used_env_resource = true;
69   deme_add_bonus = 0.0;
70   deme_mult_bonus = 1.0;
71   active_deme_reaction = false;
72 
73   // And finally note that this is indeed already active.
74   active_reaction = true;
75 }
76 
77 
Consume(int id,double num,bool is_env_resource)78 void cReactionResult::Consume(int id, double num, bool is_env_resource)
79 {
80   ActivateReaction();
81   if(is_env_resource) { resources_consumed[id] += num; }
82   else {
83     used_env_resource = false;
84     internal_resources_consumed[id] += num;
85   }
86 }
87 
88 
Produce(int id,double num,bool is_env_resource)89 void cReactionResult::Produce(int id, double num, bool is_env_resource)
90 {
91   ActivateReaction();
92 
93   if(is_env_resource) { resources_produced[id] += num; }
94   else {
95     used_env_resource = false;
96     internal_resources_produced[id] += num;
97   }
98 }
99 
100 
Detect(int id,double num)101 void cReactionResult::Detect(int id, double num)
102 {
103   ActivateReaction();
104   resources_detected[id] += num;
105 }
106 
Lethal(bool flag)107 void cReactionResult::Lethal(bool flag)
108 {
109  ActivateReaction();
110  lethal = flag;
111 }
112 
Sterilize(bool flag)113 void cReactionResult::Sterilize(bool flag)
114 {
115   ActivateReaction();
116   sterilize = flag;
117 }
118 
119 
MarkTask(int id,const double quality,const double value)120 void cReactionResult::MarkTask(int id, const double quality, const double value)
121 {
122   ActivateReaction();
123   tasks_done[id] = true;
124   tasks_quality[id] = quality;
125   tasks_value[id] = value;
126 }
127 
128 
MarkReaction(int id)129 void cReactionResult::MarkReaction(int id)
130 {
131   ActivateReaction();
132   reactions_triggered[id] = true;
133 }
134 
AddEnergy(double value)135 void cReactionResult::AddEnergy(double value)
136 {
137   ActivateReaction();
138   energy_add += value;
139 }
140 
AddBonus(double value,int id)141 void cReactionResult::AddBonus(double value, int id)
142 {
143   ActivateReaction();
144   bonus_add += value;
145   reaction_add_bonus[id] += value;
146 }
147 
148 
MultBonus(double value)149 void cReactionResult::MultBonus(double value)
150 {
151   ActivateReaction();
152   bonus_mult *= value;
153 }
154 
AddDemeBonus(double value)155 void cReactionResult::AddDemeBonus(double value)
156 {
157   ActivateReaction();
158   active_deme_reaction = true;
159   deme_add_bonus += value;
160 }
161 
MultDemeBonus(double value)162 void cReactionResult::MultDemeBonus(double value)
163 {
164   ActivateReaction();
165   active_deme_reaction = true;
166   deme_mult_bonus *= value;
167 }
168 
AddGermline(double value)169 void cReactionResult::AddGermline(double value)
170 {
171   ActivateReaction();
172   germline_add += value;
173 }
174 
MultGermline(double value)175 void cReactionResult::MultGermline(double value)
176 {
177   ActivateReaction();
178   germline_mult *= value;
179 }
180 
181 
AddInst(const cString & inst)182 void cReactionResult::AddInst(const cString& inst)
183 {
184   insts_triggered.Push(inst);
185 }
186 
GetConsumed(int id)187 double cReactionResult::GetConsumed(int id)
188 {
189   if (GetActive() == false) return 0.0;
190   return resources_consumed[id];
191 }
192 
193 
GetProduced(int id)194 double cReactionResult::GetProduced(int id)
195 {
196   if (GetActive() == false) return 0.0;
197   return resources_produced[id];
198 }
199 
GetDetected(int id)200 double cReactionResult::GetDetected(int id)
201 {
202   if (GetActive() == false) return 0.0;
203   return resources_detected[id];
204 }
205 
GetInternalConsumed(int id)206 double cReactionResult::GetInternalConsumed(int id)
207 {
208   if (GetActive() == false) return 0.0;
209   return internal_resources_consumed[id];
210 }
211 
GetInternalProduced(int id)212 double cReactionResult::GetInternalProduced(int id)
213 {
214   if (GetActive() == false) return 0.0;
215   return internal_resources_produced[id];
216 }
217 
GetLethal()218 bool cReactionResult::GetLethal()
219 {
220   if (GetActive() == false) return false;
221   return lethal;
222 }
223 
GetSterilize()224 bool cReactionResult::GetSterilize()
225 {
226   if (GetActive() == false) return false;
227   return sterilize;
228 }
229 
ReactionTriggered(int id)230 bool cReactionResult::ReactionTriggered(int id)
231 {
232   if (GetActive() == false) return false;
233   return reactions_triggered[id];
234 }
235 
TaskDone(int id)236 bool cReactionResult::TaskDone(int id)
237 {
238   if (GetActive() == false) return false;
239   return tasks_done[id];
240 }
241 
TaskQuality(int id)242 double cReactionResult::TaskQuality(int id)
243 {
244 	if (GetActive() == false) return 0;
245 	return tasks_quality[id];
246 }
247 
TaskValue(int id)248 double cReactionResult::TaskValue(int id)
249 {
250 	if (GetActive() == false) return 0;
251 	return tasks_value[id];
252 }
253 
254