Skip to content

Commit 45e2b1e

Browse files
committed
Changes:
1. Edits in vect_edge.
1 parent 6e90474 commit 45e2b1e

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

frame_2D_alg/vectorize_edge_blob/vect_edge.py

+25-20
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def __init__(He, Et, tft, lft=None, root=None, node_=None, fd_=None, altH=None):
5959
He.fd_ = [] if fd_ is None else fd_ # 0: sum CGs, 1: sum CLs, + concat from comparands
6060
He.root = None if root is None else root # N or higher-composition He
6161
He.node_ = [] if node_ is None else node_ # concat bottom nesting order if CG, may be redundant to G.node_
62-
He.altH = CH(altH=object) if altH is None else altH # summed altLays, prevent cyclic
62+
He.altH = CH(altH=object, Et=np.zeros(4), tft=[]) if altH is None else altH # summed altLays, prevent cyclic
6363
He.depth = 0 # max depth of fork tree?
6464
# if combined-layer H:
6565
# He.i = 0 if i is None else i # lay index in root.lft, to revise olp
@@ -73,7 +73,7 @@ def __bool__(H): return bool(H.tft) # empty CH
7373

7474
def copy_(He, root, rev=0, fc=0): # comp direction may be reversed to -1
7575

76-
C = CH(fd_=copy(He.fd_), root=root, node_=copy(He.node_), Et=He.Et * -1 if (fc and rev) else copy(He.Et))
76+
C = CH(fd_=copy(He.fd_), root=root, node_=copy(He.node_), Et=He.Et * -1 if (fc and rev) else copy(He.Et), tft=[])
7777

7878
for fd, tt in enumerate(He.tft): # nested array tuples
7979
C.tft += [tt * -1 if rev and (fd or fc) else deepcopy(tt)]
@@ -111,7 +111,7 @@ def append_(HE, He, fb=0): # unpack HE lft tree down to He.fd_ and append He, i
111111
root.Et += He.Et
112112
if not root.tft: root.tft = He.tft # if init from sum mlink_
113113
if fb:
114-
root.add_tree(He) # sum|init if called from feedback
114+
root.lft[-1].add_tree(He) # sum|init if called from feedback
115115
else:
116116
root.lft += [He]
117117

@@ -173,8 +173,8 @@ def __init__(G, fd=0, rng=1, root=[], node_=[], link_=[], subG_=[], subL_=[],
173173
G.latuple = np.array([.0,.0,.0,.0,.0,np.zeros(2)],dtype=object) if latuple is None else latuple # lateral I,G,M,D,L,[Dy,Dx]
174174
G.vert = np.array([np.zeros(6), np.zeros(6)]) if vert is None else vert # vertical m_d_ of latuple
175175
# maps to node_tree / agg+|sub+:
176-
G.derH = CH() if derH is None else derH # sum from nodes, then append from feedback
177-
G.extH = CH() if extH is None else extH # sum from rim_ elays, H maybe deleted
176+
G.derH = CH(Et=np.zeros(4),tft=[]) if derH is None else derH # sum from nodes, then append from feedback
177+
G.extH = CH(Et=np.zeros(4),tft=[]) if extH is None else extH # sum from rim_ elays, H maybe deleted
178178
G.rim = [] # flat links of any rng, may be nested in clustering
179179
G.aRad = 0 # average distance between graph center and node center
180180
G.box = [np.inf, np.inf, -np.inf, -np.inf] if box is None else box # y0,x0,yn,xn
@@ -214,7 +214,7 @@ def vectorize_root(frame):
214214
if blob.Et[0] * (len(blob.node_)-1)*(blob.rng+1) > ave:
215215
# init for agg+:
216216
if not hasattr(frame, 'derH'):
217-
frame.derH = CH(root=frame); frame.root = None; frame.subG_ = []
217+
frame.derH = CH(root=frame, Et=np.zeros(4), tft=[]); frame.root = None; frame.subG_ = []
218218
Y,X,_,_,_,_ = blob.latuple
219219
lat = np.array([.0,.0,.0,.0,.0,np.zeros(2)],dtype=object); vert = np.array([np.zeros(6), np.zeros(6)])
220220
for PP in blob.node_:
@@ -230,7 +230,9 @@ def vectorize_root(frame):
230230
G_ += [PP]
231231
edge.subG_ = G_
232232
if len(G_) > ave_L:
233-
cluster_edge(edge); frame.subG_ += [edge]; frame.derH.add_tree(edge.derH)
233+
cluster_edge(edge); frame.subG_ += [edge]
234+
if frame.derH: frame.derH.add_tree(edge.derH)
235+
else: frame.derH = edge.derH.copy_(root=frame) # init
234236
# add altG: summed converted adj_blobs of converted edge blob
235237
# if len(edge.subG_) > ave_L: agg_recursion(edge) # unlikely
236238

@@ -274,18 +276,19 @@ def cluster_PP_(edge, fd):
274276
edge.subG_ = N_
275277
edge.link_ = L_
276278
if val_(Et, fo=1) > 0: # cancel by borrowing d?
277-
mlay = L_[0].derH.copy_.add_tree([L.derH for L in L_[1:]])
279+
mlay = L_[0].derH.copy_(root=edge.derH).add_tree([L.derH for L in L_[1:]])
278280
mlay.fd_=[]; edge.derH.append_(mlay)
279281
if len(N_) > ave_L:
280282
cluster_PP_(edge, fd=0)
281283
if val_(Et, mEt=Et, fo=1) > 0: # likely not from the same links
282284
for L in L_:
283-
L.extH, L.root, L.mL_t, L.rimt, L.aRad, L.visited_, L.Et = CH(), [edge], [[],[]], [[],[]], 0, [L], copy(L.derH.Et)
285+
L.extH, L.root, L.mL_t, L.rimt, L.aRad, L.visited_, L.Et = CH(Et=np.zeros(4), tft=[]), [edge], [[],[]], [[],[]], 0, [L], copy(L.derH.Et)
284286
# comp dPP_:
285287
lN_,lL_,_ = comp_link_(L_, Et)
286-
dlay = lL_[0].derH.copy_.add_tree([L.derH for L in lL_[1:]])
287-
dlay.fd_= []; edge.derH.append_(dlay)
288288
if len(lN_) > ave_L:
289+
# this should be moved here? lL_ may empty and we won't get any dlay, and hence nothing to feedback too
290+
dlay = lL_[0].derH.copy_(root=edge.derH).add_tree([L.derH for L in lL_[1:]])
291+
dlay.fd_= []; edge.derH.append_(dlay)
289292
cluster_PP_(edge, fd=1)
290293

291294
def comp_node_(_N_): # rng+ forms layer of rim and extH per N, appends N_,L_,Et, ~ graph CNN without backprop
@@ -438,28 +441,28 @@ def sum2graph(root, grapht, fd, nest, fsub=0): # sum node and link params into
438441

439442
node_, link_, Et = grapht[:3]
440443
Et *= icoef # is internal now
441-
graph = CG(fd=fd, Et=Et, root = [root]+[node_[0].root], node_=node_, link_=link_, rng=nest)
444+
graph = CG(fd=fd, Et=Et, root = [root]+ (node_[0].root if isinstance(node_[0].root, list) else [node_[0].root]), node_=node_, link_=link_, rng=nest)
442445
if len(grapht) == 5: # called from cluster_N
443446
minL, subG_ = grapht[3:]
444447
if fd: graph.subL_ = subG_
445448
else: graph.subG_ = subG_
446449
graph.minL = minL
447450
yx = np.array([0,0])
448-
graph.derH = derH = CH(root=graph)
449451
for N in node_:
450452
graph.box = extend_box(graph.box, N.box) # pre-compute graph.area += N.area?
451453
yx = np.add(yx, N.yx)
452454
if isinstance(node_[0],CG):
453455
graph.latuple += N.latuple; graph.vert += N.vert
454-
if N.derH:
455-
derH.add_tree(N.derH)
456456
graph.Et += N.Et * icoef ** 2 # deeper, lower weight
457+
# root[-1] doesn't exist in vect_edge, we need N.root = [graph] instead
457458
N.root[-1] = graph # replace Gt, if single root, else N.root[-1][-1] = graph
459+
# sum node_ derH: (N.derH accumulation is moved here)
460+
graph.derH = node_[0].derH.copy_(root=graph).add_tree([n.derH for n in node_[1:]])
458461
# sum link_ derH:
459-
derLay = link_[0].derH.copy_.add_tree([link.derH for link in link_[1:]])
462+
derLay = link_[0].derH.copy_(root=graph.derH).add_tree([link.derH for link in link_[1:]])
460463
derLay.fd_ = [] # reset
461-
if derH:
462-
derH.fd_=[]; derLay.append_(derH)
464+
if graph.derH:
465+
graph.derH.fd_=[]; derLay.append_(graph.derH)
463466
graph.derH = derLay
464467
L = len(node_)
465468
yx = np.divide(yx,L); graph.yx = yx
@@ -481,9 +484,11 @@ def sum2graph(root, grapht, fd, nest, fsub=0): # sum node and link params into
481484
def feedback(node): # propagate derH to higher roots
482485

483486
while node.root:
487+
if isinstance(node.root, list): root = node.root[-1] # in agg+
488+
else: root = node.root
484489
# root tree is one layer deeper than node tree, so root fork maps to node fork tuple:
485-
node.root.derH.append_(node.derH, fb=0) # root.lft[fd].add_tree( node.derH)
486-
node = node.root
490+
root.derH.append_(node.derH, fb=1 if root.derH else 0) # root.lft[fd].add_tree( node.derH) (fb = 1 if root.derH is not empty)
491+
node = root
487492

488493
def sum_G_(node_):
489494
G = CG()

0 commit comments

Comments
 (0)