@@ -59,7 +59,7 @@ def __init__(He, Et, tft, lft=None, root=None, node_=None, fd_=None, altH=None):
59
59
He .fd_ = [] if fd_ is None else fd_ # 0: sum CGs, 1: sum CLs, + concat from comparands
60
60
He .root = None if root is None else root # N or higher-composition He
61
61
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
63
63
He .depth = 0 # max depth of fork tree?
64
64
# if combined-layer H:
65
65
# 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
73
73
74
74
def copy_ (He , root , rev = 0 , fc = 0 ): # comp direction may be reversed to -1
75
75
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 = [] )
77
77
78
78
for fd , tt in enumerate (He .tft ): # nested array tuples
79
79
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
111
111
root .Et += He .Et
112
112
if not root .tft : root .tft = He .tft # if init from sum mlink_
113
113
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
115
115
else :
116
116
root .lft += [He ]
117
117
@@ -173,8 +173,8 @@ def __init__(G, fd=0, rng=1, root=[], node_=[], link_=[], subG_=[], subL_=[],
173
173
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]
174
174
G .vert = np .array ([np .zeros (6 ), np .zeros (6 )]) if vert is None else vert # vertical m_d_ of latuple
175
175
# 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
178
178
G .rim = [] # flat links of any rng, may be nested in clustering
179
179
G .aRad = 0 # average distance between graph center and node center
180
180
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):
214
214
if blob .Et [0 ] * (len (blob .node_ )- 1 )* (blob .rng + 1 ) > ave :
215
215
# init for agg+:
216
216
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_ = []
218
218
Y ,X ,_ ,_ ,_ ,_ = blob .latuple
219
219
lat = np .array ([.0 ,.0 ,.0 ,.0 ,.0 ,np .zeros (2 )],dtype = object ); vert = np .array ([np .zeros (6 ), np .zeros (6 )])
220
220
for PP in blob .node_ :
@@ -230,7 +230,9 @@ def vectorize_root(frame):
230
230
G_ += [PP ]
231
231
edge .subG_ = G_
232
232
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
234
236
# add altG: summed converted adj_blobs of converted edge blob
235
237
# if len(edge.subG_) > ave_L: agg_recursion(edge) # unlikely
236
238
@@ -274,18 +276,19 @@ def cluster_PP_(edge, fd):
274
276
edge .subG_ = N_
275
277
edge .link_ = L_
276
278
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 :]])
278
280
mlay .fd_ = []; edge .derH .append_ (mlay )
279
281
if len (N_ ) > ave_L :
280
282
cluster_PP_ (edge , fd = 0 )
281
283
if val_ (Et , mEt = Et , fo = 1 ) > 0 : # likely not from the same links
282
284
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 )
284
286
# comp dPP_:
285
287
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 )
288
288
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 )
289
292
cluster_PP_ (edge , fd = 1 )
290
293
291
294
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
438
441
439
442
node_ , link_ , Et = grapht [:3 ]
440
443
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 )
442
445
if len (grapht ) == 5 : # called from cluster_N
443
446
minL , subG_ = grapht [3 :]
444
447
if fd : graph .subL_ = subG_
445
448
else : graph .subG_ = subG_
446
449
graph .minL = minL
447
450
yx = np .array ([0 ,0 ])
448
- graph .derH = derH = CH (root = graph )
449
451
for N in node_ :
450
452
graph .box = extend_box (graph .box , N .box ) # pre-compute graph.area += N.area?
451
453
yx = np .add (yx , N .yx )
452
454
if isinstance (node_ [0 ],CG ):
453
455
graph .latuple += N .latuple ; graph .vert += N .vert
454
- if N .derH :
455
- derH .add_tree (N .derH )
456
456
graph .Et += N .Et * icoef ** 2 # deeper, lower weight
457
+ # root[-1] doesn't exist in vect_edge, we need N.root = [graph] instead
457
458
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 :]])
458
461
# 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 :]])
460
463
derLay .fd_ = [] # reset
461
- if derH :
462
- derH .fd_ = []; derLay .append_ (derH )
464
+ if graph . derH :
465
+ graph . derH .fd_ = []; derLay .append_ (graph . derH )
463
466
graph .derH = derLay
464
467
L = len (node_ )
465
468
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
481
484
def feedback (node ): # propagate derH to higher roots
482
485
483
486
while node .root :
487
+ if isinstance (node .root , list ): root = node .root [- 1 ] # in agg+
488
+ else : root = node .root
484
489
# 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
487
492
488
493
def sum_G_ (node_ ):
489
494
G = CG ()
0 commit comments