kevin-toolbox-dev 1.1.2__py3-none-any.whl → 1.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
kevin_toolbox/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "1.1.2"
1
+ __version__ = "1.1.3"
2
2
 
3
3
 
4
4
  import os
@@ -12,5 +12,5 @@ os.system(
12
12
  os.system(
13
13
  f'python {os.path.split(__file__)[0]}/env_info/check_validity_and_uninstall.py '
14
14
  f'--package_name kevin-toolbox-dev '
15
- f'--expiration_timestamp 1703415924 --verbose 0'
15
+ f'--expiration_timestamp 1703667553 --verbose 0'
16
16
  )
@@ -16,7 +16,8 @@ def copy_(var, b_deepcopy=False):
16
16
  return copy.deepcopy(var)
17
17
 
18
18
  return traverse(var=[var], match_cond=lambda _, __, value: isinstance(value, (list, dict,)),
19
- action_mode="replace", converter=lambda _, value: value.copy(), b_traverse_matched_element=True)[0]
19
+ action_mode="replace", converter=lambda _, value: value.copy(),
20
+ traversal_mode="dfs_pre_order", b_traverse_matched_element=True)[0]
20
21
 
21
22
 
22
23
  if __name__ == '__main__':
@@ -1,8 +1,21 @@
1
+ from enum import Enum
1
2
  from kevin_toolbox.computer_science.algorithm.for_nested_dict_list.name_handler import escape_node
2
3
 
3
4
 
5
+ class ACTION_MODE(Enum):
6
+ remove = 1
7
+ replace = 2
8
+ skip = 3
9
+
10
+
11
+ class TRAVERSAL_MODE(Enum):
12
+ dfs_pre_order = 1
13
+ dfs_post_order = 2
14
+ bfs = 3
15
+
16
+
4
17
  def traverse(var, match_cond, action_mode="remove", converter=None,
5
- b_use_name_as_idx=False, b_traverse_matched_element=False):
18
+ b_use_name_as_idx=False, traversal_mode="dfs_pre_order", b_traverse_matched_element=False):
6
19
  """
7
20
  遍历 var 找到符合 match_cond 的元素,将其按照 action_mode 指定的操作进行处理
8
21
 
@@ -27,43 +40,109 @@ def traverse(var, match_cond, action_mode="remove", converter=None,
27
40
  converter: <func> 参见 action_mode 中的 "replace" 模式
28
41
  函数类型为 def(idx, value): ...
29
42
  其中 idx 和 value 的含义参见参数 match_cond 介绍
43
+ traversal_mode: <str> 遍历的模式、顺序
44
+ 目前支持:
45
+ "dfs_pre_order" 深度优先、先序遍历
46
+ "dfs_post_order" 深度优先、后序遍历
47
+ "bfs" 宽度优先
48
+ 默认为 "dfs_pre_order"
30
49
  b_use_name_as_idx: <boolean> 对于 match_cond/converter 中的 idx 参数,是传入整体的 name 还是父节点的 index 或 key。
31
50
  默认为 False
32
51
  b_traverse_matched_element <boolean> 对于匹配上的元素,经过处理后,是否继续遍历该元素的内容
33
52
  默认为 False
34
53
  """
35
54
  assert callable(match_cond)
36
- assert action_mode in {"replace", "remove", "skip"}
37
- if action_mode == "replace":
55
+ assert action_mode in ACTION_MODE.__members__.keys()
56
+ action_mode = ACTION_MODE.__members__[action_mode]
57
+ if action_mode is ACTION_MODE.replace:
38
58
  assert callable(converter)
59
+ #
60
+ assert traversal_mode in TRAVERSAL_MODE.__members__.keys()
61
+ traversal_mode = TRAVERSAL_MODE.__members__[traversal_mode]
39
62
 
40
- return recursive_(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element, "")
63
+ if traversal_mode is TRAVERSAL_MODE.bfs:
64
+ return _bfs(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element)
65
+ else:
66
+ return _dfs(var, match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
67
+ b_traverse_matched_element, "")
68
+
69
+
70
+ def _bfs(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element):
71
+ temp = [("", var)]
41
72
 
73
+ while len(temp):
74
+ pre_name, i = temp.pop(0)
75
+ if isinstance(i, (list, dict)):
76
+ keys = list(range(len(i)) if isinstance(i, list) else i.keys())
77
+ keys.reverse() # 反过来便于 列表 弹出元素
78
+ idx_ls = _gen_idx(i, keys, b_use_name_as_idx, pre_name)
42
79
 
43
- def recursive_(var, match_cond, action_mode, converter, b_use_name_as_idx, b_traverse_matched_element, pre_name):
80
+ # 匹配&处理
81
+ for k, idx in zip(keys, idx_ls):
82
+ b_matched, b_popped = _deal(i, k, idx, match_cond, converter, action_mode)
83
+ if b_popped or (b_matched and not b_traverse_matched_element):
84
+ continue
85
+ # 添加到队尾
86
+ temp.append((idx, i[k]))
87
+
88
+ return var
89
+
90
+
91
+ def _dfs(var, match_cond, action_mode, converter,
92
+ b_use_name_as_idx, traversal_mode, b_traverse_matched_element, pre_name):
44
93
  if isinstance(var, (list, dict)):
45
- items = reversed(list(enumerate(var))) if isinstance(var, list) else list(var.items())
46
- for k, v in items:
47
- if b_use_name_as_idx:
48
- method = "@" if isinstance(var, list) else ":"
49
- idx = f'{pre_name}{method}{escape_node(node=k, b_reversed=False, times=1)}'
50
- else:
51
- idx = k
52
- # 匹配
53
- b_matched = match_cond(type(var), idx, v)
54
- # 处理
55
- if b_matched:
56
- if action_mode == "remove":
57
- var.pop(k)
58
- elif action_mode == "replace":
59
- var[k] = converter(idx, v)
60
- else:
61
- pass
94
+ keys = list(range(len(var)) if isinstance(var, list) else var.keys())
95
+ keys.reverse() # 反过来便于 列表 弹出元素
96
+ idx_ls = _gen_idx(var, keys, b_use_name_as_idx, pre_name)
97
+
98
+ #
99
+ if traversal_mode is TRAVERSAL_MODE.dfs_pre_order:
100
+ # 先序
101
+ # 匹配&处理
102
+ deal_res_ls = []
103
+ for k, idx in zip(keys, idx_ls):
104
+ deal_res_ls.append(_deal(var, k, idx, match_cond, converter, action_mode))
62
105
  # 递归遍历
63
- if b_matched and not b_traverse_matched_element:
64
- continue
65
- var[k] = recursive_(var[k], match_cond, action_mode, converter, b_use_name_as_idx,
66
- b_traverse_matched_element, idx)
106
+ for (b_matched, b_popped), k, idx in zip(deal_res_ls, keys, idx_ls):
107
+ if b_popped or (b_matched and not b_traverse_matched_element):
108
+ continue
109
+ var[k] = _dfs(var[k], match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
110
+ b_traverse_matched_element, idx)
111
+ else:
112
+ # 后序
113
+ # 递归遍历
114
+ for k, idx in zip(keys, idx_ls):
115
+ var[k] = _dfs(var[k], match_cond, action_mode, converter, b_use_name_as_idx, traversal_mode,
116
+ b_traverse_matched_element, idx)
117
+ # 匹配&处理
118
+ for k, idx in zip(keys, idx_ls):
119
+ _deal(var, k, idx, match_cond, converter, action_mode)
67
120
  else:
68
121
  pass
69
122
  return var
123
+
124
+
125
+ def _deal(var, k, idx, match_cond, converter, action_mode):
126
+ """处理节点"""
127
+ # 匹配
128
+ b_matched = match_cond(type(var), idx, var[k])
129
+ b_popped = False
130
+ # 处理
131
+ if b_matched:
132
+ if action_mode is ACTION_MODE.remove:
133
+ var.pop(k)
134
+ b_popped = True
135
+ elif action_mode is ACTION_MODE.replace:
136
+ var[k] = converter(idx, var[k])
137
+ else:
138
+ pass
139
+ return b_matched, b_popped
140
+
141
+
142
+ def _gen_idx(var, keys, b_use_name_as_idx, pre_name):
143
+ if b_use_name_as_idx:
144
+ method = "@" if isinstance(var, list) else ":"
145
+ idx_ls = [f'{pre_name}{method}{escape_node(node=k, b_reversed=False, times=1)}' for k in keys]
146
+ else:
147
+ idx_ls = keys
148
+ return idx_ls
@@ -9,8 +9,12 @@ def eval_references(var, node_s, order, converter_for_ref=None, converter_for_re
9
9
  var:
10
10
  node_s: <dict> 引用节点,parse_references() 返回的结果
11
11
  order: <list of name> 计算顺序,cal_relation_between_references() 返回的结果
12
- converter_for_ref: <callable> 对引用值施加何种处理
13
- 形如 def(idx, v): ... 的函数,其中 idx 是被引用节点的名字,v是其值
12
+ converter_for_ref: <callable> 对被引用节点施加何种处理
13
+ 形如 def(idx, v): ... 的函数,其中 idx 是被引用节点的名字,v是其值,
14
+ 返回的结果将替换掉被引用节点中原来的值。
15
+ 注意:
16
+ - 处理后得到的结果将替换掉原引用节点的值。(重要所以说两次)
17
+ - 当同一节点被多次引用时,仅会被处理、替换一次。
14
18
  converter_for_res: <callable> 对计算结果施加何种处理
15
19
  形如 def(idx, v): ... 的函数,其中 idx 是节点的名字,v是计算结果
16
20
  """
@@ -18,13 +22,18 @@ def eval_references(var, node_s, order, converter_for_ref=None, converter_for_re
18
22
  assert converter_for_ref is None or callable(converter_for_ref)
19
23
  assert converter_for_res is None or callable(converter_for_res)
20
24
 
25
+ processed_ref_nodes = set()
26
+
21
27
  for name in order:
22
28
  details = node_s[name]
23
29
  # 获取依赖值
24
- for k, v in details["paras"].items():
25
- v_new = get_value_by_name(var=var, name=v)
26
- if converter_for_ref is not None:
27
- v_new = converter_for_ref(v, v_new)
30
+ for k, idx in details["paras"].items():
31
+ v_new = get_value_by_name(var=var, name=idx)
32
+ if converter_for_ref is not None and idx not in processed_ref_nodes:
33
+ v_new = converter_for_ref(idx, v_new)
34
+ # 赋值
35
+ set_value_by_name(var=var, name=idx, value=v_new, b_force=False)
36
+ processed_ref_nodes.add(idx)
28
37
  details["paras"][k] = v_new
29
38
  # 计算
30
39
  res = eval(details["expression"], details["paras"])
@@ -2,7 +2,7 @@ import random
2
2
  import torch
3
3
  import numpy as np
4
4
  import copy
5
- from kevin_toolbox.computer_science.algorithm.for_nested_dict_list import set_value_by_name, get_value_by_name
5
+ from kevin_toolbox.computer_science.algorithm.for_nested_dict_list import set_value_by_name, get_value_by_name, traverse
6
6
 
7
7
 
8
8
  class Strategy_Manager:
@@ -20,9 +20,9 @@ class Strategy_Manager:
20
20
  ":lr": {
21
21
  # 当 key 满足 trigger_value 时,将 ":lr" 指向的部分替换为 value
22
22
  0: 0.1,
23
- # 如果是以 <f> 为开头的字符串,则视为函数并将 value 解释为函数执行后的结果
23
+ # 如果是以 <eval> 为开头的字符串,则视为函数并将 value 解释为函数执行后的结果
24
24
  # 函数中 t, p 参数将被分别传入 trigger_value 和 para_value
25
- "<f>lambda t: t%100==0": "<f>lambda p, t: p*0.1",
25
+ "<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
26
26
  },
27
27
  },
28
28
  override=False,
@@ -93,10 +93,11 @@ class Strategy_Manager:
93
93
  300: {
94
94
  ":ratio_ls@1": 1e-5,
95
95
  }, # 在 epoch=300 时,将 ratio_ls[1] 设置为 1e-5
96
- "<f>lambda t: t%100==0": {
97
- ":lr": "<f>lambda p, t: p*0.1",
98
- }, # 当键为 string 且 开头带有 <f> 标记时候,将以函数的方式读取该字符串,
99
- # 并在匹配过程中向该函数输入触发值 t 和当前元素的值 p,当函数返回True视为匹配成功。
96
+ "<eval>lambda t: t%100==0": {
97
+ ":lr": "<eval>lambda p, t: p*0.1",
98
+ }, # 当键为 string 且 开头带有 <eval> 标记时候,将使用 eval() 函数读取该字符串,
99
+ # 当键为 callable 的函数时,在匹配过程中向该函数输入触发值 t 和当前元素的值 p
100
+ # 当函数返回True视为匹配成功。
100
101
  # 比如上式表示的是:每经过 100 epoch,也就是当 epoch%100==0 时,lr 在原来的基础上乘上0.1。
101
102
  # 函数匹配的的优先级低于直接的值匹配。
102
103
  ...
@@ -109,7 +110,7 @@ class Strategy_Manager:
109
110
  "__trigger_name": "epoch",
110
111
  ":lr": {
111
112
  0: 0.1,
112
- "<f>lambda t: t%100==0": "<f>lambda p, t: p*0.1",
113
+ "<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
113
114
  },
114
115
  ":ratio_ls": {
115
116
  0: [1e-3, 1e-2],
@@ -146,6 +147,21 @@ class Strategy_Manager:
146
147
  temp[t_key][p_key] = strategy[p_key][t_key]
147
148
  strategy = temp
148
149
 
150
+ def deal_eval_str(x):
151
+ return eval(x[6:]) if isinstance(x, (str,)) and x.startswith("<eval>") else x
152
+
153
+ # 使用 eval() 读取带 "<eval>" 标签的键or值
154
+ def converter(_, value):
155
+ if isinstance(value, (dict,)):
156
+ res = {deal_eval_str(k): deal_eval_str(v) for k, v in value.items()}
157
+ else:
158
+ res = deal_eval_str(value)
159
+ return res
160
+
161
+ strategy = traverse(var=[strategy], match_cond=lambda _, __, value: isinstance(value, (dict, str,)),
162
+ action_mode="replace", converter=converter, traversal_mode="dfs_post_order",
163
+ b_use_name_as_idx=False, b_traverse_matched_element=True)[0]
164
+
149
165
  # 将策略添加到 database
150
166
  old_strategy = self.database.get(_trigger_name, dict())
151
167
  for t_key, item in strategy.items():
@@ -187,7 +203,7 @@ class Strategy_Manager:
187
203
  action_s = dict() # {p_name: p_value, ...}
188
204
  # 使用匹配函数
189
205
  for key, p_s in strategy.items():
190
- if isinstance(key, (str,)) and key.startswith("<f>") and eval(key[3:])(t_value):
206
+ if callable(key) and key(t_value):
191
207
  action_s.update({i: j for i, j in p_s.items() if i not in action_s})
192
208
  # 直接匹配
193
209
  if t_value in strategy:
@@ -200,9 +216,9 @@ class Strategy_Manager:
200
216
  for t_name, action_s in sorted(action_s_all.items(), key=lambda x: x[0]):
201
217
  t_value = trigger_state[t_name]
202
218
  for name, p_value in copy.deepcopy(action_s):
203
- if isinstance(p_value, (str,)) and p_value.startswith("<f>"):
219
+ if callable(p_value):
204
220
  raw_value = get_value_by_name(var=var, name=name)
205
- p_value = eval(p_value[3:])(raw_value, t_value)
221
+ p_value = p_value(raw_value, t_value)
206
222
  set_value_by_name(var=var, name=name, value=p_value)
207
223
 
208
224
  return var, action_s_all
@@ -217,7 +233,7 @@ if __name__ == '__main__':
217
233
  "__trigger_name": "epoch",
218
234
  ":lr": {
219
235
  # 0: 0.1,
220
- "<f>lambda t: t%100==0": "<f>lambda p, t: p*0.1",
236
+ "<eval>lambda t: t%100==0": "<eval>lambda p, t: p*0.1",
221
237
  },
222
238
  })
223
239
  sm.add(strategy={
@@ -230,8 +246,8 @@ if __name__ == '__main__':
230
246
  300: {
231
247
  ":ratio_ls@1": 1e-5,
232
248
  },
233
- # "<f>lambda t: t%100==0": {
234
- # ":lr": "<f>lambda p, t: p*0.1",
249
+ # "<eval>lambda t: t%100==0": {
250
+ # ":lr": "<eval>lambda p, t: p*0.1",
235
251
  # },
236
252
  }, override=False)
237
253
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kevin-toolbox-dev
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Summary: 一个常用的工具代码包集合
5
5
  Home-page: https://github.com/cantbeblank96/kevin_toolbox
6
6
  Download-URL: https://github.com/username/your-package/archive/refs/tags/v1.0.0.tar.gz
@@ -50,26 +50,14 @@ pip install kevin-toolbox --no-dependencies
50
50
 
51
51
  [版本更新记录](./notes/Release_Record.md):
52
52
 
53
- - v 1.1.2(2023-06-27)【bug fix】
54
-
53
+ - v 1.1.3(2023-06-30)
55
54
  - computer_science.algorithm.for_nested_dict_list
56
- - 改进 get_value_by_name()
57
- - 新增了参数 b_pop 用于支持取值的同时将该值从 var 中移除
58
- - 新增了参数 default 用于设置取值失败时是报错还是返回默认值
59
- - computer_science.algorithm.registration
60
- - Registry
61
- - 【bug fix】修复了问题:当已有实例的 uid 为正整数 n,同时 cls.__counter 为 n 时,不指定 uid 再创建实例将错误地返回 uid=n 的已有实例而不是新建一个。
62
- - 将 self.pop() 函数的功能合并到 self.get(... ,b_pop=...) 中
55
+ - traverse() 中新增了traversal_mode 参数用于控制遍历的顺序,目前支持三种模式: "dfs_pre_order" 深度优先-先序遍历、"dfs_post_order" 深度优先-后序遍历、以及 "bfs" 宽度优先。
56
+ - 在单元测试中新增了对 traverse() traversal_mode 参数的测试项目。
57
+ - value_parser
58
+ - 修改 eval_references() 中 converter_for_ref 参数的行为,从原来只是作为计算结果前对算式中引用节点值的预处理,变成直接改变被引用节点的值。亦即原来不会修改原被引用节点的值,现在变为会修改原节点的值了。
63
59
  - computer_science.algorithm.scheduler
64
- - 改进 Trigger
65
- - 使用 Registry 来管理触发目标
66
- - 新增 self.unbind() 函数来解除绑定
67
- - 在 update_by_state() 中新增了 target_names 参数来决定调用哪些目标
68
- - 新增 Trigger 的状态管理相关函数
69
- - self.clear_state_dict(): 清除 Trigger 中保存的状态
70
- - self.load_state_dict(): 加载
71
- - self.state_dict(): 获取
72
- - load_state_dict 和 state_dict 的接口名称是为了和 pytorch 中模型、优化器的状态加载、获取保持一致。
73
-
74
-
75
-
60
+ - 改进 Strategy_Manager
61
+ - 使用 `<eval>` 来标记需要使用 eval() 函数读取的字符串。相对于旧版通过 `<eval>` 来标记需要被读取为函数的字符串,使用 `<eval>` 不仅可以读取函数,也可以读取更多的数据结构。
62
+ - 在通过 add() 添加策略时即对 strategy 中被 `<eval>` 标记的键值进行解释,而非等到后续每次 cal() 时再进行解释,提高了效率。
63
+ - 修改了对应的单元测试。
@@ -1,4 +1,4 @@
1
- kevin_toolbox/__init__.py,sha256=Uxqn69hN-4zRQm_bQT-HIU11b0-JLq2tRoC4sv1ghKg,410
1
+ kevin_toolbox/__init__.py,sha256=vAS6Ot-u8d3-594niDe3hf21gjSztypz4qspgIG4jNU,410
2
2
  kevin_toolbox/computer_science/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  kevin_toolbox/computer_science/algorithm/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
4
4
  kevin_toolbox/computer_science/algorithm/combinatorial_optimization/__init__.py,sha256=fBMX0_WiV8kfHLWZNfVe2uL67gsN_oHfpbuHaHUOiys,142
@@ -10,20 +10,20 @@ kevin_toolbox/computer_science/algorithm/combinatorial_optimization/test/test_ze
10
10
  kevin_toolbox/computer_science/algorithm/for_dict/__init__.py,sha256=YFxhbWIsOMGf7ay3fh0sosvXzpuqQQC1bkXK75LAqO4,37
11
11
  kevin_toolbox/computer_science/algorithm/for_dict/deep_update.py,sha256=_1GL8-zY1t48rp3N_SiirjYPzLwQSN_cpmzLKymOnQI,666
12
12
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/__init__.py,sha256=tOEHNkIRhCMTjAaNNjn_Wa6FXNvQTyNC2erJN0rpLkw,273
13
- kevin_toolbox/computer_science/algorithm/for_nested_dict_list/copy_.py,sha256=NQp6sq2yPJQ--PfV9vgtIMkgjRNmGk1gtpKAn-dRYsc,887
13
+ kevin_toolbox/computer_science/algorithm/for_nested_dict_list/copy_.py,sha256=vOHiHg8UHnETy5e3hODzSnGHGMlxcFml4Q1qbX88aEI,939
14
14
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/count_leaf_node_nums.py,sha256=CY9fXmdkwWqHwP62LyxCp7uqt5OMNcSm1zD4s4Ol_x0,645
15
15
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_hash.py,sha256=Ygadnn5dnvIeE-9t39p2EwNKNRLzomL37ZsRD5daXxo,1286
16
16
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_nodes.py,sha256=tpRAE3p_ER9Kj4GwP7ub_ZYm_qITRxAzom2t2EHUyms,3543
17
17
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/get_value_by_name.py,sha256=MlpfZrr95VrZgKpjV_CtJSc7LG1l79_5JUJ6_phwVxo,2122
18
18
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/set_value_by_name.py,sha256=aFZL5P9C3kbJEfNBNgr760B7mYWSunirjTU-EpglGbk,2875
19
- kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py,sha256=mBWHsEKYRGqEeQ1h6fD6FbwW_UO67GOARS33wB_GhuI,3951
19
+ kevin_toolbox/computer_science/algorithm/for_nested_dict_list/traverse.py,sha256=3g--9_icGWN2CuXu1qXyzsCxovf0UymutD3_C2DJkP4,6889
20
20
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/__init__.py,sha256=P_pWq78oN6NdvWg2h6AduW_sUqbeaaVyoWWbW9kbgmU,107
21
21
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/build_name.py,sha256=63xfhk1-lUButEdn76I32Sx-osvKF8A8KJBNylA2QBI,1051
22
22
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/escape_node.py,sha256=niT9MxmsyrSZYhKXlWzdoKXVYhWRCR-kmQBkZopznpA,1163
23
23
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/name_handler/parse_name.py,sha256=bk1vdBIX07Nu52hd805GqIWj51vnaJiq-owBAJGP-O4,2350
24
24
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/__init__.py,sha256=9Z-zlaCakJsb8oB_ZpzUGxdH743gmoXrwJJCTP1viLY,169
25
25
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/cal_relation_between_references.py,sha256=csxrOB_QZIOlTJo9-buBOkEwyE2mGRbq2_dzvXwkNjs,3181
26
- kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/eval_references.py,sha256=XWApZnrMaS8HEZ4UOb1J41BW9DkIwJgqhqoDK8BFC0w,1737
26
+ kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/eval_references.py,sha256=Dx4tAu51wRqTTQlYOw2NrGszxPnMukbIDbXY74P-CIc,2372
27
27
  kevin_toolbox/computer_science/algorithm/for_nested_dict_list/value_parser/parse_references.py,sha256=SYmJSC8IO-6VlCT1BlM9924kEuRbO4rGEN8hpPjlDhc,2155
28
28
  kevin_toolbox/computer_science/algorithm/for_seq/__init__.py,sha256=qXNVulpOBOWlD2yJ9L4D5bfrNFmnBd29ibtUbvaJHYk,76
29
29
  kevin_toolbox/computer_science/algorithm/for_seq/flatten_list.py,sha256=XnDq-_nQln55vwpAnBslyOKI_KYq11C7PmfLChhSe0k,1046
@@ -35,7 +35,7 @@ kevin_toolbox/computer_science/algorithm/pareto_front/get_pareto_points_idx.py,s
35
35
  kevin_toolbox/computer_science/algorithm/registration/__init__.py,sha256=teEd9HkrB6baLpwNwae5c4wn0QRwV3KtBv-2V9-Z7cc,49
36
36
  kevin_toolbox/computer_science/algorithm/registration/registry.py,sha256=Luz48VmqS8BR8sjwQrfHnI0biAYv06rG8ZyXTskPvfA,13567
37
37
  kevin_toolbox/computer_science/algorithm/scheduler/__init__.py,sha256=ENzZsNaMu6ISilTxeE3_EP_L0dNi8SI7IYdTdxic2nw,76
38
- kevin_toolbox/computer_science/algorithm/scheduler/strategy_manager.py,sha256=yVOLk_k-V_RN7GMTx2-fL4eXbHa-DQDnIbmbpvGamyc,11495
38
+ kevin_toolbox/computer_science/algorithm/scheduler/strategy_manager.py,sha256=nzKLaKOmIAc6Hrm1O6KAm49yvJtIWMUY-gaswslkIb4,12265
39
39
  kevin_toolbox/computer_science/algorithm/scheduler/trigger.py,sha256=WDkM635xcB3ZoPzOCJUwLHju22Fuji7PA7xCx-ZQLOI,4508
40
40
  kevin_toolbox/computer_science/algorithm/search/__init__.py,sha256=zja7FXLTNd2dSVzzGp1TbBp4i3TDY8S9tcJ9pqc684A,41
41
41
  kevin_toolbox/computer_science/algorithm/search/binary_search.py,sha256=FcOdgxfuNews_AhPF_CoQDr2vBPqpUpifF7Fmgml1p4,1013
@@ -223,7 +223,7 @@ kevin_toolbox/patches/for_torch/math/get_y_at_x.py,sha256=bfoVcasZ_tMdhR_1Me0Jli
223
223
  kevin_toolbox/patches/for_torch/math/my_around.py,sha256=ptpU3ids50gwf663EpHbw7raj9tNrDGBFZ5t_uMNH14,1378
224
224
  kevin_toolbox/patches/for_torch/nn/__init__.py,sha256=aJs3RMqRzQmd8KKDmQW9FxwCqS5yfPqEdg-m0PwlQro,39
225
225
  kevin_toolbox/patches/for_torch/nn/lambda_layer.py,sha256=KUuLiX_Dr4bvRmpAaCW5QTDWDcnMPRnw0jg4NNXTFhM,223
226
- kevin_toolbox_dev-1.1.2.dist-info/METADATA,sha256=qDJuuM-xBgSWgcwL_plh-ZqcYfjDij7F8E3qdoNk_-c,2489
227
- kevin_toolbox_dev-1.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
228
- kevin_toolbox_dev-1.1.2.dist-info/top_level.txt,sha256=S5TeRGF-PwlhsaUEPTI-f2vWrpLmh3axpyI6v-Fi75o,14
229
- kevin_toolbox_dev-1.1.2.dist-info/RECORD,,
226
+ kevin_toolbox_dev-1.1.3.dist-info/METADATA,sha256=-D6TRFBMXRFA2QT9wyr4Zz4sF5TrKmGrKs8gIPHEI24,2494
227
+ kevin_toolbox_dev-1.1.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
228
+ kevin_toolbox_dev-1.1.3.dist-info/top_level.txt,sha256=S5TeRGF-PwlhsaUEPTI-f2vWrpLmh3axpyI6v-Fi75o,14
229
+ kevin_toolbox_dev-1.1.3.dist-info/RECORD,,