Skip to content

Commit

Permalink
Added a custom equality check and finished up the ocean_level changes…
Browse files Browse the repository at this point in the history
… so that tests are passed.
  • Loading branch information
tcld committed Oct 17, 2015
1 parent 008bbbe commit ca4d1c4
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 17 deletions.
10 changes: 5 additions & 5 deletions tests/serialization_test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import unittest
from worldengine.plates import Step, world_gen
from worldengine.world import World
from worldengine.common import _equal
import tempfile
import os
import numpy


def _sort(l):
Expand All @@ -28,15 +28,15 @@ def test_pickle_serialize_unserialize(self):
self.assertEqual(w.ocean, unserialized.ocean)
self.assertEqual(w.biome, unserialized.biome)
self.assertEqual(w.humidity, unserialized.humidity)
self.assertTrue(numpy.array_equiv(w.irrigation, unserialized.irrigation))
self.assertTrue(_equal(w.irrigation, unserialized.irrigation))
self.assertEqual(w.permeability, unserialized.permeability)
self.assertEqual(w.watermap, unserialized.watermap)
self.assertEqual(w.precipitation, unserialized.precipitation)
self.assertEqual(w.temperature, unserialized.temperature)
self.assertEqual(w.sea_depth, unserialized.sea_depth)
self.assertEquals(w.seed, unserialized.seed)
self.assertEquals(w.n_plates, unserialized.n_plates)
self.assertAlmostEqual(w.ocean_level, unserialized.ocean_level)
self.assertTrue(_equal(w.ocean_level, unserialized.ocean_level))
self.assertEquals(w.lake_map, unserialized.lake_map)
self.assertEquals(w.river_map, unserialized.river_map)
self.assertEquals(w.step, unserialized.step)
Expand All @@ -52,15 +52,15 @@ def test_protobuf_serialize_unserialize(self):
self.assertEqual(w.ocean, unserialized.ocean)
self.assertEqual(w.biome, unserialized.biome)
self.assertEqual(w.humidity, unserialized.humidity)
self.assertTrue(numpy.array_equiv(w.irrigation, unserialized.irrigation))
self.assertTrue(_equal(w.irrigation, unserialized.irrigation))
self.assertEqual(w.permeability, unserialized.permeability)
self.assertEqual(w.watermap, unserialized.watermap)
self.assertEqual(w.precipitation, unserialized.precipitation)
self.assertEqual(w.temperature, unserialized.temperature)
self.assertEqual(w.sea_depth, unserialized.sea_depth)
self.assertEquals(w.seed, unserialized.seed)
self.assertEquals(w.n_plates, unserialized.n_plates)
self.assertAlmostEqual(w.ocean_level, unserialized.ocean_level)
self.assertTrue(_equal(w.ocean_level, unserialized.ocean_level))
self.assertEquals(w.lake_map, unserialized.lake_map)
self.assertEquals(w.river_map, unserialized.river_map)
self.assertEquals(w.step, unserialized.step)
Expand Down
2 changes: 1 addition & 1 deletion worldengine/cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ def generate_plates(seed, world_name, output_dir, width, height,
# Generate images
filename = '%s/plates_%s.png' % (output_dir, world_name)
sea_level = find_threshold_f(world.elevation['data'], 1.0 - ocean_level,
ocean=None, max=1.0, mindist=0.00001)
ocean=None, max=1.0, mindist=0.000005)

draw_simple_elevation_on_file(world.elevation['data'], filename, width,
height, sea_level)
Expand Down
31 changes: 31 additions & 0 deletions worldengine/common.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import sys
import copy
import numpy #for the _equal method only

# ----------------
# Global variables
Expand Down Expand Up @@ -120,3 +121,33 @@ def array_to_matrix(array, width, height):
for x in range(width):
matrix[y].append(array[y * width + x])
return matrix

def _equal(a, b):
#recursion on subclasses of types: tuple, list, dict
#specifically checks : float, ndarray
if type(a) is float and type(b) is float:#float
return(numpy.allclose(a, b))
elif type(a) is numpy.ndarray and type(b) is numpy.ndarray:#ndarray
return(numpy.array_equiv(a, b))#alternative for float-arrays: numpy.allclose(a, b[, rtol, atol])
elif isinstance(a, dict) and isinstance(b, dict):#dict
if len(a) != len(b):
return(False)
t = True
for key, val in a.items():
if key not in b:
return(False)
t = _equal(val, b[key])
if not t:
return(False)
return(t)
elif (isinstance(a, list) and isinstance(b, list)) or (isinstance(a, tuple) and isinstance(b, tuple)):#list, tuples
if len(a) != len(b):
return(False)
t = True
for vala, valb in zip(a, b):
t = _equal(vala, valb)
if not t:
return(False)
return(t)
else:#fallback
return(a == b)
13 changes: 2 additions & 11 deletions worldengine/world.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from worldengine.basic_map_operations import random_point
import worldengine.protobuf.World_pb2 as Protobuf
from worldengine.step import Step
from worldengine.common import _equal
from worldengine.version import __version__

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

def __eq__(self, other):
test = True
sd = self.__dict__
od = other.__dict__
for key, val in sd.items():
if type(val) is numpy.ndarray:
test = numpy.array_equiv(val, od[key])#interesting alternative: numpy.allclose(a, b[, rtol, atol])
else:
test = (val == od[key])
if not test:
break
return test
return _equal(self.__dict__, other.__dict__)

#
# Serialization/Unserialization
Expand Down

0 comments on commit ca4d1c4

Please sign in to comment.