bool-hybrid-array 9.11.8__py3-none-any.whl → 9.11.10__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.
bool_hybrid_array/core.py CHANGED
@@ -7,7 +7,7 @@ except:
7
7
  import builtins
8
8
  from types import MappingProxyType
9
9
  import array,bisect,numpy as np
10
- from collections.abc import MutableSequence,Iterable,Generator,Iterator,Sequence
10
+ from collections.abc import MutableSequence,Iterable,Generator,Iterator,Sequence,Collection
11
11
  import itertools,copy,sys,math,weakref,random,mmap,os
12
12
  from functools import reduce
13
13
  import operator,ctypes,gc,abc,types
@@ -329,7 +329,7 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):# type:
329
329
  return f"BoolHybridArr([{','.join(map(str,self))}])"
330
330
  def __reversed__(self):
331
331
  if not self:return BHA_Iterator([])
332
- return BHA_Iterator(map(self.__getitem__,range(-1,-1,-1)))
332
+ return BHA_Iterator(map(self.__getitem__,range(self.size-1,-1,-1)))
333
333
  def insert(self, key: int, value: Any) -> None:
334
334
  value = bool(value)
335
335
  key = key if key >= 0 else key + self.size
@@ -766,7 +766,7 @@ class ProtectedBuiltinsDict(dict,metaclass=ResurrectMeta):# type: ignore
766
766
  "TruesArray", "FalsesArray", "ProtectedBuiltinsDict", "builtins",
767
767
  "__builtins__", "__dict__","ResurrectMeta","math",
768
768
  "np","protected_names","BHA_Function",
769
- "__class__","Ask_BHA","Create_BHA","Ask_arr","numba_opt","bool_hybrid_array"),
769
+ "__class__","Ask_BHA","Create_BHA","Ask_arr","numba_opt","bool_hybrid_array","BHA_Queue","cin","cout","endl"),
770
770
  name = 'builtins', **kwargs):
771
771
  super().__init__(*args, **kwargs)
772
772
  if name == 'builtins':
@@ -867,7 +867,7 @@ def Ask_BHA(path):
867
867
  if len(temp) == 1:
868
868
  return temp[0]
869
869
  return temp
870
- class BHA_Queue:
870
+ class BHA_Queue(Collection,metaclass = ResurrectMeta):
871
871
  def __init__(self,data = (),*a,**k):
872
872
  self.a = BoolHybridArr(data,*a,**k)
873
873
  self.b = BoolHybridArr([],*a,**k)
@@ -878,12 +878,11 @@ class BHA_Queue:
878
878
  self.a.push(v)
879
879
  def dequeue(self):
880
880
  if self.b:
881
- print("正常执行")
882
881
  return self.b.pop()
883
882
  elif self.a:
884
- tmp = self.a[::-1]
885
- self.b.split_index,self.b.large,self.b.small,self.b.is_sparse = tmp.split_index,tmp.large,tmp.small,tmp.is_sparse
886
- print(f"self.b:{self.b}")
883
+ Type = self.b.Type
884
+ self.b = BoolHybridArr(reversed(self.a))
885
+ self.b.Type = Type
887
886
  self.a.clear()
888
887
  return self.dequeue()
889
888
  else:
@@ -935,6 +934,7 @@ def numba_opt():
935
934
  ])
936
935
  bisect.bisect_left = numba.njit(sig, cache=True)(bisect.bisect_left)
937
936
  bisect.bisect_right = numba.njit(sig, cache=True)(bisect.bisect_right)
937
+ from ._cppiostream import cin,cout,endl
938
938
  builtins.np = np
939
939
  builtins.T = BHA_bool(1)
940
940
  builtins.F = BHA_bool(0)
@@ -952,6 +952,10 @@ builtins.BHA_Function = BHA_Function
952
952
  builtins.Ask_BHA = Ask_BHA
953
953
  builtins.Create_BHA = Create_BHA
954
954
  builtins.numba_opt = numba_opt
955
+ builtins.cin = cin
956
+ builtins.cout = cout
957
+ builtins.endl = endl
958
+ builtins.BHA_Queue = BHA_Queue
955
959
  Tid,Fid = id(builtins.T),id(builtins.F)
956
960
  original_id = builtins.id
957
961
  def fake_id(obj):
@@ -1,155 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
- from __future__ import annotations
3
- from ..core import *
4
- import builtins
5
- class IntBitTag(BHA_bool, metaclass=ResurrectMeta):
6
- def __str__(self):
7
- return "'-1'" if (hasattr(self, 'is_sign_bit') and self.is_sign_bit and self) else "'1'" if self else "'0'"
8
- __repr__ = __str__
9
- __del__ = lambda self:self
10
- class IntHybridArray(BoolHybridArray):
11
- def __init__(self, int_array: list[int], bit_length: int = 8):
12
- self.bit_length = bit_length
13
- bool_data = []
14
- max_required_bits = 1
15
- for num in int_array:
16
- if num == 0:
17
- required_bits = 1
18
- else:
19
- abs_num = abs(num)
20
- num_bits_needed = abs_num.bit_length()
21
- required_bits = 1 + num_bits_needed
22
- if required_bits > max_required_bits:
23
- max_required_bits = required_bits
24
- self.bit_length = max_required_bits
25
- for num in int_array:
26
- if num >= 0:
27
- sign_bit = False
28
- num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
29
- else:
30
- sign_bit = True
31
- abs_num = abs(num)
32
- num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
33
- carry = 1
34
- for j in range(len(num_bits)):
35
- if carry:
36
- num_bits[j] = not num_bits[j]
37
- carry = 0 if num_bits[j] else 1
38
- bool_data.append(sign_bit)
39
- bool_data.extend(num_bits)
40
- self.total_bits = len(bool_data)
41
- super().__init__(0, self.total_bits, False, IntBitTag, False)
42
- for idx in range(self.total_bits):
43
- if idx < self.size:
44
- super().__setitem__(idx, bool_data[idx])
45
- else:
46
- super().append(bool_data[idx])
47
- for i in range(0, self.total_bits, self.bit_length):
48
- if i < self.size:
49
- bit_tag = super().__getitem__(i)
50
- bit_tag.is_sign_bit = True
51
-
52
- def to_int(self, bit_chunk):
53
- sign_bit = bit_chunk[0].value
54
- num_bits = [bit.value for bit in bit_chunk[1:]]
55
- if not sign_bit:
56
- num = 0
57
- for j in range(len(num_bits)):
58
- if num_bits[j]:
59
- num += (1 << j)
60
- else:
61
- num_bits_inv = [not b for b in num_bits]
62
- carry = 1
63
- for j in range(len(num_bits_inv)):
64
- if carry:
65
- num_bits_inv[j] = not num_bits_inv[j]
66
- carry = 0 if num_bits_inv[j] else 1
67
- num = 0
68
- for j in range(len(num_bits_inv)):
69
- if num_bits_inv[j]:
70
- num += (1 << j)
71
- num = -num
72
- return num
73
-
74
- def __getitem__(self, key):
75
- if isinstance(key, slice):
76
- start, stop, step = key.indices(len(self))
77
- result = []
78
- for i in range(start, stop, step):
79
- block_start = i * self.bit_length
80
- block_end = block_start + self.bit_length
81
- if block_end > self.size:
82
- raise IndexError("索引超出范围")
83
- bit_chunk = [super(self.__class__, self).__getitem__(j) for j in range(block_start, block_end)]
84
- num = self.to_int(bit_chunk)
85
- result.append(num)
86
- return IntHybridArray(result, self.bit_length)
87
- key = key if key >= 0 else key + len(self)
88
- if not (0 <= key < len(self)):
89
- raise IndexError("索引超出范围")
90
- block_start = key * self.bit_length
91
- block_end = block_start + self.bit_length
92
- if block_end > self.size:
93
- raise IndexError("索引超出范围")
94
- bit_chunk = [super(self.__class__, self).__getitem__(j) for j in range(block_start, block_end)]
95
- return self.to_int(bit_chunk)
96
-
97
- def __setitem__(self, key, value):
98
- tmp = list(self)
99
- tmp[key] = value
100
- self.__init__(tmp)
101
- def __iter__(self):
102
- return map(self.__getitem__,range(len(self)))
103
-
104
- def __str__(self):
105
- return f"IntHybridArray([{', '.join(map(str, self))}])"
106
- __repr__ = __str__
107
-
108
- def __len__(self):
109
- return self.total_bits // self.bit_length
110
- def __delitem__(self, index: int = -1):
111
- index = index if index >= 0 else index + len(self)
112
- if not (0 <= index < len(self)):
113
- raise IndexError("删除索引超出范围")
114
- target_num = self[index]
115
- pop_bit_start = index * self.bit_length
116
- pop_bit_end = pop_bit_start + self.bit_length
117
- for _ in range(self.bit_length):
118
- super().__delitem__(pop_bit_start)
119
- self.total_bits -= self.bit_length
120
- def index(self, value):
121
- value = int(value)
122
- x = f"{value} 不在 IntHybridArray 中"
123
- for idx in range(len(self)+1>>1):
124
- if self[idx] == value:
125
- return idx
126
- elif self[-idx] == value:
127
- x = len(self)-idx
128
- if x != f"{value} 不在 IntHybridArray 中":
129
- return x
130
- raise ValueError(x)
131
- def rindex(self, value):
132
- value = int(value)
133
- x = f"{value} 不在 IntHybridArray 中"
134
- for idx in range(len(self)+1>>1):
135
- if self[-idx] == value:
136
- return -idx
137
- elif self[idx] == value:
138
- x = -(len(self)-idx)
139
- if x != f"{value} 不在 IntHybridArray 中":
140
- return x
141
- raise ValueError(x)
142
- def extend(self, iterable:Iterable) -> None:
143
- if isinstance(iterable, (Iterator, Generator, map)):
144
- iterable,copy = itertools.tee(iterable, 2)
145
- len_ = sum(1 for _ in copy)
146
- else:
147
- len_ = len(iterable)
148
- self.total_bits += len_*self.bit_length
149
- for i,j in zip(range(len_),iterable):
150
- self[-i-1] = j
151
- def append(self,value):
152
- self.total_bits += self.bit_length
153
- self.size = self.total_bits
154
- self[-1] = value
2
+ try:from .compile_core import *
3
+ except:from .core import *
155
4
  __all__ = tuple(globals())
@@ -0,0 +1,154 @@
1
+ from __future__ import annotations
2
+ from collections.abc import Iterable
3
+ from ..core import *
4
+ import builtins
5
+ class IntBitTag(BHA_bool, metaclass=ResurrectMeta):
6
+ def __str__(self):
7
+ return "'-1'" if (hasattr(self, 'is_sign_bit') and self.is_sign_bit and self) else "'1'" if self else "'0'"
8
+ __repr__ = __str__
9
+ __del__ = lambda self:self
10
+ class IntHybridArray(BoolHybridArray,metaclass=ResurrectMeta):
11
+ def __init__(self, int_array: list[int], bit_length: int = 8):
12
+ self.bit_length = bit_length
13
+ bool_data = []
14
+ max_required_bits = 1
15
+ for num in int_array:
16
+ if num == 0:
17
+ required_bits = 1
18
+ else:
19
+ abs_num = abs(num)
20
+ num_bits_needed = abs_num.bit_length()
21
+ required_bits = 1 + num_bits_needed
22
+ if required_bits > max_required_bits:
23
+ max_required_bits = required_bits
24
+ self.bit_length = max_required_bits
25
+ for num in int_array:
26
+ if num >= 0:
27
+ sign_bit = False
28
+ num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
29
+ else:
30
+ sign_bit = True
31
+ abs_num = abs(num)
32
+ num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
33
+ carry = 1
34
+ for j in range(len(num_bits)):
35
+ if carry:
36
+ num_bits[j] = not num_bits[j]
37
+ carry = 0 if num_bits[j] else 1
38
+ bool_data.append(sign_bit)
39
+ bool_data.extend(num_bits)
40
+ self.total_bits = len(bool_data)
41
+ super().__init__(0, self.total_bits, False, IntBitTag, False)
42
+ for idx in range(self.total_bits):
43
+ if idx < self.size:
44
+ super().__setitem__(idx, bool_data[idx])
45
+ else:
46
+ super().append(bool_data[idx])
47
+ for i in range(0, self.total_bits, self.bit_length):
48
+ if i < self.size:
49
+ bit_tag = super().__getitem__(i)
50
+ bit_tag.is_sign_bit = True
51
+
52
+ def to_int(self, bit_chunk):
53
+ sign_bit = bit_chunk[0].value
54
+ num_bits = [bit.value for bit in bit_chunk[1:]]
55
+ if not sign_bit:
56
+ num = 0
57
+ for j in range(len(num_bits)):
58
+ if num_bits[j]:
59
+ num += (1 << j)
60
+ else:
61
+ num_bits_inv = [not b for b in num_bits]
62
+ carry = 1
63
+ for j in range(len(num_bits_inv)):
64
+ if carry:
65
+ num_bits_inv[j] = not num_bits_inv[j]
66
+ carry = 0 if num_bits_inv[j] else 1
67
+ num = 0
68
+ for j in range(len(num_bits_inv)):
69
+ if num_bits_inv[j]:
70
+ num += (1 << j)
71
+ num = -num
72
+ return num
73
+
74
+ def __getitem__(self, key):
75
+ if isinstance(key, slice):
76
+ start, stop, step = key.indices(len(self))
77
+ result = []
78
+ for i in range(start, stop, step):
79
+ block_start = i * self.bit_length
80
+ block_end = block_start + self.bit_length
81
+ if block_end > self.size:
82
+ raise IndexError("索引超出范围")
83
+ bit_chunk = [super(self.__class__, self).__getitem__(j) for j in range(block_start, block_end)]
84
+ num = self.to_int(bit_chunk)
85
+ result.append(num)
86
+ return IntHybridArray(result, self.bit_length)
87
+ key = key if key >= 0 else key + len(self)
88
+ if not (0 <= key < len(self)):
89
+ raise IndexError("索引超出范围")
90
+ block_start = key * self.bit_length
91
+ block_end = block_start + self.bit_length
92
+ if block_end > self.size:
93
+ raise IndexError("索引超出范围")
94
+ bit_chunk = [super(self.__class__, self).__getitem__(j) for j in range(block_start, block_end)]
95
+ return self.to_int(bit_chunk)
96
+
97
+ def __setitem__(self, key, value):
98
+ tmp = list(self)
99
+ tmp[key] = value
100
+ self.__init__(tmp)
101
+ def __iter__(self):
102
+ return map(self.__getitem__,range(len(self)))
103
+
104
+ def __str__(self):
105
+ return f"IntHybridArray([{', '.join(map(str, self))}])"
106
+ __repr__ = __str__
107
+
108
+ def __len__(self):
109
+ return self.total_bits // self.bit_length
110
+ def __delitem__(self, index: int = -1):
111
+ index = index if index >= 0 else index + len(self)
112
+ if not (0 <= index < len(self)):
113
+ raise IndexError("删除索引超出范围")
114
+ target_num = self[index]
115
+ pop_bit_start = index * self.bit_length
116
+ pop_bit_end = pop_bit_start + self.bit_length
117
+ for _ in range(self.bit_length):
118
+ super().__delitem__(pop_bit_start)
119
+ self.total_bits -= self.bit_length
120
+ def index(self, value):
121
+ value = int(value)
122
+ x = f"{value} 不在 IntHybridArray 中"
123
+ for idx in range(len(self)+1>>1):
124
+ if self[idx] == value:
125
+ return idx
126
+ elif self[-idx] == value:
127
+ x = len(self)-idx
128
+ if x != f"{value} 不在 IntHybridArray 中":
129
+ return x
130
+ raise ValueError(x)
131
+ def rindex(self, value):
132
+ value = int(value)
133
+ x = f"{value} 不在 IntHybridArray 中"
134
+ for idx in range(len(self)+1>>1):
135
+ if self[-idx] == value:
136
+ return -idx
137
+ elif self[idx] == value:
138
+ x = -(len(self)-idx)
139
+ if x != f"{value} 不在 IntHybridArray 中":
140
+ return x
141
+ raise ValueError(x)
142
+ def extend(self, iterable:Iterable) -> None:
143
+ if isinstance(iterable, (Iterator, Generator, map)):
144
+ iterable,copy = itertools.tee(iterable, 2)
145
+ len_ = sum(1 for _ in copy)
146
+ else:
147
+ len_ = len(iterable)
148
+ self.total_bits += len_*self.bit_length
149
+ for i,j in zip(range(len_),iterable):
150
+ self[-i-1] = j
151
+ def append(self,value):
152
+ self.total_bits += self.bit_length
153
+ self.size = self.total_bits
154
+ self[-1] = value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.11.8
3
+ Version: 9.11.10
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
5
  Home-page: https://github.com/BKsell/bool-hybrid-array
6
6
  Author: 蔡靖杰
@@ -614,6 +614,8 @@ print(f"出队2个元素后: {q}") # 输出:BHA_Queue([T,T,F,T,F])
614
614
  * **9.11.6**:修复从9.11.3版本开始cpython用户无法安装bool-hybrid-array包的问题
615
615
  * **9.11.7**:修复TypeError: 'map' object is not reversible的错误
616
616
  * **9.11.8**:增加了Windows系统Python3.14的C扩展优化
617
+ * **9.11.9**:修复BHA_Queue的bug,新增cin和cout(使用方式:a = ctypes.c_int();cin >> a;cout << a,支持各种ctypes类型、numpy标量)
618
+ * **9.11.10**:修复cin的AttributeError的错误
617
619
 
618
620
 
619
621
 
@@ -0,0 +1,14 @@
1
+ bool_hybrid_array/__init__.py,sha256=KzXCj4pevLEmZMp789nBkklGWOVGVy7iUohoA3cxhL8,1078
2
+ bool_hybrid_array/__main__.py,sha256=uFyebfsZl1tW54AVcc6IDhk36BglTGb_Vw3Djx8pq00,8987
3
+ bool_hybrid_array/_cppiostream.py,sha256=uisSGktor52VFxhTcMN011RtzuUE8O1Fgz2VltnPi3c,8447
4
+ bool_hybrid_array/compile_core.pyd,sha256=_bSaBSVM8x_fkxdP_-4AiIYWVEkTgV3DWCPXzP-i-00,556544
5
+ bool_hybrid_array/core.c,sha256=6jlDe0FTZweoWtfhabEQMOk7kfwaiPFDoe0yYPCMpS8,3230449
6
+ bool_hybrid_array/core.py,sha256=nv-veRvbioLefXCe66Py1avxb7_8OZbT5CeyQm-ErQE,42031
7
+ bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
8
+ bool_hybrid_array/int_array/__init__.py,sha256=CCKDUL5GBAXOprc9FhtLNL_rP4IDhvGVWJ-Dporp6YI,112
9
+ bool_hybrid_array/int_array/core.py,sha256=hnXHSLabtbDCnO3JX0M5tsF0BWlQpjWKu7RplMx7i8A,6236
10
+ bool_hybrid_array-9.11.10.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
11
+ bool_hybrid_array-9.11.10.dist-info/METADATA,sha256=kmw6K6GnXPoBGWxeNaZ8Rm4HGPdjWwqIsw3WgP2gkM8,26133
12
+ bool_hybrid_array-9.11.10.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
13
+ bool_hybrid_array-9.11.10.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
14
+ bool_hybrid_array-9.11.10.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,12 +0,0 @@
1
- bool_hybrid_array/__init__.py,sha256=VlUqwA0SmYh5vdHKXT-180u9A3t7Le6Fg9ppgMj8ztc,1077
2
- bool_hybrid_array/__main__.py,sha256=pjoWN4Noa_K44fqQPqp8H-diKSDf0Da8hdWFgvWUigQ,9083
3
- bool_hybrid_array/compile_core.pyd,sha256=lriymUZtvs_ryeGM_K8gM33iCIfxRH5Zr5GPKhuNCtw,555520
4
- bool_hybrid_array/core.c,sha256=b5KMuQ6Ma64wUx-oXYqkx_AR9sTcIO0VUZ6qz_2vDM0,3227011
5
- bool_hybrid_array/core.py,sha256=uJsVr6GDzCMfDLfvO9LiE0MSjmHodu4yOYwouFpxxFQ,41921
6
- bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
7
- bool_hybrid_array/int_array/__init__.py,sha256=HPBdZu5qlXaRI4n_oK6WhnG4ml8H-FP1G44igVxPJIA,6225
8
- bool_hybrid_array-9.11.8.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
9
- bool_hybrid_array-9.11.8.dist-info/METADATA,sha256=deIVm_eXDmWKFWZp65t3-0UB6PZfzprqDiBUmOaSI3U,25923
10
- bool_hybrid_array-9.11.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
11
- bool_hybrid_array-9.11.8.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
12
- bool_hybrid_array-9.11.8.dist-info/RECORD,,