ndtypes 0.2.0dev4

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 (139) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +50 -0
  3. data/Gemfile +2 -0
  4. data/History.md +0 -0
  5. data/README.md +19 -0
  6. data/Rakefile +125 -0
  7. data/ext/ruby_ndtypes/extconf.rb +55 -0
  8. data/ext/ruby_ndtypes/gc_guard.c +36 -0
  9. data/ext/ruby_ndtypes/gc_guard.h +12 -0
  10. data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
  11. data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
  12. data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
  13. data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
  14. data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
  15. data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
  16. data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
  17. data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
  18. data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
  19. data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
  20. data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
  21. data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
  22. data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
  23. data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
  24. data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
  25. data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
  26. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
  27. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
  28. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
  29. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
  30. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
  31. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
  32. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
  33. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
  34. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
  35. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
  36. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
  37. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
  38. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
  39. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
  40. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
  41. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
  42. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
  43. data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
  44. data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
  45. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
  46. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
  47. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
  48. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
  49. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
  50. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
  51. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
  52. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
  53. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
  54. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
  55. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
  56. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
  57. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
  58. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
  59. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
  60. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
  61. data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
  62. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
  63. data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
  64. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
  65. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
  66. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
  67. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
  68. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
  69. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
  70. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
  71. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
  72. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
  73. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
  74. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
  75. data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
  76. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
  77. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
  78. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
  79. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
  80. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
  81. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
  82. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
  83. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
  84. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
  85. data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
  86. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
  87. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
  88. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
  89. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
  90. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
  91. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
  92. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
  93. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
  94. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
  95. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
  96. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
  97. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
  98. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
  99. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
  100. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
  101. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
  102. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
  103. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
  104. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
  105. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
  106. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
  107. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
  108. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
  109. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
  110. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
  111. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
  112. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
  113. data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
  114. data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
  115. data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
  116. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
  117. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
  118. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
  119. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
  120. data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
  121. data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
  122. data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
  123. data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
  124. data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
  125. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
  126. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
  127. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
  128. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
  129. data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
  130. data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
  131. data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
  132. data/lib/ndtypes.rb +45 -0
  133. data/lib/ndtypes/errors.rb +2 -0
  134. data/lib/ndtypes/version.rb +6 -0
  135. data/ndtypes.gemspec +47 -0
  136. data/spec/gc_table_spec.rb +10 -0
  137. data/spec/ndtypes_spec.rb +289 -0
  138. data/spec/spec_helper.rb +241 -0
  139. metadata +242 -0
@@ -0,0 +1,1977 @@
1
+ #
2
+ # BSD 3-Clause License
3
+ #
4
+ # Copyright (c) 2017-2018, plures
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are met:
9
+ #
10
+ # 1. Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ #
13
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ # this list of conditions and the following disclaimer in the documentation
15
+ # and/or other materials provided with the distribution.
16
+ #
17
+ # 3. Neither the name of the copyright holder nor the names of its
18
+ # contributors may be used to endorse or promote products derived from
19
+ # this software without specific prior written permission.
20
+ #
21
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ #
32
+
33
+ import sys, argparse
34
+ import unittest, gc
35
+ import weakref, struct
36
+ from copy import copy
37
+ from ndtypes import ndt, typedef, instantiate, MAX_DIM, ApplySpec
38
+ from ndt_support import *
39
+ from ndt_randtype import *
40
+ from random import random
41
+ import pickle
42
+
43
+
44
+ try:
45
+ import numpy as np
46
+ except ImportError:
47
+ np = None
48
+
49
+
50
+ SKIP_LONG = True
51
+ SKIP_BRUTE_FORCE = True
52
+
53
+
54
+ def check_serialize(self, t):
55
+ b = t.serialize()
56
+ u = ndt.deserialize(b)
57
+ self.assertEqual(u, t)
58
+
59
+ s = pickle.dumps(t)
60
+ u = pickle.loads(s)
61
+ self.assertEqual(u, t)
62
+
63
+
64
+ class TestModule(unittest.TestCase):
65
+
66
+ def test_module_predicates(self):
67
+ # Namespaces are not yet supported in xnd. One can construct the
68
+ # types, however. Modules are for pattern matching only, so they
69
+ # are abstract.
70
+ t = ndt("SomeNamespace:: 2 * 3 * float64")
71
+ check_serialize(self, t)
72
+
73
+ self.assertTrue(t.isabstract())
74
+ self.assertFalse(t.iscomplex())
75
+ self.assertFalse(t.isconcrete())
76
+ self.assertFalse(t.isfloat())
77
+ self.assertFalse(t.isoptional())
78
+ self.assertFalse(t.isscalar())
79
+ self.assertFalse(t.issigned())
80
+ self.assertFalse(t.isunsigned())
81
+
82
+ self.assertFalse(t.is_f_contiguous())
83
+ self.assertFalse(t.is_c_contiguous())
84
+
85
+ def test_module_common_fields(self):
86
+ t = ndt("SomeNamespace:: 2 * 3 * float64")
87
+ check_serialize(self, t)
88
+
89
+ # Common type fields are undefined.
90
+ self.assertRaises(TypeError, getattr, t, 'ndim')
91
+ self.assertRaises(TypeError, getattr, t, 'itemsize')
92
+ self.assertRaises(TypeError, getattr, t, 'align')
93
+
94
+ # Cannot be represented as an ndarray.
95
+ self.assertRaises(TypeError, getattr, t, 'shape')
96
+ self.assertRaises(TypeError, getattr, t, 'strides')
97
+
98
+
99
+ class TestFunction(unittest.TestCase):
100
+
101
+ def test_function_predicates(self):
102
+ t = ndt("(10 * float64, string) -> float64")
103
+ check_serialize(self, t)
104
+
105
+ self.assertTrue(t.isabstract())
106
+ self.assertFalse(t.iscomplex())
107
+ self.assertFalse(t.isconcrete())
108
+ self.assertFalse(t.isfloat())
109
+ self.assertFalse(t.isoptional())
110
+ self.assertFalse(t.isscalar())
111
+ self.assertFalse(t.issigned())
112
+ self.assertFalse(t.isunsigned())
113
+
114
+ self.assertFalse(t.is_c_contiguous())
115
+ self.assertFalse(t.is_f_contiguous())
116
+
117
+ def test_function_common_fields(self):
118
+ t = ndt("(10 * float64, string) -> float64")
119
+ check_serialize(self, t)
120
+
121
+ # Common type fields are undefined.
122
+ self.assertRaises(TypeError, getattr, t, 'ndim')
123
+ self.assertRaises(TypeError, getattr, t, 'itemsize')
124
+ self.assertRaises(TypeError, getattr, t, 'align')
125
+
126
+ # Cannot be represented as an ndarray.
127
+ self.assertRaises(TypeError, getattr, t, 'shape')
128
+ self.assertRaises(TypeError, getattr, t, 'strides')
129
+
130
+
131
+ class TestVoid(unittest.TestCase):
132
+
133
+ def test_void_as_return_value(self):
134
+ t = ndt("() -> void")
135
+ check_serialize(self, t)
136
+
137
+ self.assertTrue(t.isabstract())
138
+ self.assertFalse(t.iscomplex())
139
+ self.assertFalse(t.isconcrete())
140
+ self.assertFalse(t.isfloat())
141
+ self.assertFalse(t.isoptional())
142
+ self.assertFalse(t.isscalar())
143
+ self.assertFalse(t.issigned())
144
+ self.assertFalse(t.isunsigned())
145
+
146
+ self.assertFalse(t.is_c_contiguous())
147
+ self.assertFalse(t.is_f_contiguous())
148
+
149
+ def test_void_exceptions(self):
150
+ # Void can only be used as a function return type.
151
+ self.assertRaises(ValueError, ndt, "void")
152
+
153
+
154
+ class TestAny(unittest.TestCase):
155
+
156
+ def test_any_predicates(self):
157
+ t = ndt("Any")
158
+
159
+ self.assertTrue(t.isabstract())
160
+ self.assertFalse(t.iscomplex())
161
+ self.assertFalse(t.isconcrete())
162
+ self.assertFalse(t.isfloat())
163
+ self.assertFalse(t.isoptional())
164
+ self.assertFalse(t.isscalar())
165
+ self.assertFalse(t.issigned())
166
+ self.assertFalse(t.isunsigned())
167
+
168
+ self.assertFalse(t.is_c_contiguous())
169
+ self.assertFalse(t.is_f_contiguous())
170
+
171
+ def test_any_common_fields(self):
172
+ t = ndt("Any")
173
+
174
+ # Common type fields are undefined.
175
+ self.assertRaises(TypeError, getattr, t, 'ndim')
176
+ self.assertRaises(TypeError, getattr, t, 'itemsize')
177
+ self.assertRaises(TypeError, getattr, t, 'align')
178
+
179
+ # Cannot be represented as an ndarray.
180
+ self.assertRaises(TypeError, getattr, t, 'shape')
181
+ self.assertRaises(TypeError, getattr, t, 'strides')
182
+
183
+
184
+ class TestFixedDim(unittest.TestCase):
185
+
186
+ def test_fixed_dim_predicates(self):
187
+ t = ndt("10 * 20 * complex128")
188
+ check_serialize(self, t)
189
+
190
+ self.assertFalse(t.isabstract())
191
+ self.assertFalse(t.iscomplex())
192
+ self.assertTrue(t.isconcrete())
193
+ self.assertFalse(t.isfloat())
194
+ self.assertFalse(t.isoptional())
195
+ self.assertFalse(t.isscalar())
196
+ self.assertFalse(t.issigned())
197
+ self.assertFalse(t.isunsigned())
198
+
199
+ self.assertTrue(t.is_c_contiguous())
200
+ self.assertFalse(t.is_f_contiguous())
201
+
202
+ t = ndt("20 * complex128")
203
+ self.assertTrue(t.is_c_contiguous())
204
+ self.assertTrue(t.is_f_contiguous())
205
+
206
+ t = ndt("1 * 10 * complex128")
207
+ self.assertTrue(t.is_c_contiguous())
208
+ self.assertTrue(t.is_f_contiguous())
209
+
210
+ def test_fixed_dim_common_fields(self):
211
+ dt = "{a: complex64, b: string}"
212
+ t = ndt("2 * 3 * %s" % dt)
213
+ check_serialize(self, t)
214
+
215
+ dtype = ndt(dt)
216
+
217
+ self.assertEqual(t.ndim, 2)
218
+ if not HAVE_32_BIT_LINUX:
219
+ self.assertEqual(t.itemsize, dtype.itemsize)
220
+ self.assertEqual(t.align, dtype.align)
221
+
222
+ self.assertEqual(t.shape, (2, 3))
223
+ self.assertEqual(t.strides, (3 * dtype.itemsize, dtype.itemsize))
224
+
225
+ def test_fixed_dim_invariants(self):
226
+ # Mixing var and fixed is disallowed.
227
+ self.assertRaises(TypeError, ndt, "10 * var * int8")
228
+ self.assertRaises(TypeError, ndt, "var * 10 * int16")
229
+ self.assertRaises(TypeError, ndt, "10 * var * 10 * int32")
230
+ self.assertRaises(TypeError, ndt, "var * 10 * var * int64")
231
+
232
+ def test_fixed_dim_dtypes(self):
233
+ for dtype, mem in DTYPE_TEST_CASES:
234
+ t = ndt(dtype)
235
+ self.assertEqual(t.ndim, 0)
236
+ if not HAVE_32_BIT_LINUX:
237
+ self.assertEqual(t.itemsize, mem.itemsize)
238
+ self.assertEqual(t.align, mem.align)
239
+
240
+ self.assertEqual(t.shape, ())
241
+ self.assertEqual(t.strides, ())
242
+
243
+ for i in range(10):
244
+ t = ndt("%d * %s" % (i, dtype))
245
+ check_serialize(self, t)
246
+ shape = (i,)
247
+ strides = (mem.itemsize,)
248
+
249
+ self.assertEqual(t.ndim, 1)
250
+ if not HAVE_32_BIT_LINUX:
251
+ self.assertEqual(t.itemsize, mem.itemsize)
252
+ self.assertEqual(t.align, mem.align)
253
+ self.assertEqual(t.strides, strides)
254
+
255
+ self.assertEqual(t.shape, shape)
256
+ self.assertEqual(t.datasize, c_datasize(t))
257
+ self.assertTrue(verify_datasize(t))
258
+
259
+ for i in range(10):
260
+ for j in range(10):
261
+ t = ndt("%d * %d * %s" % (i, j, dtype))
262
+ check_serialize(self, t)
263
+ shape = (i, j)
264
+ strides = (j * mem.itemsize, mem.itemsize)
265
+
266
+ self.assertEqual(t.ndim, 2)
267
+ if not HAVE_32_BIT_LINUX:
268
+ self.assertEqual(t.itemsize, mem.itemsize)
269
+ self.assertEqual(t.align, mem.align)
270
+ self.assertEqual(t.strides, strides)
271
+
272
+ self.assertEqual(t.shape, shape)
273
+ self.assertEqual(t.datasize, c_datasize(t))
274
+ self.assertTrue(verify_datasize(t))
275
+
276
+ for i in range(5):
277
+ for j in range(5):
278
+ for k in range(5):
279
+ t = ndt("%d * %d * %d * %s" % (i, j, k, dtype))
280
+ check_serialize(self, t)
281
+ shape = (i, j, k)
282
+ strides = (j * k * mem.itemsize, k * mem.itemsize, mem.itemsize)
283
+
284
+ self.assertEqual(t.ndim, 3)
285
+ if not HAVE_32_BIT_LINUX:
286
+ self.assertEqual(t.itemsize, mem.itemsize)
287
+ self.assertEqual(t.align, mem.align)
288
+ self.assertEqual(t.strides, strides)
289
+
290
+ self.assertEqual(t.shape, shape)
291
+ self.assertEqual(t.datasize, c_datasize(t))
292
+ self.assertTrue(verify_datasize(t))
293
+
294
+
295
+ class TestFortran(unittest.TestCase):
296
+
297
+ def test_fortran_predicates(self):
298
+ t = ndt("!10 * 20 * complex128")
299
+
300
+ self.assertFalse(t.isabstract())
301
+ self.assertFalse(t.iscomplex())
302
+ self.assertTrue(t.isconcrete())
303
+ self.assertFalse(t.isfloat())
304
+ self.assertFalse(t.isoptional())
305
+ self.assertFalse(t.isscalar())
306
+ self.assertFalse(t.issigned())
307
+ self.assertFalse(t.isunsigned())
308
+
309
+ self.assertFalse(t.is_c_contiguous())
310
+ self.assertTrue(t.is_f_contiguous())
311
+
312
+ t = ndt("!20 * complex128")
313
+ self.assertTrue(t.is_c_contiguous())
314
+ self.assertTrue(t.is_f_contiguous())
315
+
316
+ t = ndt("!1 * 10 * uint8")
317
+ self.assertTrue(t.is_c_contiguous())
318
+ self.assertTrue(t.is_f_contiguous())
319
+
320
+ def test_fortran_common_fields(self):
321
+ dt = "{a: complex64, b: string}"
322
+ t = ndt("!2 * 3 * %s" % dt)
323
+ dtype = ndt(dt)
324
+
325
+ self.assertEqual(t.ndim, 2)
326
+ if not HAVE_32_BIT_LINUX:
327
+ self.assertEqual(t.itemsize, dtype.itemsize)
328
+ self.assertEqual(t.align, dtype.align)
329
+
330
+ self.assertEqual(t.shape, (2, 3))
331
+ self.assertEqual(t.strides, (dtype.itemsize, 2 * dtype.itemsize))
332
+ self.assertTrue(verify_datasize(t))
333
+
334
+ def test_fortran_dtypes(self):
335
+ for dtype, mem in DTYPE_TEST_CASES:
336
+ t = ndt(dtype)
337
+ self.assertEqual(t.ndim, 0)
338
+ if not HAVE_32_BIT_LINUX:
339
+ self.assertEqual(t.itemsize, mem.itemsize)
340
+ self.assertEqual(t.align, mem.align)
341
+
342
+ self.assertEqual(t.shape, ())
343
+ self.assertEqual(t.strides, ())
344
+
345
+ for i in range(10):
346
+ t = ndt("!%d * %s" % (i, dtype))
347
+ check_serialize(self, t)
348
+ shape = (i,)
349
+ strides = (mem.itemsize,)
350
+
351
+ self.assertEqual(t.ndim, 1)
352
+ if not HAVE_32_BIT_LINUX:
353
+ self.assertEqual(t.itemsize, mem.itemsize)
354
+ self.assertEqual(t.align, mem.align)
355
+ self.assertEqual(t.strides, strides)
356
+
357
+ self.assertEqual(t.shape, shape)
358
+ self.assertEqual(t.datasize, c_datasize(t))
359
+ self.assertTrue(verify_datasize(t))
360
+
361
+ for i in range(10):
362
+ for j in range(10):
363
+ t = ndt("!%d * %d * %s" % (i, j, dtype))
364
+ check_serialize(self, t)
365
+ shape = (i, j)
366
+ strides = (mem.itemsize, i * mem.itemsize)
367
+
368
+ self.assertEqual(t.ndim, 2)
369
+ if not HAVE_32_BIT_LINUX:
370
+ self.assertEqual(t.itemsize, mem.itemsize)
371
+ self.assertEqual(t.align, mem.align)
372
+ self.assertEqual(t.strides, strides)
373
+
374
+ self.assertEqual(t.shape, shape)
375
+ self.assertEqual(t.datasize, c_datasize(t))
376
+ self.assertTrue(verify_datasize(t))
377
+
378
+ for i in range(5):
379
+ for j in range(5):
380
+ for k in range(5):
381
+ t = ndt("!%d * %d * %d * %s" % (i, j, k, dtype))
382
+ check_serialize(self, t)
383
+ shape = (i, j, k)
384
+ strides = (mem.itemsize, i * mem.itemsize, i * j * mem.itemsize)
385
+
386
+ self.assertEqual(t.ndim, 3)
387
+ if not HAVE_32_BIT_LINUX:
388
+ self.assertEqual(t.itemsize, mem.itemsize)
389
+ self.assertEqual(t.align, mem.align)
390
+ self.assertEqual(t.strides, strides)
391
+
392
+ self.assertEqual(t.shape, shape)
393
+ self.assertEqual(t.datasize, c_datasize(t))
394
+ self.assertTrue(verify_datasize(t))
395
+
396
+ def test_fortran_conversion(self):
397
+ # Conversion should be from C-contiguous array.
398
+ s = "!fixed(shape=2, step=-20) * uint8"
399
+ self.assertRaises(TypeError, ndt, s)
400
+
401
+
402
+ class TestVarDim(unittest.TestCase):
403
+
404
+ def test_var_dim_predicates(self):
405
+ t = ndt("var(offsets=[0,2]) * var(offsets=[0,3,10]) * complex128")
406
+ check_serialize(self, t)
407
+
408
+ self.assertFalse(t.isabstract())
409
+ self.assertFalse(t.iscomplex())
410
+ self.assertTrue(t.isconcrete())
411
+ self.assertFalse(t.isfloat())
412
+ self.assertFalse(t.isoptional())
413
+ self.assertFalse(t.isscalar())
414
+ self.assertFalse(t.issigned())
415
+ self.assertFalse(t.isunsigned())
416
+
417
+ self.assertFalse(t.is_c_contiguous())
418
+ self.assertFalse(t.is_f_contiguous())
419
+
420
+ def test_var_dim_common_fields(self):
421
+ dt = "{a: complex64, b: string}"
422
+ t = ndt("var(offsets=[0,2]) * var(offsets=[0,3,10]) * %s" % dt)
423
+ check_serialize(self, t)
424
+ dtype = ndt(dt)
425
+
426
+ self.assertEqual(t.ndim, 2)
427
+ if not HAVE_32_BIT_LINUX:
428
+ self.assertEqual(t.itemsize, dtype.itemsize)
429
+ self.assertEqual(t.align, dtype.align)
430
+
431
+ self.assertRaises(TypeError, getattr, t, 'shape')
432
+ self.assertRaises(TypeError, getattr, t, 'strides')
433
+
434
+ def test_var_dim_invariants(self):
435
+ # Mixing var and fixed is disallowed.
436
+ self.assertRaises(TypeError, ndt, "10 * var * int64")
437
+ self.assertRaises(TypeError, ndt, "var * 10 * int64")
438
+ self.assertRaises(TypeError, ndt, "10 * var * 10 * int64")
439
+ self.assertRaises(TypeError, ndt, "var * 10 * var * int64")
440
+ self.assertRaises(TypeError, ndt, "N * var * int64")
441
+ self.assertRaises(TypeError, ndt, "var * N * int64")
442
+ self.assertRaises(TypeError, ndt, "N * var * N * int64")
443
+ self.assertRaises(TypeError, ndt, "var * N * var * int64")
444
+
445
+ # Too many dimensions.
446
+ self.assertRaises(TypeError, ndt, "var * " * (MAX_DIM + 1) + "float64")
447
+
448
+ # Nested var is disallowed.
449
+ self.assertRaises(TypeError, ndt, "2 * {a: var * complex128}")
450
+ self.assertRaises(TypeError, ndt, "var * {a: var * complex128}")
451
+ self.assertRaises(TypeError, ndt, "var * ref(var * string)")
452
+ self.assertRaises(TypeError, ndt, "var * SomeConstr(var * string)")
453
+
454
+ def test_var_dim_external_offsets(self):
455
+ # Invalid offsets.
456
+ self.assertRaises(TypeError, ndt, "int8", [""])
457
+ self.assertRaises(TypeError, ndt, "int8", [0])
458
+ self.assertRaises(TypeError, ndt, "int8", [0, 2])
459
+ self.assertRaises(TypeError, ndt, "int8", {})
460
+ self.assertRaises(TypeError, ndt, "int8", ())
461
+ self.assertRaises(TypeError, ndt, "int8", [(), ()])
462
+
463
+ self.assertRaises(ValueError, ndt, "int8", [])
464
+ self.assertRaises(ValueError, ndt, "int8", [[0]])
465
+ self.assertRaises(ValueError, ndt, "int8", [[0], [0]])
466
+
467
+ self.assertRaises(ValueError, ndt, "int8", [[-1, 2]])
468
+ self.assertRaises(ValueError, ndt, "int8", [[0, 2147483648]])
469
+
470
+ # Invalid combinations.
471
+ self.assertRaises(ValueError, ndt, "int8", [[0, 2], [0, 10]])
472
+ self.assertRaises(ValueError, ndt, "int8", [[0, 2], [0, 10, 30, 40]])
473
+
474
+ # Implicit mixing of var and fixed.
475
+ self.assertRaises(TypeError, ndt, "10 * int8", [[0, 2], [0, 10, 20]])
476
+
477
+ # Abstract dtype.
478
+ self.assertRaises(ValueError, ndt, "N * int8", [[0, 2], [0, 10, 20]])
479
+ self.assertRaises(ValueError, ndt, "var * int8", [[0, 2], [0, 10, 20]])
480
+
481
+ # Mixing external and internal offsets.
482
+ self.assertRaises(TypeError, ndt, "var(offsets=[0,2,10]) * int8", [[0, 1], [0, 2]])
483
+
484
+
485
+ class TestSymbolicDim(unittest.TestCase):
486
+
487
+ def test_symbolic_dim_predicates(self):
488
+ t = ndt("N * M * complex128")
489
+ check_serialize(self, t)
490
+
491
+ self.assertTrue(t.isabstract())
492
+ self.assertFalse(t.iscomplex())
493
+ self.assertFalse(t.isconcrete())
494
+ self.assertFalse(t.isfloat())
495
+ self.assertFalse(t.isoptional())
496
+ self.assertFalse(t.isscalar())
497
+ self.assertFalse(t.issigned())
498
+ self.assertFalse(t.isunsigned())
499
+
500
+ self.assertFalse(t.is_c_contiguous())
501
+ self.assertFalse(t.is_f_contiguous())
502
+
503
+ def test_symbolic_dim_common_fields(self):
504
+ dt = "{a: complex64, b: string}"
505
+ t = ndt("N * M * %s" % dt)
506
+ check_serialize(self, t)
507
+ dtype = ndt(dt)
508
+
509
+ self.assertRaises(TypeError, t, 'ndim')
510
+ self.assertRaises(TypeError, t, 'itemsize')
511
+ self.assertRaises(TypeError, t, 'align')
512
+
513
+ self.assertRaises(TypeError, t, 'shape')
514
+ self.assertRaises(TypeError, t, 'strides')
515
+
516
+
517
+ class TestEllipsisDim(unittest.TestCase):
518
+
519
+ def test_ellipsis_dim_predicates(self):
520
+ t = ndt("... * 2 * complex128")
521
+ check_serialize(self, t)
522
+
523
+ self.assertTrue(t.isabstract())
524
+ self.assertFalse(t.iscomplex())
525
+ self.assertFalse(t.isconcrete())
526
+ self.assertFalse(t.isfloat())
527
+ self.assertFalse(t.isoptional())
528
+ self.assertFalse(t.isscalar())
529
+ self.assertFalse(t.issigned())
530
+ self.assertFalse(t.isunsigned())
531
+
532
+ self.assertFalse(t.is_c_contiguous())
533
+ self.assertFalse(t.is_f_contiguous())
534
+
535
+ def test_ellipsis_dim_common_fields(self):
536
+ dt = "{a: complex64, b: string}"
537
+ t = ndt("... * 2 * %s" % dt)
538
+ check_serialize(self, t)
539
+ dtype = ndt(dt)
540
+
541
+ self.assertRaises(TypeError, t, 'ndim')
542
+ self.assertRaises(TypeError, t, 'itemsize')
543
+ self.assertRaises(TypeError, t, 'align')
544
+
545
+ self.assertRaises(TypeError, t, 'shape')
546
+ self.assertRaises(TypeError, t, 'strides')
547
+
548
+
549
+ class TestTuple(unittest.TestCase):
550
+
551
+ def test_tuple_predicates(self):
552
+ for s in ["()", "(int64)", "(string, bytes, pack=1)"]:
553
+ t = ndt(s)
554
+ check_serialize(self, t)
555
+
556
+ self.assertFalse(t.isabstract())
557
+ self.assertFalse(t.iscomplex())
558
+ self.assertTrue(t.isconcrete())
559
+ self.assertFalse(t.isfloat())
560
+ self.assertFalse(t.isoptional())
561
+ self.assertFalse(t.isscalar())
562
+ self.assertFalse(t.issigned())
563
+ self.assertFalse(t.isunsigned())
564
+
565
+ self.assertTrue(t.is_c_contiguous())
566
+ self.assertTrue(t.is_f_contiguous())
567
+
568
+ for s in ["(Any)", "(int64, N * M * uint8)", "(string, Float)"]:
569
+ t = ndt(s)
570
+ check_serialize(self, t)
571
+
572
+ self.assertTrue(t.isabstract())
573
+ self.assertFalse(t.iscomplex())
574
+ self.assertFalse(t.isconcrete())
575
+ self.assertFalse(t.isfloat())
576
+ self.assertFalse(t.isoptional())
577
+ self.assertFalse(t.isscalar())
578
+ self.assertFalse(t.issigned())
579
+ self.assertFalse(t.isunsigned())
580
+
581
+ self.assertFalse(t.is_c_contiguous())
582
+ self.assertFalse(t.is_f_contiguous())
583
+
584
+ def test_tuple_common_fields(self):
585
+ f = "{a: complex64, b: string}"
586
+ t = ndt("(%s, %s)" % (f, f))
587
+ check_serialize(self, t)
588
+ field = ndt(f)
589
+
590
+ self.assertEqual(t.ndim, 0)
591
+ if not HAVE_32_BIT_LINUX:
592
+ self.assertEqual(t.itemsize, 2 * field.itemsize)
593
+ self.assertEqual(t.align, field.align)
594
+
595
+ self.assertRaises(TypeError, t, 'shape')
596
+ self.assertRaises(TypeError, t, 'strides')
597
+
598
+
599
+ class TestRecord(unittest.TestCase):
600
+
601
+ def test_record_predicates(self):
602
+ for s in ["{}", "{a: int64, b: bytes}", "{x: string, y: uint8, pack=1}"]:
603
+ t = ndt(s)
604
+ check_serialize(self, t)
605
+
606
+ self.assertFalse(t.isabstract())
607
+ self.assertFalse(t.iscomplex())
608
+ self.assertTrue(t.isconcrete())
609
+ self.assertFalse(t.isfloat())
610
+ self.assertFalse(t.isoptional())
611
+ self.assertFalse(t.isscalar())
612
+ self.assertFalse(t.issigned())
613
+ self.assertFalse(t.isunsigned())
614
+
615
+ self.assertTrue(t.is_c_contiguous())
616
+ self.assertTrue(t.is_f_contiguous())
617
+
618
+ for s in ["{a: Any, b: Complex}", "{x: N * M * T}"]:
619
+ t = ndt(s)
620
+ check_serialize(self, t)
621
+
622
+ self.assertTrue(t.isabstract())
623
+ self.assertFalse(t.iscomplex())
624
+ self.assertFalse(t.isconcrete())
625
+ self.assertFalse(t.isfloat())
626
+ self.assertFalse(t.isoptional())
627
+ self.assertFalse(t.isscalar())
628
+ self.assertFalse(t.issigned())
629
+ self.assertFalse(t.isunsigned())
630
+
631
+ self.assertFalse(t.is_c_contiguous())
632
+ self.assertFalse(t.is_f_contiguous())
633
+
634
+ def test_record_common_fields(self):
635
+ f = "{a: complex64, b: string}"
636
+ t = ndt("{x: %s, y: %s, z: %s}" % (f, f, f))
637
+ check_serialize(self, t)
638
+ field = ndt(f)
639
+
640
+ self.assertEqual(t.ndim, 0)
641
+ if not HAVE_32_BIT_LINUX:
642
+ self.assertEqual(t.itemsize, 3 * field.itemsize)
643
+ self.assertEqual(t.align, field.align)
644
+
645
+ self.assertRaises(TypeError, t, 'shape')
646
+ self.assertRaises(TypeError, t, 'strides')
647
+
648
+
649
+ class TestRef(unittest.TestCase):
650
+
651
+ def test_ref_predicates(self):
652
+ for s in ["&2 * 3 * float64", "&bool", "&(uint8, int32)"]:
653
+ t = ndt(s)
654
+ check_serialize(self, t)
655
+
656
+ self.assertFalse(t.isabstract())
657
+ self.assertFalse(t.iscomplex())
658
+ self.assertTrue(t.isconcrete())
659
+ self.assertFalse(t.isfloat())
660
+ self.assertFalse(t.isoptional())
661
+ self.assertFalse(t.isscalar())
662
+ self.assertFalse(t.issigned())
663
+ self.assertFalse(t.isunsigned())
664
+
665
+ self.assertTrue(t.is_c_contiguous())
666
+ self.assertTrue(t.is_f_contiguous())
667
+
668
+ for s in ["&Any", "&(int64, N * M * uint8)"]:
669
+ t = ndt(s)
670
+ check_serialize(self, t)
671
+
672
+ self.assertTrue(t.isabstract())
673
+ self.assertFalse(t.iscomplex())
674
+ self.assertFalse(t.isconcrete())
675
+ self.assertFalse(t.isfloat())
676
+ self.assertFalse(t.isoptional())
677
+ self.assertFalse(t.isscalar())
678
+ self.assertFalse(t.issigned())
679
+ self.assertFalse(t.isunsigned())
680
+
681
+ self.assertFalse(t.is_c_contiguous())
682
+ self.assertFalse(t.is_f_contiguous())
683
+
684
+ def test_ref_common_fields(self):
685
+ a = "{a: complex64, b: string}"
686
+ t = ndt("ref(%s)" % a)
687
+ check_serialize(self, t)
688
+ arg = ndt(a)
689
+
690
+ self.assertEqual(t.ndim, 0)
691
+ self.assertEqual(t.itemsize, SIZEOF_PTR)
692
+ self.assertEqual(t.align, SIZEOF_PTR)
693
+
694
+ self.assertRaises(TypeError, t, 'shape')
695
+ self.assertRaises(TypeError, t, 'strides')
696
+
697
+
698
+ class TestConstr(unittest.TestCase):
699
+
700
+ def test_constr_predicates(self):
701
+ for s in ["Some(int16)", "Maybe(int64)", "Just((string, bytes))"]:
702
+ t = ndt(s)
703
+ check_serialize(self, t)
704
+
705
+ self.assertFalse(t.isabstract())
706
+ self.assertFalse(t.iscomplex())
707
+ self.assertTrue(t.isconcrete())
708
+ self.assertFalse(t.isfloat())
709
+ self.assertFalse(t.isoptional())
710
+ self.assertFalse(t.isscalar())
711
+ self.assertFalse(t.issigned())
712
+ self.assertFalse(t.isunsigned())
713
+
714
+ self.assertTrue(t.is_c_contiguous())
715
+ self.assertTrue(t.is_f_contiguous())
716
+
717
+ def test_constr_common_fields(self):
718
+ a = "{a: complex64, b: string}"
719
+ t = ndt("Just(%s)" % a)
720
+ check_serialize(self, t)
721
+ arg = ndt(a)
722
+
723
+ self.assertEqual(t.ndim, 0)
724
+ if not HAVE_32_BIT_LINUX:
725
+ self.assertEqual(t.itemsize, arg.itemsize)
726
+ self.assertEqual(t.align, arg.align)
727
+
728
+ self.assertRaises(TypeError, t, 'shape')
729
+ self.assertRaises(TypeError, t, 'strides')
730
+
731
+
732
+ class TestNominal(unittest.TestCase):
733
+
734
+ # The regrtest.py -R option causes setUpClass() to be called several times.
735
+ initialized = False
736
+
737
+ @classmethod
738
+ def setUpClass(cls):
739
+ if not cls.initialized:
740
+ typedef("some_t", "2 * 10 * complex128")
741
+ cls.initialized = True
742
+
743
+ def test_nominal_predicates(self):
744
+ t = ndt("some_t")
745
+ check_serialize(self, t)
746
+
747
+ # The nominal type is opaque. The only thing known is that
748
+ # the typedef is concrete.
749
+ self.assertFalse(t.isabstract())
750
+ self.assertFalse(t.iscomplex())
751
+ self.assertTrue(t.isconcrete())
752
+ self.assertFalse(t.isfloat())
753
+ self.assertFalse(t.isoptional())
754
+ self.assertFalse(t.isscalar())
755
+ self.assertFalse(t.issigned())
756
+ self.assertFalse(t.isunsigned())
757
+
758
+ self.assertTrue(t.is_c_contiguous())
759
+ self.assertTrue(t.is_f_contiguous())
760
+
761
+ def test_nominal_common_fields(self):
762
+ t = ndt("some_t")
763
+ dtype = ndt("complex128")
764
+
765
+ # The opaque type is treated as a dtype with ndim==0, same as
766
+ # for constructor types.
767
+ self.assertEqual(t.ndim, 0)
768
+ if not HAVE_32_BIT_LINUX:
769
+ self.assertEqual(t.itemsize, 2 * 10 * dtype.itemsize)
770
+ self.assertEqual(t.align, dtype.align)
771
+
772
+ self.assertRaises(TypeError, t, 'shape')
773
+ self.assertRaises(TypeError, t, 'strides')
774
+
775
+ def test_nominal_exceptions(self):
776
+ # not in the typedef table
777
+ self.assertRaises(ValueError, ndt, "undefined_t")
778
+
779
+ # duplicate typedef
780
+ self.assertRaises(ValueError, typedef, "some_t", "int64")
781
+
782
+
783
+ class TestScalarKind(unittest.TestCase):
784
+
785
+ def test_scalar_kind_predicates(self):
786
+ t = ndt("Scalar")
787
+ check_serialize(self, t)
788
+
789
+ self.assertTrue(t.isabstract())
790
+ self.assertFalse(t.iscomplex())
791
+ self.assertFalse(t.isconcrete())
792
+ self.assertFalse(t.isfloat())
793
+ self.assertFalse(t.isoptional())
794
+ self.assertFalse(t.isscalar())
795
+ self.assertFalse(t.issigned())
796
+ self.assertFalse(t.isunsigned())
797
+
798
+ self.assertFalse(t.is_c_contiguous())
799
+ self.assertFalse(t.is_f_contiguous())
800
+
801
+ def test_scalar_kind_common_fields(self):
802
+ t = ndt("Scalar")
803
+ check_serialize(self, t)
804
+
805
+ self.assertRaises(TypeError, t, 'ndim')
806
+ self.assertRaises(TypeError, t, 'itemsize')
807
+ self.assertRaises(TypeError, t, 'align')
808
+
809
+ self.assertRaises(TypeError, t, 'shape')
810
+ self.assertRaises(TypeError, t, 'strides')
811
+
812
+
813
+ class TestCategorical(unittest.TestCase):
814
+
815
+ def test_categorical_predicates(self):
816
+ for s in [
817
+ "categorical(NA, 1, 100, -29999)",
818
+ "categorical(NA, 1.2, -200.25)",
819
+ "categorical('foo', 'bar')",
820
+ "categorical('foo', NA, 100)"]:
821
+ t = ndt(s)
822
+ check_serialize(self, t)
823
+
824
+ self.assertFalse(t.isabstract())
825
+ self.assertFalse(t.iscomplex())
826
+ self.assertTrue(t.isconcrete())
827
+ self.assertFalse(t.isfloat())
828
+ self.assertFalse(t.isoptional())
829
+ self.assertFalse(t.isscalar())
830
+ self.assertFalse(t.issigned())
831
+ self.assertFalse(t.isunsigned())
832
+
833
+ self.assertTrue(t.is_c_contiguous())
834
+ self.assertTrue(t.is_f_contiguous())
835
+
836
+ def test_categorical_common_fields(self):
837
+ t = ndt("categorical(NA, 'something', 'must', 'be', 'done')")
838
+ check_serialize(self, t)
839
+
840
+ self.assertEqual(t.ndim, 0)
841
+ if not HAVE_32_BIT_LINUX:
842
+ self.assertEqual(t.itemsize, 8)
843
+ self.assertEqual(t.align, 8)
844
+
845
+ self.assertRaises(TypeError, t, 'shape')
846
+ self.assertRaises(TypeError, t, 'strides')
847
+
848
+
849
+ class TestFixedStringKind(unittest.TestCase):
850
+
851
+ def test_fixed_string_kind_predicates(self):
852
+ t = ndt("FixedString")
853
+ check_serialize(self, t)
854
+
855
+ self.assertTrue(t.isabstract())
856
+ self.assertFalse(t.iscomplex())
857
+ self.assertFalse(t.isconcrete())
858
+ self.assertFalse(t.isfloat())
859
+ self.assertFalse(t.isoptional())
860
+ self.assertFalse(t.isscalar())
861
+ self.assertFalse(t.issigned())
862
+ self.assertFalse(t.isunsigned())
863
+
864
+ self.assertFalse(t.is_c_contiguous())
865
+ self.assertFalse(t.is_f_contiguous())
866
+
867
+ def test_fixed_string_kind_common_fields(self):
868
+ t = ndt("FixedString")
869
+
870
+ self.assertRaises(TypeError, t, 'ndim')
871
+ self.assertRaises(TypeError, t, 'itemsize')
872
+ self.assertRaises(TypeError, t, 'align')
873
+
874
+ self.assertRaises(TypeError, t, 'shape')
875
+ self.assertRaises(TypeError, t, 'strides')
876
+
877
+
878
+ class TestFixedString(unittest.TestCase):
879
+
880
+ def test_fixed_string_predicates(self):
881
+ t = ndt("fixed_string(380, 'utf16')")
882
+ check_serialize(self, t)
883
+
884
+ self.assertFalse(t.isabstract())
885
+ self.assertFalse(t.iscomplex())
886
+ self.assertTrue(t.isconcrete())
887
+ self.assertFalse(t.isfloat())
888
+ self.assertFalse(t.isoptional())
889
+ self.assertTrue(t.isscalar())
890
+ self.assertFalse(t.issigned())
891
+ self.assertFalse(t.isunsigned())
892
+
893
+ self.assertTrue(t.is_c_contiguous())
894
+ self.assertTrue(t.is_f_contiguous())
895
+
896
+ def test_fixed_string_common_fields(self):
897
+ for encoding, codepoint_size in [
898
+ ('ascii', 1),
899
+ ('utf8', 1),
900
+ ('utf16', 2),
901
+ ('utf32', 4)]:
902
+
903
+ t = ndt("fixed_string(20, '%s')" % encoding)
904
+ check_serialize(self, t)
905
+
906
+ self.assertEqual(t.ndim, 0)
907
+ if not HAVE_32_BIT_LINUX:
908
+ self.assertEqual(t.itemsize, 20 * codepoint_size)
909
+ self.assertEqual(t.align, codepoint_size)
910
+
911
+ self.assertRaises(TypeError, t, 'shape')
912
+ self.assertRaises(TypeError, t, 'strides')
913
+
914
+
915
+ class TestFixedBytesKind(unittest.TestCase):
916
+
917
+ def test_fixed_bytes_kind_predicates(self):
918
+ t = ndt("FixedBytes")
919
+ check_serialize(self, t)
920
+
921
+ self.assertTrue(t.isabstract())
922
+ self.assertFalse(t.iscomplex())
923
+ self.assertFalse(t.isconcrete())
924
+ self.assertFalse(t.isfloat())
925
+ self.assertFalse(t.isoptional())
926
+ self.assertFalse(t.isscalar())
927
+ self.assertFalse(t.issigned())
928
+ self.assertFalse(t.isunsigned())
929
+
930
+ self.assertFalse(t.is_c_contiguous())
931
+ self.assertFalse(t.is_f_contiguous())
932
+
933
+ def test_fixed_string_kind_common_fields(self):
934
+ t = ndt("FixedBytes")
935
+
936
+ self.assertRaises(TypeError, t, 'ndim')
937
+ self.assertRaises(TypeError, t, 'itemsize')
938
+ self.assertRaises(TypeError, t, 'align')
939
+
940
+ self.assertRaises(TypeError, t, 'shape')
941
+ self.assertRaises(TypeError, t, 'strides')
942
+
943
+
944
+ class TestFixedBytes(unittest.TestCase):
945
+
946
+ def test_fixed_bytes_predicates(self):
947
+ t = ndt("fixed_bytes(size=1020)")
948
+ check_serialize(self, t)
949
+
950
+ self.assertFalse(t.isabstract())
951
+ self.assertFalse(t.iscomplex())
952
+ self.assertTrue(t.isconcrete())
953
+ self.assertFalse(t.isfloat())
954
+ self.assertFalse(t.isoptional())
955
+ self.assertTrue(t.isscalar())
956
+ self.assertFalse(t.issigned())
957
+ self.assertFalse(t.isunsigned())
958
+
959
+ self.assertTrue(t.is_c_contiguous())
960
+ self.assertTrue(t.is_f_contiguous())
961
+
962
+ def test_fixed_bytes_common_fields(self):
963
+ for align in [1,2,4,8,16,32,64]:
964
+
965
+ t = ndt("fixed_bytes(size=1024, align=%d)" % align)
966
+ check_serialize(self, t)
967
+
968
+ self.assertEqual(t.ndim, 0)
969
+ if not HAVE_32_BIT_LINUX:
970
+ self.assertEqual(t.itemsize, 1024)
971
+ self.assertEqual(t.align, align)
972
+
973
+ self.assertRaises(TypeError, t, 'shape')
974
+ self.assertRaises(TypeError, t, 'strides')
975
+
976
+ def test_fixed_bytes_exceptions(self):
977
+ # Data size must be a multiple of align.
978
+ self.assertRaises(ValueError, ndt, "fixed_bytes(size=20, align=8)")
979
+
980
+
981
+ class TestString(unittest.TestCase):
982
+
983
+ def test_string_predicates(self):
984
+ t = ndt("string")
985
+ check_serialize(self, t)
986
+
987
+ self.assertFalse(t.isabstract())
988
+ self.assertFalse(t.iscomplex())
989
+ self.assertTrue(t.isconcrete())
990
+ self.assertFalse(t.isfloat())
991
+ self.assertFalse(t.isoptional())
992
+ self.assertTrue(t.isscalar())
993
+ self.assertFalse(t.issigned())
994
+ self.assertFalse(t.isunsigned())
995
+
996
+ self.assertTrue(t.is_c_contiguous())
997
+ self.assertTrue(t.is_f_contiguous())
998
+
999
+ def test_string_common_fields(self):
1000
+ t = ndt("string")
1001
+
1002
+ self.assertEqual(t.ndim, 0)
1003
+ self.assertEqual(t.itemsize, SIZEOF_PTR)
1004
+ self.assertEqual(t.align, SIZEOF_PTR)
1005
+
1006
+ self.assertRaises(TypeError, t, 'shape')
1007
+ self.assertRaises(TypeError, t, 'strides')
1008
+
1009
+
1010
+ class TestBytes(unittest.TestCase):
1011
+
1012
+ def test_bytes_predicates(self):
1013
+ t = ndt("bytes")
1014
+ check_serialize(self, t)
1015
+
1016
+ self.assertFalse(t.isabstract())
1017
+ self.assertFalse(t.iscomplex())
1018
+ self.assertTrue(t.isconcrete())
1019
+ self.assertFalse(t.isfloat())
1020
+ self.assertFalse(t.isoptional())
1021
+ self.assertTrue(t.isscalar())
1022
+ self.assertFalse(t.issigned())
1023
+ self.assertFalse(t.isunsigned())
1024
+
1025
+ self.assertTrue(t.is_c_contiguous())
1026
+ self.assertTrue(t.is_f_contiguous())
1027
+
1028
+ def test_bytes_common_fields(self):
1029
+ t = ndt("bytes")
1030
+
1031
+ self.assertEqual(t.ndim, 0)
1032
+ if not HAVE_32_BIT_LINUX:
1033
+ self.assertEqual(t.itemsize, 16)
1034
+ self.assertEqual(t.align, 8)
1035
+
1036
+ self.assertRaises(TypeError, t, 'shape')
1037
+ self.assertRaises(TypeError, t, 'strides')
1038
+
1039
+
1040
+ class TestChar(unittest.TestCase):
1041
+
1042
+ def test_char_predicates(self):
1043
+ t = ndt("char")
1044
+ check_serialize(self, t)
1045
+
1046
+ self.assertFalse(t.isabstract())
1047
+ self.assertFalse(t.iscomplex())
1048
+ self.assertTrue(t.isconcrete())
1049
+ self.assertFalse(t.isfloat())
1050
+ self.assertFalse(t.isoptional())
1051
+ self.assertTrue(t.isscalar())
1052
+ self.assertFalse(t.issigned())
1053
+ self.assertFalse(t.isunsigned())
1054
+
1055
+ self.assertTrue(t.is_c_contiguous())
1056
+ self.assertTrue(t.is_f_contiguous())
1057
+
1058
+ def test_char_common_fields(self):
1059
+ t = ndt("char('utf32')")
1060
+ check_serialize(self, t)
1061
+
1062
+ self.assertEqual(t.ndim, 0)
1063
+ self.assertEqual(t.itemsize, 4)
1064
+ self.assertEqual(t.align, 4)
1065
+
1066
+ self.assertRaises(TypeError, t, 'shape')
1067
+ self.assertRaises(TypeError, t, 'strides')
1068
+
1069
+
1070
+ class TestBool(unittest.TestCase):
1071
+
1072
+ def test_bool_predicates(self):
1073
+ t = ndt("bool")
1074
+ check_serialize(self, t)
1075
+
1076
+ self.assertFalse(t.isabstract())
1077
+ self.assertFalse(t.iscomplex())
1078
+ self.assertTrue(t.isconcrete())
1079
+ self.assertFalse(t.isfloat())
1080
+ self.assertFalse(t.isoptional())
1081
+ self.assertTrue(t.isscalar())
1082
+ self.assertFalse(t.issigned())
1083
+ self.assertFalse(t.isunsigned())
1084
+
1085
+ self.assertTrue(t.is_c_contiguous())
1086
+ self.assertTrue(t.is_f_contiguous())
1087
+
1088
+ def test_bool_common_fields(self):
1089
+ t = ndt("bool")
1090
+
1091
+ self.assertEqual(t.ndim, 0)
1092
+ self.assertEqual(t.itemsize, 1)
1093
+ self.assertEqual(t.align, 1)
1094
+
1095
+ self.assertRaises(TypeError, t, 'shape')
1096
+ self.assertRaises(TypeError, t, 'strides')
1097
+
1098
+
1099
+ class TestSignedKind(unittest.TestCase):
1100
+
1101
+ def test_signed_kind_predicates(self):
1102
+ t = ndt("Signed")
1103
+ check_serialize(self, t)
1104
+
1105
+ self.assertTrue(t.isabstract())
1106
+ self.assertFalse(t.iscomplex())
1107
+ self.assertFalse(t.isconcrete())
1108
+ self.assertFalse(t.isfloat())
1109
+ self.assertFalse(t.isoptional())
1110
+ self.assertFalse(t.isscalar())
1111
+ self.assertFalse(t.issigned())
1112
+ self.assertFalse(t.isunsigned())
1113
+
1114
+ self.assertFalse(t.is_c_contiguous())
1115
+ self.assertFalse(t.is_f_contiguous())
1116
+
1117
+ def test_signed_kind_common_fields(self):
1118
+ t = ndt("Signed")
1119
+
1120
+ self.assertRaises(TypeError, t, 'ndim')
1121
+ self.assertRaises(TypeError, t, 'itemsize')
1122
+ self.assertRaises(TypeError, t, 'align')
1123
+
1124
+ self.assertRaises(TypeError, t, 'shape')
1125
+ self.assertRaises(TypeError, t, 'strides')
1126
+
1127
+
1128
+ class TestSigned(unittest.TestCase):
1129
+
1130
+ def test_signed_predicates(self):
1131
+ signed = ['int8', 'int16', 'int32', 'int64']
1132
+
1133
+ for s in signed:
1134
+ t = ndt(s)
1135
+ check_serialize(self, t)
1136
+
1137
+ self.assertFalse(t.isabstract())
1138
+ self.assertFalse(t.iscomplex())
1139
+ self.assertTrue(t.isconcrete())
1140
+ self.assertFalse(t.isfloat())
1141
+ self.assertFalse(t.isoptional())
1142
+ self.assertTrue(t.isscalar())
1143
+ self.assertTrue(t.issigned())
1144
+ self.assertFalse(t.isunsigned())
1145
+
1146
+ self.assertTrue(t.is_c_contiguous())
1147
+ self.assertTrue(t.is_f_contiguous())
1148
+
1149
+ def test_signed_common_fields(self):
1150
+ for s, itemsize in [
1151
+ ('int8', 1),
1152
+ ('int16', 2),
1153
+ ('int32', 4),
1154
+ ('int64', 8)]:
1155
+
1156
+ t = ndt(s)
1157
+
1158
+ self.assertEqual(t.ndim, 0)
1159
+ if not HAVE_32_BIT_LINUX:
1160
+ self.assertEqual(t.itemsize, itemsize)
1161
+ self.assertEqual(t.align, itemsize)
1162
+
1163
+ self.assertRaises(TypeError, t, 'shape')
1164
+ self.assertRaises(TypeError, t, 'shape')
1165
+
1166
+
1167
+ class TestUnsignedKind(unittest.TestCase):
1168
+
1169
+ def test_unsigned_kind_predicates(self):
1170
+ t = ndt("Unsigned")
1171
+ check_serialize(self, t)
1172
+
1173
+ self.assertTrue(t.isabstract())
1174
+ self.assertFalse(t.iscomplex())
1175
+ self.assertFalse(t.isconcrete())
1176
+ self.assertFalse(t.isfloat())
1177
+ self.assertFalse(t.isoptional())
1178
+ self.assertFalse(t.isscalar())
1179
+ self.assertFalse(t.issigned())
1180
+ self.assertFalse(t.isunsigned())
1181
+
1182
+ self.assertFalse(t.is_c_contiguous())
1183
+ self.assertFalse(t.is_f_contiguous())
1184
+
1185
+ def test_unsigned_kind_common_fields(self):
1186
+ t = ndt("Unsigned")
1187
+
1188
+ self.assertRaises(TypeError, t, 'ndim')
1189
+ self.assertRaises(TypeError, t, 'itemsize')
1190
+ self.assertRaises(TypeError, t, 'align')
1191
+
1192
+ self.assertRaises(TypeError, t, 'shape')
1193
+ self.assertRaises(TypeError, t, 'strides')
1194
+
1195
+
1196
+ class TestUnsigned(unittest.TestCase):
1197
+
1198
+ def test_unsigned_predicates(self):
1199
+ unsigned = ['uint8', 'uint16', 'uint32', 'uint64']
1200
+
1201
+ for s in unsigned:
1202
+ t = ndt(s)
1203
+ check_serialize(self, t)
1204
+
1205
+ self.assertFalse(t.isabstract())
1206
+ self.assertFalse(t.iscomplex())
1207
+ self.assertTrue(t.isconcrete())
1208
+ self.assertFalse(t.isfloat())
1209
+ self.assertFalse(t.isoptional())
1210
+ self.assertTrue(t.isscalar())
1211
+ self.assertFalse(t.issigned())
1212
+ self.assertTrue(t.isunsigned())
1213
+
1214
+ self.assertTrue(t.is_c_contiguous())
1215
+ self.assertTrue(t.is_f_contiguous())
1216
+
1217
+ def test_unsigned_common_fields(self):
1218
+ for s, itemsize in [
1219
+ ('uint8', 1),
1220
+ ('uint16', 2),
1221
+ ('uint32', 4),
1222
+ ('uint64', 8)]:
1223
+
1224
+ t = ndt(s)
1225
+
1226
+ self.assertEqual(t.ndim, 0)
1227
+ if not HAVE_32_BIT_LINUX:
1228
+ self.assertEqual(t.itemsize, itemsize)
1229
+ self.assertEqual(t.align, itemsize)
1230
+
1231
+ self.assertRaises(TypeError, t, 'shape')
1232
+ self.assertRaises(TypeError, t, 'shape')
1233
+
1234
+
1235
+ class TestFloatKind(unittest.TestCase):
1236
+
1237
+ def test_float_kind_predicates(self):
1238
+ t = ndt("Float")
1239
+ check_serialize(self, t)
1240
+
1241
+ self.assertTrue(t.isabstract())
1242
+ self.assertFalse(t.iscomplex())
1243
+ self.assertFalse(t.isconcrete())
1244
+ self.assertFalse(t.isfloat())
1245
+ self.assertFalse(t.isoptional())
1246
+ self.assertFalse(t.isscalar())
1247
+ self.assertFalse(t.issigned())
1248
+ self.assertFalse(t.isunsigned())
1249
+
1250
+ self.assertFalse(t.is_c_contiguous())
1251
+ self.assertFalse(t.is_f_contiguous())
1252
+
1253
+ def test_float_kind_common_fields(self):
1254
+ t = ndt("Float")
1255
+ check_serialize(self, t)
1256
+
1257
+ self.assertRaises(TypeError, t, 'ndim')
1258
+ self.assertRaises(TypeError, t, 'itemsize')
1259
+ self.assertRaises(TypeError, t, 'align')
1260
+
1261
+ self.assertRaises(TypeError, t, 'shape')
1262
+ self.assertRaises(TypeError, t, 'strides')
1263
+
1264
+
1265
+ class TestFloat(unittest.TestCase):
1266
+
1267
+ def test_float_predicates(self):
1268
+ _float = ['float32', 'float64']
1269
+ if HAVE_PYTHON_36:
1270
+ _float.insert(0, 'float16')
1271
+
1272
+ for s in _float:
1273
+ t = ndt(s)
1274
+ check_serialize(self, t)
1275
+
1276
+ self.assertFalse(t.isabstract())
1277
+ self.assertFalse(t.iscomplex())
1278
+ self.assertTrue(t.isconcrete())
1279
+ self.assertTrue(t.isfloat())
1280
+ self.assertFalse(t.isoptional())
1281
+ self.assertTrue(t.isscalar())
1282
+ self.assertFalse(t.issigned())
1283
+ self.assertFalse(t.isunsigned())
1284
+
1285
+ self.assertTrue(t.is_c_contiguous())
1286
+ self.assertTrue(t.is_f_contiguous())
1287
+
1288
+ def test_float_common_fields(self):
1289
+ _float = [('float32', 4), ('float64', 8)]
1290
+ if HAVE_PYTHON_36:
1291
+ _float.insert(0, ('float16', 2))
1292
+
1293
+ for s, itemsize in _float:
1294
+ t = ndt(s)
1295
+
1296
+ self.assertEqual(t.ndim, 0)
1297
+ if not HAVE_32_BIT_LINUX:
1298
+ self.assertEqual(t.itemsize, itemsize)
1299
+ self.assertEqual(t.align, itemsize)
1300
+
1301
+ self.assertRaises(TypeError, t, 'shape')
1302
+ self.assertRaises(TypeError, t, 'shape')
1303
+
1304
+
1305
+ class TestComplexKind(unittest.TestCase):
1306
+
1307
+ def test_complex_kind_predicates(self):
1308
+ t = ndt("Complex")
1309
+ check_serialize(self, t)
1310
+
1311
+ self.assertTrue(t.isabstract())
1312
+ self.assertFalse(t.iscomplex())
1313
+ self.assertFalse(t.isconcrete())
1314
+ self.assertFalse(t.isfloat())
1315
+ self.assertFalse(t.isoptional())
1316
+ self.assertFalse(t.isscalar())
1317
+ self.assertFalse(t.issigned())
1318
+ self.assertFalse(t.isunsigned())
1319
+
1320
+ self.assertFalse(t.is_c_contiguous())
1321
+ self.assertFalse(t.is_f_contiguous())
1322
+
1323
+ def test_complex_kind_common_fields(self):
1324
+ t = ndt("Complex")
1325
+
1326
+ self.assertRaises(TypeError, t, 'ndim')
1327
+ self.assertRaises(TypeError, t, 'itemsize')
1328
+ self.assertRaises(TypeError, t, 'align')
1329
+
1330
+ self.assertRaises(TypeError, t, 'shape')
1331
+ self.assertRaises(TypeError, t, 'strides')
1332
+
1333
+
1334
+ class TestComplex(unittest.TestCase):
1335
+
1336
+ def test_complex_predicates(self):
1337
+ _complex = ['complex64', 'complex128']
1338
+ if HAVE_PYTHON_36:
1339
+ _complex.insert(0, 'complex32')
1340
+
1341
+ for s in _complex:
1342
+ t = ndt(s)
1343
+ check_serialize(self, t)
1344
+
1345
+ self.assertFalse(t.isabstract())
1346
+ self.assertTrue(t.iscomplex())
1347
+ self.assertTrue(t.isconcrete())
1348
+ self.assertFalse(t.isfloat())
1349
+ self.assertFalse(t.isoptional())
1350
+ self.assertTrue(t.isscalar())
1351
+ self.assertFalse(t.issigned())
1352
+ self.assertFalse(t.isunsigned())
1353
+
1354
+ self.assertTrue(t.is_c_contiguous())
1355
+ self.assertTrue(t.is_f_contiguous())
1356
+
1357
+ def test_complex_common_fields(self):
1358
+ _complex = [('complex64', 8), ('complex128', 16)]
1359
+ if HAVE_PYTHON_36:
1360
+ _complex.insert(0, ('complex32', 4))
1361
+
1362
+ for s, itemsize in _complex:
1363
+ t = ndt(s)
1364
+
1365
+ self.assertEqual(t.ndim, 0)
1366
+ if not HAVE_32_BIT_LINUX:
1367
+ self.assertEqual(t.itemsize, itemsize)
1368
+ self.assertEqual(t.align, itemsize // 2)
1369
+
1370
+ self.assertRaises(TypeError, t, 'shape')
1371
+ self.assertRaises(TypeError, t, 'shape')
1372
+
1373
+
1374
+ class TestTypevar(unittest.TestCase):
1375
+
1376
+ def test_typevar_predicates(self):
1377
+ t = ndt("T")
1378
+ check_serialize(self, t)
1379
+
1380
+ self.assertTrue(t.isabstract())
1381
+ self.assertFalse(t.iscomplex())
1382
+ self.assertFalse(t.isconcrete())
1383
+ self.assertFalse(t.isfloat())
1384
+ self.assertFalse(t.isoptional())
1385
+ self.assertFalse(t.isscalar())
1386
+ self.assertFalse(t.issigned())
1387
+ self.assertFalse(t.isunsigned())
1388
+
1389
+ self.assertFalse(t.is_c_contiguous())
1390
+ self.assertFalse(t.is_f_contiguous())
1391
+
1392
+ def test_typevar_common_fields(self):
1393
+ t = ndt("T")
1394
+
1395
+ self.assertRaises(TypeError, t, 'ndim')
1396
+ self.assertRaises(TypeError, t, 'itemsize')
1397
+ self.assertRaises(TypeError, t, 'align')
1398
+
1399
+ self.assertRaises(TypeError, t, 'shape')
1400
+ self.assertRaises(TypeError, t, 'strides')
1401
+
1402
+
1403
+ class TestCopy(unittest.TestCase):
1404
+
1405
+ def test_copy(self):
1406
+ for dtype, mem in DTYPE_TEST_CASES:
1407
+ t = ndt(dtype)
1408
+ u = copy(t)
1409
+ self.assertEqual(u, t)
1410
+ self.assertEqual(u.ast_repr(), t.ast_repr())
1411
+
1412
+ def test_copy_gc(self):
1413
+ class MyType(ndt):
1414
+ self.attr = None
1415
+ class MyObject():
1416
+ self.attr = None
1417
+
1418
+ x = ndt("var(offsets=[0,2]) * var(offsets=[0,3,10]) * int8")
1419
+ y = copy(x)
1420
+ x = y = None
1421
+ gc.collect()
1422
+
1423
+ x = ndt("{z: 10 * int8}", [[0, 2], [0, 10, 20]])
1424
+ y = copy(x)
1425
+ x = y = None
1426
+ gc.collect()
1427
+
1428
+ x = MyType("var(offsets=[0,2]) * var(offsets=[0,3,10]) * int8")
1429
+ y = copy(x)
1430
+ o = MyObject()
1431
+ o.attr = x
1432
+ x.attr = y
1433
+ y.attr = o
1434
+ wr = weakref.ref(o)
1435
+ x = y = o = None
1436
+ gc.collect()
1437
+ self.assertTrue(wr() is None, wr())
1438
+
1439
+
1440
+ class TestBufferProtocol(unittest.TestCase):
1441
+
1442
+ def test_array(self):
1443
+ test_cases = [
1444
+ # format, itemsize, alignment
1445
+ ("(0)f", 4, 4),
1446
+ ("(1)d", 8, 8),
1447
+ ("(125)d", 8, 8),
1448
+ ("(2,3)d", 8, 8),
1449
+ ("(2,10)T{<b:a:Q:b:}", 9, 1),
1450
+ ("(2,19)T{<b:a:xxxQ:b:}", 12, 4),
1451
+ ("(31,221)T{<b:a:xxxxxxxQ:b:}", 16, 8),
1452
+ ("(2,3,10)T{<b:a:xxxxxxxxxxxxxxxQ:b:xxxxxxxx}", 32, 16),
1453
+ ("(2,10)T{=L:a:(2,3)D:b:}", 100, 1)]
1454
+
1455
+ test_error_cases = [
1456
+ # empty shape (scalars are not arrays in datashape)
1457
+ "()Q",
1458
+ # Ambiguous (tuple of 10 or array of 10)?
1459
+ "10Q"]
1460
+
1461
+ for fmt, itemsize, align in test_cases:
1462
+ t = ndt.from_format(fmt)
1463
+ if not HAVE_32_BIT_LINUX:
1464
+ self.assertEqual(t.itemsize, itemsize)
1465
+ self.assertEqual(t.align, align)
1466
+
1467
+ for fmt in test_error_cases:
1468
+ self.assertRaises(ValueError, ndt.from_format, fmt)
1469
+
1470
+ def test_record(self):
1471
+ test_cases = [
1472
+ # format, itemsize, alignment
1473
+ ("T{<b:a:Q:b:}", 9, 1),
1474
+ ("T{<b:a:xQ:b:}", 10, 2),
1475
+ ("T{<b:a:xxxQ:b:}", 12, 4),
1476
+ ("T{<b:a:xxxxxxxQ:b:}", 16, 8),
1477
+ ("T{<b:a:xxxxxxxxxxxxxxxQ:b:xxxxxxxx}", 32, 16),
1478
+ ("T{=i:foo:f:bar:10s:baz:}", 18, 1)]
1479
+
1480
+ test_error_cases = [
1481
+ # sizeof(signed char) + padding is not a power of two.
1482
+ "T{<b:a:xxQ:b:}",
1483
+ # Missing padding bytes at the end of the struct. The only
1484
+ # reason a compiler would add three padding bytes to field
1485
+ # zero is an artificial forced alignment of four for the short
1486
+ # in field one. This in turn requires that the entire struct
1487
+ # has alignment four, which necessitates two padding bytes at
1488
+ # the end of the struct.
1489
+ "T{<b:a:xxxh:b:}",
1490
+ # Unnatural padding at the end of the struct (expect two padding
1491
+ # bytes instead of four).
1492
+ "T{<b:a:xxxh:b:xxxx}"]
1493
+
1494
+ for fmt, itemsize, align in test_cases:
1495
+ t = ndt.from_format(fmt)
1496
+ if not HAVE_32_BIT_LINUX:
1497
+ self.assertEqual(t.itemsize, itemsize)
1498
+ self.assertEqual(t.align, align)
1499
+
1500
+ for fmt in test_error_cases:
1501
+ self.assertRaises(ValueError, ndt.from_format, fmt)
1502
+
1503
+ def test_fixed_bytes(self):
1504
+ for fmt in ['s', '100s']:
1505
+ t = ndt.from_format(fmt)
1506
+ s = struct.Struct(fmt)
1507
+ self.assertEqual(t.itemsize, s.size)
1508
+
1509
+ # For consistency (it would be easy to allow, but other dtypes
1510
+ # cannot have size 0).
1511
+ self.assertRaises(ValueError, ndt.from_format, "0s")
1512
+
1513
+ for fmt in ['0s', 's', '100s']:
1514
+ for modifier in ['@', '=', '<', '>', '!']:
1515
+ f = modifier + fmt
1516
+ self.assertRaises(ValueError, ndt.from_format, f)
1517
+
1518
+ t = ndt.from_format('c')
1519
+ self.assertEqual(t, ndt("char('ascii')"))
1520
+
1521
+ def test_primitive(self):
1522
+ standard = [
1523
+ '?',
1524
+ 'c', 'b', 'B',
1525
+ 'h', 'i', 'l', 'q',
1526
+ 'H', 'I', 'L', 'Q',
1527
+ 'f', 'd']
1528
+
1529
+ native = ['n', 'N']
1530
+
1531
+ if HAVE_PYTHON_36:
1532
+ standard += ['e']
1533
+
1534
+ for fmt in standard:
1535
+ for modifier in ['', '@', '=', '<', '>', '!']:
1536
+ f = modifier + fmt
1537
+ t = ndt.from_format(f)
1538
+ s = struct.Struct(f)
1539
+ if not HAVE_32_BIT_LINUX:
1540
+ self.assertEqual(t.itemsize, s.size)
1541
+
1542
+ for fmt in native:
1543
+ for modifier in ['', '@']:
1544
+ f = modifier + fmt
1545
+ t = ndt.from_format(f)
1546
+ s = struct.Struct(f)
1547
+ if not HAVE_32_BIT_LINUX:
1548
+ self.assertEqual(t.itemsize, s.size)
1549
+
1550
+ for fmt in native:
1551
+ for modifier in ['=', '<', '>', '!']:
1552
+ f = modifier + fmt
1553
+ self.assertRaises(ValueError, ndt.from_format, f)
1554
+ self.assertRaises(struct.error, struct.Struct, f)
1555
+
1556
+ if HAVE_PYTHON_36:
1557
+ # complex32
1558
+ fmt = 'E'
1559
+ for modifier in ['', '@', '=', '<', '>', '!']:
1560
+ f = modifier + fmt
1561
+ t = ndt.from_format(f)
1562
+ if not HAVE_32_BIT_LINUX:
1563
+ self.assertEqual(t.itemsize, 4)
1564
+
1565
+ # complex64
1566
+ fmt = 'F'
1567
+ for modifier in ['', '@', '=', '<', '>', '!']:
1568
+ f = modifier + fmt
1569
+ t = ndt.from_format(f)
1570
+ if not HAVE_32_BIT_LINUX:
1571
+ self.assertEqual(t.itemsize, 8)
1572
+
1573
+ # complex128
1574
+ fmt = 'D'
1575
+ for modifier in ['', '@', '=', '<', '>', '!']:
1576
+ f = modifier + fmt
1577
+ t = ndt.from_format(f)
1578
+ if not HAVE_32_BIT_LINUX:
1579
+ self.assertEqual(t.itemsize, 16)
1580
+
1581
+
1582
+ class TestError(unittest.TestCase):
1583
+
1584
+ def test_exceptions(self):
1585
+ self.assertRaises(TypeError, ndt, None)
1586
+ self.assertRaises(ValueError, ndt, "")
1587
+ self.assertRaises(ValueError, ndt, "xyz")
1588
+ self.assertRaises(ValueError, ndt, "var() * int64")
1589
+
1590
+
1591
+ class TestConstruction(unittest.TestCase):
1592
+
1593
+ def test_roundtrip(self):
1594
+ test_cases = [
1595
+ "2 * 3 * float64",
1596
+ "2 * 3 * {a : uint8, b : complex64}",
1597
+ ]
1598
+ for s in test_cases:
1599
+ t = ndt(s)
1600
+ self.assertEqual(str(t), s)
1601
+
1602
+ def test_from_ndt(self):
1603
+ test_cases = [
1604
+ "2 * 3 * {a : 10 * bytes, b : 20 * string}",
1605
+ "var(offsets=[0,2]) * var(offsets=[0,3,10]) * complex128"]
1606
+
1607
+ for s in test_cases:
1608
+ t = ndt(s)
1609
+ u = ndt(t)
1610
+ self.assertEqual(u, t)
1611
+ t = None
1612
+ gc.collect()
1613
+
1614
+ t = ndt("{x: complex128, y: float64}", [[0, 2], [0, 3, 5]])
1615
+ u = ndt(t)
1616
+ self.assertEqual(u, t)
1617
+ t = None
1618
+ gc.collect()
1619
+
1620
+
1621
+ class TestMatch(unittest.TestCase):
1622
+
1623
+ def test_match(self):
1624
+
1625
+ ##### No contiguity requirements.
1626
+ p = ndt("... * 2 * 3 * float32")
1627
+ c = ndt("2 * 3 * float32")
1628
+ self.assertTrue(p.match(c))
1629
+
1630
+ ##### C-contiguity required for inner dimensions.
1631
+ p = ndt("... * C[2 * 3 * float32]")
1632
+
1633
+ # C input.
1634
+ c = ndt("2 * 3 * float32")
1635
+ self.assertTrue(p.match(c))
1636
+
1637
+ # Inner dimensions C-contiguous.
1638
+ c = ndt("4 * 2 * 3 * float32")
1639
+ self.assertTrue(p.match(c))
1640
+
1641
+ # Inner dimensions C-contiguous.
1642
+ c = ndt("fixed(shape=4, step=-6) * 2 * 3 * float32")
1643
+ self.assertTrue(p.match(c))
1644
+
1645
+ # F input.
1646
+ c = ndt("!2 * 3 * float32")
1647
+ self.assertFalse(p.match(c))
1648
+
1649
+ ##### F-contiguity required for inner dimensions.
1650
+ p = ndt("... * F[2 * 3 * float32]")
1651
+
1652
+ # F input.
1653
+ c = ndt("!2 * 3 * float32")
1654
+ self.assertTrue(p.match(c))
1655
+
1656
+ # Inner dimensions F-contiguous.
1657
+ c = ndt("fixed(shape=10, step=6) * fixed(shape=2, step=1) * fixed(shape=3, step=2) * float32")
1658
+ self.assertTrue(p.match(c))
1659
+
1660
+ # C input.
1661
+ c = ndt("2 * 3 * float32")
1662
+ self.assertFalse(p.match(c))
1663
+
1664
+ ##### C-contiguity required for all dimensions after broadcast.
1665
+ p = ndt("C[... * 2 * 3 * float32]")
1666
+
1667
+ # C input.
1668
+ c = ndt("2 * 3 * float32")
1669
+ self.assertTrue(p.match(c))
1670
+
1671
+ # All dimensions C-contiguous.
1672
+ c = ndt("4 * 2 * 3 * float32")
1673
+ self.assertTrue(p.match(c))
1674
+
1675
+ # Inner dimensions C-contiguous.
1676
+ c = ndt("fixed(shape=4, step=-6) * 2 * 3 * float32")
1677
+ self.assertFalse(p.match(c))
1678
+
1679
+ # F input.
1680
+ c = ndt("!2 * 3 * float32")
1681
+ self.assertFalse(p.match(c))
1682
+
1683
+ ##### F-contiguity required for all dimensions after broadcast.
1684
+ p = ndt("F[... * 2 * 3 * float32]")
1685
+
1686
+ # C input.
1687
+ c = ndt("2 * 3 * float32")
1688
+ self.assertFalse(p.match(c))
1689
+
1690
+ c = ndt("4 * 2 * 3 * float32")
1691
+ self.assertFalse(p.match(c))
1692
+
1693
+ # F input.
1694
+ c = ndt("!2 * 3 * float32")
1695
+ self.assertTrue(p.match(c))
1696
+
1697
+ # All dimensions F-contiguous.
1698
+ c = ndt("!4 * 2 * 3 * float32")
1699
+ self.assertTrue(p.match(c))
1700
+
1701
+ # Inner dimensions C-contiguous.
1702
+ c = ndt("fixed(shape=10, step=6) * fixed(shape=2, step=1) * fixed(shape=3, step=2) * float32")
1703
+ self.assertFalse(p.match(c))
1704
+
1705
+
1706
+ class TestApply(unittest.TestCase):
1707
+
1708
+ def test_apply(self):
1709
+ # Type checking and return type inference for function applications.
1710
+
1711
+ # Function type:
1712
+ sig = ndt("Dims... * N * M * int64, Dims... * M * P * int64 -> Dims... * N * P * float64")
1713
+ check_serialize(self, sig)
1714
+
1715
+
1716
+ # Argument types:
1717
+ in_types = [ndt("20 * 2 * 3 * int64"), ndt("20 * 3 * 4 * int64")]
1718
+
1719
+ spec = sig.apply(in_types)
1720
+ self.assertEqual(spec.sig, sig)
1721
+ self.assertEqual(spec.in_types, in_types)
1722
+ self.assertSequenceEqual(spec.out_types, [ndt("20 * 2 * 4 * float64")])
1723
+ self.assertEqual(spec.outer_dims, 1)
1724
+
1725
+ def test_apply_error(self):
1726
+
1727
+ sig = ndt("Dims... * N * M * int64, Dims... * M * P * int64 -> Dims... * N * P * float64")
1728
+
1729
+ lst = [["20 * 2 * 3 * int8", "20 * 3 * 4 * int64"],
1730
+ ["10 * 2 * 3 * int64", "20 * 3 * 4 * int64"],
1731
+ ["20 * 2 * 100 * int64", "20 * 3 * 4 * int64"]]
1732
+
1733
+ for l in lst:
1734
+ in_types = [ndt(x) for x in l]
1735
+ self.assertRaises(TypeError, sig.apply, in_types)
1736
+
1737
+
1738
+ def from_shape_strides(shape, strides):
1739
+ s = "float64"
1740
+ for n, m in zip(reversed(shape), reversed(strides)):
1741
+ s = "fixed(shape=%s, step=%s) * %s" % (n, m//8, s)
1742
+ return ndt(s)
1743
+
1744
+ class TestBroadcast(unittest.TestCase):
1745
+
1746
+ def test_broadcast(self):
1747
+
1748
+ for c in BROADCAST_TEST_CASES:
1749
+ spec = c.sig.apply(c.in_types)
1750
+
1751
+ self.assertEqual(len(spec), len(c))
1752
+ for v, u in zip(spec, c):
1753
+ self.assertEqual(v, u)
1754
+
1755
+ def test_against_numpy(self):
1756
+
1757
+ skip_if(np is None, "test requires numpy")
1758
+ skip_if(SKIP_LONG, "use --long argument to enable these tests")
1759
+
1760
+ sig = ndt("... * float64, ... * float64 -> ... * float64")
1761
+ check_serialize(self, sig)
1762
+
1763
+ for xshape in genindices(1):
1764
+ for yshape in genindices(1):
1765
+ for xstrides in genindices(8):
1766
+ for ystrides in genindices(8):
1767
+
1768
+ if len(xshape) != len(xstrides) or len(yshape) != len(ystrides):
1769
+ continue
1770
+
1771
+ if (random() < 0.99):
1772
+ continue
1773
+
1774
+ try:
1775
+ x = np.ndarray(shape=xshape, strides=xstrides)
1776
+ except ValueError:
1777
+ continue
1778
+
1779
+ try:
1780
+ y = np.ndarray(shape=yshape, strides=ystrides)
1781
+ except ValueError:
1782
+ continue
1783
+
1784
+ try:
1785
+ xx, yy = np.broadcast_arrays(x, y)
1786
+ except ValueError:
1787
+ continue
1788
+
1789
+ t = from_shape_strides(xshape, xstrides)
1790
+ u = from_shape_strides(yshape, ystrides)
1791
+ spec = sig.apply([t, u])
1792
+ tt, uu = spec.in_broadcast
1793
+
1794
+ self.assertEqual(tt.shape, xx.shape)
1795
+ self.assertEqual(uu.shape, yy.shape)
1796
+
1797
+ self.assertEqual(len(tt.strides), len(xx.strides))
1798
+ for i in range(len(tt.strides)):
1799
+ if tt.shape[i] <= 1:
1800
+ # numpy has strange rules for strides in this case.
1801
+ self.assertEqual(tt.strides[i], 0)
1802
+ else:
1803
+ self.assertEqual(tt.strides[i], xx.strides[i])
1804
+
1805
+ self.assertEqual(len(uu.strides), len(yy.strides))
1806
+ for i in range(len(uu.strides)):
1807
+ if uu.shape[i] <= 1:
1808
+ # numpy has strange rules for strides in this case.
1809
+ self.assertEqual(uu.strides[i], 0)
1810
+ else:
1811
+ self.assertEqual(uu.strides[i], yy.strides[i])
1812
+
1813
+
1814
+ class TestTypedef(unittest.TestCase):
1815
+
1816
+ def test_instantiate(self):
1817
+ typedef("node", "int32")
1818
+ typedef("cost", "int32")
1819
+ typedef("graph", "var * var * (node, cost)")
1820
+
1821
+ t = ndt("var(offsets=[0,2]) * var(offsets=[0,3,10]) * (node, cost)")
1822
+ u = instantiate("graph", t)
1823
+ del t
1824
+ gc.collect()
1825
+ self.assertTrue(u.isconcrete())
1826
+
1827
+ t = ndt("var(offsets=[0,2]) * var(offsets=[0,2,3]) * var(offsets=[0,1,2,3]) * (node, cost)")
1828
+ self.assertRaises(ValueError, instantiate, "graph", t)
1829
+
1830
+
1831
+ class TestSerialize(unittest.TestCase):
1832
+
1833
+ def test_serialize(self):
1834
+ typedef("xnode", "int32")
1835
+ typedef("xcost", "int32")
1836
+
1837
+ t = ndt("var(offsets=[0,2]) * var(offsets=[0,3,10]) * (xnode, xcost)")
1838
+ b = t.serialize()
1839
+ u = ndt.deserialize(b)
1840
+ self.assertEqual(u, t)
1841
+
1842
+
1843
+ class TestPickle(unittest.TestCase):
1844
+
1845
+ def test_pickle(self):
1846
+ typedef("ynode", "int32")
1847
+ typedef("ycost", "int32")
1848
+
1849
+ t = ndt("var(offsets=[0,2]) * var(offsets=[0,3,10]) * (ynode, ycost)")
1850
+ s = pickle.dumps(t)
1851
+ u = pickle.loads(s)
1852
+ self.assertEqual(u, t)
1853
+
1854
+
1855
+ class LongFixedDimTests(unittest.TestCase):
1856
+
1857
+ def test_steps_random(self):
1858
+ # Test random steps.
1859
+ skip_if(SKIP_LONG, "use --long argument to enable these tests")
1860
+
1861
+ for dtype, _ in DTYPE_TEST_CASES:
1862
+ for _ in range(1000):
1863
+ s = dtype
1864
+ ndim = randrange(1, 10)
1865
+
1866
+ for n in range(ndim):
1867
+ shape = randrange(1, 100)
1868
+ step = randrange(-100, 100)
1869
+ s = "fixed(shape=%s, step=%s) * %s" % (shape, step, s)
1870
+
1871
+ t = ndt(s)
1872
+ self.assertTrue(verify_datasize(t))
1873
+
1874
+ def test_steps_brute_force(self):
1875
+ # Test all possible shapes and steps within a range.
1876
+ skip_if(SKIP_BRUTE_FORCE, "use --all argument to enable these tests")
1877
+
1878
+ for dtype, _ in DTYPE_TEST_CASES:
1879
+ for m in range(10):
1880
+ for i in range(-10, 10):
1881
+ s = "fixed(shape=%s, step=%s) * %s" % (m, i, dtype)
1882
+ t = ndt(s)
1883
+ self.assertTrue(verify_datasize(t))
1884
+
1885
+ for m in range(10):
1886
+ for n in range(10):
1887
+ for i in range(-10, 10):
1888
+ for j in range(-10, 10):
1889
+ s = """fixed(shape=%s, step=%s) *
1890
+ fixed(shape=%s, step=%s) * %s
1891
+ """ % (m, i, n, j, dtype)
1892
+ t = ndt(s)
1893
+ self.assertTrue(verify_datasize(t))
1894
+
1895
+ for m in range(3):
1896
+ for n in range(3):
1897
+ for p in range(3):
1898
+ for i in range(-5, 5):
1899
+ for j in range(-5, 5):
1900
+ for k in range(-5, 5):
1901
+ s = """fixed(shape=%s, step=%s) *
1902
+ fixed(shape=%s, step=%s) *
1903
+ fixed(shape=%s, step=%s) * %s
1904
+ """ % (m, i, n, j, p, k, dtype)
1905
+ t = ndt(s)
1906
+ self.assertTrue(verify_datasize(t))
1907
+
1908
+
1909
+ ALL_TESTS = [
1910
+ TestModule,
1911
+ TestFunction,
1912
+ TestVoid,
1913
+ TestAny,
1914
+ TestFixedDim,
1915
+ TestFortran,
1916
+ TestVarDim,
1917
+ TestSymbolicDim,
1918
+ TestEllipsisDim,
1919
+ TestTuple,
1920
+ TestRecord,
1921
+ TestRef,
1922
+ TestConstr,
1923
+ TestNominal,
1924
+ TestScalarKind,
1925
+ TestCategorical,
1926
+ TestFixedStringKind,
1927
+ TestFixedString,
1928
+ TestFixedBytesKind,
1929
+ TestFixedBytes,
1930
+ TestString,
1931
+ TestBytes,
1932
+ TestChar,
1933
+ TestBool,
1934
+ TestSignedKind,
1935
+ TestSigned,
1936
+ TestUnsignedKind,
1937
+ TestUnsigned,
1938
+ TestFloatKind,
1939
+ TestFloat,
1940
+ TestComplexKind,
1941
+ TestComplex,
1942
+ TestTypevar,
1943
+ TestCopy,
1944
+ TestBufferProtocol,
1945
+ TestConstruction,
1946
+ TestError,
1947
+ TestMatch,
1948
+ TestApply,
1949
+ TestBroadcast,
1950
+ TestTypedef,
1951
+ TestSerialize,
1952
+ TestPickle,
1953
+ LongFixedDimTests,
1954
+ ]
1955
+
1956
+ if __name__ == '__main__':
1957
+ parser = argparse.ArgumentParser()
1958
+ parser.add_argument("-f", "--failfast", action="store_true",
1959
+ help="stop the test run on first error")
1960
+ parser.add_argument('--long', action="store_true", help="run long slice tests")
1961
+ parser.add_argument('--all', action="store_true", help="run brute force tests")
1962
+ args = parser.parse_args()
1963
+ SKIP_LONG = not (args.long or args.all)
1964
+ SKIP_BRUTE_FORCE = not args.all
1965
+
1966
+ suite = unittest.TestSuite()
1967
+ loader = unittest.TestLoader()
1968
+
1969
+ for case in ALL_TESTS:
1970
+ s = loader.loadTestsFromTestCase(case)
1971
+ suite.addTest(s)
1972
+
1973
+ runner = unittest.TextTestRunner(failfast=args.failfast, verbosity=2)
1974
+ result = runner.run(suite)
1975
+ ret = not result.wasSuccessful()
1976
+
1977
+ sys.exit(ret)