38
38
capitalized variables are usually summed small-case variables
39
39
'''
40
40
41
- # module-specific:
42
41
ave , ave_d , ave_rn , ave_ro , ave_G , ave_L , max_dist , icoef , med_cost , ave_dI , mw_ , dw_ = 5 , 10 , 2 , 2 , 100 , 1 , 2 , 0.15 , 10 , 20 , np .ones (8 ), np .ones (8 )
43
42
44
-
45
43
class CLay (CBase ): # flat layer if derivation hierarchy
46
44
name = "lay"
47
45
def __init__ (l , ** kwargs ):
@@ -50,7 +48,6 @@ def __init__(l, **kwargs):
50
48
l .root = kwargs .get ('root' , None ) # higher node or link
51
49
l .node_ = kwargs .get ('node_' , []) # concat across fork tree
52
50
l .link_ = kwargs .get ('link_' , [])
53
- l .baseT = kwargs .get ('baseT' , np .zeros (5 ))
54
51
l .derTT = kwargs .get ('derTT' , np .zeros ((2 ,8 ))) # m_,d_ [M,D,n,o, I,G,A,L], sum across fork tree,
55
52
# add weights for cross-similarity, along with vertical aves, for both m_ and d_?
56
53
# altL = CLay from comp altG
@@ -112,7 +109,7 @@ def __init__(G, **kwargs):
112
109
G .Et = kwargs .get ('Et' , np .zeros (4 )) # sum all params M,D,n,o
113
110
G .yx = kwargs .get ('yx' , np .zeros (2 )) # init PP.yx = [(y+Y)/2,(x,X)/2], then ave node yx
114
111
G .box = kwargs .get ('box' , np .array ([np .inf ,- np .inf ,np .inf ,- np .inf ])) # y,Y,x,X, area: (Y-y)*(X-x)
115
- G .baseT = kwargs .get ('baseT' ,np .zeros (5 )) # I,G,Dy,Dx,L # L=box
112
+ G .baseT = kwargs .get ('baseT' ,np .zeros (4 )) # I,G,Dy,Dx # from slice_edge
116
113
G .derTT = kwargs .get ('derTT' ,np .zeros ((2 ,8 ))) # m,d / Et,baseT: [M,D,n,o, I,G,A,L], summed across derH lay forks
117
114
G .derTTe = kwargs .get ('derTTe' ,np .zeros ((2 ,8 ))) # sum across link.derHs
118
115
G .derH = kwargs .get ('derH' ,[]) # each lay is [m,d]: Clay(Et,node_,link_,derTT), sum|concat links across fork tree
@@ -151,42 +148,33 @@ class CL(CBase): # link or edge, a product of comparison between two nodes or l
151
148
def __init__ (l , ** kwargs ):
152
149
super ().__init__ ()
153
150
l .nodet = kwargs .get ('nodet' ,[]) # e_ in kernels, else replaces _node,node: not used in kernels
151
+ l .L = 0 # distance between nodes
154
152
l .Et = kwargs .get ('Et' , np .zeros (4 ))
155
153
l .fd = kwargs .get ('fd' ,0 )
156
154
l .yx = kwargs .get ('yx' , np .zeros (2 )) # [(y+Y)/2,(x,X)/2], from nodet
157
- l .baseT = kwargs .get ('baseT' , np .zeros (5 ))
155
+ l .baseT = kwargs .get ('baseT' , np .zeros (4 ))
158
156
l .derTT = kwargs .get ('derTT' , np .zeros ((2 ,8 ))) # m_,d_ [M,D,n,o, I,G,A,L], sum across derH
159
157
l .derH = kwargs .get ('derH' , []) # list of single-fork CLays
160
- l .box = kwargs .get ('box' , np .array ([np .inf ,- np .inf ,np .inf ,- np .inf ])) # y,Y,x,X, area: (Y-y)*(X-x)
161
158
# add med, rimt, extH in der+
162
159
def __bool__ (l ): return bool (l .nodet )
163
160
164
- def vectorize_root (frame , _fb_ = {}, fb_ = {}): # init for agg+:
165
-
166
- if _fb_ : # update ave based on feedback coefficients
167
- global ave , ave_d , ave_rn , ave_ro , ave_G , ave_L , max_dist , icoef , med_cost , ave_dI , mw_ , dw_
168
- ave *= _fb_ ['agg_recursion' ] # get feedback coefficient from comp_slice
169
- ave_d *= _fb_ ['agg_recursion' ]
170
- ave_rn *= _fb_ ['agg_recursion' ]
171
- ave_ro *= _fb_ ['agg_recursion' ]
172
- ave_G *= _fb_ ['agg_recursion' ]
173
- ave_L *= _fb_ ['agg_recursion' ]
174
- max_dist *= _fb_ ['agg_recursion' ]
175
- icoef *= _fb_ ['agg_recursion' ]
176
- med_cost *= _fb_ ['agg_recursion' ]
177
- ave_dI *= _fb_ ['agg_recursion' ]
178
- mw_ *= _fb_ ['agg_recursion' ]
179
- dw_ *= _fb_ ['agg_recursion' ]
180
- fb_ ['comp_slice' ] = (ave + ave_d + ave_rn + ave_ro + ave_G + ave_L + max_dist + icoef + med_cost + ave_dI + sum (mw_ )+ sum (dw_ ))/ 26 # feedback coefficient to the next comp_slice
181
-
161
+ def vectorize_root (frame , rave_ = []): # init for agg+:
162
+ # draft:
163
+ global ave , ave_d , ave_rn , ave_ro , ave_G , ave_L , max_dist , icoef , med_cost , ave_dI , mw_ , dw_
164
+ if rave_ :
165
+ ave_ = np .array ([ave , ave_d , ave_rn , ave_ro , ave_G , ave_L , max_dist , icoef , med_cost , ave_dI , mw_ , dw_ ])
166
+ ave , ave_d , ave_rn , ave_ro , ave_G , ave_L , max_dist , icoef , med_cost , ave_dI , mw_ , dw_ = ave_ * rave_
167
+ else :
168
+ rave_ = np .append (np .ones (10 ), np .ones (10 ), np .ones (10 )) # weight per ave?
182
169
blob_ = unpack_blob_ (frame )
183
170
frame2G (frame , derH = [CLay (root = frame )], node_ = [blob_ ], root = None )
184
171
edge_ = [] # cluster, unpack
185
172
for blob in blob_ :
186
173
if not blob .sign and blob .G > ave_G * blob .root .olp :
187
- edge = slice_edge (blob , _fb_ , fb_ )
174
+ # convert rave_ to slice_edge coefs:
175
+ edge = slice_edge (blob , rave_2SE (rave_ ))
188
176
if edge .G * (len (edge .P_ )- 1 ) > ave : # eval PP
189
- comp_slice (edge )
177
+ comp_slice (edge , rave_2CS ( rave_ ) )
190
178
if edge .Et [0 ] * (len (edge .node_ )- 1 )* (edge .rng + 1 ) > ave :
191
179
G_ = [PP2G (PP )for PP in edge .node_ if PP [- 1 ][0 ] > ave ] # Et, no altGs
192
180
if len (G_ ) > ave_L : # no comp node_,link_,PPd_
@@ -207,7 +195,9 @@ def vectorize_root(frame, _fb_={}, fb_={}): # init for agg+:
207
195
frame .link_ += [sum_G_ (lG_ )]; frame .lnest = 1
208
196
frame .baseT = np .sum ([G .baseT for G in PP_ + G_ ], axis = 0 )
209
197
frame .derTT = np .sum ([L .derTT for L in L_ + lG_ ], axis = 0 )
210
- return frame
198
+
199
+ rave = [] # convert rave for comp_slice
200
+ return frame , rave
211
201
212
202
def cluster_edge (iG_ , frame ): # edge is CG but not a connectivity cluster, just a set of clusters in >ave G blob, unpack by default
213
203
@@ -372,13 +362,13 @@ def base_comp(_N, N, dir=1): # comp Et, Box, baseT, derTT
372
362
nM = M * rn ; dM = _M - nM ; mM = min (_M ,nM ) / max (_M ,nM )
373
363
nD = D * rn ; dD = _D - nD ; mD = min (_D ,nD ) / max (_D ,nD )
374
364
# comp baseT:
375
- _I ,_G ,_Dy ,_Dx , _L = _N .baseT ; I ,G ,Dy ,Dx , L = N .baseT # I, G|D, angle, dimension
365
+ _I ,_G ,_Dy ,_Dx = _N .baseT ; I ,G ,Dy ,Dx = N .baseT # I, G|D, angle
376
366
I *= rn ; dI = _I - I ; mI = abs (dI ) / ave_dI
377
367
G *= rn ; dG = _G - G ; mG = min (_G ,G ) / max (_G ,G )
378
368
mA , dA = comp_angle ((_Dy ,_Dx ),(Dy * rn ,Dx * rn ))
379
- L *= rn
380
369
if N .fd : # dimension is distance
381
- mL , dL = min (_L ,L )/ max (_L ,L ), _L - L
370
+ _L ,L = _N .L , N .L
371
+ mL ,dL = min (_L ,L )/ max (_L ,L ), _L - L
382
372
else : # dimension is box area
383
373
_y0 ,_x0 ,_yn ,_xn = _N .box ; _A = (_yn - _y0 ) * (_xn - _x0 )
384
374
y0 , x0 , yn , xn = N .box ; A = (yn - y0 ) * (xn - x0 )
@@ -399,12 +389,12 @@ def comp_N(_N,N, ave, fd, angle=None, dist=None, dir=1): # compare links, relat
399
389
dderH = []
400
390
401
391
[m_ ,d_ ], rn = base_comp (_N , N , dir )
402
- baseT = np .array ([(_N .baseT [0 ] + N .baseT [0 ]) / 2 , np .sum (d_ * dw_ ), * angle , dist ])
392
+ baseT = np .array ([(_N .baseT [0 ] + N .baseT [0 ]) / 2 , np .sum (d_ * dw_ ), * angle ])
403
393
derTT = np .array ([m_ , d_ ])
404
- M = np .sum (m_ * mw_ ); D = np .sum (np .abs (d_ * dw_ )) # feedback-weighted summation
394
+ M = np .sum (m_ * mw_ ); D = np .sum (np .abs (d_ * dw_ )) # feedback-weighted sum
405
395
Et = np .array ([M ,D , 8 , (_N .Et [3 ]+ N .Et [3 ]) / 2 ]) # n comp vars, inherited olp
406
396
407
- Link = CL (fd = fd , nodet = [_N ,N ], baseT = baseT , derTT = derTT , yx = np .add (_N .yx ,N .yx )/ 2 , box = extend_box ( _N . box , N . box ) )
397
+ Link = CL (fd = fd , nodet = [_N ,N ], baseT = baseT , derTT = derTT , yx = np .add (_N .yx ,N .yx )/ 2 , L = dist )
408
398
# spec / lay:
409
399
if M > ave and (len (N .derH ) > 2 or isinstance (N ,CL )): # else derH is redundant to dext,vert
410
400
dderH = comp_H (_N .derH , N .derH , rn , Link , Et , fd ) # comp shared layers, if any
@@ -456,7 +446,7 @@ def sum2graph(root, grapht, fd, minL=0, maxL=None): # sum node and link params
456
446
else : N_ += [N ] # roots if minL
457
447
N .root = graph
458
448
yx_ += [N .yx ]
459
- graph .box = extend_box (graph .box , N .box ) # pre-compute graph.area += N.area?
449
+ graph .box = extend_box (graph .box , N .box ) # pre-compute graph.area += N.area? or from N.yx?
460
450
graph .Et += N .Et * icoef # deeper, lower weight
461
451
if i and not fd : graph .baseT += N .baseT
462
452
# not in CL
@@ -570,7 +560,7 @@ def blob2G(G, **kwargs):
570
560
G .lnest = kwargs .get ('lnest' ,0 ) # link_H if > 0, link_[-1] is top L_
571
561
G .derH = [] # sum from nodes, then append from feedback, maps to node_tree
572
562
G .extH = [] # sum from rims
573
- G .baseT = np .zeros (5 ) # I,G,Dy,Dx
563
+ G .baseT = np .zeros (4 ) # I,G,Dy,Dx
574
564
G .derTT = kwargs .get ('derTT' , np .zeros ((2 ,8 ))) # m_,d_ base params
575
565
G .derTTe = kwargs .get ('derTTe' , np .zeros ((2 ,8 )))
576
566
G .box = kwargs .get ('box' , np .array ([np .inf ,np .inf ,- np .inf ,- np .inf ])) # y0,x0,yn,xn
@@ -584,8 +574,9 @@ def blob2G(G, **kwargs):
584
574
def PP2G (PP ):
585
575
root , P_ , link_ , vert , latuple , A , S , box , yx , Et = PP
586
576
587
- baseT = np .array ((* latuple [:2 ], latuple [- 2 ], * latuple [- 1 ])) # I,G,Dy,Dx,L
588
- derTT = np .hstack ((vert , np .zeros ((2 ,2 )))) # [I,G,A, M,D,L] -> [I,G,gA, M,D,n, empty L,A]
577
+ baseT = np .array ((* latuple [:2 ], * latuple [- 1 ])) # I,G,Dy,Dx
578
+ [mI ,mG ,mA ,mM ,mD ,mL ], [dI ,dG ,dA ,dM ,dD ,dL ] = vert
579
+ derTT = np .array ([np .array ([mM ,mD ,mL ,1 ,mI ,mG ,* mA ,mL ]), np .array ([dM ,dD ,dL ,1 ,dI ,dG ,* dA ,dL ])])
589
580
y ,x ,Y ,X = box ; dy ,dx = Y - y ,X - x # A = (dy,dx); L = np.hypot(dy,dx)
590
581
G = CG (root = root , fd = 0 , Et = Et , node_ = P_ , link_ = [], baseT = baseT , derTT = derTT , box = box , yx = yx , aRad = np .hypot (dy / 2 , dx / 2 ),
591
582
derH = [[CLay (node_ = P_ ,link_ = link_ , derTT = deepcopy (derTT )), CLay ()]]) # empty dfork
0 commit comments