@@ -1420,7 +1420,7 @@ def _build_neighbors_kdtree(self, max_k: int, tol: float) -> None:
1420
1420
1421
1421
# Find all distances for shell identification - use comprehensive sampling
1422
1422
logger .info ("Identifying distance shells..." )
1423
- distances_for_shells = []
1423
+ distances_for_shells : List [ float ] = []
1424
1424
1425
1425
# For robust shell identification, query all pairwise distances for smaller lattices
1426
1426
# or use dense sampling for larger ones
@@ -1432,7 +1432,10 @@ def _build_neighbors_kdtree(self, max_k: int, tol: float) -> None:
1432
1432
dists , _ = tree .query (
1433
1433
coords_np [i ], k = query_k + 1
1434
1434
) # +1 to exclude self
1435
- distances_for_shells .extend (dists [1 :]) # Skip distance to self
1435
+ if isinstance (dists , np .ndarray ):
1436
+ distances_for_shells .extend (dists [1 :]) # Skip distance to self
1437
+ else :
1438
+ distances_for_shells .append (dists ) # Single distance
1436
1439
else :
1437
1440
# For larger lattices, use adaptive sampling but ensure we capture all shells
1438
1441
sample_size = min (1000 , self .num_sites // 2 ) # More conservative sampling
@@ -1442,7 +1445,10 @@ def _build_neighbors_kdtree(self, max_k: int, tol: float) -> None:
1442
1445
dists , _ = tree .query (
1443
1446
coords_np [i ], k = query_k + 1
1444
1447
) # +1 to exclude self
1445
- distances_for_shells .extend (dists [1 :]) # Skip distance to self
1448
+ if isinstance (dists , np .ndarray ):
1449
+ distances_for_shells .extend (dists [1 :]) # Skip distance to self
1450
+ else :
1451
+ distances_for_shells .append (dists ) # Single distance
1446
1452
1447
1453
# Filter out zero distances (duplicate coordinates) before shell identification
1448
1454
ZERO_THRESHOLD = 1e-12
@@ -1476,12 +1482,18 @@ def _build_neighbors_kdtree(self, max_k: int, tol: float) -> None:
1476
1482
) # +1 for self
1477
1483
1478
1484
# Skip the first entry (distance to self)
1479
- distances = distances [1 :]
1480
- indices = indices [1 :]
1485
+ # Handle both single value and array cases
1486
+ if isinstance (distances , np .ndarray ) and len (distances ) > 1 :
1487
+ distances_slice = distances [1 :]
1488
+ indices_slice = indices [1 :] if isinstance (indices , np .ndarray ) else np .array ([], dtype = int )
1489
+ else :
1490
+ # Single value or empty case - no neighbors to process
1491
+ distances_slice = np .array ([])
1492
+ indices_slice = np .array ([], dtype = int )
1481
1493
1482
1494
# Filter out zero distances (duplicate coordinates)
1483
1495
valid_pairs = [
1484
- (d , idx ) for d , idx in zip (distances , indices ) if d > ZERO_THRESHOLD
1496
+ (d , idx ) for d , idx in zip (distances_slice , indices_slice ) if d > ZERO_THRESHOLD
1485
1497
]
1486
1498
1487
1499
# Assign neighbors to shells
0 commit comments