@@ -70,12 +70,12 @@ def __init__(He, root=None, Et=None, tft=None, lft=None, node_=None, fd_=None, a
70
70
# He.deep = 0 if deep is None else deep # nesting in root H
71
71
# He.nest = 0 if nest is None else nest # nesting in H
72
72
73
- def __bool__ (H ):return bool (H .Et [0 ]> 0 ) # empty only in empty CH
73
+ def __bool__ (H ):return bool (H .Et [0 ]!= 0 ) # empty only in empty CH (M may negative and it has non empty tft or lft too)
74
74
75
75
76
76
def copy_ (He , root , rev = 0 , fc = 0 ): # comp direction may be reversed to -1
77
77
78
- C = CH (root = root , node_ = copy (He .node_ ), Et = He .Et * - 1 if (fc and rev ) else copy (He .Et ))
78
+ C = CH (fd_ = copy ( He . fd_ ), root = root , node_ = copy (He .node_ ), Et = He .Et * - 1 if (fc and rev ) else copy (He .Et ))
79
79
80
80
for fd , tt in enumerate (He .tft ): # nested array tuples
81
81
C .tft += [tt * - 1 if rev and (fd or fc ) else deepcopy (tt )]
@@ -89,9 +89,11 @@ def add_tree(HE, He_, rev=0, fc=0): # rev = dir==-1, unpack derH trees down to
89
89
90
90
for He in He_ :
91
91
# sum tft:
92
- for fd , (F_t , f_t ) in enumerate (zip (HE .tft , He .tft )): # m_t and d_t
93
- for F_ ,f_ in zip (F_t , f_t ):
94
- F_ += f_ * - 1 if rev and (fd or fc ) else f_ # m_|d_ in [dext,dlat,dver]
92
+ if HE .tft :
93
+ for fd , (F_t , f_t ) in enumerate (zip (HE .tft , He .tft )): # m_t and d_t
94
+ for F_ ,f_ in zip (F_t , f_t ):
95
+ F_ += f_ * - 1 if rev and (fd or fc ) else f_ # m_|d_ in [dext,dlat,dver]
96
+ else : HE .tft = deepcopy (He .tft ) # HE.tft is init empty, copy the first tft when it's empty
95
97
96
98
for F , f in zip_longest (HE .lft , He .lft , fillvalue = None ): # CH forks
97
99
if f : # empty in bottom layer
@@ -100,13 +102,14 @@ def add_tree(HE, He_, rev=0, fc=0): # rev = dir==-1, unpack derH trees down to
100
102
101
103
HE .node_ += [node for node in He .node_ if node not in HE .node_ ] # empty in CL derH?
102
104
HE .Et += He .Et * - 1 if rev and fc else He .Et
105
+ if not HE .fd_ : HE .fd_ = copy (He .fd_ ) # init fd_
103
106
104
107
return HE # root should be updated by returned HE
105
108
106
109
def append_ (HE , He ): # unpack HE lft tree down to He.fd_ and append He there
107
110
108
- fd_ = He .fd_ ; root = HE
109
- while fd_ :
111
+ root = HE ; fd_ = copy ( He .fd_ ) # use copy prevent popping fd in the He
112
+ while fd_ and root . lft : # skip empty root (in the base fork)
110
113
fd = fd_ .pop (0 )
111
114
root = root .lft [fd ]
112
115
root .lft += [He ]
@@ -115,15 +118,15 @@ def append_(HE, He): # unpack HE lft tree down to He.fd_ and append He there
115
118
116
119
def comp_tree (_He , He , rn , root , dir = 1 , fd = 0 ): # unpack derH trees down to numericals and compare them
117
120
118
- _d_t , d_t = He .tft [1 ], He .tft [1 ] # comp_tft:
121
+ _d_t , d_t = _He .tft [1 ], He .tft [1 ] # comp_tft: (should be _He here)
119
122
d_t = d_t * rn # norm by accum span
120
123
dd_t = (_d_t - d_t * dir ) # np.arrays
121
124
md_t = np .array ([np .minimum (_d_ ,d_ ) for _d_ ,d_ in zip (_d_t , d_t )], dtype = object )
122
125
for i , (_d_ ,d_ ) in enumerate (zip (_d_t , d_t )):
123
126
md_t [i ][(_d_ < 0 ) != (d_ < 0 )] *= - 1 # negate if only one of _d_ or d_ is negative
124
127
M = sum ([sum (md_ ) for md_ in md_t ])
125
128
D = sum ([sum (dd_ ) for dd_ in dd_t ])
126
- n = .3 if len (d_t )== 1 else 2.3 # n comp params / 6
129
+ n = .3 if len (d_t )== 1 else 2.3 # n comp params / 6 : m fork: [ext(2), Lat(6), Ver(6)], d fork: [ext(2)]
127
130
128
131
derH = CH (fd_ = _He .fd_ + [fd ], root = root , tft = [np .array (md_t ),np .array (dd_t )], Et = np .array ([M ,D ,n , (_He .Et [3 ]+ He .Et [3 ])/ 2 ]))
129
132
@@ -138,7 +141,7 @@ def norm_(He, n):
138
141
for f in He .tft : # arrays
139
142
f *= n
140
143
for fork in He .lft : # CHs
141
- fork .norm_C (n )
144
+ # fork.norm_C(n) # pending update with new structure of tft and lft
142
145
fork .Et *= n
143
146
He .Et *= n
144
147
@@ -457,9 +460,10 @@ def sum2graph(root, grapht, fd, nest, fsub=0): # sum node and link params into
457
460
derH .add_tree (N .derH ) # exclude Et, already in N.Et?:
458
461
graph .Et += N .Et * icoef ** 2 # deeper, lower weight
459
462
N .root [- 1 ] = graph # replace Gt, if single root, else N.root[-1][-1] = graph
460
- # sum link.derHs
461
- derH .append_ (CH ().add_tree ([link .derH for link in link_ ])) # derH lft @ derLay.fd_ += [derLay]
462
- graph .derH = derH ; graph .Et += derH .Et
463
+ # sum link.
464
+ derLay = CH ().add_tree ([link .derH for link in link_ ])
465
+ derH .append_ (derLay ) # derH lft @ derLay.fd_ += [derLay] (in the base m and d fork, derH.lft is empty)
466
+ graph .Et += derH .Et # graph.derH is already assigned during derH initialization
463
467
# add feedback to higher roots?
464
468
L = len (node_ )
465
469
yx = np .divide (yx ,L ); graph .yx = yx
0 commit comments