Skip to content

Commit 12708fe

Browse files
committed
Merge branch 'master' of https://github.com/boris-kz/CogAlg
# Conflicts: # frame_2D_alg/agg_recursion.py # frame_2D_alg/frame_blobs.py # frame_2D_alg/vect_edge.py
2 parents 648f819 + e1f7fa3 commit 12708fe

File tree

3 files changed

+32
-36
lines changed

3 files changed

+32
-36
lines changed

frame_2D_alg/agg_recursion.py

+23-22
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,20 @@
1313
prefix _ denotes prior of two same-name variables, multiple _s for relative precedence
1414
postfix _ denotes array of same-name elements, multiple _s is nested array
1515
capitalized vars are summed small-case vars
16+
17+
Each agg+ cycle forms higher-composition complemented graphs G.altG_ in cluster_N_ and refines them in cluster_C_:
18+
cross_comp -> cluster_N_ -> cluster_C -> cross_comp...
1619
'''
1720

18-
def cross_comp(root): # breadth-first node_,link_ cross-comp, connect.clustering, recursion
21+
def cross_comp(root, nest=0): # breadth-first node_,link_ cross-comp, connect.clustering, recursion
1922

2023
N_,L_,Et = comp_node_(root.node_) # cross-comp exemplars, extrapolate to their node_s
2124
# mfork
2225
if val_(Et, fo=1) > 0:
2326
mlay = CH().add_tree([L.derH for L in L_]); H=root.derH; mlay.root=H; H.Et += mlay.Et; H.lft = [mlay]
2427
pL_ = {l for n in N_ for l,_ in get_rim(n, fd=0)}
2528
if len(pL_) > ave_L:
26-
cluster_N_(root, pL_, fd=0) # nested distance clustering, calls centroid and higher connect.clustering
29+
cluster_N_(root, pL_, nest, fd=0) # nested distance clustering, calls centroid and higher connect.clustering
2730
# dfork
2831
if val_(Et, mEt=Et, fo=1) > 0: # same root for L_, root.link_ was compared in root-forming for alt clustering
2932
for L in L_:
@@ -33,12 +36,12 @@ def cross_comp(root): # breadth-first node_,link_ cross-comp, connect.clusterin
3336
dlay = CH().add_tree([L.derH for L in lL_]); dlay.root=H; H.Et += dlay.Et; H.lft += [dlay]
3437
plL_ = {l for n in lN_ for l,_ in get_rim(n, fd=1)}
3538
if len(plL_) > ave_L:
36-
cluster_N_(root, plL_, fd=1)
39+
cluster_N_(root, plL_, nest, fd=1)
3740

38-
combine_altG__(root) # cross-comp | sum contour altG_ to altG
41+
comb_altG_(root) # combine node altG_(contour) by sum,cross-comp -> CG altG
3942
cluster_C_(root) # get (G,altG) exemplars, altG_ may reinforce G by borrowing from extended surround?
4043

41-
def cluster_N_(root, L_, fd, nest=0): # top-down segment L_ by >ave ratio of L.dists
44+
def cluster_N_(root, L_, nest, fd): # top-down segment L_ by >ave ratio of L.dists
4245

4346
L_ = sorted(L_, key=lambda x: x.dist) # shorter links first
4447
while L_:
@@ -91,7 +94,7 @@ def centroid(dnode_, node_, C=None): # sum|subtract and average Rim nodes
9194

9295
if C is None:
9396
C,A, fC = CG(),CG(), 0
94-
C.M,C.L, A.M,A.L = 0,0,0,0 # setattr
97+
C.M,C.L, A.M,A.L = 0,0,0,0 # centroid setattr
9598
else:
9699
A, fC = C.altG_, 1
97100
sum_G_(C, dnode_, fc=1) # exclude extend_box and sum extH
@@ -176,28 +179,26 @@ def sum_G_(G, node_, fc=0):
176179
for n in node_:
177180
if fc:
178181
s = n.sign; n.sign = 1 # single-use
179-
else: s = 1
180182
G.latuple += n.latuple * s; G.vert += n.vert * s
181183
G.Et += n.Et * s; G.aRad += n.aRad * s
182184
G.yx += n.yx * s
183185
if n.derH: G.derH.add_tree(n.derH, root=G, rev = s==-1, fc=fc)
184186
if fc:
185-
G.L += 1 # nodes doesn't have M and L? We just need to accumulate M and L into C
187+
G.M += n.m*s; G.L += s
186188
else:
187-
if n.extH: G.extH.add_tree(n.extH, root=G, rev = s==-1)
188-
G.box = extend_box( G.box, n.box)
189-
190-
def combine_altG__(root): # combine contour G.altG_ into altG (node_ defined by root=G), for agg+ cross-comp
191-
192-
for G in root.node_: # eval altG * borrow from G:
193-
if isinstance(G.altG_, list) and G.altG_: # skip converted alt or empty altG_
194-
altG_ = G.altG_; G.altG_ = CG(node_=altG_, root=G); G.altG_.sign = 1
195-
if val_(np.sum([alt.Et for alt in altG_],axis=0), mEt=G.Et):
196-
G.altG_.L = len(G.altG_.node_)
189+
if n.extH: G.extH.add_tree(n.extH, root=G, rev = s==-1) # empty in centroid
190+
G.box = extend_box( G.box, n.box) # extended per separate node_ in centroid
191+
192+
def comb_altG_(root): # combine contour G.altG_ into altG (node_ defined by root=G), for agg+ cross-comp
193+
194+
for G in root.node_:
195+
if G.nest+1 == root.nest and G.altG_:
196+
alt_ = G.altG_
197+
sum_G_(alt_[0], [alt for alt in alt_[1:]])
198+
G.altG_ = CG(root=G, node_=alt_); G.altG_.sign = 1; G.altG_.m = 0
199+
# alt D * G rM:
200+
if val_(G.altG_.Et, mEt=G.Et):
197201
cross_comp(G.altG_)
198-
else:
199-
sum_G_(G.altG_, [alt for alt in G.altG_])
200-
# or keep altG_ in altG.node_?
201202

202203
if __name__ == "__main__":
203204
image_file = './images/raccoon_eye.jpeg'
@@ -208,7 +209,7 @@ def combine_altG__(root): # combine contour G.altG_ into altG (node_ defined by
208209
if frame.node_: # converted edges
209210
G_ = []
210211
for edge in frame.node_:
211-
combine_altG__(edge)
212+
comb_altG_(edge)
212213
cluster_C_(edge) # no cluster_C_ in vect_edge
213214
G_ += edge.node_ # unpack edge, or keep if connectivity cluster, or in flat blob altG_?
214215
frame.node_ = G_

frame_2D_alg/frame_blobs.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,11 @@ def term(blob):
117117
def G(blob): return blob.latuple[-1]
118118
@property
119119
def yx_(blob): return list(blob.dert_.keys())
120-
# @property
121-
# def yx(blob): return map(np.mean, zip(*blob.yx_))
122120

123121
def frame_blobs_root(image):
124122
dert__ = comp_pixel(image)
125123
frame = CFrame(image)
126-
127-
# Flood-fill 1 pixel at a time
128-
flood_fill(frame, dert__)
124+
flood_fill(frame, dert__) # flood-fill 1 pixel at a time
129125

130126
return frame
131127

frame_2D_alg/vect_edge.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -427,15 +427,14 @@ def sum_G_(node_):
427427
def sum2graph(root, grapht, fd, maxL=None, nest=0): # sum node and link params into graph, aggH in agg+ or player in sub+
428428

429429
node_, link_, Et = grapht
430-
graph = CG(fd=fd, Et=Et*icoef, root=root, link_=link_, maxL=maxL, nest=nest) # internal nesting
430+
graph = CG(fd=fd, Et=Et*icoef, root=root, link_=link_, maxL=maxL, nest=nest+1) # internal nesting
431431
# arg Et is weaker if internal
432432
yx = np.array([0,0]); yx_ = []
433433
derH = CH(root=graph)
434434
root_ = []
435435
for N in node_:
436-
if nest: # G is dist-nested in cluster_N_, cluster roots instead of nodes
437-
while N.root.nest+1 < nest and N.root is not graph: # higher root.root maybe updated to graph in prior node, so we need to skip it
438-
N = N.root # incr/elevation in feedback, return root.nest+1 == nest
436+
if nest: # G is distance-nested in cluster_N_, cluster prior-dist graphs instead of nodes:
437+
while N.nest != nest: N = N.root # get prior top root: nest = arg nest
439438
if N in root_: continue # roots overlap
440439
root_ += [N]
441440
graph.box = extend_box(graph.box, N.box) # pre-compute graph.area += N.area?
@@ -458,22 +457,22 @@ def sum2graph(root, grapht, fd, maxL=None, nest=0): # sum node and link params
458457
dy,dx = np.divide( np.sum([ np.abs(yx-_yx) for _yx in yx_], axis=0), L)
459458
graph.aRad = np.hypot(dy,dx) # ave distance from graph center to node centers
460459
graph.yx = yx
461-
if fd: # dgraph # and val_(Et, mEt=root.Et) > 0:
460+
if fd: # dgraph, no mGs / dG for now # and val_(Et, mEt=root.Et) > 0:
462461
altG_ = [] # mGs overlapping dG
463462
for L in node_:
464463
for n in L.nodet: # map root mG
465464
mG = n.root
466465
if mG not in altG_:
467466
mG.altG_ += [graph] # cross-comp|sum complete altG_ before next agg+ cross-comp
468467
altG_ += [mG]
469-
feedback(graph, nest) # recursive root.derH.add_fork(graph.derH)
468+
feedback(graph) # recursive root.derH.add_fork(graph.derH)
470469
return graph
471470

472-
def feedback(node, nest): # propagate node.derH to higher roots
471+
def feedback(node): # propagate node.derH to higher roots
473472

474473
while node.root:
475474
root = node.root
476-
root.nest = max(root.nest, node.nest+1) # when nest == 0, we still need to increase root.nest?
475+
root.nest = max(root.nest, node.nest+1)
477476
lowH = addH = root.derH
478477
add = 1
479478
for fd in addH.fd_: # unpack top-down, each fd was assigned by corresponding level of roots
@@ -504,7 +503,7 @@ def blob2CG(G, **kwargs):
504503
G.extH = CH() # sum from rims
505504
G.altG_ = [] # or altG? adjacent (contour) gap+overlap alt-fork graphs, converted to CG
506505
if not hasattr(G, 'node_'): G.node_ = [] # add node_ in frame
507-
506+
508507
return G
509508

510509
if __name__ == "__main__":

0 commit comments

Comments
 (0)