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