Skip to content

Commit 4e4f916

Browse files
committed
fix(edits): more precise filter for latest edges; error on chunk_id mismatch (ingest); bump version
1 parent 5a1d153 commit 4e4f916

File tree

6 files changed

+63
-55
lines changed

6 files changed

+63
-55
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 3.0.13
2+
current_version = 3.1.0
33
commit = True
44
tag = True
55

pychunkedgraph/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "3.0.13"
1+
__version__ = "3.1.0"

pychunkedgraph/graph/edges/__init__.py

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def get_stale_nodes(
220220
)
221221
stale_mask = layer_nodes != _nodes
222222
stale_nodes.append(layer_nodes[stale_mask])
223-
return np.concatenate(stale_nodes), edge_supervoxels
223+
return np.concatenate(stale_nodes)
224224

225225

226226
def get_latest_edges(
@@ -328,13 +328,18 @@ def _filter(node):
328328

329329
children_a = cg.get_children(_edges[mask][:, 0], flatten=True)
330330
children_b = cg.get_children(_edges[mask][:, 1], flatten=True)
331-
if 85431849467249595 in children_a and 85502218144317440 in children_b:
332-
print("woohoo0")
333-
continue
334331

335-
if 85502218144317440 in children_a and 85431849467249595 in children_b:
336-
print("woohoo1")
337-
continue
332+
parents_a = _edges[mask][:, 0]
333+
parents_b = np.unique(cg.get_parents(children_b, time_stamp=parent_ts))
334+
_cx_edges_d = cg.get_cross_chunk_edges(parents_b)
335+
parents_b = []
336+
for _node, _edges_d in _cx_edges_d.items():
337+
for _edges in _edges_d.values():
338+
_mask = np.isin(_edges[:,1], parents_a)
339+
if np.any(_mask):
340+
parents_b.append(_node)
341+
342+
parents_b = np.array(parents_b, dtype=basetypes.NODE_ID)
338343
parents_a = np.unique(
339344
cg.get_roots(
340345
children_a, stop_layer=mlayer, ceil=False, time_stamp=parent_ts
@@ -348,10 +353,43 @@ def _filter(node):
348353

349354
parents_b = np.unique(
350355
cg.get_roots(
351-
children_b, stop_layer=mlayer, ceil=False, time_stamp=parent_ts
356+
parents_b, stop_layer=mlayer, ceil=False, time_stamp=parent_ts
352357
)
353358
)
354359

355360
parents_a = np.array([node_a] * parents_b.size, dtype=basetypes.NODE_ID)
356361
result.append(np.column_stack((parents_a, parents_b)))
357362
return np.concatenate(result)
363+
364+
365+
def get_latest_edges_wrapper(
366+
cg,
367+
cx_edges_d: dict,
368+
parent_ts: datetime.datetime = None,
369+
) -> np.ndarray:
370+
"""Helper function to filter stale edges and replace with latest edges."""
371+
_cx_edges = [types.empty_2d]
372+
_edge_layers = [types.empty_1d]
373+
for k, v in cx_edges_d.items():
374+
_cx_edges.append(v)
375+
_edge_layers.append([k] * len(v))
376+
_cx_edges = np.concatenate(_cx_edges)
377+
_edge_layers = np.concatenate(_edge_layers, dtype=int)
378+
379+
edge_nodes = np.unique(_cx_edges)
380+
stale_nodes = get_stale_nodes(cg, edge_nodes, parent_ts=parent_ts)
381+
stale_nodes_mask = np.isin(edge_nodes, stale_nodes)
382+
383+
latest_edges = types.empty_2d.copy()
384+
if np.any(stale_nodes_mask):
385+
stalte_edges_mask = _cx_edges[:, 1] == stale_nodes
386+
stale_edges = _cx_edges[stalte_edges_mask]
387+
stale_edge_layers = _edge_layers[stalte_edges_mask]
388+
latest_edges = get_latest_edges(
389+
cg,
390+
stale_edges,
391+
stale_edge_layers,
392+
parent_ts=parent_ts,
393+
)
394+
print(list(stale_edges[:, 1]), list(latest_edges[:, 1]))
395+
return np.concatenate([_cx_edges, latest_edges])

pychunkedgraph/graph/edits.py

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from . import types
1616
from . import attributes
1717
from . import cache as cache_utils
18-
from .edges import get_latest_edges, get_stale_nodes
18+
from .edges import get_latest_edges, get_latest_edges_wrapper, get_stale_nodes
1919
from .edges.utils import concatenate_cross_edge_dicts
2020
from .edges.utils import merge_cross_edge_dicts
2121
from .utils import basetypes
@@ -587,36 +587,10 @@ def _update_cross_edge_cache(self, parent, children):
587587
children, time_stamp=self._last_successful_ts
588588
)
589589
cx_edges_d = concatenate_cross_edge_dicts(cx_edges_d.values())
590-
591-
_cx_edges = [types.empty_2d]
592-
_edge_layers = [types.empty_1d]
593-
for k, v in cx_edges_d.items():
594-
_cx_edges.append(v)
595-
_edge_layers.append([k] * len(v))
596-
_cx_edges = np.concatenate(_cx_edges)
597-
_edge_layers = np.concatenate(_edge_layers, dtype=int)
598-
599-
edge_nodes = np.unique(_cx_edges)
600-
stale_nodes, edge_supervoxels = get_stale_nodes(
601-
self.cg, edge_nodes, parent_ts=self._last_successful_ts
590+
_cx_edges = get_latest_edges_wrapper(
591+
self.cg, cx_edges_d, parent_ts=self._last_successful_ts
602592
)
603-
stale_nodes_mask = np.isin(edge_nodes, stale_nodes)
604-
605-
latest_edges = types.empty_2d.copy()
606-
if np.any(stale_nodes_mask):
607-
stalte_edges_mask = _cx_edges[:, 1] == stale_nodes
608-
stale_edges = _cx_edges[stalte_edges_mask]
609-
stale_edge_layers = _edge_layers[stalte_edges_mask]
610-
latest_edges = get_latest_edges(
611-
self.cg,
612-
stale_edges,
613-
stale_edge_layers,
614-
parent_ts=self._last_successful_ts,
615-
)
616-
617-
_cx_edges = np.concatenate([_cx_edges, latest_edges])
618-
edge_nodes = np.unique(_cx_edges)
619-
593+
edge_nodes = np.unique(_cx_edges)
620594
edge_parents = self.cg.get_roots(
621595
edge_nodes,
622596
stop_layer=parent_layer,

pychunkedgraph/ingest/cluster.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,8 @@ def _check_edges_direction(
108108
chunk_id = cg.get_chunk_id(layer=1, x=x, y=y, z=z)
109109
for edge_type in [EDGE_TYPES.between_chunk, EDGE_TYPES.cross_chunk]:
110110
edges = chunk_edges[edge_type]
111-
e1 = edges.node_ids1
112-
e2 = edges.node_ids2
113-
114-
e2_chunk_ids = cg.get_chunk_ids_from_node_ids(e2)
115-
mask = e2_chunk_ids == chunk_id
116-
e1[mask], e2[mask] = e2[mask], e1[mask]
117-
118-
e1_chunk_ids = cg.get_chunk_ids_from_node_ids(e1)
119-
mask = e1_chunk_ids == chunk_id
111+
chunk_ids = cg.get_chunk_ids_from_node_ids(edges.node_ids1)
112+
mask = chunk_ids == chunk_id
120113
assert np.all(mask), "all IDs must belong to same chunk"
121114

122115

pychunkedgraph/ingest/upgrade/parent_layer.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from pychunkedgraph.graph import ChunkedGraph
1212
from pychunkedgraph.graph.attributes import Connectivity, Hierarchy
13+
from pychunkedgraph.graph.edges import get_latest_edges_wrapper
1314
from pychunkedgraph.graph.utils import serializers
1415
from pychunkedgraph.graph.types import empty_2d
1516
from pychunkedgraph.utils.general import chunked
@@ -105,19 +106,21 @@ def update_cross_edges(cg: ChunkedGraph, layer, node, node_ts, earliest_ts) -> l
105106
return rows
106107

107108
for ts, cx_edges_d in CX_EDGES[node].items():
108-
edges = np.concatenate([empty_2d] + list(cx_edges_d.values()))
109+
edges = get_latest_edges_wrapper(cg, cx_edges_d, parent_ts=ts)
109110
if edges.size == 0:
110111
continue
111-
nodes = np.unique(edges[:, 1])
112-
svs = cg.get_single_leaf_multiple(nodes)
113-
parents = cg.get_roots(svs, time_stamp=ts, stop_layer=layer, ceil=False)
114-
edge_parents_d = dict(zip(nodes, parents))
112+
113+
edge_nodes = np.unique(edges)
114+
parents = cg.get_roots(edge_nodes, time_stamp=ts, stop_layer=layer, ceil=False)
115+
edge_parents_d = dict(zip(edge_nodes, parents))
115116
val_dict = {}
116117
for _layer, layer_edges in cx_edges_d.items():
117118
layer_edges = fastremap.remap(
118119
layer_edges, edge_parents_d, preserve_missing_labels=True
119120
)
120-
layer_edges[:, 0] = node
121+
mask = layer_edges[:, 0] == node
122+
assert np.all(mask), (node, layer_edges[~mask])
123+
# layer_edges[:, 0] = node
121124
layer_edges = np.unique(layer_edges, axis=0)
122125
col = Connectivity.CrossChunkEdge[_layer]
123126
val_dict[col] = layer_edges

0 commit comments

Comments
 (0)