Skip to content

Commit 402ab56

Browse files
committed
Generator: Avoid recursive functions in defrag, should fix #78
1 parent cb2a467 commit 402ab56

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

exllamav3/generator/pagetable.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,23 @@ def measure(p):
510510
p.longest_chain += max([measure(pc) for pc in p.children])
511511
return p.longest_chain
512512

513+
def measure_iterative(root):
514+
stack = [(root, False)]
515+
while stack:
516+
node, visited = stack.pop()
517+
if not visited:
518+
stack.append((node, True))
519+
for child in node.children:
520+
stack.append((child, False))
521+
else:
522+
if node.children:
523+
node.longest_chain = 1 + max(child.longest_chain for child in node.children)
524+
else:
525+
node.longest_chain = 1
526+
return root.longest_chain
527+
513528
for page in root_pages:
514-
measure(page)
529+
measure_iterative(page)
515530

516531
# Recursively sort branches by length
517532
def sort_seq(p):
@@ -520,8 +535,16 @@ def sort_seq(p):
520535
for pc in p.children:
521536
sort_seq(pc)
522537

538+
def sort_seq_iterative(root):
539+
stack = [root]
540+
while stack:
541+
node = stack.pop()
542+
if len(node.children) > 1:
543+
node.children = sorted(node.children, key = lambda x: x.longest_chain, reverse = True)
544+
stack.extend(node.children)
545+
523546
for page in root_pages:
524-
sort_seq(page)
547+
sort_seq_iterative(page)
525548

526549
# Process roots in order of increasing age
527550
root_pages = sorted(root_pages, key = lambda x: x.access_serial)

0 commit comments

Comments
 (0)