@@ -71,23 +71,23 @@ def __bool__(H): return bool(H.Et[3] != 0)
71
71
72
72
def copy_md_C (he , root , dir = 1 , fc = 0 ): # dir is sign if called from centroid, which doesn't use dir
73
73
74
- md_t = [np .array ([m_ * dir if fc else copy (m_ ), d_ * dir ]) for m_ , d_ in he .H ]
74
+ md_t = [np .array ([m_ * dir if fc else copy (m_ ), d_ * dir ]) for m_ , d_ in he .layt ]
75
75
# m_ * dir only if called from centroid()
76
76
Et = he .Et * dir if fc else copy (he .Et )
77
77
78
- return CH (root = root , H = md_t , node_ = copy (he .node_ ), Et = Et , i = he .i , i_ = he .i_ )
78
+ return CH (root = root , layt = md_t , node_ = copy (he .node_ ), Et = Et , i = he .i , i_ = he .i_ )
79
79
80
80
def copy_ (He , root , dir = 1 , fc = 0 ): # comp direction may be reversed to -1
81
81
82
82
C = CH (root = root , node_ = copy (He .node_ ), Et = copy (He .Et ), i = He .i , i_ = He .i_ )
83
- for he in He .H :
84
- C .H += [he .copy_ (root = C , dir = dir , fc = fc ) if isinstance (he .H [0 ],CH ) else
83
+ for he in He .layt :
84
+ C .layt += [he .copy_ (root = C , dir = dir , fc = fc ) if isinstance (he .layt [0 ],CH ) else
85
85
he .copy_md_C (root = C , dir = dir , fc = fc )]
86
86
return C
87
87
88
88
def add_md_C (Lay , lay , dir = 1 , fc = 0 ):
89
89
90
- for Md_ , md_ in zip (Lay .H , lay .H ): # [mdext, ?vert, mdVer]
90
+ for Md_ , md_ in zip (Lay .layt , lay .layt ): # [mdext, ?vert, mdVer]
91
91
Md_ += np .array ([md_ [0 ]* dir if fc else md_ [0 ].copy (), md_ [1 ]* dir ])
92
92
93
93
Lay .Et += lay .Et * dir if fc else copy (lay .Et )
@@ -96,14 +96,14 @@ def add_H(HE, He_, dir=1, fc=0): # unpack derHs down to numericals and sum them
96
96
if not isinstance (He_ ,list ): He_ = [He_ ]
97
97
98
98
for He in He_ :
99
- for Lay , lay in zip_longest (HE .H , He .H , fillvalue = None ):
99
+ for Lay , lay in zip_longest (HE .layt , He .layt , fillvalue = None ):
100
100
if lay :
101
101
if Lay : # unpack|add, same nesting in both lays
102
- Lay .add_H (lay ,dir ,fc ) if isinstance (lay .H [0 ],CH ) else Lay .add_md_C (lay ,dir ,fc )
102
+ Lay .add_H (lay ,dir ,fc ) if isinstance (lay .layt [0 ],CH ) else Lay .add_md_C (lay ,dir ,fc )
103
103
elif Lay is None :
104
- HE .append_ ( lay .copy_ (root = HE , dir = dir , fc = fc ) if isinstance (lay .H [0 ],CH ) else lay .copy_md_C (root = HE , dir = dir , fc = fc ))
104
+ HE .append_ ( lay .copy_ (root = HE , dir = dir , fc = fc ) if isinstance (lay .layt [0 ],CH ) else lay .copy_md_C (root = HE , dir = dir , fc = fc ))
105
105
elif lay is not None and Lay is None :
106
- HE .H += [CH ()]
106
+ HE .layt += [CH ()]
107
107
108
108
HE .node_ += [node for node in He .node_ if node not in HE .node_ ] # empty in CL derH?
109
109
HE .Et += He .Et * dir
@@ -113,37 +113,37 @@ def add_H(HE, He_, dir=1, fc=0): # unpack derHs down to numericals and sum them
113
113
def append_ (HE ,He , flat = 0 ):
114
114
115
115
if flat :
116
- for i , lay in enumerate (He .H ):
116
+ for i , lay in enumerate (He .layt ):
117
117
if lay :
118
- lay = lay .copy_ (root = HE ) if isinstance (lay .H [0 ],CH ) else lay .copy_md_C (root = HE )
119
- lay .i = len (HE .H ) + i
120
- HE .H += [lay ] # lay may be empty to trace forks
118
+ lay = lay .copy_ (root = HE ) if isinstance (lay .layt [0 ],CH ) else lay .copy_md_C (root = HE )
119
+ lay .i = len (HE .layt ) + i
120
+ HE .layt += [lay ] # lay may be empty to trace forks
121
121
else :
122
- He .i = len (HE .H ); He .root = HE ; HE .H += [He ] # He can't be empty
123
- HE .H += [He ]
122
+ He .i = len (HE .layt ); He .root = HE ; HE .layt += [He ] # He can't be empty
123
+ HE .layt += [He ]
124
124
HE .Et += He .Et
125
125
return HE
126
126
127
127
def comp_md_C (_md_C , md_C , rn , root , olp = 1. , dir = 1 ):
128
128
129
129
der_md_t = []
130
130
Et = np .zeros (2 )
131
- for _md_ , md_ in zip (_md_C .H , md_C .H ): # [mdext, ?vert, mdvert]
131
+ for _md_ , md_ in zip (_md_C .layt , md_C .layt ): # [mdext, ?vert, mdvert]
132
132
# comp ds:
133
133
der_md_ , et = comp_md_ (_md_ [1 ], md_ [1 ], rn , dir = dir )
134
134
der_md_t += [der_md_ ]
135
135
Et += et
136
136
137
- return CH (root = root , H = der_md_t , Et = np .append (Et ,[olp , .3 if len (der_md_t )== 1 else 2.3 ])) # .3 in default comp ext)
137
+ return CH (root = root , layt = der_md_t , Et = np .append (Et ,[olp , .3 if len (der_md_t )== 1 else 2.3 ])) # .3 in default comp ext)
138
138
139
139
def comp_H (_He , He , rn , root ):
140
140
141
141
derH = CH (root = root ) # derH.H ( flat lay.H, or nest per higher lay.H for selective access?
142
142
# lay.H maps to higher Hs it was derived from, len lay.H = 2 ^ lay_depth (unpacked root H[:i])
143
143
144
- for _lay , lay in zip (_He .H , He .H ): # both may be empty CH to trace fork types
144
+ for _lay , lay in zip (_He .layt , He .layt ): # both may be empty CH to trace fork types
145
145
if _lay and lay : # same depth
146
- if isinstance (lay .H [0 ], CH ):
146
+ if isinstance (lay .layt [0 ], CH ):
147
147
dLay = _lay .comp_H (lay , rn , root = derH ) # deeper unpack -> comp_md_t
148
148
else :
149
149
dLay = _lay .comp_md_C (lay , rn = rn , root = derH , olp = (_He .Et [3 ]+ He .Et [3 ]) / 2 ) # comp shared layers, add n to olp?
@@ -154,26 +154,26 @@ def comp_H(_He, He, rn, root):
154
154
155
155
def norm_ (He , n ):
156
156
157
- for lay in He .H : # not empty list
157
+ for lay in He .layt : # not empty list
158
158
if lay :
159
- if isinstance (lay .H [0 ], CH ):
159
+ if isinstance (lay .layt [0 ], CH ):
160
160
lay .norm_C (n )
161
161
else :
162
- for md_ in lay .H : md_ *= n
162
+ for md_ in lay .layt : md_ *= n
163
163
lay .Et *= n
164
164
He .Et *= n
165
165
166
166
# not updated:
167
167
def sort_H (He , fd ): # re-assign olp and form priority indices for comp_H, if selective and aligned
168
168
169
169
i_ = [] # priority indices
170
- for i , lay in enumerate (sorted (He .H , key = lambda lay : lay .Et [fd ], reverse = True )):
170
+ for i , lay in enumerate (sorted (He .layt , key = lambda lay : lay .Et [fd ], reverse = True )):
171
171
di = lay .i - i # lay index in H
172
172
lay .olp += di # derR- valR
173
173
i_ += [lay .i ]
174
174
He .i_ = i_ # comp_H priority indices: node/m | link/d
175
175
if not fd :
176
- He .root .node_ = He .H [i_ [0 ]].node_ # no He.node_ in CL?
176
+ He .root .node_ = He .layt [i_ [0 ]].node_ # no He.node_ in CL?
177
177
178
178
179
179
class CG (CBase ): # PP | graph | blob: params of single-fork node_ cluster
@@ -197,7 +197,7 @@ def __init__(G, fd=0, rng=1, root=[], node_=[], link_=[], subG_=[], subL_=[],
197
197
G .rim = [] # flat links of any rng, may be nested in clustering
198
198
G .aRad = 0 # average distance between graph center and node center
199
199
G .box = [np .inf , np .inf , - np .inf , - np .inf ] if box is None else box # y0,x0,yn,xn
200
- G .yx = np .array ([ 0 , 0 ] ) if yx is None else yx # init PP.yx = [(y0+yn)/2,(x0,xn)/2], then ave node yx
200
+ G .yx = np .zeros ( 2 ) if yx is None else yx # init PP.yx = [(y0+yn)/2,(x0,xn)/2], then ave node yx
201
201
G .altG = CG (altG = G ) if altG is None else altG # adjacent gap+overlap graphs, vs. contour in frame_graphs (prevent cyclic)
202
202
# G.fback_ = [] # always from CGs with fork merging, no dderHm_, dderHd_
203
203
# id_H: list = z([[]]) # indices in all layers(forks, if no fback merge
@@ -219,7 +219,7 @@ def __init__(l, nodet=None, dist=None, derH=None, angle=None, box=None, H_=None,
219
219
l .yx = [0 ,0 ] if yx is None else yx
220
220
l .H_ = [] if H_ is None else H_ # if agg++| sub++?
221
221
# add med, rimt, elay | extH in der+
222
- def __bool__ (l ): return bool (l .derH .H )
222
+ def __bool__ (l ): return bool (l .derH .layt )
223
223
224
224
def vectorize_root (frame ):
225
225
@@ -232,7 +232,7 @@ def vectorize_root(frame):
232
232
if blob .Et [0 ] * (len (blob .node_ )- 1 )* (blob .rng + 1 ) > ave :
233
233
# init for agg+:
234
234
if not hasattr (frame , 'derH' ):
235
- frame .derH = CH (root = frame ); frame .root = None ; frame .subG_ = []
235
+ frame .derH = CH (root = frame ); frame .root = None ; frame .subG_ = []; frame . Et = np . zeros ( 4 )
236
236
Y ,X ,_ ,_ ,_ ,_ = blob .latuple
237
237
lat = np .array ([.0 ,.0 ,.0 ,.0 ,.0 ,np .zeros (2 )],dtype = object ); vert = np .array ([np .zeros (6 ), np .zeros (6 )])
238
238
for PP in blob .node_ :
@@ -432,8 +432,8 @@ def comp_N(_N,N, rn, angle=None, dist=None, dir=1): # dir if fd, Link.derH=dH,
432
432
md_t = [mdext , vert , md_vert ]
433
433
Et = np .array ([mL + mA + et1 [0 ]+ et2 [0 ], abs (dL )+ abs (dA ) + et1 [1 ]+ et2 [1 ], 2.3 , olp ])
434
434
# 1st lay:
435
- md_C = CH (H = md_t , Et = Et )
436
- derH = CH (H = [md_C ], Et = copy (Et )) # no lay = CH(H=[md_C], Et=copy(Et), n=n)
435
+ md_C = CH (layt = md_t , Et = Et )
436
+ derH = CH (layt = [md_C ], Et = copy (Et )) # no lay = CH(H=[md_C], Et=copy(Et), n=n)
437
437
if _N .derH and N .derH :
438
438
dderH = _N .derH .comp_H (N .derH , rn , root = derH ) # comp shared layers
439
439
derH .append_ (dderH , flat = 1 )
@@ -476,14 +476,16 @@ def sum2graph(root, grapht, fd, nest): # sum node and link params into graph, a
476
476
if fg :
477
477
vert = N .vert ; M += np .sum (vert [0 ]); D += np .sum (vert [1 ]); graph .vert += vert
478
478
graph .latuple += N .latuple
479
- N .root [- 1 ] = graph # replace Gt, if single root, else N.root[-1][-1] = graph
479
+ if isinstance (N .root , list ): N .root [- 1 ] = graph # replace Gt, if single root, else N.root[-1][-1] = graph (agg++)
480
+ else : N .root = graph
481
+
480
482
if fg :
481
483
graph .Et [:2 ] += np .array ([M ,D ]) * icoef ** 2
482
484
if derH :
483
485
graph .derH = derH # lower layers
484
486
derLay = CH ().add_H ([link .derH for link in link_ ])
485
- for lay in derLay .H :
486
- lay .root = graph ; graph .derH .H += [lay ] # concat new layer, add node_? higher layers are added by feedback
487
+ for lay in derLay .layt :
488
+ lay .root = graph ; graph .derH .layt += [lay ] # concat new layer, add node_? higher layers are added by feedback
487
489
graph .derH .Et += Et # arg Et
488
490
L = len (node_ )
489
491
yx = np .divide (yx ,L ); graph .yx = yx
0 commit comments