asigalov61 commited on
Commit
e60072c
·
verified ·
1 Parent(s): cda1d7d

Upload TMIDIX.py

Browse files
Files changed (1) hide show
  1. TMIDIX.py +48 -25
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 = sum(values[i] for i in locked_idx)
13941
  adj_original_sum = sum(values[i] for i in adj_idx)
13942
  adj_target_sum = target_sum - locked_sum
13943
 
13944
- if adj_target_sum < 0:
13945
- print("target_sum is smaller than the sum of locked values")
13946
- return None
 
 
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
- if adj_original_sum == 0:
13956
- base = adj_target_sum // len(adj_idx)
13957
- remainder = adj_target_sum - base * len(adj_idx)
13958
- new_vals = values.copy()
13959
 
13960
- for j, i in enumerate(sorted(adj_idx)):
13961
- add = base + (1 if j >= len(adj_idx) - remainder else 0)
13962
- new_vals[i] = values[i] + add
 
 
 
 
 
13963
 
13964
- return new_vals
13965
 
13966
- factor = adj_target_sum / adj_original_sum
13967
- scaled = {i: values[i] * factor for i in adj_idx}
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 frac, i in fracs[:remainder]:
13980
- floored[i] += 1
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]