teeworlds 2.0.2 → 2.0.5

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.
package/lib/huffman.py DELETED
@@ -1,224 +0,0 @@
1
- # from Ryozuki, found on ddnet discord ( 11.10.2018 )
2
- from typing import List
3
- from sys import argv
4
- FREQ_TABLE = [
5
- 1 << 30, 4545, 2657, 431, 1950, 919, 444, 482, 2244, 617, 838, 542, 715, 1814, 304, 240, 754, 212, 647, 186,
6
- 283, 131, 146, 166, 543, 164, 167, 136, 179, 859, 363, 113, 157, 154, 204, 108, 137, 180, 202, 176,
7
- 872, 404, 168, 134, 151, 111, 113, 109, 120, 126, 129, 100, 41, 20, 16, 22, 18, 18, 17, 19,
8
- 16, 37, 13, 21, 362, 166, 99, 78, 95, 88, 81, 70, 83, 284, 91, 187, 77, 68, 52, 68,
9
- 59, 66, 61, 638, 71, 157, 50, 46, 69, 43, 11, 24, 13, 19, 10, 12, 12, 20, 14, 9,
10
- 20, 20, 10, 10, 15, 15, 12, 12, 7, 19, 15, 14, 13, 18, 35, 19, 17, 14, 8, 5,
11
- 15, 17, 9, 15, 14, 18, 8, 10, 2173, 134, 157, 68, 188, 60, 170, 60, 194, 62, 175, 71,
12
- 148, 67, 167, 78, 211, 67, 156, 69, 1674, 90, 174, 53, 147, 89, 181, 51, 174, 63, 163, 80,
13
- 167, 94, 128, 122, 223, 153, 218, 77, 200, 110, 190, 73, 174, 69, 145, 66, 277, 143, 141, 60,
14
- 136, 53, 180, 57, 142, 57, 158, 61, 166, 112, 152, 92, 26, 22, 21, 28, 20, 26, 30, 21,
15
- 32, 27, 20, 17, 23, 21, 30, 22, 22, 21, 27, 25, 17, 27, 23, 18, 39, 26, 15, 21,
16
- 12, 18, 18, 27, 20, 18, 15, 19, 11, 17, 33, 12, 18, 15, 19, 18, 16, 26, 17, 18,
17
- 9, 10, 25, 22, 22, 17, 20, 16, 6, 16, 15, 20, 14, 18, 24, 335, 1517]
18
-
19
- HUFFMAN_EOF_SYMBOL = 256
20
- HUFFMAN_MAX_SYMBOLS = HUFFMAN_EOF_SYMBOL + 1
21
- HUFFMAN_MAX_NODES = HUFFMAN_MAX_SYMBOLS * 2 - 1
22
- HUFFMAN_LUTBITS = 10
23
- HUFFMAN_LUTSIZE = 1 << HUFFMAN_LUTBITS
24
- HUFFMAN_LUTMASK = HUFFMAN_LUTSIZE - 1
25
-
26
-
27
- class Node:
28
- def __init__(self):
29
- self.bits: int = None
30
- self.numbits: int = None
31
- # Leafs
32
- self.left: int = None
33
- self.right: int = None
34
-
35
- self.symbol: int = None
36
-
37
- def __eq__(self, other):
38
- return self.symbol == other.symbol
39
-
40
-
41
- class HuffmanConstructNode:
42
- def __init__(self):
43
- self.node_id: int = None
44
- self.frequency: int = None
45
-
46
-
47
- class Huffman:
48
- def __init__(self, frequencies: List[int]):
49
- self.nodes: List[Node] = [Node() for _ in range(HUFFMAN_MAX_NODES)]
50
- # list of index of nodes
51
- self.decode_lut: List[int] = [None for _ in range(HUFFMAN_LUTSIZE)]
52
- self.num_nodes: int = None
53
- self.start_node_index: int = None
54
-
55
- self.construct_tree(frequencies)
56
- # print(self.num_nodes, "numnodes")
57
- # print(self.start_node_index, "nodeindex")
58
- # print(len(self.decode_lut), "dcodelut")
59
- xx = 0
60
- for i in range(HUFFMAN_LUTSIZE):
61
- bits = i
62
- broke = False
63
- index = self.start_node_index
64
- for x in range(HUFFMAN_LUTBITS):
65
- if bits & 1:
66
- index = self.nodes[index].right
67
- else:
68
- index = self.nodes[index].left
69
- # print(index)
70
- bits >>= 1
71
-
72
- if self.nodes[index].numbits:
73
- # print(i, bits)
74
- self.decode_lut[i] = index
75
- xx += 1
76
- broke = True
77
- break
78
- if not broke:
79
- self.decode_lut[i] = index
80
- # print(xx, HUFFMAN_LUTSIZE, HUFFMAN_LUTBITS)
81
- def set_bits_r(self, node_index: int, bits: int, depth: int):
82
- if self.nodes[node_index].right != 0xffff:
83
- self.set_bits_r(self.nodes[node_index].right, bits | (1 << depth), depth + 1)
84
- if self.nodes[node_index].left != 0xffff:
85
- self.set_bits_r(self.nodes[node_index].left, bits, depth + 1)
86
-
87
- if self.nodes[node_index].numbits:
88
- self.nodes[node_index].bits = bits
89
- self.nodes[node_index].numbits = depth
90
-
91
- @staticmethod
92
- def bubble_sort(index_list: List[int], node_list: List[HuffmanConstructNode], size: int):
93
- changed = True
94
- while changed:
95
- changed = False
96
- for i in range(size - 1):
97
- if node_list[index_list[i]].frequency < node_list[index_list[i + 1]].frequency:
98
- index_list[i], index_list[i + 1] = index_list[i + 1], index_list[i]
99
- changed = True
100
- size -= 1
101
- return index_list
102
-
103
- def construct_tree(self, frequencies: List[int]):
104
- nodes_left_storage: List[HuffmanConstructNode] = [HuffmanConstructNode() for _ in range(HUFFMAN_MAX_SYMBOLS)]
105
- nodes_left: List[int] = [None for _ in range(HUFFMAN_MAX_SYMBOLS)]
106
- num_nodes_left = HUFFMAN_MAX_SYMBOLS
107
-
108
- for i in range(HUFFMAN_MAX_SYMBOLS):
109
- self.nodes[i].numbits = 0xFFFFFFFF
110
- self.nodes[i].symbol = i
111
- self.nodes[i].left = 0xffff
112
- self.nodes[i].right = 0xffff
113
-
114
- if i == HUFFMAN_EOF_SYMBOL:
115
- nodes_left_storage[i].frequency = 1
116
- else:
117
- nodes_left_storage[i].frequency = frequencies[i]
118
- nodes_left_storage[i].node_id = i
119
- nodes_left[i] = i
120
-
121
- self.num_nodes = HUFFMAN_MAX_SYMBOLS
122
-
123
- while num_nodes_left > 1:
124
- nodes_left = Huffman.bubble_sort(nodes_left, nodes_left_storage, num_nodes_left)
125
-
126
- self.nodes[self.num_nodes].numbits = 0
127
- self.nodes[self.num_nodes].left = nodes_left_storage[nodes_left[num_nodes_left - 1]].node_id
128
- self.nodes[self.num_nodes].right = nodes_left_storage[nodes_left[num_nodes_left - 2]].node_id
129
- nodes_left_storage[nodes_left[num_nodes_left - 2]].node_id = self.num_nodes
130
- nodes_left_storage[nodes_left[num_nodes_left - 2]].frequency = \
131
- nodes_left_storage[nodes_left[num_nodes_left - 1]].frequency \
132
- + nodes_left_storage[nodes_left[num_nodes_left - 2]].frequency
133
- self.num_nodes += 1
134
- num_nodes_left -= 1
135
- self.start_node_index = self.num_nodes - 1
136
- self.set_bits_r(self.start_node_index, 0, 0)
137
-
138
- def compress(self, inp_buffer: bytearray, start_index: int = 0, size: int = None):
139
- output = bytearray()
140
- bits = 0
141
- bitcount = 0
142
-
143
- if size is None:
144
- size = len(inp_buffer)
145
-
146
- for x in inp_buffer[start_index:size:]:
147
- # print(x)
148
- bits |= self.nodes[x].bits << bitcount
149
- bitcount += self.nodes[x].numbits
150
-
151
- while bitcount >= 8:
152
- output.append(bits & 0xff)
153
- bits >>= 8
154
- bitcount -= 8
155
-
156
- bits |= self.nodes[HUFFMAN_EOF_SYMBOL].bits << bitcount
157
- bitcount += self.nodes[HUFFMAN_EOF_SYMBOL].numbits
158
-
159
- while bitcount >= 8:
160
- output.append(bits & 0xff)
161
- bits >>= 8
162
- bitcount -= 8
163
-
164
- # write out last bits
165
- output.append(bits)
166
- return output
167
-
168
- def decompress(self, inp_buffer: bytearray, size: int = None):
169
- bits = 0
170
- bitcount = 0
171
- eof = self.nodes[HUFFMAN_EOF_SYMBOL]
172
- output = bytearray()
173
-
174
- if size is None:
175
- size = len(inp_buffer)
176
-
177
- src_index = 0
178
- while True:
179
- node_i = None
180
- if bitcount >= HUFFMAN_LUTBITS:
181
- node_i = self.decode_lut[bits & HUFFMAN_LUTMASK]
182
- # print("yes im here!", output, node_i, bits & HUFFMAN_LUTMASK)
183
-
184
- while bitcount < 24 and src_index != size:
185
- bits |= inp_buffer[src_index] << bitcount
186
- src_index += 1
187
- bitcount += 8
188
-
189
- # print(self.decode_lut)
190
- if node_i is None:
191
- node_i = self.decode_lut[bits & HUFFMAN_LUTMASK]
192
- if self.nodes[node_i].numbits:
193
- bits >>= self.nodes[node_i].numbits
194
- bitcount -= self.nodes[node_i].numbits
195
- else:
196
- bits >>= HUFFMAN_LUTBITS
197
- bitcount -= HUFFMAN_LUTBITS
198
- # print("yes im here!", output)
199
-
200
- while True:
201
- if bits & 1:
202
- node_i = self.nodes[node_i].right
203
- else:
204
- node_i = self.nodes[node_i].left
205
-
206
- bitcount -= 1
207
- bits >>= 1
208
-
209
- if self.nodes[node_i].numbits:
210
- break
211
-
212
- if bitcount == 0:
213
- raise ValueError("No more bits, decoding error")
214
-
215
- if self.nodes[node_i] == eof:
216
- break
217
- output.append(self.nodes[node_i].symbol)
218
-
219
- return output
220
- huff = Huffman(frequencies=FREQ_TABLE)
221
- if (argv[1] and argv[2] == "-decompress"):
222
- print(list(huff.decompress(bytearray.fromhex(argv[1]))))
223
- elif (argv[1] and argv[2] == "-compress"):
224
- print(list(huff.compress(bytearray.fromhex(argv[1]))))