handle infinite loop

This commit is contained in:
Martin Diehl 2021-04-28 07:57:20 +02:00
parent 1b98597bb1
commit ff8ce3840b
4 changed files with 24 additions and 8 deletions

@ -1 +1 @@
Subproject commit 7f0594060779d9a8a4e774d558134309ab77b96e Subproject commit ab64793bb04c506d815ebc850672ed0f2d013e67

View File

@ -71,18 +71,25 @@ def from_Poisson_disc(size,N_seeds,N_candidates,distance,periodic=True,rng_seed=
coords = _np.empty((N_seeds,3)) coords = _np.empty((N_seeds,3))
coords[0] = rng.random(3) * size coords[0] = rng.random(3) * size
i = 1 s = 1
i = 0
progress = util._ProgressBar(N_seeds+1,'',50) progress = util._ProgressBar(N_seeds+1,'',50)
while i < N_seeds: while s < N_seeds:
candidates = rng.random((N_candidates,3))*_np.broadcast_to(size,(N_candidates,3)) candidates = rng.random((N_candidates,3))*_np.broadcast_to(size,(N_candidates,3))
tree = _spatial.cKDTree(coords[:i],boxsize=size) if periodic else \ tree = _spatial.cKDTree(coords[:s],boxsize=size) if periodic else \
_spatial.cKDTree(coords[:i]) _spatial.cKDTree(coords[:s])
distances, dev_null = tree.query(candidates) distances, dev_null = tree.query(candidates)
best = distances.argmax() best = distances.argmax()
if distances[best] > distance: # require minimum separation if distances[best] > distance: # require minimum separation
coords[i] = candidates[best] # maximum separation to existing point cloud coords[s] = candidates[best] # maximum separation to existing point cloud
s += 1
progress.update(s)
i = 0
else:
i += 1 i += 1
progress.update(i)
if i == 100:
raise ValueError('Seeding not possible')
return coords return coords

View File

@ -4,7 +4,7 @@ import re
# https://www.python.org/dev/peps/pep-0440 # https://www.python.org/dev/peps/pep-0440
with open(Path(__file__).parent/'damask/VERSION') as f: with open(Path(__file__).parent/'damask/VERSION') as f:
version = re.sub(r'(-([^-]*)).*$',r'.\2',re.sub(r'^v(\d+\.\d+(\.\d+)?)',r'\1',f.readline().strip())) version = re.sub(r'(-([^-]*)).*$',r'.\2',re.sub(r'^v(\d+\.\d+(\.\d+)?)',r'\1',f.readline().strip()))
setuptools.setup( setuptools.setup(
name='damask', name='damask',

View File

@ -26,6 +26,15 @@ class TestSeeds:
cKDTree(coords).query(coords, 2) cKDTree(coords).query(coords, 2)
assert (0<= coords).all() and (coords<size).all() and np.min(min_dists[:,1])>=distance assert (0<= coords).all() and (coords<size).all() and np.min(min_dists[:,1])>=distance
@pytest.mark.parametrize('periodic',[True,False])
def test_from_Poisson_disc_invalid(self,periodic):
N_seeds = np.random.randint(30,300)
N_candidates = N_seeds//15
distance = np.random.random()
size = np.ones(3)*distance
with pytest.raises(ValueError):
seeds.from_Poisson_disc(size,N_seeds,N_candidates,distance,periodic=periodic)
def test_from_grid_reconstruct(self): def test_from_grid_reconstruct(self):
cells = np.random.randint(10,20,3) cells = np.random.randint(10,20,3)
N_seeds = np.random.randint(30,300) N_seeds = np.random.randint(30,300)