optimization, more tests

This commit is contained in:
Will McGugan
2022-02-19 11:39:11 +00:00
parent 1b50d77aaf
commit 06485495d4
2 changed files with 25 additions and 3 deletions

View File

@@ -58,18 +58,18 @@ def layout_resolve(total: int, edges: Sequence[Edge]) -> list[int]:
for size, edge in zip(sizes, edges)
]
total_flexible = sum((edge.fraction or 1) for _, edge in flexible_edges)
_Fraction = Fraction
while flexible_edges:
# Calculate number of characters in a ratio portion
portion = _Fraction(
remaining, sum((edge.fraction or 1) for _, edge in flexible_edges)
)
portion = _Fraction(remaining, total_flexible)
# If any edges will be less than their minimum, replace size with the minimum
for flexible_index, (index, edge) in enumerate(flexible_edges):
if portion * edge.fraction <= edge.min_size:
sizes[index] = edge.min_size
remaining -= edge.min_size
total_flexible -= edge.fraction
del flexible_edges[flexible_index]
# New fixed size will invalidate calculations, so we need to repeat the process
break

View File

@@ -64,6 +64,28 @@ def test_two():
[5, 2, 1, 2],
),
(2, [Edge(None, 1), Edge(None, 1), Edge(None, 1)], [1, 1, 1]),
(
2,
[
Edge(None, 1, min_size=5),
Edge(None, 1, min_size=4),
Edge(None, 1, min_size=3),
],
[5, 4, 3],
),
(
18,
[
Edge(None, 1, min_size=1),
Edge(3),
Edge(None, 1, min_size=1),
Edge(4),
Edge(None, 1, min_size=1),
Edge(5),
Edge(None, 1, min_size=1),
],
[1, 3, 2, 4, 1, 5, 2],
),
],
)
def test_multiple(size, edges, result):