Skip to content

Commit

Permalink
* add datatypes to save memory
Browse files Browse the repository at this point in the history
* remove extra version assignment in environment
* add chunking for large meshes
  • Loading branch information
mogres committed Jul 31, 2023
1 parent 844e6d0 commit 8eeee86
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 13 deletions.
18 changes: 10 additions & 8 deletions cellpack/autopack/Compartment.py
Original file line number Diff line number Diff line change
Expand Up @@ -1313,20 +1313,22 @@ def BuildGrid_trimesh(
self.center,
self.encapsulating_radius + env.grid.gridSpacing * 2,
return_sorted=True,
)
),
dtype=numpy.int32,
)
self.log.info(f"GOT POINTS IN SPHERE {len(points_in_encap_sphere)}")

point_compartment_ids = compartment_ids[points_in_encap_sphere]
point_ids_to_assign = points_in_encap_sphere[point_compartment_ids == 0]
point_positions = master_grid_positions[point_ids_to_assign]
point_positions = numpy.float16(master_grid_positions[point_ids_to_assign])

# check surface points
points_on_surface = trimesh_grid_surface.is_filled(point_positions)
compartment_ids[point_ids_to_assign[points_on_surface]] = number

# check inside points
points_in_mesh = mesh_store.contains_points_mesh(self.gname, point_positions)

points_in_mesh = points_in_mesh & ~points_on_surface
compartment_ids[point_ids_to_assign[points_in_mesh]] = -number
insidePoints = point_ids_to_assign[points_in_mesh]
Expand Down Expand Up @@ -2466,7 +2468,7 @@ def find_nearest(self, array, value):
# TOD add and store the grid_distances (closest distance for each point). not only inside / outside

def getSurfaceInnerPoints_sdf(
self, boundingBox, spacing, display=True, useFix=False
self, boundingBox, spacing, display=False, useFix=False
):
"""
Only compute the inner point. No grid.
Expand Down Expand Up @@ -2538,7 +2540,7 @@ def getSurfaceInnerPoints_sdf(
return pointinside[0], self.vertices

def getSurfaceInnerPoints_kevin(
self, boundingBox, spacing, display=True, superFine=False
self, boundingBox, spacing, display=False, superFine=False
):
"""
Takes a polyhedron, and builds a grid. In this grid:
Expand Down Expand Up @@ -2857,7 +2859,7 @@ def getSurfaceInnerPoints_kevin(
return insidePoints, surfacePoints

def getSurfaceInnerPoints_sdf_interpolate(
self, boundingBox, spacing, display=True, useFix=False
self, boundingBox, spacing, display=False, useFix=False
):
"""
Only compute the inner point. No grid.
Expand Down Expand Up @@ -2923,7 +2925,7 @@ def getSurfaceInnerPoints_sdf_interpolate(
# need to update the surface. need to create a aligned grid
return pointinside[0], self.vertices

def getSurfaceInnerPoints(self, boundingBox, spacing, display=True, useFix=False):
def getSurfaceInnerPoints(self, boundingBox, spacing, display=False, useFix=False):
"""
Only compute the inner point. No grid.
This is independant from the packing. Help build ingredient sphere tree and representation
Expand Down Expand Up @@ -3208,7 +3210,7 @@ def create_voxelization(
return image_data

def getSurfaceInnerPointsPandaRay(
self, boundingBox, spacing, display=True, useFix=False
self, boundingBox, spacing, display=False, useFix=False
):
"""
Only compute the inner point. No grid.
Expand Down Expand Up @@ -3363,7 +3365,7 @@ def getSurfaceInnerPointsPandaRay(
return insidePoints, surfacePoints

def getSurfaceInnerPointsPanda(
self, boundingBox, spacing, display=True, useFix=False
self, boundingBox, spacing, display=False, useFix=False
):
"""
Only compute the inner point. No grid.
Expand Down
5 changes: 1 addition & 4 deletions cellpack/autopack/Environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,6 @@ def __init__(self, config=None, recipe=None):
self.host = None
self.afviewer = None

# version of setup used
self.version = "1.0"

# option for packing using host dynamics capability
self.windowsSize = 100
self.windowsSize_overwrite = False
Expand Down Expand Up @@ -2200,7 +2197,7 @@ def pack_grid(
stime = time()
if self.show_progress_bar:
pbar = tqdm(total=totalNumMols, mininterval=0, miniters=1)
pbar.set_description(f"Packing {self.name}")
pbar.set_description(f"Packing {self.name}_{self.version}")
while nbFreePoints:
self.log.info(
".........At start of while loop, with vRangeStart = %d", vRangeStart
Expand Down
14 changes: 13 additions & 1 deletion cellpack/autopack/MeshStore.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import trimesh
from cellpack import autopack

CHUNK_SIZE = 100000


class MeshStore:
def __init__(self):
Expand Down Expand Up @@ -267,7 +269,17 @@ def contains_points(self, geomname, points):
def contains_points_mesh(self, geomname, points):
mesh = self.get_object(geomname)
if mesh is not None:
return mesh.contains(points)
if len(points) <= CHUNK_SIZE:
return mesh.contains(points) # TODO: check for memory leak
else:
# chunk the points
for i in range(0, len(points), CHUNK_SIZE):
chunk = points[i : min(i + CHUNK_SIZE, len(points))]
if i == 0:
inside = mesh.contains(chunk)
else:
inside = numpy.append(inside, mesh.contains(chunk))
return inside
return numpy.full(len(points), False)

def get_smallest_radius(self, geomname, center):
Expand Down

0 comments on commit 8eeee86

Please sign in to comment.