Skip to content

Commit 4758b20

Browse files
Merge pull request #317 from LaurenC267/main
Changed so that the 'season' starts on the opposite one
2 parents dc8e6af + db5544d commit 4758b20

6 files changed

Lines changed: 115 additions & 67 deletions

File tree

source/sgp_mode/SGPHost.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,20 @@ class SGPHost : public Host {
178178

179179
void DecPoints(double amt) {
180180
points -= amt;
181+
182+
if (points < 0){
183+
points = 0;
184+
}
181185
}
186+
182187
void AddPoints(double amt) {
183188
points += amt;
189+
190+
if (points < 0){
191+
points = 0;
192+
}
193+
194+
184195
}
185196

186197
size_t GetCountofMatchingSymsToInteractWith(){

source/sgp_mode/SGPSymbiont.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,20 @@ class SGPSymbiont : public Symbiont {
190190

191191
}
192192

193-
void AddPoints(double _in) {
194-
points += _in;
195-
}
196-
197193
void DecPoints(double amt) {
198194
points -= amt;
195+
196+
if (points < 0){
197+
points = 0;
198+
}
199+
}
200+
201+
void AddPoints(double amt) {
202+
points += amt;
203+
204+
if (points < 0){
205+
points = 0;
206+
}
199207
}
200208

201209
/**

source/sgp_mode/SGPWorldSetup.cc

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -120,17 +120,15 @@ void SGPWorld::SetupChangingEnvironment() {
120120
else if (task_env.GetTaskSet().HasTask("and_not")) {
121121
andn_task_id = task_env.GetTaskSet().GetID("and_not");
122122
}
123-
124-
123+
125124
size_t orn_task_id = task_env.GetTaskSet().GetSize();
126125
if (task_env.GetTaskSet().HasTask("OR_NOT")) {
127126
orn_task_id = task_env.GetTaskSet().GetID("OR_NOT");
128127
}
129128
else if (task_env.GetTaskSet().HasTask("or_not")) {
130129
orn_task_id = task_env.GetTaskSet().GetID("or_not");
131130
}
132-
133-
131+
134132
// grab task ids for NOT, AND, OR
135133
size_t not_task_id = task_env.GetTaskSet().GetSize();
136134
if (task_env.GetTaskSet().HasTask("NOT")) {
@@ -155,20 +153,21 @@ void SGPWorld::SetupChangingEnvironment() {
155153
else if (task_env.GetTaskSet().HasTask("or")) {
156154
or_task_id = task_env.GetTaskSet().GetID("or");
157155
}
158-
159-
// update 0 will flip not-and-or to rewarded and nand-andn-orn to punished
160-
GetTaskEnv().GetHostTaskReq(not_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(not_task_id).task_value;
161-
GetTaskEnv().GetSymTaskReq(not_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(not_task_id).task_value;
162-
163-
GetTaskEnv().GetHostTaskReq(and_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(and_task_id).task_value;
164-
GetTaskEnv().GetSymTaskReq(and_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(and_task_id).task_value;
165-
166-
GetTaskEnv().GetHostTaskReq(or_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(or_task_id).task_value;
167-
GetTaskEnv().GetSymTaskReq(or_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(or_task_id).task_value;
156+
157+
// update 0 will flip nand-andn-orn to rewarded and not-and-or to punished
158+
GetTaskEnv().GetHostTaskReq(nand_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(nand_task_id).task_value;
159+
GetTaskEnv().GetSymTaskReq(nand_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(nand_task_id).task_value;
160+
161+
GetTaskEnv().GetHostTaskReq(andn_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(andn_task_id).task_value;
162+
GetTaskEnv().GetSymTaskReq(andn_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(andn_task_id).task_value;
163+
164+
GetTaskEnv().GetHostTaskReq(orn_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(orn_task_id).task_value;
165+
GetTaskEnv().GetSymTaskReq(orn_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(orn_task_id).task_value;
168166

169167
begin_update_sig.AddAction(
170168
[this, nand_task_id, andn_task_id, orn_task_id, not_task_id, and_task_id, or_task_id]() {
171169
if (GetUpdate() % sgp_config.TEMP_CHANGING_ENVIRONMENT_INTERVAL() == 0) {
170+
172171
GetTaskEnv().GetHostTaskReq(nand_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(nand_task_id).task_value;
173172
GetTaskEnv().GetHostTaskReq(andn_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(andn_task_id).task_value;
174173
GetTaskEnv().GetHostTaskReq(orn_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(orn_task_id).task_value;
@@ -177,14 +176,15 @@ void SGPWorld::SetupChangingEnvironment() {
177176
GetTaskEnv().GetHostTaskReq(and_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(and_task_id).task_value;
178177
GetTaskEnv().GetHostTaskReq(or_task_id).task_value = -1 * GetTaskEnv().GetHostTaskReq(or_task_id).task_value;
179178

180-
181179
GetTaskEnv().GetSymTaskReq(nand_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(nand_task_id).task_value;
182180
GetTaskEnv().GetSymTaskReq(andn_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(andn_task_id).task_value;
183181
GetTaskEnv().GetSymTaskReq(orn_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(orn_task_id).task_value;
184182

185183
GetTaskEnv().GetSymTaskReq(not_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(not_task_id).task_value;
186184
GetTaskEnv().GetSymTaskReq(and_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(and_task_id).task_value;
187185
GetTaskEnv().GetSymTaskReq(or_task_id).task_value = -1 * GetTaskEnv().GetSymTaskReq(or_task_id).task_value;
186+
187+
188188
}
189189
}
190190
);

source/test/sgp_mode_test/functional_tests/SenseTask_Tasks.test.cc

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,18 @@ TEST_CASE("Test host SenseTask instruction after a rewarded task", "[sgp]"){
5757
host_hw.Reset();
5858
host_hw.SetProgram(host_program);
5959
world.AssignNewEnvIO(host_hw.GetCPUState());
60-
61-
// NOT is currently rewarded.
62-
REQUIRE(world.GetTaskEnv().GetHostTaskReq(not_task_id).task_value > 0);
63-
60+
61+
// NOT is currently not rewarded.
62+
REQUIRE(world.GetTaskEnv().GetHostTaskReq(not_task_id).task_value < 0);
63+
6464
// Initial register values
6565
host_hw.SetRegisters({3, 2, 5});
6666

6767
// Run host program
6868
host_hw.RunCPUStep(4);
6969

70-
THEN("SenseTask puts a 1 into register 1"){
71-
REQUIRE(host_hw.GetRegister(1) == 1);
70+
THEN("SenseTask puts a 0 into register 1"){
71+
REQUIRE(host_hw.GetRegister(1) == 0);
7272
}
7373
}
7474
}
@@ -110,22 +110,24 @@ TEST_CASE("Test host SenseTask instruction after a punished task", "[sgp]"){
110110
host_hw.SetProgram(host_program);
111111
world.AssignNewEnvIO(host_hw.GetCPUState());
112112

113-
// NAND is currently punished.
114-
REQUIRE(world.GetTaskEnv().GetHostTaskReq(nand_task_id).task_value < 0);
113+
// NAND is not currently punished.
114+
REQUIRE(world.GetTaskEnv().GetHostTaskReq(nand_task_id).task_value > 0);
115115

116+
117+
116118
// Initial register values
117119
host_hw.SetRegisters({7, 12, 9});
118120

119121
// Run host program
120122
host_hw.RunCPUStep(5);
121-
122-
THEN("SenseTask puts a 0 into register 1"){
123-
REQUIRE(host_hw.GetRegister(1) == 0);
123+
124+
THEN("SenseTask puts a 1 into register 1"){
125+
REQUIRE(host_hw.GetRegister(1) == 1);
124126
}
125127
}
126128
}
127129

128-
TEST_CASE("Test symbiont SenseTask instruction after a rewarded task", "[sgp]"){
130+
TEST_CASE("Test symbiont SenseTask instruction after a punished task", "[sgp]"){
129131
sgpmode::SymConfigSGP config;
130132
config.CYCLES_PER_UPDATE(0);
131133
config.SEED(61);
@@ -149,7 +151,7 @@ TEST_CASE("Test symbiont SenseTask instruction after a rewarded task", "[sgp]"){
149151
// setup correct reward/punishment values for update 0
150152
world.Update();
151153

152-
WHEN("A symbiont runs a task which is rewarded and then the SenseTask instruction"){
154+
WHEN("A symbiont runs a task which is punished and then the SenseTask instruction"){
153155
program_t sym_program;
154156
prog_builder.AddStartAnchor(sym_program);
155157
prog_builder.AddInst(sym_program, "IO", 0);
@@ -159,22 +161,22 @@ TEST_CASE("Test symbiont SenseTask instruction after a rewarded task", "[sgp]"){
159161
sym_hw.SetProgram(sym_program);
160162
world.AssignNewEnvIO(sym_hw.GetCPUState());
161163

162-
// NOT is currently rewarded.
163-
REQUIRE(world.GetTaskEnv().GetHostTaskReq(not_task_id).task_value > 0);
164-
164+
// NOT is currently punished.
165+
REQUIRE(world.GetTaskEnv().GetHostTaskReq(not_task_id).task_value < 0);
166+
165167
// Initial register values
166168
sym_hw.SetRegisters({3, 2, 5});
167169

168170
// Run symbiont program
169-
sym_hw.RunCPUStep(4);
170-
171-
THEN("SenseTask puts a 1 into register 1"){
172-
REQUIRE(sym_hw.GetRegister(1) == 1);
171+
sym_hw.RunCPUStep(4);
172+
173+
THEN("SenseTask puts a 0 into register 1"){
174+
REQUIRE(sym_hw.GetRegister(1) == 0);
173175
}
174176
}
175177
}
176178

177-
TEST_CASE("Test symbiont SenseTask instruction after a punished task", "[sgp]"){
179+
TEST_CASE("Test symbiont SenseTask instruction after a rewarded task", "[sgp]"){
178180
sgpmode::SymConfigSGP config;
179181
config.CYCLES_PER_UPDATE(0);
180182
config.SEED(61);
@@ -198,7 +200,7 @@ TEST_CASE("Test symbiont SenseTask instruction after a punished task", "[sgp]"){
198200
// setup correct reward/punishment values for update 0
199201
world.Update();
200202

201-
WHEN("A symbiont runs a task which is punished and then the SenseTask instruction") {
203+
WHEN("A symbiont runs a task which is rewarded and then the SenseTask instruction") {
202204
program_t sym_program;
203205
prog_builder.AddStartAnchor(sym_program);
204206
prog_builder.AddInst(sym_program, "IO", 0);
@@ -209,17 +211,17 @@ TEST_CASE("Test symbiont SenseTask instruction after a punished task", "[sgp]"){
209211
sym_hw.SetProgram(sym_program);
210212
world.AssignNewEnvIO(sym_hw.GetCPUState());
211213

212-
// NAND is currently punished.
213-
REQUIRE(world.GetTaskEnv().GetHostTaskReq(nand_task_id).task_value < 0);
214-
214+
// NAND is currently rewarded.
215+
REQUIRE(world.GetTaskEnv().GetHostTaskReq(nand_task_id).task_value > 0);
216+
215217
// Initial register values
216218
sym_hw.SetRegisters({7, 12, 9});
217219

218220
// run symbiont program
219221
sym_hw.RunCPUStep(5);
220-
221-
THEN("SenseTask puts a 0 into register 1"){
222-
REQUIRE(sym_hw.GetRegister(1) == 0);
222+
223+
THEN("SenseTask puts a 1 into register 1"){
224+
REQUIRE(sym_hw.GetRegister(1) == 1);
223225
}
224226
}
225227
}

source/test/sgp_mode_test/functional_tests/TempChangingEnvironments.test.cc

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ using sgp_host_t = sgpmode::SGPHost<hw_spec_t>;
2626
using sgp_sym_t = sgpmode::SGPSymbiont<hw_spec_t>;
2727
using program_t = typename world_t::sgp_prog_t;
2828

29-
TEST_CASE("Hosts start with a rewarded task in a temporally changing environment"){
29+
TEST_CASE("Hosts start with a poisoned task in a temporally changing environment","[sgp]"){
3030
// set up configs
3131
sgpmode::SymConfigSGP config;
3232
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
@@ -64,23 +64,23 @@ TEST_CASE("Hosts start with a rewarded task in a temporally changing environment
6464
world.Update();
6565
size_t host_not_count = world.GetHostTaskSuccesses().at(not_task_id);
6666

67-
THEN("The host initially gains points for completing its task") {
67+
THEN("The host initially gains loses for completing its task") {
6868
REQUIRE(host_not_count == 1);
69-
REQUIRE(host_not_only->GetPoints() == 5);
69+
REQUIRE(host_not_only->GetPoints() == 0);
7070
}
7171

7272
// event update
7373
world.Update();
7474
host_not_count += world.GetHostTaskSuccesses().at(not_task_id);
7575

76-
THEN("After the environment changes, the host loses points for completing its task") {
76+
THEN("After the environment changes, the host gains points for completing its task") {
7777
REQUIRE(host_not_count == 2);
78-
REQUIRE(host_not_only->GetPoints() == 0);
78+
REQUIRE(host_not_only->GetPoints() == 5);
7979
}
8080
}
8181
}
8282

83-
TEST_CASE("Symbionts start with a rewarded task in a temporally changing environment"){
83+
TEST_CASE("Symbionts start with a poisoned task in a temporally changing environment", "[sgp]"){
8484
// set up configs
8585
sgpmode::SymConfigSGP config;
8686
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
@@ -120,23 +120,23 @@ TEST_CASE("Symbionts start with a rewarded task in a temporally changing environ
120120
world.Update();
121121
size_t sym_not_count = world.GetSymTaskSuccesses().at(not_task_id);
122122

123-
THEN("The symbiont initially gains points for completing its task") {
123+
THEN("The symbiont initially loses points for completing its task") {
124124
REQUIRE(sym_not_count == 1);
125-
REQUIRE(symbiont_not_only->GetPoints() == 5);
125+
REQUIRE(symbiont_not_only->GetPoints() == 0);
126126
}
127127

128128
// event update
129129
world.Update();
130130
sym_not_count += world.GetSymTaskSuccesses().at(not_task_id);
131131

132-
THEN("After the environment changes, the symbiont loses points for completing its task") {
132+
THEN("After the environment changes, the symbiont gains points for completing its task") {
133133
REQUIRE(sym_not_count == 2);
134-
REQUIRE(symbiont_not_only->GetPoints() == 0);
134+
REQUIRE(symbiont_not_only->GetPoints() == 5);
135135
}
136136
}
137137
}
138138

139-
TEST_CASE("Hosts start with a punished task in a temporally changing environment", "[sgp]") {
139+
TEST_CASE("Hosts start with a rewarded task in a temporally changing environment", "[sgp]") {
140140
// set up configs
141141
sgpmode::SymConfigSGP config;
142142
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
@@ -174,24 +174,24 @@ TEST_CASE("Hosts start with a punished task in a temporally changing environment
174174
world.Update();
175175
size_t host_orn_count = world.GetHostTaskSuccesses().at(or_not_task_id);
176176

177-
THEN("The host initially loses points for completing its task") {
177+
THEN("The host initially gains points for completing its task") {
178178
REQUIRE(host_orn_count == 1);
179-
REQUIRE(host_orn_only->GetPoints() == -5);
179+
REQUIRE(host_orn_only->GetPoints() == 5);
180180
}
181181

182182
// event update
183183
world.Update();
184184
host_orn_count += world.GetHostTaskSuccesses().at(or_not_task_id);
185185

186-
THEN("After the environment changes, the host gains points for completing its task") {
186+
THEN("After the environment changes, the host loses points for completing its task") {
187187
REQUIRE(host_orn_count == 3);
188-
REQUIRE(host_orn_only->GetPoints() == 5);
188+
REQUIRE(host_orn_only->GetPoints() == 0);
189189
}
190190
}
191191
}
192192

193193

194-
TEST_CASE("Symbionts start with a punished task in a temporally changing environment", "[sgp]") {
194+
TEST_CASE("Symbionts start with a rewarded task in a temporally changing environment", "[sgp]") {
195195
// set up configs
196196
sgpmode::SymConfigSGP config;
197197
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
@@ -231,18 +231,18 @@ TEST_CASE("Symbionts start with a punished task in a temporally changing environ
231231
world.Update();
232232
size_t sym_nand_count = world.GetSymTaskSuccesses().at(nand_task_id);
233233

234-
THEN("The symbiont initially loses points for completing its task") {
234+
THEN("The symbiont initially gains points for completing its task") {
235235
REQUIRE(sym_nand_count == 1);
236-
REQUIRE(symbiont_nand_only->GetPoints() == -5);
236+
REQUIRE(symbiont_nand_only->GetPoints() == 5);
237237
}
238238

239239
// event update
240240
world.Update();
241241
sym_nand_count += world.GetSymTaskSuccesses().at(nand_task_id);
242242

243-
THEN("After the environment changes, the symbiont gains points for completing its tasks") {
243+
THEN("After the environment changes, the symbiont loses points for completing its tasks") {
244244
REQUIRE(sym_nand_count == 3);
245-
REQUIRE(symbiont_nand_only->GetPoints() == 5);
245+
REQUIRE(symbiont_nand_only->GetPoints() == 0);
246246
}
247247
}
248248
}

source/test/sgp_mode_test/unit_tests/SGPHost.test.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,31 @@ TEST_CASE("ProcessOutputBuffer", "[sgp][sgp-unit]") {
282282
}
283283
}
284284
}
285+
}
286+
287+
288+
TEST_CASE("Check that hosts and syms can't have negative points", "[sgp][sgp-unit]"){
289+
using world_t = sgpmode::SGPWorld;
290+
using cpu_state_t = sgpmode::CPUState<world_t>;
291+
using hw_spec_t = sgpmode::SGPHardwareSpec<sgpmode::Library, cpu_state_t, world_t>;
292+
using sgp_host_t = sgpmode::SGPHost<hw_spec_t>;
293+
using sgp_sym_t = sgpmode::SGPSymbiont<hw_spec_t>;
294+
GIVEN("A host and sym starting with zero points"){
295+
emp::Random random(31);
296+
sgpmode::SymConfigSGP config;
297+
config.TASK_ENV_CFG_PATH("source/test/sgp_mode_test/hardware-test-env.json");
298+
world_t world(random, &config);
299+
auto& prog_builder = world.GetProgramBuilder();
300+
emp::Ptr<sgp_host_t> host = emp::NewPtr<sgp_host_t>(&random, &world, &config, prog_builder.CreateReproProgram(100));
301+
emp::Ptr<sgp_sym_t> sym = emp::NewPtr<sgp_sym_t>(&random, &world, &config, prog_builder.CreateNotProgram(100));
302+
303+
WHEN("points are added to make total points negative"){
304+
sym->AddPoints(-100);
305+
host->AddPoints(-100);
306+
THEN("point value should be set to zero"){
307+
REQUIRE(host->GetPoints() == 0);
308+
REQUIRE(sym->GetPoints() == 0);
309+
}
310+
}
311+
}
285312
}

0 commit comments

Comments
 (0)