Spaces:
Sleeping
Sleeping
Upload TMIDIX.py
Browse files
TMIDIX.py
CHANGED
|
@@ -13934,52 +13934,75 @@ def chunk_by_threshold_mode(nums, threshold=0, normalize=False):
|
|
| 13934 |
def proportional_adjust(values, target_sum, threshold):
|
| 13935 |
|
| 13936 |
n = len(values)
|
|
|
|
|
|
|
|
|
|
| 13937 |
locked_idx = [i for i, v in enumerate(values) if v < threshold]
|
| 13938 |
adj_idx = [i for i in range(n) if i not in locked_idx]
|
| 13939 |
|
| 13940 |
-
locked_sum
|
| 13941 |
adj_original_sum = sum(values[i] for i in adj_idx)
|
| 13942 |
adj_target_sum = target_sum - locked_sum
|
| 13943 |
|
| 13944 |
-
|
| 13945 |
-
|
| 13946 |
-
|
|
|
|
|
|
|
| 13947 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13948 |
if not adj_idx:
|
| 13949 |
if locked_sum == target_sum:
|
| 13950 |
return values.copy()
|
| 13951 |
-
|
| 13952 |
-
print("no entries >= threshold to adjust, but sums differ")
|
| 13953 |
-
return None
|
| 13954 |
|
| 13955 |
-
|
| 13956 |
-
|
| 13957 |
-
|
| 13958 |
-
|
| 13959 |
|
| 13960 |
-
|
| 13961 |
-
|
| 13962 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13963 |
|
| 13964 |
-
return
|
| 13965 |
|
| 13966 |
-
|
| 13967 |
-
scaled = {i: values[i] *
|
| 13968 |
floored = {i: math.floor(scaled[i]) for i in adj_idx}
|
| 13969 |
floor_sum = sum(floored.values())
|
|
|
|
| 13970 |
|
| 13971 |
-
remainder = adj_target_sum - floor_sum
|
| 13972 |
-
|
| 13973 |
fracs = sorted(
|
| 13974 |
((scaled[i] - floored[i], i) for i in adj_idx),
|
| 13975 |
-
key=lambda x: (x[0], x[1]),
|
| 13976 |
reverse=True
|
| 13977 |
)
|
| 13978 |
-
|
| 13979 |
-
for
|
| 13980 |
-
floored[
|
| 13981 |
-
|
| 13982 |
-
result = values.copy()
|
| 13983 |
|
| 13984 |
for i in adj_idx:
|
| 13985 |
result[i] = floored[i]
|
|
|
|
| 13934 |
def proportional_adjust(values, target_sum, threshold):
|
| 13935 |
|
| 13936 |
n = len(values)
|
| 13937 |
+
if n == 0:
|
| 13938 |
+
return []
|
| 13939 |
+
|
| 13940 |
locked_idx = [i for i, v in enumerate(values) if v < threshold]
|
| 13941 |
adj_idx = [i for i in range(n) if i not in locked_idx]
|
| 13942 |
|
| 13943 |
+
locked_sum = sum(values[i] for i in locked_idx)
|
| 13944 |
adj_original_sum = sum(values[i] for i in adj_idx)
|
| 13945 |
adj_target_sum = target_sum - locked_sum
|
| 13946 |
|
| 13947 |
+
def _proportional_scale(idxs, original, target):
|
| 13948 |
+
|
| 13949 |
+
scaled_vals = {i: original[i] * (target / sum(original[i] for i in idxs))
|
| 13950 |
+
if sum(original[i] for i in idxs) > 0 else 0
|
| 13951 |
+
for i in idxs}
|
| 13952 |
|
| 13953 |
+
floored = {i: math.floor(scaled_vals[i]) for i in idxs}
|
| 13954 |
+
rem = target - sum(floored.values())
|
| 13955 |
+
|
| 13956 |
+
fracs = sorted(
|
| 13957 |
+
((scaled_vals[i] - floored[i], i) for i in idxs),
|
| 13958 |
+
key=lambda x: (x[0], -x[1]),
|
| 13959 |
+
reverse=True
|
| 13960 |
+
)
|
| 13961 |
+
|
| 13962 |
+
for _, idx in fracs[:rem]:
|
| 13963 |
+
floored[idx] += 1
|
| 13964 |
+
|
| 13965 |
+
result = original.copy()
|
| 13966 |
+
|
| 13967 |
+
for i in idxs:
|
| 13968 |
+
result[i] = floored[i]
|
| 13969 |
+
|
| 13970 |
+
return result
|
| 13971 |
+
|
| 13972 |
if not adj_idx:
|
| 13973 |
if locked_sum == target_sum:
|
| 13974 |
return values.copy()
|
|
|
|
|
|
|
|
|
|
| 13975 |
|
| 13976 |
+
return _proportional_scale(locked_idx, values, target_sum)
|
| 13977 |
+
|
| 13978 |
+
if adj_target_sum < 0:
|
| 13979 |
+
return _proportional_scale(range(n), values, target_sum)
|
| 13980 |
|
| 13981 |
+
if adj_original_sum == 0:
|
| 13982 |
+
base = adj_target_sum // len(adj_idx)
|
| 13983 |
+
rem = adj_target_sum - base * len(adj_idx)
|
| 13984 |
+
result = values.copy()
|
| 13985 |
+
|
| 13986 |
+
for j, idx in enumerate(sorted(adj_idx)):
|
| 13987 |
+
increment = base + (1 if j < rem else 0)
|
| 13988 |
+
result[idx] = values[idx] + increment
|
| 13989 |
|
| 13990 |
+
return result
|
| 13991 |
|
| 13992 |
+
result = values.copy()
|
| 13993 |
+
scaled = {i: values[i] * (adj_target_sum / adj_original_sum) for i in adj_idx}
|
| 13994 |
floored = {i: math.floor(scaled[i]) for i in adj_idx}
|
| 13995 |
floor_sum = sum(floored.values())
|
| 13996 |
+
rem = adj_target_sum - floor_sum
|
| 13997 |
|
|
|
|
|
|
|
| 13998 |
fracs = sorted(
|
| 13999 |
((scaled[i] - floored[i], i) for i in adj_idx),
|
| 14000 |
+
key=lambda x: (x[0], -x[1]),
|
| 14001 |
reverse=True
|
| 14002 |
)
|
| 14003 |
+
|
| 14004 |
+
for _, idx in fracs[:rem]:
|
| 14005 |
+
floored[idx] += 1
|
|
|
|
|
|
|
| 14006 |
|
| 14007 |
for i in adj_idx:
|
| 14008 |
result[i] = floored[i]
|