pd-code-connected-sum 0.0.1__tar.gz → 0.0.3__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pd-code-connected-sum
3
- Version: 0.0.1
3
+ Version: 0.0.3
4
4
  Summary: make connected sum for link pd_code
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -14,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
+ Requires-Dist: pd-code-pre-nxt
17
18
  Requires-Dist: pd-code-sanity
18
19
  Description-Content-Type: text/markdown
19
20
 
@@ -40,7 +41,10 @@ link_pd_code_2 = [[6, 1, 7, 2], [8, 3, 5, 4], [2, 5, 3, 6], [4, 7, 1, 8]]
40
41
  connect_pos_1 = 1
41
42
  connect_pos_2 = 1
42
43
 
43
- print(pd_code_connected_sum.connected_sum(
44
- link_pd_code_1, link_pd_code_2, connect_pos_1, connect_pos_2))
44
+ new_pd_code, num_map = pd_code_connected_sum.connected_sum(
45
+ link_pd_code_1, link_pd_code_2, connect_pos_1, connect_pos_2)
46
+
47
+ print(new_pd_code)
48
+ print(num_map)
45
49
  ```
46
50
 
@@ -21,6 +21,9 @@ link_pd_code_2 = [[6, 1, 7, 2], [8, 3, 5, 4], [2, 5, 3, 6], [4, 7, 1, 8]]
21
21
  connect_pos_1 = 1
22
22
  connect_pos_2 = 1
23
23
 
24
- print(pd_code_connected_sum.connected_sum(
25
- link_pd_code_1, link_pd_code_2, connect_pos_1, connect_pos_2))
24
+ new_pd_code, num_map = pd_code_connected_sum.connected_sum(
25
+ link_pd_code_1, link_pd_code_2, connect_pos_1, connect_pos_2)
26
+
27
+ print(new_pd_code)
28
+ print(num_map)
26
29
  ```
@@ -1,4 +1,5 @@
1
1
  import pd_code_sanity
2
+ import pd_code_pre_nxt
2
3
  import json
3
4
 
4
5
  # 为编码增加前缀
@@ -9,66 +10,6 @@ def add_prefix(pd_code:list[list], prefix:str) -> list[list]:
9
10
  pd_code[i][j] = prefix + str(pd_code[i][j])
10
11
  return json.loads(json.dumps(pd_code))
11
12
 
12
- # 提取原始数值
13
- def get_raw_val(val_in_crs:int|str) -> int:
14
- if isinstance(val_in_crs, str):
15
- return int(val_in_crs.split("_")[-1])
16
- return int(val_in_crs)
17
-
18
- def add_edge(pre:dict, nxt:dict, val1, val2):
19
- raw_val1 = get_raw_val(val1)
20
- raw_val2 = get_raw_val(val2)
21
-
22
- # 记录前后关系
23
- pre_val = -1
24
- nxt_val = -1
25
-
26
- # 确定前后关系
27
- if abs(raw_val1 - raw_val2) == 1:
28
- if raw_val1 < raw_val2:
29
- pre_val = val1
30
- nxt_val = val2
31
- else:
32
- pre_val = val2
33
- nxt_val = val1
34
- else:
35
- if raw_val1 < raw_val2:
36
- pre_val = val2
37
- nxt_val = val1
38
- else:
39
- pre_val = val1
40
- nxt_val = val2
41
-
42
- # 设置 dict 值
43
- pre[nxt_val] = pre_val
44
- nxt[pre_val] = nxt_val
45
-
46
- # 计算 pre 和 nxt
47
- # 没有 r1 crossing 就不会出现混乱
48
- def get_pre_nxt(pd_code:list[list]) -> tuple[dict, dict]:
49
- pre = dict()
50
- nxt = dict()
51
- for crossing in pd_code:
52
- if len(set(crossing)) > 2: # 至少有三个不同的数
53
- add_edge(pre, nxt, crossing[0], crossing[2])
54
- add_edge(pre, nxt, crossing[1], crossing[3])
55
- else:
56
- two_values = list(set(crossing)) # 只有两个不同的数
57
- if len(two_values) != 2:
58
- raise AssertionError()
59
- for i in range(2):
60
- pre[two_values[i]] = two_values[1-i] # 互为前驱后继
61
- nxt[two_values[i]] = two_values[1-i]
62
-
63
- # 获取数值合集
64
- num_set = get_num_set(pd_code)
65
- for num in num_set:
66
- if pre.get(num) is None:
67
- pre[num] = nxt[num]
68
- if nxt.get(num) is None:
69
- nxt[num] = pre[num]
70
- return pre, nxt
71
-
72
13
  # 替换一个值恰好一次
73
14
  def replace_val(crossing:list, val_now:str, val_new:str):
74
15
  cnt = 0
@@ -92,13 +33,7 @@ def check_has2(crossing:list, val1:str, val2:str) -> bool:
92
33
  check_has(crossing, val1) and
93
34
  check_has(crossing, val2))
94
35
 
95
- def get_num_set(pd_code:list[list]):
96
- val_set = set()
97
- for crossing in pd_code:
98
- for term in crossing:
99
- if term not in val_set:
100
- val_set.add(term)
101
- return sorted(list(val_set))
36
+ get_num_set = pd_code_pre_nxt.get_num_set
102
37
 
103
38
  # 按照顺序对循环进行遍历
104
39
  def dfs(val, nxt:dict[str, str], vis: set[int], idx:dict[str, int]):
@@ -149,7 +84,7 @@ def find_avaible_pos(pd_code:list[list], val_now):
149
84
  # 删除 pd_code1 中 val_1 所在的 crossing
150
85
  # 然后把两个扭结直接合并
151
86
  # 然后重新编号
152
- def del_component_and_merge(pd_code1, pd_code2, val_1, val_2) -> list[list]:
87
+ def del_component_and_merge(pd_code1, pd_code2, val_1, val_2) -> tuple[list[list], dict]:
153
88
  suc = False
154
89
  for i in range(len(pd_code1)):
155
90
  if check_has(pd_code1[i], val_1):
@@ -169,8 +104,8 @@ def del_component_and_merge(pd_code1, pd_code2, val_1, val_2) -> list[list]:
169
104
  pd_code2 = add_prefix(pd_code2, "b_")
170
105
 
171
106
  # 计算前驱后继
172
- _, nxt1 = get_pre_nxt(pd_code1)
173
- _, nxt2 = get_pre_nxt(pd_code2)
107
+ _, nxt1 = pd_code_pre_nxt.get_pre_nxt(pd_code1)
108
+ _, nxt2 = pd_code_pre_nxt.get_pre_nxt(pd_code2)
174
109
  nxt = nxt1 | nxt2
175
110
 
176
111
  # 合并得到新的 pd_code
@@ -183,11 +118,11 @@ def del_component_and_merge(pd_code1, pd_code2, val_1, val_2) -> list[list]:
183
118
  if num_map.get(crossing[i]) is None:
184
119
  assert AssertionError()
185
120
  crossing[i] = num_map[crossing[i]]
186
- return sorted(new_pd_code)
121
+ return sorted(new_pd_code), num_map
187
122
 
188
123
  # 将 pd_code1 里面的 val_1 和 pd_code2 里面的 val_2 连接起来
189
124
  def connected_sum(
190
- pd_code1:list[list], pd_code2:list[list], val_1, val_2) -> list[list]:
125
+ pd_code1:list[list], pd_code2:list[list], val_1, val_2) -> tuple[list[list], dict]:
191
126
 
192
127
  # 如果有一个扭结平凡,则不需要连接
193
128
  if pd_code1 == [] or pd_code2 == []:
@@ -261,8 +196,8 @@ def connected_sum(
261
196
 
262
197
  # 由于不存在 nugatory crossing 和 r1 crossing
263
198
  # 所以两侧各有两个相关 crossing
264
- _, nxt1 = get_pre_nxt(pd_code1)
265
- _, nxt2 = get_pre_nxt(pd_code2)
199
+ _, nxt1 = pd_code_pre_nxt.get_pre_nxt(pd_code1)
200
+ _, nxt2 = pd_code_pre_nxt.get_pre_nxt(pd_code2)
266
201
  nxt = nxt1 | nxt2
267
202
 
268
203
  # 带有字母前缀的成分
@@ -300,7 +235,11 @@ def connected_sum(
300
235
  ans_pd_code = sorted(new_pd_code)
301
236
  if not pd_code_sanity.sanity(ans_pd_code):
302
237
  raise AssertionError()
303
- return ans_pd_code
238
+
239
+ return ans_pd_code, num_map
304
240
 
305
241
  if __name__ == "__main__":
306
- print(connected_sum([[1, 2, 2, 1]], [[1, 2, 2, 1]], 1, 1))
242
+ pd_code, num_map = connected_sum(
243
+ [[1, 5, 2, 4], [3, 1, 4, 6], [5, 3, 6, 2]],
244
+ [[1, 5, 2, 4], [3, 1, 4, 6], [5, 3, 6, 2]], 1, 1)
245
+ print(num_map)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pd-code-connected-sum"
3
- version = "0.0.1"
3
+ version = "0.0.3"
4
4
  description = "make connected sum for link pd_code"
5
5
  authors = [
6
6
  {name = "GGN_2015",email = "neko@jlulug.org"}
@@ -9,7 +9,8 @@ license = {text = "MIT"}
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
11
  dependencies = [
12
- "pd-code-sanity"
12
+ "pd-code-sanity",
13
+ "pd-code-pre-nxt"
13
14
  ]
14
15
 
15
16