diff options
author | Anthony LaTorre <tlatorre9@gmail.com> | 2011-08-11 15:09:16 -0400 |
---|---|---|
committer | Anthony LaTorre <tlatorre9@gmail.com> | 2011-08-11 15:09:16 -0400 |
commit | 9d68f8ea2b6a64e83195f16aa066caac5eeb8fae (patch) | |
tree | 828d3544c4783e25be3f5931a952b14342fc19aa | |
parent | 23b4bedf43f2ff120c1178c3445e39b8735030f3 (diff) | |
download | chroma-9d68f8ea2b6a64e83195f16aa066caac5eeb8fae.tar.gz chroma-9d68f8ea2b6a64e83195f16aa066caac5eeb8fae.tar.bz2 chroma-9d68f8ea2b6a64e83195f16aa066caac5eeb8fae.zip |
add consume() to itertoolset. checksum the number of bits shifted in each iteration of the bounding volume hierarchy construction. only cache the bounding volume hierarchy information.
-rw-r--r-- | geometry.py | 36 | ||||
-rw-r--r-- | gpu.py | 7 | ||||
-rw-r--r-- | itertoolset.py | 11 |
3 files changed, 30 insertions, 24 deletions
diff --git a/geometry.py b/geometry.py index 579e01d..81bc82d 100644 --- a/geometry.py +++ b/geometry.py @@ -257,28 +257,9 @@ class Geometry(object): pass checksum = md5(str(bits)) - + checksum.update(str(shift)) checksum.update(self.mesh.vertices) checksum.update(self.mesh.triangles) - checksum.update(self.colors) - checksum.update(self.solid_id) - checksum.update(self.material1_index) - checksum.update(self.material2_index) - checksum.update(self.surface_index) - - for material in self.unique_materials: - checksum.update(material.refractive_index) - checksum.update(material.absorption_length) - checksum.update(material.scattering_length) - - for surface in self.unique_surfaces: - if surface is not None: - checksum.update(surface.detect) - checksum.update(surface.absorb) - checksum.update(surface.reflect_diffuse) - checksum.update(surface.reflect_specular) - else: - checksum.update(str(None)) cache_dir = os.path.expanduser('~/.chroma') cache_file = checksum.hexdigest() @@ -291,9 +272,16 @@ class Geometry(object): else: print 'loading cache.' data = pickle.load(f) - self.mesh.triangles = self.mesh.triangles[data['reorder']] - del data['reorder'] - for key, value in data.items(): + + reorder = data.pop('reorder') + self.mesh.triangles = self.mesh.triangles[reorder] + self.material1_index = self.material1_index[reorder] + self.material2_index = self.material2_index[reorder] + self.surface_index = self.surface_index[reorder] + self.colors = self.colors[reorder] + self.solid_id = self.solid_id[reorder] + + for key, value in data.iteritems(): setattr(self, key, value) f.close() return @@ -362,7 +350,7 @@ class Geometry(object): f = open(cache_path, 'wb') data = {} - for key in ['material1_index', 'material2_index', 'surface_index', 'colors', 'solid_id', 'lower_bounds', 'upper_bounds', 'node_map', 'node_map_end', 'layers', 'first_node']: + for key in ['lower_bounds', 'upper_bounds', 'node_map', 'node_map_end', 'layers', 'first_node']: data[key] = getattr(self, key) data['reorder'] = reorder pickle.dump(data, f, -1) @@ -179,6 +179,13 @@ class GPU(object): self.geometry = geometry + print 'average of %f child nodes per node' % (np.mean(geometry.node_map_end[geometry.first_node:] - geometry.node_map[geometry.first_node:])) + + print '%i nodes with one child' % (np.count_nonzero((geometry.node_map_end[geometry.first_node:] - geometry.node_map[geometry.first_node:]) == 1)) + + print '%i leaf nodes with one child' % (np.count_nonzero((geometry.node_map_end[:geometry.first_node] - geometry.node_map[:geometry.first_node]) == 1)) + + self.print_device_usage() def reset_colors(self): diff --git a/itertoolset.py b/itertoolset.py index bd4e45c..9d5200c 100644 --- a/itertoolset.py +++ b/itertoolset.py @@ -1,4 +1,5 @@ from itertools import * +import collections def roundrobin(*iterables): """roundrobin('ABC', 'D', 'EF') --> A D E B F C""" @@ -36,3 +37,13 @@ def ncycles(iterable, n): def take(n, iterable): "Return first n items of the iterable as a list" return list(islice(iterable, n)) + +def consume(iterator, n=None): + "Advance the iterator n-steps ahead. If n is none, consume entirely." + # Use functions that consume iterators at C speed. + if n is None: + # feed the entire iterator into a zero-length deque + collections.deque(iterator, maxlen=0) + else: + # advance to the empty slice starting at position n + next(islice(iterator, n, n), None) |