Skip to content

Commit 1a153a4

Browse files
committed
Added a custom equality check and finished up the ocean_level changes so that tests are passed.
1 parent acc3208 commit 1a153a4

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

tests/serialization_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import unittest
22
from worldengine.plates import Step, world_gen
33
from worldengine.world import World
4+
from worldengine.common import _equal
45
import tempfile
56
import os
6-
import numpy
77

88

99
def _sort(l):
@@ -28,15 +28,15 @@ def test_pickle_serialize_unserialize(self):
2828
self.assertEqual(w.ocean, unserialized.ocean)
2929
self.assertEqual(w.biome, unserialized.biome)
3030
self.assertEqual(w.humidity, unserialized.humidity)
31-
self.assertTrue(numpy.array_equiv(w.irrigation, unserialized.irrigation))
31+
self.assertTrue(_equal(w.irrigation, unserialized.irrigation))
3232
self.assertEqual(w.permeability, unserialized.permeability)
3333
self.assertEqual(w.watermap, unserialized.watermap)
3434
self.assertEqual(w.precipitation, unserialized.precipitation)
3535
self.assertEqual(w.temperature, unserialized.temperature)
3636
self.assertEqual(w.sea_depth, unserialized.sea_depth)
3737
self.assertEquals(w.seed, unserialized.seed)
3838
self.assertEquals(w.n_plates, unserialized.n_plates)
39-
self.assertAlmostEqual(w.ocean_level, unserialized.ocean_level)
39+
self.assertTrue(_equal(w.ocean_level, unserialized.ocean_level))
4040
self.assertEquals(w.lake_map, unserialized.lake_map)
4141
self.assertEquals(w.river_map, unserialized.river_map)
4242
self.assertEquals(w.step, unserialized.step)
@@ -52,15 +52,15 @@ def test_protobuf_serialize_unserialize(self):
5252
self.assertEqual(w.ocean, unserialized.ocean)
5353
self.assertEqual(w.biome, unserialized.biome)
5454
self.assertEqual(w.humidity, unserialized.humidity)
55-
self.assertTrue(numpy.array_equiv(w.irrigation, unserialized.irrigation))
55+
self.assertTrue(_equal(w.irrigation, unserialized.irrigation))
5656
self.assertEqual(w.permeability, unserialized.permeability)
5757
self.assertEqual(w.watermap, unserialized.watermap)
5858
self.assertEqual(w.precipitation, unserialized.precipitation)
5959
self.assertEqual(w.temperature, unserialized.temperature)
6060
self.assertEqual(w.sea_depth, unserialized.sea_depth)
6161
self.assertEquals(w.seed, unserialized.seed)
6262
self.assertEquals(w.n_plates, unserialized.n_plates)
63-
self.assertAlmostEqual(w.ocean_level, unserialized.ocean_level)
63+
self.assertTrue(_equal(w.ocean_level, unserialized.ocean_level))
6464
self.assertEquals(w.lake_map, unserialized.lake_map)
6565
self.assertEquals(w.river_map, unserialized.river_map)
6666
self.assertEquals(w.step, unserialized.step)

worldengine/cli/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def generate_plates(seed, world_name, output_dir, width, height,
103103
# Generate images
104104
filename = '%s/plates_%s.png' % (output_dir, world_name)
105105
sea_level = find_threshold_f(world.elevation['data'], 1.0 - ocean_level,
106-
ocean=None, max=1.0, mindist=0.00001)
106+
ocean=None, max=1.0, mindist=0.000005)
107107

108108
draw_simple_elevation_on_file(world.elevation['data'], filename, width,
109109
height, sea_level)

worldengine/common.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import sys
22
import copy
3+
import numpy #for the _equal method only
34

45
# ----------------
56
# Global variables
@@ -120,3 +121,33 @@ def array_to_matrix(array, width, height):
120121
for x in range(width):
121122
matrix[y].append(array[y * width + x])
122123
return matrix
124+
125+
def _equal(a, b):
126+
#recursion on subclasses of types: tuple, list, dict
127+
#specifically checks : float, ndarray
128+
if type(a) is float and type(b) is float:#float
129+
return(numpy.allclose(a, b))
130+
elif type(a) is numpy.ndarray and type(b) is numpy.ndarray:#ndarray
131+
return(numpy.array_equiv(a, b))#alternative for float-arrays: numpy.allclose(a, b[, rtol, atol])
132+
elif isinstance(a, dict) and isinstance(b, dict):#dict
133+
if len(a) != len(b):
134+
return(False)
135+
t = True
136+
for key, val in a.items():
137+
if key not in b:
138+
return(False)
139+
t = _equal(val, b[key])
140+
if not t:
141+
return(False)
142+
return(t)
143+
elif (isinstance(a, list) and isinstance(b, list)) or (isinstance(a, tuple) and isinstance(b, tuple)):#list, tuples
144+
if len(a) != len(b):
145+
return(False)
146+
t = True
147+
for vala, valb in zip(a, b):
148+
t = _equal(vala, valb)
149+
if not t:
150+
return(False)
151+
return(t)
152+
else:#fallback
153+
return(a == b)

worldengine/world.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from worldengine.basic_map_operations import random_point
1616
import worldengine.protobuf.World_pb2 as Protobuf
1717
from worldengine.step import Step
18+
from worldengine.common import _equal
1819
from worldengine.version import __version__
1920

2021
class World(object):
@@ -37,17 +38,7 @@ def __init__(self, name, width, height, seed, num_plates, ocean_level,
3738
#
3839

3940
def __eq__(self, other):
40-
test = True
41-
sd = self.__dict__
42-
od = other.__dict__
43-
for key, val in sd.items():
44-
if type(val) is numpy.ndarray:
45-
test = numpy.array_equiv(val, od[key])#interesting alternative: numpy.allclose(a, b[, rtol, atol])
46-
else:
47-
test = (val == od[key])
48-
if not test:
49-
break
50-
return test
41+
return _equal(self.__dict__, other.__dict__)
5142

5243
#
5344
# Serialization/Unserialization

0 commit comments

Comments
 (0)