xobjects 0.2.5__tar.gz → 0.2.7__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.
Files changed (48) hide show
  1. {xobjects-0.2.5 → xobjects-0.2.7}/PKG-INFO +1 -1
  2. {xobjects-0.2.5 → xobjects-0.2.7}/setup.py +1 -1
  3. xobjects-0.2.7/xobjects/_version.py +1 -0
  4. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/context_cpu.py +13 -1
  5. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/context_cupy.py +12 -0
  6. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/context_pyopencl.py +7 -0
  7. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/hybrid_class.py +6 -1
  8. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects.egg-info/PKG-INFO +1 -1
  9. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects.egg-info/SOURCES.txt +0 -17
  10. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects.egg-info/requires.txt +1 -0
  11. xobjects-0.2.5/tests/test_align.py +0 -18
  12. xobjects-0.2.5/tests/test_array.py +0 -303
  13. xobjects-0.2.5/tests/test_buffer.py +0 -135
  14. xobjects-0.2.5/tests/test_capi.py +0 -583
  15. xobjects-0.2.5/tests/test_chunk.py +0 -23
  16. xobjects-0.2.5/tests/test_hybrid_class.py +0 -312
  17. xobjects-0.2.5/tests/test_kernel.py +0 -263
  18. xobjects-0.2.5/tests/test_linked_array.py +0 -89
  19. xobjects-0.2.5/tests/test_nplike_arrays.py +0 -163
  20. xobjects-0.2.5/tests/test_ref.py +0 -340
  21. xobjects-0.2.5/tests/test_scalars.py +0 -40
  22. xobjects-0.2.5/tests/test_strides.py +0 -41
  23. xobjects-0.2.5/tests/test_string.py +0 -51
  24. xobjects-0.2.5/tests/test_struct.py +0 -262
  25. xobjects-0.2.5/tests/test_to_json.py +0 -41
  26. xobjects-0.2.5/tests/test_typeutils.py +0 -104
  27. xobjects-0.2.5/tests/test_unionref.py +0 -74
  28. xobjects-0.2.5/xobjects/_version.py +0 -1
  29. {xobjects-0.2.5 → xobjects-0.2.7}/LICENSE +0 -0
  30. {xobjects-0.2.5 → xobjects-0.2.7}/pyproject.toml +0 -0
  31. {xobjects-0.2.5 → xobjects-0.2.7}/setup.cfg +0 -0
  32. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/__init__.py +0 -0
  33. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/_patch_pyopencl_array.py +0 -0
  34. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/array.py +0 -0
  35. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/capi.py +0 -0
  36. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/context.py +0 -0
  37. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/general.py +0 -0
  38. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/linkedarray.py +0 -0
  39. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/ref.py +0 -0
  40. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/scalar.py +0 -0
  41. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/specialize_source.py +0 -0
  42. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/string.py +0 -0
  43. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/struct.py +0 -0
  44. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/test_helpers.py +0 -0
  45. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/typeutils.py +0 -0
  46. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects/union.py +0 -0
  47. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects.egg-info/dependency_links.txt +0 -0
  48. {xobjects-0.2.5 → xobjects-0.2.7}/xobjects.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xobjects
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: In-memory serialization and code generator for CPU and GPU
5
5
  Home-page: https://xsuite.readthedocs.io/
6
6
  Download-URL: https://pypi.python.org/pypi/xobjects
@@ -33,6 +33,6 @@ setup(
33
33
  "Source Code": "https://github.com/xsuite/xobjects",
34
34
  },
35
35
  extras_require={
36
- "tests": ["pytest"],
36
+ "tests": ["pytest", "pytest-mock"],
37
37
  },
38
38
  )
@@ -0,0 +1 @@
1
+ __version__ = "0.2.7"
@@ -14,6 +14,7 @@ from typing import Callable, Dict, List, Sequence, Tuple
14
14
  from .general import _print
15
15
 
16
16
  import numpy as np
17
+ import scipy as sp
17
18
 
18
19
  from .context import (
19
20
  Kernel,
@@ -535,6 +536,16 @@ class ContextCpu(XContext):
535
536
 
536
537
  return np
537
538
 
539
+ @property
540
+ def splike_lib(self):
541
+ """
542
+ Module containing all the scipy features. Numpy members should be accessed
543
+ through ``splike_lib`` to keep compatibility with the other contexts.
544
+
545
+ """
546
+
547
+ return sp
548
+
538
549
  def synchronize(self):
539
550
  """
540
551
  Ensures that all computations submitted to the context are completed.
@@ -711,6 +722,7 @@ class BufferNumpy(XBuffer):
711
722
  """return data that can be used as argument in kernel"""
712
723
  return self.buffer[offset : offset + nbytes]
713
724
 
725
+
714
726
  class KernelCpu:
715
727
  def __init__(
716
728
  self,
@@ -754,7 +766,7 @@ class KernelCpu:
754
766
  else:
755
767
  if hasattr(arg.atype, "_dtype"): # it is numerical scalar
756
768
  return arg.atype(value) # try to return a numpy scalar
757
- elif (hasattr(arg.atype, "_size")): # it is a compound xobject
769
+ elif hasattr(arg.atype, "_size"): # it is a compound xobject
758
770
  assert isinstance(
759
771
  value._buffer.context, ContextCpu
760
772
  ), f"Incompatible context for argument `{arg.name}`."
@@ -26,6 +26,11 @@ log = logging.getLogger(__name__)
26
26
 
27
27
  try:
28
28
  import cupy
29
+ import cupyx.scipy
30
+ import cupyx.scipy.interpolate
31
+ import cupyx.scipy.signal
32
+ import cupyx.scipy.special
33
+ import cupyx.scipy.stats
29
34
  from cupyx.scipy import fftpack as cufftp
30
35
 
31
36
  _enabled = True
@@ -500,6 +505,13 @@ class ContextCupy(XContext):
500
505
  """
501
506
  return cupy
502
507
 
508
+ @property
509
+ def splike_lib(self):
510
+ """
511
+ Module containing all the scipy features supported by cupy.
512
+ """
513
+ return cupyx.scipy
514
+
503
515
  def synchronize(self):
504
516
  """
505
517
  Ensures that all computations submitted to the context are completed.
@@ -273,6 +273,13 @@ class ContextPyopencl(XContext):
273
273
  """
274
274
  return cla
275
275
 
276
+ @property
277
+ def splike_lib(self):
278
+ """
279
+ Scipy features are not available through openCL
280
+ """
281
+ raise NotImplementedError
282
+
276
283
  def synchronize(self):
277
284
  """
278
285
  Ensures that all computations submitted to the context are completed.
@@ -341,7 +341,8 @@ class HybridClass(metaclass=MetaHybridClass):
341
341
 
342
342
  def __setstate__(self, state):
343
343
  self._xobject = self._XoStruct._from_buffer(
344
- buffer=state[0], offset=state[1])
344
+ buffer=state[0], offset=state[1]
345
+ )
345
346
  self._reinit_from_xobject(_xobject=self._xobject)
346
347
 
347
348
  @property
@@ -359,6 +360,10 @@ class HybridClass(metaclass=MetaHybridClass):
359
360
  def compile_kernels(self, *args, **kwargs):
360
361
  return self._xobject.compile_kernels(*args, **kwargs)
361
362
 
363
+ def __repr__(self):
364
+ args = [f"{fname}={getattr(self, fname)}" for fname in self._fields]
365
+ return f'{type(self).__name__}({", ".join(args)})'
366
+
362
367
 
363
368
  class ThisClass: # Place holder
364
369
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xobjects
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: In-memory serialization and code generator for CPU and GPU
5
5
  Home-page: https://xsuite.readthedocs.io/
6
6
  Download-URL: https://pypi.python.org/pypi/xobjects
@@ -2,23 +2,6 @@ LICENSE
2
2
  pyproject.toml
3
3
  setup.cfg
4
4
  setup.py
5
- tests/test_align.py
6
- tests/test_array.py
7
- tests/test_buffer.py
8
- tests/test_capi.py
9
- tests/test_chunk.py
10
- tests/test_hybrid_class.py
11
- tests/test_kernel.py
12
- tests/test_linked_array.py
13
- tests/test_nplike_arrays.py
14
- tests/test_ref.py
15
- tests/test_scalars.py
16
- tests/test_strides.py
17
- tests/test_string.py
18
- tests/test_struct.py
19
- tests/test_to_json.py
20
- tests/test_typeutils.py
21
- tests/test_unionref.py
22
5
  xobjects/__init__.py
23
6
  xobjects/_patch_pyopencl_array.py
24
7
  xobjects/_version.py
@@ -3,3 +3,4 @@ cffi
3
3
 
4
4
  [tests]
5
5
  pytest
6
+ pytest-mock
@@ -1,18 +0,0 @@
1
- # copyright ################################# #
2
- # This file is part of the Xobjects Package. #
3
- # Copyright (c) CERN, 2021. #
4
- # ########################################### #
5
-
6
- import xobjects as xo
7
- from xobjects.test_helpers import for_all_test_contexts
8
-
9
-
10
- @for_all_test_contexts
11
- def test_create_aligned_objects(test_context):
12
- for Arr in xo.Float64[3], xo.Float64[16], xo.Float64[17]:
13
- buff = test_context.new_buffer(10)
14
- assert buff.default_alignment == test_context.minimum_alignment
15
- for i in range(4):
16
- aa = Arr(_buffer=buff, _offset="aligned")
17
- print(test_context, Arr._size, aa._offset)
18
- assert aa._offset % test_context.minimum_alignment == 0
@@ -1,303 +0,0 @@
1
- # copyright ################################# #
2
- # This file is part of the Xobjects Package. #
3
- # Copyright (c) CERN, 2021. #
4
- # ########################################### #
5
-
6
- # pylint:disable=E1101
7
-
8
- import numpy as np
9
- import pytest
10
-
11
- import xobjects as xo
12
- from xobjects.test_helpers import for_all_test_contexts
13
-
14
-
15
- def test_get_shape():
16
- from xobjects.array import get_shape_from_array
17
-
18
- assert get_shape_from_array(0, 0) == ()
19
- assert get_shape_from_array([], 1) == (0,)
20
- assert get_shape_from_array([1, 2, 3], 1) == (3,)
21
- assert get_shape_from_array(range(3), 1) == (3,)
22
- assert get_shape_from_array([[], []], 2) == (2, 0)
23
- assert get_shape_from_array([[2], [2]], 2) == (2, 1)
24
- assert get_shape_from_array([[1, 3], [3]], 1) == (2,)
25
- assert get_shape_from_array([[1, [2]], [[3], [4, 5]]], 2) == (2, 2)
26
-
27
- with pytest.raises(ValueError):
28
- get_shape_from_array([[1, [2]], [[3], [4, 5]]], 3)
29
- get_shape_from_array([[1], [2, 3], [4, 5, 6]], 2)
30
-
31
-
32
- def mk_classes() -> xo.Array:
33
- class ArrayA(xo.Array):
34
- _itemtype = xo.Float64
35
- _shape = (6, 6)
36
- _order = (0, 1)
37
-
38
- class ArrayB(xo.Array):
39
- _itemtype = xo.Float64
40
- _shape = (6, None)
41
- _order = (0, 1)
42
-
43
- class ArrayC(xo.Array):
44
- _itemtype = xo.Float64
45
- _shape = (None,)
46
- _order = "C"
47
-
48
- class ArrayD(xo.Array):
49
- _itemtype = ArrayA
50
- _shape = (None,)
51
- _order = "F"
52
-
53
- class ArrayE(xo.Array):
54
- _itemtype = ArrayB
55
- _shape = (None,)
56
- _order = "C"
57
-
58
- return ArrayA, ArrayB, ArrayC, ArrayD, ArrayE
59
-
60
-
61
- def test_class_creation():
62
- ArrayA, ArrayB, ArrayC, ArrayD, ArrayE = mk_classes()
63
-
64
- assert ArrayA._is_static_shape == True
65
- assert ArrayE._is_static_type == False
66
- assert ArrayA._size == 36 * 8
67
-
68
- for arr in ArrayB, ArrayC, ArrayD, ArrayE:
69
- assert arr._is_static_shape == False
70
- for arr in ArrayB, ArrayC, ArrayD, ArrayE:
71
- assert arr._is_static_shape == False
72
-
73
- assert ArrayA._data_offset == 0
74
- assert ArrayB._data_offset == 32
75
- assert ArrayC._data_offset == 16
76
- assert ArrayD._data_offset == 16
77
- assert ArrayE._data_offset == 16
78
-
79
- assert ArrayA._strides == (48, 8)
80
- assert ArrayC._strides == (8,)
81
- assert ArrayD._strides == (ArrayA._size,)
82
-
83
-
84
- def test_class_mk_array():
85
- ArrayA = xo.Float64[3, 6]
86
- assert ArrayA._shape == (3, 6)
87
- assert ArrayA._order == (0, 1)
88
- assert ArrayA.__name__ == "Arr3x6Float64"
89
-
90
- ArrayA = xo.Float64[None, 6]
91
- assert ArrayA._shape == (None, 6)
92
- assert ArrayA.__name__ == "ArrNx6Float64"
93
-
94
- ArrayA = xo.String[3:1, 4:0, 5:2]
95
- assert ArrayA._shape == (3, 4, 5)
96
- assert ArrayA.__name__ == "Arr3x4x5String"
97
-
98
- class StructA(xo.Struct):
99
- a = xo.Float64
100
-
101
- ArrayA = StructA[10]
102
-
103
- assert ArrayA.__name__ == "Arr10StructA"
104
-
105
-
106
- def test_inspect_args():
107
- import numpy as np
108
-
109
- arrays = mk_classes()
110
-
111
- for AnArray in arrays:
112
- if AnArray._size is not None:
113
- info = AnArray._inspect_args()
114
- assert info.value == None
115
-
116
- ArrayA = arrays[0]
117
- info = ArrayA._inspect_args(np.zeros((6, 6)))
118
-
119
- assert info.size == 36 * 8
120
-
121
-
122
- def test_array_allocation():
123
- MyArray = xo.Int64[10]
124
- ss = MyArray()
125
- assert ss._itemtype == xo.Int64
126
-
127
-
128
- def test_array_sshape_stype():
129
- Array1D = xo.Int64[3]
130
- Array2D = xo.Int64[2, 3]
131
- Array3D = xo.Int64[2, 3, 4]
132
-
133
- for cls in Array1D, Array2D, Array3D:
134
- ss = cls()
135
- for ii in ss._iter_index():
136
- assert ss[0] == 0
137
- ss[ii] = sum(ii) if len(ss._shape) > 1 else ii
138
- for ii in ss._iter_index():
139
- assert ss[ii] == (sum(ii) if len(ss._shape) > 1 else ii)
140
-
141
-
142
- def test_array_dshape_stype():
143
- Array1 = xo.Int64[:]
144
- Array2 = xo.Int64[:, 3, 4]
145
- Array3 = xo.Int64[2, :, 4]
146
- Array4 = xo.Int64[2, 3, :]
147
-
148
- for cls in Array1, Array2, Array3, Array4:
149
- ss = cls(3)
150
- for ii in ss._iter_index():
151
- assert ss[0] == 0
152
- ss[ii] = sum(ii) if len(ss._shape) > 1 else ii
153
- for ii in ss._iter_index():
154
- assert ss[ii] == (sum(ii) if len(ss._shape) > 1 else ii)
155
-
156
- arr = Array1(10)
157
- arr[3] = 42
158
- data = arr._buffer.to_nplike(arr._offset, "int64", (12,))
159
- assert data[0] == 8 + 8 + 10 * 8
160
- assert data[1] == 10
161
- data[6] = 43
162
- assert arr[4] == 43
163
-
164
- arr = Array2(2)
165
- arr[1, 2, 3] = 42
166
- data = arr._buffer.to_nplike(arr._offset, "int64", (29,))
167
-
168
- assert data[0] == 8 + 8 + 3 * 8 + 24 * 8
169
-
170
-
171
- def test_array_sshape_dtype():
172
- Array1 = xo.Int64[:]
173
- Array2 = Array1[3]
174
- arr = Array2([2, 3, 4])
175
- arr[0][1] = 3
176
- assert arr[0][1] == 3
177
-
178
- arr1 = Array1(2)
179
- assert arr1._shape == arr[0]._shape
180
-
181
-
182
- def test_array_dshape_dtype():
183
- Array1 = xo.Int64[:]
184
- Array2 = Array1[:]
185
- ss = Array2([2, 3, 4])
186
- ss[0][1] = 3
187
- assert ss[0][1] == 3
188
-
189
- ss0 = Array1(2)
190
- ss1 = Array1(3)
191
- ss2 = Array1(4)
192
- assert ss0._shape == ss[0]._shape
193
-
194
- ss = Array2([[1], [2, 3], [4, 5, 6]])
195
- assert ss[0][0] == 1
196
- assert ss[1][1] == 3
197
- assert ss[2][2] == 6
198
-
199
-
200
- def test_array_in_struct():
201
- class Multipole(xo.Struct):
202
- order = xo.Int64
203
- length = xo.Float64
204
- hxl = xo.Float64
205
- hyl = xo.Float64
206
- bal = xo.Float64[:]
207
-
208
- m = Multipole(order=2, bal=np.array([1.0, 2.0, 3.0, 4.0]))
209
-
210
-
211
- def test_initialize_from_array():
212
- class MyStruct(xo.Struct):
213
- a = xo.Float64[3]
214
-
215
- sa = MyStruct()
216
- buf = sa._buffer
217
- sb = MyStruct(_buffer=buf)
218
- sa.a = sb.a
219
-
220
-
221
- def test_init_with_nparray():
222
- a = xo.Float64[:](np.array([1, 2, 3], dtype=np.float64))
223
- assert a[1] == 2.0
224
-
225
-
226
- def test_init_with_nparray2d():
227
- class Mys(xo.Struct):
228
- m0 = xo.Float64[6]
229
- m1 = xo.Float64[6, 6]
230
-
231
- m = Mys(m1=np.ones((6, 6)) * 3, m0=np.ones(6))
232
- assert m.m1[3, 4] == 3
233
- assert m.m0[3] == 1
234
-
235
-
236
- def test_update():
237
- class A(xo.Struct):
238
- a = xo.Float64[:]
239
- b = xo.Float64[10]
240
-
241
- a = A(a=3)
242
- with pytest.raises(Exception) as e:
243
- a.a = 2
244
- assert e.type == ValueError
245
-
246
- with pytest.raises(Exception) as e:
247
- a.a = [1, 2]
248
- assert e.type == ValueError
249
-
250
- a.a = [1, 2, 3]
251
-
252
-
253
- @for_all_test_contexts
254
- def test_array_custom_strides(test_context):
255
- Array = xo.Int8[2:1, 3:0, 4:2]
256
- a_xo = Array(_context=test_context)
257
-
258
- assert a_xo._strides == (4, 8, 1)
259
-
260
- j = 0
261
- for i0, i1, i2 in np.ndindex(2, 3, 4):
262
- a_xo[i0, i1, i2] = j
263
- j += 1
264
-
265
- buffer_contents = a_xo._buffer.to_bytearray(
266
- offset=0, nbytes=a_xo._buffer.capacity
267
- )
268
- assert np.all(
269
- buffer_contents
270
- == bytearray(
271
- [
272
- 0,
273
- 1,
274
- 2,
275
- 3,
276
- 12,
277
- 13,
278
- 14,
279
- 15,
280
- 4,
281
- 5,
282
- 6,
283
- 7,
284
- 16,
285
- 17,
286
- 18,
287
- 19,
288
- 8,
289
- 9,
290
- 10,
291
- 11,
292
- 20,
293
- 21,
294
- 22,
295
- 23,
296
- ]
297
- )
298
- )
299
-
300
- j = 0
301
- for i0, i1, i2 in np.ndindex(2, 3, 4):
302
- assert a_xo[i0, i1, i2] == j
303
- j += 1
@@ -1,135 +0,0 @@
1
- # copyright ################################# #
2
- # This file is part of the Xobjects Package. #
3
- # Copyright (c) CERN, 2021. #
4
- # ########################################### #
5
-
6
- import numpy as np
7
-
8
- import xobjects as xo
9
- from xobjects.test_helpers import for_all_test_contexts, requires_context
10
-
11
-
12
- class Check:
13
- def __init__(self, ctx, capacity):
14
- self.ctx = ctx
15
- self.buffer = ctx.new_buffer(capacity=capacity)
16
- self.state = {}
17
-
18
- def random_string(self, maxlength=100):
19
- size = np.random.randint(1, maxlength)
20
- self.new_string(size)
21
-
22
- def new_string(self, size=100):
23
- if size > 0:
24
- data = bytes(np.random.randint(65, 90, size, dtype="u1"))
25
-
26
- offset = self.buffer.allocate(len(data))
27
- self.buffer.update_from_buffer(offset, data)
28
- self.state[offset] = data
29
- return offset
30
- else:
31
- raise ValueError("size must be >0")
32
-
33
- def free_string(self, offset):
34
- size = len(self.state[offset])
35
- self.buffer.free(offset, size)
36
- del self.state[offset]
37
-
38
- def random_free(self):
39
- ii = np.random.randint(1, len(self.state))
40
- offset = list(self.state.keys())[ii]
41
- self.free_string(offset)
42
-
43
- def check(self):
44
- for offset, value in self.state.items():
45
- assert self.buffer.to_bytearray(offset, len(value)) == value
46
-
47
-
48
- @requires_context("ContextPyopencl")
49
- def test_cl_print_devices():
50
- xo.ContextPyopencl.print_devices()
51
-
52
-
53
- @requires_context("ContextPyopencl")
54
- def test_cl_init():
55
- _ = xo.ContextPyopencl(device="0.0")
56
-
57
-
58
- @for_all_test_contexts
59
- def test_new_buffer(test_context):
60
- _ = test_context.new_buffer()
61
- _ = test_context.new_buffer(capacity=200)
62
-
63
-
64
- @for_all_test_contexts
65
- def test_read_write(test_context):
66
- buff = test_context.new_buffer()
67
- bb = b"asdfasdfafsdf"
68
- buff.update_from_buffer(23, bb)
69
- assert buff.to_bytearray(23, len(bb)) == bb
70
-
71
-
72
- @for_all_test_contexts
73
- def test_to_from_byterarray(test_context):
74
- buff = test_context.new_buffer()
75
- bb = b"asdfasdfafsdf"
76
- buff.update_from_buffer(23, bb)
77
- assert buff.to_bytearray(23, len(bb)) == bb
78
-
79
-
80
- @for_all_test_contexts
81
- def test_allocate_simple(test_context):
82
- ch = Check(test_context, 200)
83
- ch.new_string(30)
84
- ch.check()
85
-
86
-
87
- @for_all_test_contexts
88
- def test_free_simple(test_context):
89
- ch = Check(test_context, 200)
90
- offsets = [ch.new_string(ii * 2 + 1) for ii in range(10)]
91
- print(offsets)
92
- for offset in offsets:
93
- print(offset)
94
- ch.free_string(offset)
95
- ch.check()
96
-
97
-
98
- @for_all_test_contexts
99
- def test_grow(test_context):
100
- ch = Check(test_context, 200)
101
- st = ch.new_string(150)
102
- st = ch.new_string(60)
103
- ch.check()
104
- assert ch.buffer.capacity == 400
105
- assert ch.buffer.chunks[0].start == st + 60
106
- assert ch.buffer.chunks[0].end == 400
107
- st = ch.new_string(500)
108
- assert ch.buffer.capacity == 900 + ch.buffer.default_alignment - 1
109
- ch.check()
110
-
111
-
112
- @for_all_test_contexts
113
- def test_random_string(test_context):
114
- ch = Check(test_context, 200)
115
-
116
- for i in range(50):
117
- ch.random_string(maxlength=2000)
118
- ch.check()
119
-
120
- for i in range(50):
121
- ch.random_string(maxlength=2000)
122
- ch.check()
123
- ch.random_free()
124
- ch.check()
125
-
126
-
127
- @for_all_test_contexts
128
- def test_nplike(test_context):
129
- buff = test_context.new_buffer(capacity=80)
130
- arr = np.arange(6.0).reshape((2, 3))
131
- offset = 3
132
- buff.update_from_buffer(offset, arr.tobytes())
133
- arr2 = buff.to_nplike(offset, "float64", (2, 3))
134
- arr3 = test_context.nparray_from_context_array(arr2)
135
- assert np.all(arr == arr3)