Commit 448c5f4d authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent fc509e63
...@@ -160,8 +160,6 @@ class Tree(object): ...@@ -160,8 +160,6 @@ class Tree(object):
return child0.firstbucket() return child0.firstbucket()
# Bucket represents a bucket node. # Bucket represents a bucket node.
class Bucket(object): class Bucket(object):
# .keyv () of keys # .keyv () of keys
...@@ -186,7 +184,7 @@ class Bucket(object): ...@@ -186,7 +184,7 @@ class Bucket(object):
return Bucket(*b.keyv) return Bucket(*b.keyv)
# StructureOf returns internal structure of a BTree. # StructureOf returns internal structure of a ZODB BTree.
# #
# The structure is represented as Tree and Bucket nodes. # The structure is represented as Tree and Bucket nodes.
def StructureOf(znode): def StructureOf(znode):
...@@ -235,7 +233,7 @@ def Restructure(ztree, newStructure): ...@@ -235,7 +233,7 @@ def Restructure(ztree, newStructure):
kv = dict(ztree) kv = dict(ztree)
# walk original and new structures level by level. # walk original and new structures level by level.
# XXX push buckets till the end # push buckets till the end, then
# for each level we have A1...An "old" nodes, and B1...Bm "new" nodes. # for each level we have A1...An "old" nodes, and B1...Bm "new" nodes.
# if n == m - map A-B 1-to-1 # if n == m - map A-B 1-to-1
# if n < m - we have to "insert" (m-n) new nodes # if n < m - we have to "insert" (m-n) new nodes
...@@ -253,9 +251,10 @@ def Restructure(ztree, newStructure): ...@@ -253,9 +251,10 @@ def Restructure(ztree, newStructure):
# #
# sum min d(a,b) sum min d(a,b) # sum min d(a,b) sum min d(a,b)
# a∈A b∈B b∈B a∈A # a∈A b∈B b∈B a∈A
# D(A,B) = ────────────── + ────────────── XXX # D(A,B) = ────────────── + ────────────── XXX -> D(A,B) = |A.lo, B.lo| + |A.hi - B.hi|
# N(A) N(B) # N(A) N(B)
# #
# XXX ^^^ -> assignment problem
# we will modify nodes from new set: # we will modify nodes from new set:
# - node.Z will point to associated znode # - node.Z will point to associated znode
...@@ -278,6 +277,7 @@ def Restructure(ztree, newStructure): ...@@ -278,6 +277,7 @@ def Restructure(ztree, newStructure):
assert not hasattr(rn.node, 'Z') assert not hasattr(rn.node, 'Z')
rn.node.Z = None rn.node.Z = None
# D(a,b)
def D(a, b): def D(a, b):
def fin(v): # TeX hack: inf = 10000 def fin(v): # TeX hack: inf = 10000
if v == +inf: return +1E4 if v == +inf: return +1E4
...@@ -289,7 +289,7 @@ def Restructure(ztree, newStructure): ...@@ -289,7 +289,7 @@ def Restructure(ztree, newStructure):
return d(a.range.klo, b.range.klo) + \ return d(a.range.klo, b.range.klo) + \
d(a.range.khi, b.range.khi) d(a.range.khi, b.range.khi)
# prepare cost matrix # cost matrix
C = np.zeros((len(RNv), len(RZv))) C = np.zeros((len(RNv), len(RZv)))
for j in range(len(RNv)): # "workers" for j in range(len(RNv)): # "workers"
for i in range(len(RZv)): # "jobs" for i in range(len(RZv)): # "jobs"
...@@ -297,9 +297,9 @@ def Restructure(ztree, newStructure): ...@@ -297,9 +297,9 @@ def Restructure(ztree, newStructure):
# find the assignments. # find the assignments.
# TODO try to avoid scipy dependency; we could also probably make # TODO try to avoid scipy dependency; we could also probably make
# assignments more efficiently taking that Av and Bv are key↑ and the # assignments more efficiently taking into account that Av and Bv are
# property of D function so that if B2 > B1 (all keys in B2 > all keys # key↑ and the property of D function so that if B2 > B1 (all keys in
# in B1) and A < B1.hi, then D(B2, A) > D(B1, A). # B2 > all keys in B1) and A < B1.hi, then D(B2, A) > D(B1, A).
""" """
print() print()
print('COST:') print('COST:')
...@@ -342,33 +342,16 @@ def Restructure(ztree, newStructure): ...@@ -342,33 +342,16 @@ def Restructure(ztree, newStructure):
rbucketv = [] # of _NodeInRange rbucketv = [] # of _NodeInRange
rlevelv_orig = copy.copy(rlevelv) rlevelv_orig = copy.copy(rlevelv)
while len(rlevelv) > 0 or len(zrlevelv) > 0: while len(rlevelv) > 0 or len(zrlevelv) > 0:
if len(rlevelv) == 0: rlevel = []
rlevel = [] zrlevel = []
else: if len(rlevelv) > 0:
rlevel = rlevelv.pop(0) rlevel = rlevelv .pop(0)
if len(zrlevelv) > 0:
if len(zrlevelv) == 0:
zrlevel = []
else:
zrlevel = zrlevelv.pop(0) zrlevel = zrlevelv.pop(0)
# filter-out buckets to be processed in the end # filter-out buckets to be processed in the end
_ = [] # zrlevel -> zrlevel, zrbucketv zrbucketv, zrlevel = _filter2(zrlevel, lambda zrn: isinstance(zrn.node, zbucketType))
for zrn in zrlevel: rbucketv, rlevel = _filter2(rlevel, lambda rn: isinstance(rn.node, Bucket))
assert isinstance(zrn.node, (ztreeType, zbucketType))
if isinstance(zrn.node, zbucketType):
zrbucketv.append(zrn)
else:
_.append(zrn)
zrlevel = _
_ = [] # rlevel -> rlevel, rbucketv
for rn in rlevel:
assert isinstance(rn.node, (Tree, Bucket))
if isinstance(rn.node, Bucket):
rbucketv.append(rn)
else:
_.append(rn)
rlevel = _
if len(rlevel) == 0: if len(rlevel) == 0:
continue continue
...@@ -808,6 +791,16 @@ def _indent(prefix, text): # -> text ...@@ -808,6 +791,16 @@ def _indent(prefix, text): # -> text
text = '\n'.join(textv) text = '\n'.join(textv)
return text return text
# _filter2(l,pred) = filter(l,pred), filter(l,!pred)
def _filter2(l, pred):
t, f = [], []
for _ in l:
if pred(_):
t.append(_)
else:
f.append(_)
return t,f
# _assertIncv asserts that values of vector v are strictly ↑ # _assertIncv asserts that values of vector v are strictly ↑
def _assertIncv(v): def _assertIncv(v):
prev = -inf prev = -inf
......
...@@ -664,3 +664,4 @@ def test_iterSplitByN(): ...@@ -664,3 +664,4 @@ def test_iterSplitByN():
assert X(0,5, 3) == ( [0,1,2,3,5], [0,1,2,4,5], [0,1,3,4,5], [0,2,3,4,5] ) assert X(0,5, 3) == ( [0,1,2,3,5], [0,1,2,4,5], [0,1,3,4,5], [0,2,3,4,5] )
assert X(0,5, 4) == ( [0,1,2,3,4,5], ) assert X(0,5, 4) == ( [0,1,2,3,4,5], )
assert X(0,5, 5) == () assert X(0,5, 5) == ()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment