Method: rich._ratio.ratio_distribute
Calls: 41, Exceptions: 0, Paths: 3Back
Path 1: 29 calls (0.71)
92 (11) 93 (4) 59 (3) 100 (2) 86 (2) 85 (2) 75 (1) 35 (1) 20 (1) 23 (1)
[1] (22) [1, 1] (6) [1, 3] (1)
[2] (20) [3, 3] (6) [3] (2) [1, 1] (1)
[92] (11) [93] (4) [59] (3) [50, 50] (2) [43, 43] (2) [43, 42] (2) [75] (1) [35] (1) [20] (1) [23] (1)
1def ratio_distribute(
2 total: int, ratios: List[int], minimums: Optional[List[int]] = None
3) -> List[int]:
4 """Distribute an integer total in to parts based on ratios.
5
6 Args:
7 total (int): The total to divide.
8 ratios (List[int]): A list of integer ratios.
9 minimums (List[int]): List of minimum values for each slot.
10
11 Returns:
12 List[int]: A list of integers guaranteed to sum to total.
13 """
14 if minimums:
15 ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
16 total_ratio = sum(ratios)
17 assert total_ratio > 0, "Sum of ratios must be > 0"
18
19 total_remaining = total
20 distributed_total: List[int] = []
21 append = distributed_total.append
22 if minimums is None:
23 _minimums = [0] * len(ratios)
24 else:
25 _minimums = minimums
26 for ratio, minimum in zip(ratios, _minimums):
27 if total_ratio > 0:
28 distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
29 else:
30 distributed = total_remaining
31 append(distributed)
32 total_ratio -= ratio
33 total_remaining -= distributed
34 return distributed_total
Path 2: 11 calls (0.27)
12 (2) 23 (2) 10 (2) 17 (1) 2 (1) 7 (1) 11 (1) 0 (1)
[22, 17, 5] (3) [5] (2) [1, 3] (2) [6, 6] (1) [20, 15, 3, 8] (1) [1] (1) [1, 1] (1)
None (11)
[23] (2) [9, 8] (1) [6, 5, 1] (1) [1, 1, 0] (1) [4, 3, 0] (1) [5, 4, 1, 1] (1) [10] (1) [5, 5] (1) [3, 9] (1) [0, 0] (1)
1def ratio_distribute(
2 total: int, ratios: List[int], minimums: Optional[List[int]] = None
3) -> List[int]:
4 """Distribute an integer total in to parts based on ratios.
5
6 Args:
7 total (int): The total to divide.
8 ratios (List[int]): A list of integer ratios.
9 minimums (List[int]): List of minimum values for each slot.
10
11 Returns:
12 List[int]: A list of integers guaranteed to sum to total.
13 """
14 if minimums:
15 ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
16 total_ratio = sum(ratios)
17 assert total_ratio > 0, "Sum of ratios must be > 0"
18
19 total_remaining = total
20 distributed_total: List[int] = []
21 append = distributed_total.append
22 if minimums is None:
23 _minimums = [0] * len(ratios)
24 else:
25 _minimums = minimums
26 for ratio, minimum in zip(ratios, _minimums):
27 if total_ratio > 0:
28 distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
29 else:
30 distributed = total_remaining
31 append(distributed)
32 total_ratio -= ratio
33 total_remaining -= distributed
34 return distributed_total
Path 3: 1 calls (0.02)
10 (1)
[1, 0] (1)
None (1)
[10, 0] (1)
1def ratio_distribute(
2 total: int, ratios: List[int], minimums: Optional[List[int]] = None
3) -> List[int]:
4 """Distribute an integer total in to parts based on ratios.
5
6 Args:
7 total (int): The total to divide.
8 ratios (List[int]): A list of integer ratios.
9 minimums (List[int]): List of minimum values for each slot.
10
11 Returns:
12 List[int]: A list of integers guaranteed to sum to total.
13 """
14 if minimums:
15 ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)]
16 total_ratio = sum(ratios)
17 assert total_ratio > 0, "Sum of ratios must be > 0"
18
19 total_remaining = total
20 distributed_total: List[int] = []
21 append = distributed_total.append
22 if minimums is None:
23 _minimums = [0] * len(ratios)
24 else:
25 _minimums = minimums
26 for ratio, minimum in zip(ratios, _minimums):
27 if total_ratio > 0:
28 distributed = max(minimum, ceil(ratio * total_remaining / total_ratio))
29 else:
30 distributed = total_remaining
31 append(distributed)
32 total_ratio -= ratio
33 total_remaining -= distributed
34 return distributed_total