ndtypes 0.2.0dev4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +2 -0
- data/History.md +0 -0
- data/README.md +19 -0
- data/Rakefile +125 -0
- data/ext/ruby_ndtypes/extconf.rb +55 -0
- data/ext/ruby_ndtypes/gc_guard.c +36 -0
- data/ext/ruby_ndtypes/gc_guard.h +12 -0
- data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
- data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
- data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
- data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
- data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
- data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
- data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
- data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
- data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
- data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
- data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
- data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
- data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
- data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
- data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
- data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
- data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
- data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
- data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
- data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
- data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
- data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
- data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
- data/lib/ndtypes.rb +45 -0
- data/lib/ndtypes/errors.rb +2 -0
- data/lib/ndtypes/version.rb +6 -0
- data/ndtypes.gemspec +47 -0
- data/spec/gc_table_spec.rb +10 -0
- data/spec/ndtypes_spec.rb +289 -0
- data/spec/spec_helper.rb +241 -0
- metadata +242 -0
@@ -0,0 +1,228 @@
|
|
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
|
+
|
34
|
+
#include <string.h>
|
35
|
+
#include <assert.h>
|
36
|
+
#include "ndtypes.h"
|
37
|
+
#include "seq.h"
|
38
|
+
|
39
|
+
|
40
|
+
/*****************************************************************************/
|
41
|
+
/* Values for the categorical type */
|
42
|
+
/*****************************************************************************/
|
43
|
+
|
44
|
+
void
|
45
|
+
ndt_value_del(ndt_value_t *mem)
|
46
|
+
{
|
47
|
+
if (mem == NULL) {
|
48
|
+
return;
|
49
|
+
}
|
50
|
+
|
51
|
+
if (mem->tag == ValString) {
|
52
|
+
ndt_free(mem->ValString);
|
53
|
+
}
|
54
|
+
|
55
|
+
ndt_free(mem);
|
56
|
+
}
|
57
|
+
|
58
|
+
void
|
59
|
+
ndt_value_array_del(ndt_value_t *mem, int64_t ntypes)
|
60
|
+
{
|
61
|
+
int64_t i;
|
62
|
+
|
63
|
+
if (mem == NULL) {
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
|
67
|
+
for (i = 0; i < ntypes; i++) {
|
68
|
+
if (mem[i].tag == ValString) {
|
69
|
+
ndt_free(mem[i].ValString);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
ndt_free(mem);
|
74
|
+
}
|
75
|
+
|
76
|
+
/* Value sequences */
|
77
|
+
NDT_SEQ_NEW(ndt_value)
|
78
|
+
NDT_SEQ_DEL(ndt_value)
|
79
|
+
NDT_SEQ_GROW(ndt_value)
|
80
|
+
NDT_SEQ_APPEND(ndt_value)
|
81
|
+
NDT_SEQ_FINALIZE(ndt_value)
|
82
|
+
|
83
|
+
|
84
|
+
/* Return a new ndt memory buffer. Input types are restricted. */
|
85
|
+
ndt_value_t *
|
86
|
+
ndt_value_from_number(enum ndt_value tag, char *v, ndt_context_t *ctx)
|
87
|
+
{
|
88
|
+
ndt_value_t *mem;
|
89
|
+
|
90
|
+
mem = ndt_alloc_size(sizeof *mem);
|
91
|
+
if (mem == NULL) {
|
92
|
+
ndt_free(v);
|
93
|
+
return ndt_memory_error(ctx);
|
94
|
+
}
|
95
|
+
mem->tag = tag;
|
96
|
+
|
97
|
+
switch (tag) {
|
98
|
+
case ValBool:
|
99
|
+
mem->ValBool = ndt_strtobool(v, ctx);
|
100
|
+
break;
|
101
|
+
case ValInt64:
|
102
|
+
mem->ValInt64 = (int64_t)ndt_strtoll(v, INT64_MIN, INT64_MAX, ctx);
|
103
|
+
break;
|
104
|
+
case ValFloat64:
|
105
|
+
mem->ValFloat64 = ndt_strtod(v, ctx);
|
106
|
+
break;
|
107
|
+
case ValString: case ValNA:
|
108
|
+
ndt_err_format(ctx, NDT_InvalidArgumentError, "expected number tag");
|
109
|
+
break;
|
110
|
+
}
|
111
|
+
|
112
|
+
ndt_free(v);
|
113
|
+
if (ndt_err_occurred(ctx)) {
|
114
|
+
ndt_free(mem);
|
115
|
+
return NULL;
|
116
|
+
}
|
117
|
+
|
118
|
+
return mem;
|
119
|
+
}
|
120
|
+
|
121
|
+
/* Return a new ndt memory buffer. The input type is 'string'. */
|
122
|
+
ndt_value_t *
|
123
|
+
ndt_value_from_string(char *v, ndt_context_t *ctx)
|
124
|
+
{
|
125
|
+
ndt_value_t *mem;
|
126
|
+
|
127
|
+
mem = ndt_alloc_size(sizeof *mem);
|
128
|
+
if (mem == NULL) {
|
129
|
+
ndt_free(v);
|
130
|
+
return ndt_memory_error(ctx);
|
131
|
+
}
|
132
|
+
|
133
|
+
/* XXX: check utf8 */
|
134
|
+
mem->tag = ValString;
|
135
|
+
mem->ValString = v;
|
136
|
+
|
137
|
+
return mem;
|
138
|
+
}
|
139
|
+
|
140
|
+
/* Return a new ndt memory buffer. The input type is 'NA'. */
|
141
|
+
ndt_value_t *
|
142
|
+
ndt_value_na(ndt_context_t *ctx)
|
143
|
+
{
|
144
|
+
ndt_value_t *mem;
|
145
|
+
|
146
|
+
mem = ndt_alloc_size(sizeof *mem);
|
147
|
+
if (mem == NULL) {
|
148
|
+
return ndt_memory_error(ctx);
|
149
|
+
}
|
150
|
+
mem->tag = ValNA;
|
151
|
+
|
152
|
+
return mem;
|
153
|
+
}
|
154
|
+
|
155
|
+
/* Equality: NA does not compare equal to anything. */
|
156
|
+
int
|
157
|
+
ndt_value_equal(const ndt_value_t *x, const ndt_value_t *y)
|
158
|
+
{
|
159
|
+
if (x->tag != y->tag) {
|
160
|
+
return 0;
|
161
|
+
}
|
162
|
+
|
163
|
+
switch(x->tag) {
|
164
|
+
case ValBool:
|
165
|
+
return x->ValBool == y->ValBool;
|
166
|
+
case ValInt64:
|
167
|
+
return x->ValInt64 == y->ValInt64;
|
168
|
+
case ValFloat64:
|
169
|
+
return x->ValFloat64 == y->ValFloat64;
|
170
|
+
case ValString:
|
171
|
+
return strcmp(x->ValString, y->ValString) == 0;
|
172
|
+
case ValNA:
|
173
|
+
return 0;
|
174
|
+
}
|
175
|
+
|
176
|
+
/* NOT REACHED: tags should be exhaustive. */
|
177
|
+
ndt_internal_error("invalid value");
|
178
|
+
}
|
179
|
+
|
180
|
+
/* Structural equality: NA compares equal to itself. */
|
181
|
+
int
|
182
|
+
ndt_value_mem_equal(const ndt_value_t *x, const ndt_value_t *y)
|
183
|
+
{
|
184
|
+
if (x->tag != y->tag) {
|
185
|
+
return 0;
|
186
|
+
}
|
187
|
+
|
188
|
+
switch(x->tag) {
|
189
|
+
case ValBool:
|
190
|
+
return x->ValBool == y->ValBool;
|
191
|
+
case ValInt64:
|
192
|
+
return x->ValInt64 == y->ValInt64;
|
193
|
+
case ValFloat64:
|
194
|
+
return x->ValFloat64 == y->ValFloat64;
|
195
|
+
case ValString:
|
196
|
+
return strcmp(x->ValString, y->ValString) == 0;
|
197
|
+
case ValNA:
|
198
|
+
return 1;
|
199
|
+
}
|
200
|
+
|
201
|
+
/* NOT REACHED: tags should be exhaustive. */
|
202
|
+
ndt_internal_error("invalid value");
|
203
|
+
}
|
204
|
+
|
205
|
+
/* Sort order: NA compares equal to itself. */
|
206
|
+
int
|
207
|
+
ndt_value_compare(const ndt_value_t *x, const ndt_value_t *y)
|
208
|
+
{
|
209
|
+
if (x->tag != y->tag) {
|
210
|
+
return x->tag - y->tag;
|
211
|
+
}
|
212
|
+
|
213
|
+
switch(x->tag) {
|
214
|
+
case ValBool:
|
215
|
+
return x->ValBool < y->ValBool ? -1 : x->ValBool != y->ValBool;
|
216
|
+
case ValInt64:
|
217
|
+
return x->ValInt64 < y->ValInt64 ? -1 : x->ValInt64 != y->ValInt64;
|
218
|
+
case ValFloat64:
|
219
|
+
return x->ValFloat64 < y->ValFloat64 ? -1 : x->ValFloat64 != y->ValFloat64;
|
220
|
+
case ValString:
|
221
|
+
return strcmp(x->ValString, y->ValString);
|
222
|
+
case ValNA:
|
223
|
+
return 0;
|
224
|
+
}
|
225
|
+
|
226
|
+
/* NOT REACHED: tags should be exhaustive. */
|
227
|
+
ndt_internal_error("invalid value");
|
228
|
+
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
from ndtypes import *
|
2
|
+
import time
|
3
|
+
|
4
|
+
# =============================================================================
|
5
|
+
# Type with huge number of offsets
|
6
|
+
# =============================================================================
|
7
|
+
|
8
|
+
s = "var(offsets=[0,10000000]) * var(offsets=%s) * int64" % list(range(10000001))
|
9
|
+
print("Parse 10_000_000 var offsets:")
|
10
|
+
start = time.time()
|
11
|
+
t = ndt(s)
|
12
|
+
end = time.time()
|
13
|
+
print(end-start)
|
14
|
+
|
15
|
+
|
16
|
+
b = t.serialize()
|
17
|
+
print("\nDeserialize 10_000_000 var offsets:")
|
18
|
+
start = time.time()
|
19
|
+
u = ndt.deserialize(b)
|
20
|
+
end = time.time()
|
21
|
+
print(end-start)
|
22
|
+
|
23
|
+
assert t == u
|
24
|
+
|
25
|
+
|
26
|
+
# =============================================================================
|
27
|
+
# Large type
|
28
|
+
# =============================================================================
|
29
|
+
|
30
|
+
s = """
|
31
|
+
{battingpost: 100 * {yearID: ?int32, round: ?string, playerID: ?string, teamID: ?string, lgID: (?string, int64, 5 * 10 * {a: complex128, b: ?int32}), G: ?int32, AB: ?int32, R: ?int32, H: (int32, 10 * int32), HR: {a: 10 * float64, b: 10 * int32}, RBI: ?int32, SB: ?int32, CS: ?int32, BB: ?int32, SO: ?int32, IBB: ?int32, HBP: ?int32, SH: ?int32, SF: ?int32, GIDP: ?int32, AString: fixed_string(100,'utf32'), BString: fixed_string(100), CBytes: bytes(align=16), DBytes: fixed_bytes(size=1600, align=16)}, awardsmanagers: 10 * {managerID: ?string, awardID: ?string, yearID: ?int32, lgID: ?string, tie: ?string, notes: ?string}, hofold: 10 * {hofID: ?string, yearid: ?int32, votedBy: ?string, ballots: ?int32, votes: ?int32, inducted: ?string, category: ?string}, salaries: 10 * {yearID: ?int32, teamID: ?string, lgID: ?string, playerID: ?string, salary: ?float64}, pitchingpost: 10 * {playerID: ?string, yearID: ?int32, round: ?string, teamID: ?string, lgID: ?string, W: ?int32, L: ?int32, G: ?int32, GS: ?int32, CG: ?int32, SHO: ?int32, SV: ?int32, IPouts: ?int32, H: ?int32, ER: ?int32, HR: ?int32, BB: ?int32, SO: ?int32, BAOpp: ?float64, ERA: ?float64, IBB: ?int32, WP: ?int32, HBP: ?int32, BK: ?int32, BFP: ?int32, GF: ?int32, R: ?int32, SH: ?int32, SF: ?int32, GIDP: ?int32}, managers: 10 * {managerID: ?string, yearID: ?int32, teamID: ?string, lgID: ?string, inseason: ?int32, G: ?int32, W: ?int32, L: ?int32, rank: ?int32, plyrMgr: ?string}, teams: 10 * {yearID: ?int32, lgID: ?string, teamID: ?string, franchID: ?string, divID: ?string, Rank: ?int32, G: ?int32, Ghome: ?int32, W: ?int32, L: ?int32, DivWin: ?string, WCWin: ?string, LgWin: ?string, WSWin: ?string, R: ?int32, AB: ?int32, H: ?int32, B: ?int32, B: ?int32, HR: ?int32, BB: ?int32, SO: ?int32, SB: ?int32, CS: ?int32, HBP: ?int32, SF: ?int32, RA: ?int32, ER: ?int32, ERA: ?float64, CG: ?int32, SHO: ?int32, SV: ?int32, IPouts: ?int32, HA: ?int32, HRA: ?int32, BBA: ?int32, SOA: ?int32, E: ?int32, DP: ?int32, FP: ?float64, name: ?string, park: ?string, attendance: ?int32, BPF: ?int32, PPF: ?int32, teamIDBR: ?string, teamIDlahman45: ?string, teamIDretro: ?string}}
|
32
|
+
"""
|
33
|
+
|
34
|
+
print("\nParse large type (100_000 repetitions):")
|
35
|
+
start = time.time()
|
36
|
+
for i in range(100000):
|
37
|
+
t = ndt(s)
|
38
|
+
end = time.time()
|
39
|
+
print(end-start)
|
40
|
+
|
41
|
+
b = t.serialize()
|
42
|
+
print("\nDeserialize large type (100_000 repetitions):")
|
43
|
+
start = time.time()
|
44
|
+
for i in range(100000):
|
45
|
+
u = ndt.deserialize(b)
|
46
|
+
end = time.time()
|
47
|
+
print(end-start)
|
48
|
+
|
49
|
+
assert t == u
|
@@ -0,0 +1,409 @@
|
|
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
|
+
# Functions for generating test cases.
|
34
|
+
|
35
|
+
import sys
|
36
|
+
from itertools import accumulate, count, product
|
37
|
+
from collections import namedtuple
|
38
|
+
from random import randrange
|
39
|
+
from ndtypes import ndt, ApplySpec
|
40
|
+
from _testbuffer import get_sizeof_void_p
|
41
|
+
|
42
|
+
|
43
|
+
SIZEOF_PTR = get_sizeof_void_p()
|
44
|
+
|
45
|
+
Mem = namedtuple("Mem", "itemsize align")
|
46
|
+
|
47
|
+
|
48
|
+
# ======================================================================
|
49
|
+
# Check contiguous fixed dimensions
|
50
|
+
# ======================================================================
|
51
|
+
|
52
|
+
def c_datasize(t):
|
53
|
+
"""Check the datasize of contiguous arrays."""
|
54
|
+
datasize = t.itemsize
|
55
|
+
for v in t.shape:
|
56
|
+
datasize *= v
|
57
|
+
return datasize
|
58
|
+
|
59
|
+
|
60
|
+
# ======================================================================
|
61
|
+
# Check fixed dimensions with arbitary strides
|
62
|
+
# ======================================================================
|
63
|
+
|
64
|
+
def verify_datasize(t):
|
65
|
+
"""Verify the datasize of fixed dimensions with arbitrary strides."""
|
66
|
+
|
67
|
+
if t.itemsize == 0:
|
68
|
+
return t.datasize == 0
|
69
|
+
if t.datasize % t.itemsize:
|
70
|
+
return False
|
71
|
+
if t.ndim <= 0:
|
72
|
+
return t.ndim == 0 and not t.shape and not t.strides
|
73
|
+
if any(v < 0 for v in t.shape):
|
74
|
+
return False
|
75
|
+
if any(v % t.itemsize for v in t.strides):
|
76
|
+
return False
|
77
|
+
|
78
|
+
if 0 in t.shape:
|
79
|
+
return t.datasize == 0
|
80
|
+
|
81
|
+
imin = sum(t.strides[j]*(t.shape[j]-1) for j in range(t.ndim)
|
82
|
+
if t.strides[j] <= 0)
|
83
|
+
imax = sum(t.strides[j]*(t.shape[j]-1) for j in range(t.ndim)
|
84
|
+
if t.strides[j] > 0)
|
85
|
+
|
86
|
+
return t.datasize == (abs(imin) + imax + t.itemsize)
|
87
|
+
|
88
|
+
|
89
|
+
# ======================================================================
|
90
|
+
# Typed values
|
91
|
+
# ======================================================================
|
92
|
+
|
93
|
+
DTYPE_TEST_CASES = [
|
94
|
+
# Tuples
|
95
|
+
("()", Mem(itemsize=0, align=1)),
|
96
|
+
("(complex128)", Mem(itemsize=16, align=8)),
|
97
|
+
|
98
|
+
("(int8, int64)", Mem(itemsize=16, align=8)),
|
99
|
+
("(int8, int64, pack=1)", Mem(itemsize=9, align=1)),
|
100
|
+
("(int8, int64, pack=2)", Mem(itemsize=10, align=2)),
|
101
|
+
("(int8, int64, pack=4)", Mem(itemsize=12, align=4)),
|
102
|
+
("(int8, int64, pack=8)", Mem(itemsize=16, align=8)),
|
103
|
+
("(int8, int64, pack=16)", Mem(itemsize=32, align=16)),
|
104
|
+
|
105
|
+
("(int8, int64, align=1)", Mem(itemsize=16, align=8)),
|
106
|
+
("(int8, int64, align=2)", Mem(itemsize=16, align=8)),
|
107
|
+
("(int8, int64, align=4)", Mem(itemsize=16, align=8)),
|
108
|
+
("(int8, int64, align=8)", Mem(itemsize=16, align=8)),
|
109
|
+
("(int8, int64, align=16)", Mem(itemsize=16, align=16)),
|
110
|
+
|
111
|
+
("(int8 |align=1|, int64)", Mem(itemsize=16, align=8)),
|
112
|
+
("(int8 |align=2|, int64)", Mem(itemsize=16, align=8)),
|
113
|
+
("(int8 |align=4|, int64)", Mem(itemsize=16, align=8)),
|
114
|
+
("(int8 |align=8|, int64)", Mem(itemsize=16, align=8)),
|
115
|
+
("(int8 |align=16|, int64)", Mem(itemsize=16, align=16)),
|
116
|
+
|
117
|
+
("(uint16, (complex64))", Mem(itemsize=12, align=4)),
|
118
|
+
("(uint16, (complex64), pack=1)", Mem(itemsize=10, align=1)),
|
119
|
+
("(uint16, (complex64), pack=2)", Mem(itemsize=10, align=2)),
|
120
|
+
("(uint16, (complex64), pack=4)", Mem(itemsize=12, align=4)),
|
121
|
+
("(uint16, (complex64), pack=8)", Mem(itemsize=16, align=8)),
|
122
|
+
|
123
|
+
("(uint16, (complex64), align=1)", Mem(itemsize=12, align=4)),
|
124
|
+
("(uint16, (complex64), align=2)", Mem(itemsize=12, align=4)),
|
125
|
+
("(uint16, (complex64), align=4)", Mem(itemsize=12, align=4)),
|
126
|
+
("(uint16, (complex64), align=8)", Mem(itemsize=16, align=8)),
|
127
|
+
|
128
|
+
# References to tuples
|
129
|
+
("&(uint16, (complex64), align=1)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
130
|
+
("(uint16, &(complex64), pack=1)", Mem(itemsize=2+SIZEOF_PTR, align=1)),
|
131
|
+
|
132
|
+
# Constructor containing references to tuples
|
133
|
+
("Some(&(uint16, (complex64), align=1))", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
134
|
+
("Some((uint16, &(complex64), pack=1))", Mem(itemsize=2+SIZEOF_PTR, align=1)),
|
135
|
+
|
136
|
+
# Optional tuples
|
137
|
+
("?(uint16, (complex64), align=1)", Mem(itemsize=12, align=4)),
|
138
|
+
("(uint16, ?(complex64), align=1)", Mem(itemsize=12, align=4)),
|
139
|
+
("?(uint16, ?(complex64), align=1)", Mem(itemsize=12, align=4)),
|
140
|
+
("?(uint16, (complex64), align=2)", Mem(itemsize=12, align=4)),
|
141
|
+
("(uint16, ?(complex64), align=4)", Mem(itemsize=12, align=4)),
|
142
|
+
("?(uint16, ?(complex64), align=8)", Mem(itemsize=16, align=8)),
|
143
|
+
|
144
|
+
# References to optional tuples or tuples with optional subtrees
|
145
|
+
("&?(uint16, (complex64), align=1)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
146
|
+
("&(uint16, ?(complex64), align=1)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
147
|
+
|
148
|
+
# Constructor containing optional tuples or tuples with optional subtrees
|
149
|
+
("Some(?(uint16, (complex64), align=1))", Mem(itemsize=12, align=4)),
|
150
|
+
("Some((uint16, ?(complex64), align=1))", Mem(itemsize=12, align=4)),
|
151
|
+
|
152
|
+
# Records
|
153
|
+
("{}", Mem(itemsize=0, align=1)),
|
154
|
+
("{x: complex128}", Mem(itemsize=16, align=8)),
|
155
|
+
|
156
|
+
("{x: int8, y: int64}", Mem(itemsize=16, align=8)),
|
157
|
+
("{x: int8, y: int64, pack=1}", Mem(itemsize=9, align=1)),
|
158
|
+
("{x: int8, y: int64, pack=2}", Mem(itemsize=10, align=2)),
|
159
|
+
("{x: int8, y: int64, pack=4}", Mem(itemsize=12, align=4)),
|
160
|
+
("{x: int8, y: int64, pack=8}", Mem(itemsize=16, align=8)),
|
161
|
+
("{x: int8, y: int64, pack=16}", Mem(itemsize=32, align=16)),
|
162
|
+
|
163
|
+
("{x: uint16, y: {z: complex128}}", Mem(itemsize=24, align=8)),
|
164
|
+
("{x: uint16, y: {z: complex128, align=16}}", Mem(itemsize=32, align=16)),
|
165
|
+
("{x: uint16, y: {z: complex128}, align=16}", Mem(itemsize=32, align=16)),
|
166
|
+
|
167
|
+
# Primitive types
|
168
|
+
("bool", Mem(itemsize=1, align=1)),
|
169
|
+
|
170
|
+
("int8", Mem(itemsize=1, align=1)),
|
171
|
+
("int16", Mem(itemsize=2, align=2)),
|
172
|
+
("int32", Mem(itemsize=4, align=4)),
|
173
|
+
("int64", Mem(itemsize=8, align=8)),
|
174
|
+
|
175
|
+
("uint8", Mem(itemsize=1, align=1)),
|
176
|
+
("uint16", Mem(itemsize=2, align=2)),
|
177
|
+
("uint32", Mem(itemsize=4, align=4)),
|
178
|
+
("uint64", Mem(itemsize=8, align=8)),
|
179
|
+
|
180
|
+
("float32", Mem(itemsize=4, align=4)),
|
181
|
+
("float64", Mem(itemsize=8, align=8)),
|
182
|
+
|
183
|
+
("complex64", Mem(itemsize=8, align=4)),
|
184
|
+
("complex128", Mem(itemsize=16, align=8)),
|
185
|
+
|
186
|
+
# Primitive optional types
|
187
|
+
("?bool", Mem(itemsize=1, align=1)),
|
188
|
+
|
189
|
+
("?int8", Mem(itemsize=1, align=1)),
|
190
|
+
("?int16", Mem(itemsize=2, align=2)),
|
191
|
+
("?int32", Mem(itemsize=4, align=4)),
|
192
|
+
("?int64", Mem(itemsize=8, align=8)),
|
193
|
+
|
194
|
+
("?uint8", Mem(itemsize=1, align=1)),
|
195
|
+
("?uint16", Mem(itemsize=2, align=2)),
|
196
|
+
("?uint32", Mem(itemsize=4, align=4)),
|
197
|
+
("?uint64", Mem(itemsize=8, align=8)),
|
198
|
+
|
199
|
+
("?float32", Mem(itemsize=4, align=4)),
|
200
|
+
("?float64", Mem(itemsize=8, align=8)),
|
201
|
+
|
202
|
+
("?complex64", Mem(itemsize=8, align=4)),
|
203
|
+
("?complex128", Mem(itemsize=16, align=8)),
|
204
|
+
|
205
|
+
# References
|
206
|
+
("&bool", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
207
|
+
|
208
|
+
("&int8", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
209
|
+
("&int16", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
210
|
+
("&int32", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
211
|
+
("&int64", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
212
|
+
|
213
|
+
("ref(uint8)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
214
|
+
("ref(uint16)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
215
|
+
("ref(uint32)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
216
|
+
("ref(uint64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
217
|
+
|
218
|
+
("ref(float32)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
219
|
+
("ref(float64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
220
|
+
|
221
|
+
("ref(complex64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
222
|
+
("ref(complex128)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
223
|
+
|
224
|
+
# Optional references
|
225
|
+
("?&bool", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
226
|
+
|
227
|
+
("?&int8", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
228
|
+
("?&int16", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
229
|
+
("?&int32", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
230
|
+
("?&int64", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
231
|
+
|
232
|
+
("?ref(uint8)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
233
|
+
("?ref(uint16)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
234
|
+
("?ref(uint32)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
235
|
+
("?ref(uint64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
236
|
+
|
237
|
+
("?ref(float32)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
238
|
+
("?ref(float64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
239
|
+
|
240
|
+
("?ref(complex64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
241
|
+
("?ref(complex128)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
242
|
+
|
243
|
+
# References to optional types
|
244
|
+
("&?bool", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
245
|
+
|
246
|
+
("&?int8", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
247
|
+
("&?int16", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
248
|
+
("&?int32", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
249
|
+
("&?int64", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
250
|
+
|
251
|
+
("ref(?uint8)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
252
|
+
("ref(?uint16)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
253
|
+
("ref(?uint32)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
254
|
+
("ref(?uint64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
255
|
+
|
256
|
+
("ref(?float32)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
257
|
+
("ref(?float64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
258
|
+
|
259
|
+
("ref(?complex64)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
260
|
+
("ref(?complex128)", Mem(itemsize=SIZEOF_PTR, align=SIZEOF_PTR)),
|
261
|
+
|
262
|
+
# Constructors
|
263
|
+
("Some(bool)", Mem(itemsize=1, align=1)),
|
264
|
+
|
265
|
+
("Some(int8)", Mem(itemsize=1, align=1)),
|
266
|
+
("Some(int16)", Mem(itemsize=2, align=2)),
|
267
|
+
("Some(int32)", Mem(itemsize=4, align=4)),
|
268
|
+
("Some(int64)", Mem(itemsize=8, align=8)),
|
269
|
+
|
270
|
+
("Some(uint8)", Mem(itemsize=1, align=1)),
|
271
|
+
("Some(uint16)", Mem(itemsize=2, align=2)),
|
272
|
+
("Some(uint32)", Mem(itemsize=4, align=4)),
|
273
|
+
("Some(uint64)", Mem(itemsize=8, align=8)),
|
274
|
+
|
275
|
+
("Some(float32)", Mem(itemsize=4, align=4)),
|
276
|
+
("Some(float64)", Mem(itemsize=8, align=8)),
|
277
|
+
|
278
|
+
("Some(complex64)", Mem(itemsize=8, align=4)),
|
279
|
+
("Some(complex128)", Mem(itemsize=16, align=8)),
|
280
|
+
|
281
|
+
# Optional constructors
|
282
|
+
("?Some(bool)", Mem(itemsize=1, align=1)),
|
283
|
+
|
284
|
+
("?Some(int8)", Mem(itemsize=1, align=1)),
|
285
|
+
("?Some(int16)", Mem(itemsize=2, align=2)),
|
286
|
+
("?Some(int32)", Mem(itemsize=4, align=4)),
|
287
|
+
("?Some(int64)", Mem(itemsize=8, align=8)),
|
288
|
+
|
289
|
+
("?Some(uint8)", Mem(itemsize=1, align=1)),
|
290
|
+
("?Some(uint16)", Mem(itemsize=2, align=2)),
|
291
|
+
("?Some(uint32)", Mem(itemsize=4, align=4)),
|
292
|
+
("?Some(uint64)", Mem(itemsize=8, align=8)),
|
293
|
+
|
294
|
+
("?Some(float32)", Mem(itemsize=4, align=4)),
|
295
|
+
("?Some(float64)", Mem(itemsize=8, align=8)),
|
296
|
+
|
297
|
+
("?Some(complex64)", Mem(itemsize=8, align=4)),
|
298
|
+
("?Some(complex128)", Mem(itemsize=16, align=8)),
|
299
|
+
|
300
|
+
# Constructors containing optional types
|
301
|
+
("Some(?bool)", Mem(itemsize=1, align=1)),
|
302
|
+
|
303
|
+
("Some(?int8)", Mem(itemsize=1, align=1)),
|
304
|
+
("Some(?int16)", Mem(itemsize=2, align=2)),
|
305
|
+
("Some(?int32)", Mem(itemsize=4, align=4)),
|
306
|
+
("Some(?int64)", Mem(itemsize=8, align=8)),
|
307
|
+
|
308
|
+
("Some(?uint8)", Mem(itemsize=1, align=1)),
|
309
|
+
("Some(?uint16)", Mem(itemsize=2, align=2)),
|
310
|
+
("Some(?uint32)", Mem(itemsize=4, align=4)),
|
311
|
+
("Some(?uint64)", Mem(itemsize=8, align=8)),
|
312
|
+
|
313
|
+
("Some(?float32)", Mem(itemsize=4, align=4)),
|
314
|
+
("Some(?float64)", Mem(itemsize=8, align=8)),
|
315
|
+
|
316
|
+
("Some(?complex64)", Mem(itemsize=8, align=4)),
|
317
|
+
("Some(?complex128)", Mem(itemsize=16, align=8)),
|
318
|
+
]
|
319
|
+
|
320
|
+
# ======================================================================
|
321
|
+
# Broadcasting
|
322
|
+
# ======================================================================
|
323
|
+
|
324
|
+
def genindices(factor):
|
325
|
+
for i in range(4):
|
326
|
+
yield ()
|
327
|
+
for i in range(4):
|
328
|
+
yield (factor * i,)
|
329
|
+
for i in range(4):
|
330
|
+
for j in range(4):
|
331
|
+
yield (factor * i, factor * j)
|
332
|
+
for i in range(4):
|
333
|
+
for j in range(4):
|
334
|
+
for k in range(4):
|
335
|
+
yield (factor * i, factor * j, factor * k)
|
336
|
+
|
337
|
+
BROADCAST_TEST_CASES = [
|
338
|
+
ApplySpec(
|
339
|
+
flags = 'C|Fortran|Strided|Xnd',
|
340
|
+
sig = ndt("uint8 -> float64"),
|
341
|
+
in_types = [ndt("uint8")],
|
342
|
+
out_types = [ndt("float64")],
|
343
|
+
in_broadcast = [],
|
344
|
+
outer_dims = 0),
|
345
|
+
|
346
|
+
ApplySpec(
|
347
|
+
flags = 'Elemwise1D|C|Fortran|Strided|Xnd',
|
348
|
+
sig = ndt("... * uint8 -> ... * float64"),
|
349
|
+
in_types = [ndt("2 * uint8")],
|
350
|
+
out_types = [ndt("2 * float64")],
|
351
|
+
in_broadcast = [ndt("2 * uint8")],
|
352
|
+
outer_dims = 1),
|
353
|
+
|
354
|
+
ApplySpec(
|
355
|
+
flags = 'C|Fortran|Strided|Xnd',
|
356
|
+
sig = ndt("F[... * uint8] -> F[... * float64]"),
|
357
|
+
in_types = [ndt("!2 * 3 * uint8")],
|
358
|
+
out_types = [ndt("!2 * 3 * float64")],
|
359
|
+
in_broadcast = [ndt("!2 * 3 * uint8")],
|
360
|
+
outer_dims = 2),
|
361
|
+
|
362
|
+
ApplySpec(
|
363
|
+
flags = 'C|Fortran|Strided|Xnd',
|
364
|
+
sig = ndt("... * uint8 -> ... * float64"),
|
365
|
+
in_types = [ndt("fixed(shape=2, step=10) * uint8")],
|
366
|
+
out_types = [ndt("2 * float64")],
|
367
|
+
in_broadcast = [ndt("fixed(shape=2, step=10) * uint8")],
|
368
|
+
outer_dims = 1),
|
369
|
+
|
370
|
+
ApplySpec(
|
371
|
+
flags = 'Strided|Xnd',
|
372
|
+
sig = ndt("... * N * uint8 -> ... * N * float64"),
|
373
|
+
in_types = [ndt("fixed(shape=2, step=10) * uint8")],
|
374
|
+
out_types = [ndt("2 * float64")],
|
375
|
+
in_broadcast = [ndt("fixed(shape=2, step=10) * uint8")],
|
376
|
+
outer_dims = 0),
|
377
|
+
|
378
|
+
ApplySpec(
|
379
|
+
flags = 'C|Fortran|Strided|Xnd',
|
380
|
+
sig = ndt("... * N * uint8 -> ... * N * float64"),
|
381
|
+
in_types = [ndt("2 * 3 * uint8")],
|
382
|
+
out_types = [ndt("2 * 3 * float64")],
|
383
|
+
in_broadcast = [ndt("2 * 3 * uint8")],
|
384
|
+
outer_dims = 1),
|
385
|
+
|
386
|
+
ApplySpec(
|
387
|
+
flags = 'C|Strided|Xnd',
|
388
|
+
sig = ndt("... * N * M * uint8 -> ... * N * M * float64"),
|
389
|
+
in_types = [ndt("2 * 3 * uint8")],
|
390
|
+
out_types = [ndt("2 * 3 * float64")],
|
391
|
+
in_broadcast = [ndt("2 * 3 * uint8")],
|
392
|
+
outer_dims = 0),
|
393
|
+
|
394
|
+
ApplySpec(
|
395
|
+
flags = 'Xnd',
|
396
|
+
sig = ndt("N * D * float64 -> P * float64"),
|
397
|
+
in_types = [ndt("2 * 10 * float64")],
|
398
|
+
out_types = [ndt("P * float64")],
|
399
|
+
in_broadcast = [],
|
400
|
+
outer_dims = 0),
|
401
|
+
|
402
|
+
ApplySpec(
|
403
|
+
flags = 'C|Fortran|Xnd',
|
404
|
+
sig = ndt("var... * float64 -> var... * float64"),
|
405
|
+
in_types = [ndt("var(offsets=[0,2]) * var(offsets=[0,4,11]) * float64")],
|
406
|
+
out_types = [ndt("var(offsets=[0,2]) * var(offsets=[0,4,11]) * float64")],
|
407
|
+
in_broadcast = [],
|
408
|
+
outer_dims = 2)
|
409
|
+
]
|