ndtypes 0.2.0dev5 → 0.2.0dev6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +12 -0
- data/Rakefile +8 -0
- data/ext/ruby_ndtypes/GPATH +0 -0
- data/ext/ruby_ndtypes/GRTAGS +0 -0
- data/ext/ruby_ndtypes/GTAGS +0 -0
- data/ext/ruby_ndtypes/extconf.rb +1 -1
- data/ext/ruby_ndtypes/include/ndtypes.h +231 -122
- data/ext/ruby_ndtypes/include/ruby_ndtypes.h +1 -1
- data/ext/ruby_ndtypes/lib/libndtypes.a +0 -0
- data/ext/ruby_ndtypes/lib/libndtypes.so.0.2.0dev3 +0 -0
- data/ext/ruby_ndtypes/ndtypes/Makefile +87 -0
- data/ext/ruby_ndtypes/ndtypes/config.h +68 -0
- data/ext/ruby_ndtypes/ndtypes/config.log +477 -0
- data/ext/ruby_ndtypes/ndtypes/config.status +1027 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_static/style.css +7 -0
- data/ext/ruby_ndtypes/ndtypes/doc/_templates/layout.html +2 -0
- data/ext/ruby_ndtypes/ndtypes/doc/conf.py +40 -4
- data/ext/ruby_ndtypes/ndtypes/doc/images/xndlogo.png +0 -0
- data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +1 -1
- data/ext/ruby_ndtypes/ndtypes/doc/requirements.txt +2 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile +287 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +20 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +22 -3
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile +73 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +246 -229
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +15 -11
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +38 -28
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +91 -91
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +4 -3
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +8 -7
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +2 -2
- data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/context.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +263 -182
- data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +67 -7
- data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +1112 -1000
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +69 -58
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +150 -99
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +185 -15
- data/ext/ruby_ndtypes/ndtypes/libndtypes/io.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +301 -276
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +9 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.a +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so +1 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0 +1 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/libndtypes.so.0.2.0dev3 +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +729 -228
- data/ext/ruby_ndtypes/ndtypes/libndtypes/match.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +768 -403
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h +1002 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +231 -122
- data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +176 -84
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +26 -14
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +57 -35
- data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.c +420 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/primitive.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +8 -8
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile +48 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +200 -116
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +46 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +58 -27
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +1 -1
- data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +3 -5
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +12 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile +55 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +8 -8
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +5 -5
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +274 -172
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +24 -4
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +2 -2
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +14 -14
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +32 -30
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +37 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +36 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +16 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +5 -5
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +706 -253
- data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_unify.c +132 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.c +703 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/unify.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +335 -127
- data/ext/ruby_ndtypes/ndtypes/libndtypes/util.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +2 -2
- data/ext/ruby_ndtypes/ndtypes/libndtypes/values.o +0 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +88 -71
- data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +0 -1
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +10 -13
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +395 -314
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.a +0 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so +1 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0 +1 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/libndtypes.so.0.2.0dev3 +0 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/ndtypes.h +1002 -0
- data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +15 -33
- data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +340 -132
- data/ext/ruby_ndtypes/ndtypes/setup.py +11 -2
- data/ext/ruby_ndtypes/ruby_ndtypes.c +364 -241
- data/ext/ruby_ndtypes/ruby_ndtypes.h +1 -1
- data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +0 -1
- data/lib/ndtypes.rb +11 -0
- data/lib/ndtypes/version.rb +2 -2
- data/lib/ruby_ndtypes.so +0 -0
- data/ndtypes.gemspec +3 -0
- data/spec/ndtypes_spec.rb +6 -0
- metadata +98 -4
- data/ext/ruby_ndtypes/gc_guard.c +0 -36
- data/ext/ruby_ndtypes/gc_guard.h +0 -12
Binary file
|
@@ -56,7 +56,7 @@ ndt_value_del(ndt_value_t *mem)
|
|
56
56
|
}
|
57
57
|
|
58
58
|
void
|
59
|
-
ndt_value_array_del(ndt_value_t *mem, int64_t ntypes)
|
59
|
+
ndt_value_array_del(const ndt_value_t *mem, int64_t ntypes)
|
60
60
|
{
|
61
61
|
int64_t i;
|
62
62
|
|
@@ -70,7 +70,7 @@ ndt_value_array_del(ndt_value_t *mem, int64_t ntypes)
|
|
70
70
|
}
|
71
71
|
}
|
72
72
|
|
73
|
-
ndt_free(mem);
|
73
|
+
ndt_free((void *)mem);
|
74
74
|
}
|
75
75
|
|
76
76
|
/* Value sequences */
|
Binary file
|
@@ -335,75 +335,92 @@ def genindices(factor):
|
|
335
335
|
yield (factor * i, factor * j, factor * k)
|
336
336
|
|
337
337
|
BROADCAST_TEST_CASES = [
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
338
|
+
dict(sig=ndt("uint8 -> float64"),
|
339
|
+
args=[ndt("uint8")],
|
340
|
+
out=None,
|
341
|
+
spec= ApplySpec(
|
342
|
+
flags = 'C|Fortran|Strided|Xnd',
|
343
|
+
outer_dims = 0,
|
344
|
+
nin = 1,
|
345
|
+
nout = 1,
|
346
|
+
nargs = 2,
|
347
|
+
types = [ndt("uint8"), ndt("float64")])),
|
348
|
+
|
349
|
+
dict(sig=ndt("... * uint8 -> ... * float64"),
|
350
|
+
args=[ndt("2 * uint8")],
|
351
|
+
out=None,
|
352
|
+
spec=ApplySpec(
|
353
|
+
flags = 'OptZ|OptC|OptS|C|Fortran|Strided|Xnd',
|
354
|
+
outer_dims = 1,
|
355
|
+
nin = 1,
|
356
|
+
nout = 1,
|
357
|
+
nargs = 2,
|
358
|
+
types = [ndt("2 * uint8"), ndt("2 * float64")])),
|
359
|
+
|
360
|
+
dict(sig=ndt("F[... * uint8] -> F[... * float64]"),
|
361
|
+
args=[ndt("!2 * 3 * uint8")],
|
362
|
+
out=None,
|
363
|
+
spec=ApplySpec(
|
364
|
+
flags = 'OptS|C|Fortran|Strided|Xnd',
|
365
|
+
outer_dims = 2,
|
366
|
+
nin = 1,
|
367
|
+
nout = 1,
|
368
|
+
nargs = 2,
|
369
|
+
types = [ndt("!2 * 3 * uint8"), ndt("!2 * 3 * float64")])),
|
370
|
+
|
371
|
+
dict(sig=ndt("... * uint8 -> ... * float64"),
|
372
|
+
args=[ndt("fixed(shape=2, step=10) * uint8")],
|
373
|
+
out=None,
|
374
|
+
spec=ApplySpec(
|
375
|
+
flags = 'OptS|C|Fortran|Strided|Xnd',
|
376
|
+
outer_dims = 1,
|
377
|
+
nin = 1,
|
378
|
+
nout = 1,
|
379
|
+
nargs = 2,
|
380
|
+
types = [ndt("fixed(shape=2, step=10) * uint8"), ndt("2 * float64")])),
|
381
|
+
|
382
|
+
dict(sig=ndt("... * N * uint8 -> ... * N * float64"),
|
383
|
+
args=[ndt("fixed(shape=2, step=10) * uint8")],
|
384
|
+
out=None,
|
385
|
+
spec=ApplySpec(
|
386
|
+
flags = 'Strided|Xnd',
|
387
|
+
outer_dims = 0,
|
388
|
+
nin = 1,
|
389
|
+
nout = 1,
|
390
|
+
nargs = 2,
|
391
|
+
types = [ndt("fixed(shape=2, step=10) * uint8"), ndt("2 * float64")])),
|
392
|
+
|
393
|
+
dict(sig=ndt("... * N * uint8 -> ... * N * float64"),
|
394
|
+
args=[ndt("2 * 3 * uint8")],
|
395
|
+
out=None,
|
396
|
+
spec=ApplySpec(
|
397
|
+
flags = 'OptZ|OptC|OptS|C|Fortran|Strided|Xnd' ,
|
398
|
+
outer_dims = 1,
|
399
|
+
nin = 1,
|
400
|
+
nout = 1,
|
401
|
+
nargs = 2,
|
402
|
+
types = [ndt("2 * 3 * uint8"), ndt("2 * 3 * float64")])),
|
403
|
+
|
404
|
+
dict(sig=ndt("... * N * M * uint8 -> ... * N * M * float64"),
|
405
|
+
args=[ndt("2 * 3 * uint8")],
|
406
|
+
out=None,
|
407
|
+
spec=ApplySpec(
|
408
|
+
flags = 'C|Strided|Xnd',
|
409
|
+
outer_dims = 0,
|
410
|
+
nin = 1,
|
411
|
+
nout = 1,
|
412
|
+
nargs = 2,
|
413
|
+
types = [ndt("2 * 3 * uint8"), ndt("2 * 3 * float64")])),
|
414
|
+
|
415
|
+
dict(sig=ndt("var... * float64 -> var... * float64"),
|
416
|
+
args=[ndt("var(offsets=[0,2]) * var(offsets=[0,4,11]) * float64")],
|
417
|
+
out=None,
|
418
|
+
spec=ApplySpec(
|
419
|
+
flags = 'Xnd',
|
420
|
+
outer_dims = 2,
|
421
|
+
nin = 1,
|
422
|
+
nout = 1,
|
423
|
+
nargs = 2,
|
424
|
+
types = [ndt("var(offsets=[0,2]) * var(offsets=[0,4,11]) * float64"),
|
425
|
+
ndt("var(offsets=[0,2]) * var(offsets=[0,4,11]) * float64")])),
|
409
426
|
]
|
@@ -54,17 +54,14 @@ The xnd module uses ndtypes to implement a general container for mapping most
|
|
54
54
|
Python types relevant for scientific computing directly to memory.
|
55
55
|
"""
|
56
56
|
|
57
|
-
def _pretty_repr(self):
|
58
|
-
return """\
|
59
|
-
ApplySpec(
|
60
|
-
flags=%r,
|
61
|
-
sig=%r,
|
62
|
-
in_types=%r,
|
63
|
-
in_broadcast=%r,
|
64
|
-
out_types=%r,
|
65
|
-
outer_dims=%r
|
66
|
-
)""" % (self.flags, self.sig, self.in_types, self.in_broadcast, self.out_types, self.outer_dims)
|
67
|
-
|
68
|
-
from . import _ndtypes
|
69
|
-
_ndtypes.ApplySpec.__repr__ = _pretty_repr
|
70
57
|
from ._ndtypes import *
|
58
|
+
from ._ndtypes import _ApplySpec
|
59
|
+
from . import _ndtypes
|
60
|
+
|
61
|
+
class ApplySpec(_ApplySpec):
|
62
|
+
|
63
|
+
def __repr__(self):
|
64
|
+
return "\
|
65
|
+
ApplySpec(flags=%r,\n outer_dims=%r\n nin=%r,\n nout=%r,\n nargs=%r,\n types=%r)\
|
66
|
+
" % (self.flags, self.outer_dims, self.nin, self.nout, self.nargs, self.types)
|
67
|
+
|
@@ -54,65 +54,70 @@
|
|
54
54
|
|
55
55
|
|
56
56
|
/****************************************************************************/
|
57
|
-
/*
|
57
|
+
/* Cached objects */
|
58
58
|
/****************************************************************************/
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
At a later stage, the object will need to communicate with Arrow
|
64
|
-
or other formats to store external resources. */
|
65
|
-
|
66
|
-
static PyObject *seterr(ndt_context_t *ctx);
|
60
|
+
static PyObject *Deserialize = NULL;
|
61
|
+
static PyTypeObject *_ApplySpec = NULL;
|
67
62
|
|
68
|
-
typedef struct {
|
69
|
-
PyObject_HEAD
|
70
|
-
ndt_meta_t *m;
|
71
|
-
} ResourceBufferObject;
|
72
63
|
|
73
|
-
|
64
|
+
/****************************************************************************/
|
65
|
+
/* Error handling */
|
66
|
+
/****************************************************************************/
|
74
67
|
|
75
68
|
static PyObject *
|
76
|
-
|
69
|
+
seterr(ndt_context_t *ctx)
|
77
70
|
{
|
78
|
-
|
79
|
-
ResourceBufferObject *self;
|
71
|
+
PyObject *exc = PyExc_RuntimeError;
|
80
72
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
73
|
+
switch (ctx->err) {
|
74
|
+
case NDT_Success: /* should never be set on error */
|
75
|
+
exc = PyExc_RuntimeError;
|
76
|
+
break;
|
77
|
+
case NDT_ValueError:
|
78
|
+
exc = PyExc_ValueError;
|
79
|
+
break;
|
80
|
+
case NDT_TypeError:
|
81
|
+
exc = PyExc_TypeError;
|
82
|
+
break;
|
83
|
+
case NDT_InvalidArgumentError:
|
84
|
+
exc = PyExc_ValueError;
|
85
|
+
break;
|
86
|
+
case NDT_NotImplementedError:
|
87
|
+
exc = PyExc_NotImplementedError;
|
88
|
+
break;
|
89
|
+
case NDT_IndexError:
|
90
|
+
exc = PyExc_IndexError;
|
91
|
+
break;
|
92
|
+
case NDT_LexError: case NDT_ParseError:
|
93
|
+
exc = PyExc_ValueError;
|
94
|
+
break;
|
95
|
+
case NDT_OSError:
|
96
|
+
exc = PyExc_OSError;
|
97
|
+
break;
|
98
|
+
case NDT_RuntimeError:
|
99
|
+
exc = PyExc_RuntimeError;
|
100
|
+
break;
|
101
|
+
case NDT_MemoryError:
|
102
|
+
exc = PyExc_MemoryError;
|
103
|
+
break;
|
90
104
|
}
|
91
105
|
|
92
|
-
|
93
|
-
|
94
|
-
}
|
106
|
+
PyErr_SetString(exc, ndt_context_msg(ctx));
|
107
|
+
ndt_context_del(ctx);
|
95
108
|
|
96
|
-
|
97
|
-
|
98
|
-
void *arg UNUSED)
|
99
|
-
{
|
100
|
-
return 0;
|
101
|
-
}
|
109
|
+
return NULL;
|
110
|
+
};
|
102
111
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
self->m = NULL;
|
108
|
-
PyObject_GC_UnTrack(self);
|
109
|
-
PyObject_GC_Del(self);
|
110
|
-
}
|
112
|
+
|
113
|
+
/****************************************************************************/
|
114
|
+
/* Get offsets from a list */
|
115
|
+
/****************************************************************************/
|
111
116
|
|
112
117
|
static int
|
113
|
-
|
118
|
+
offsets_from_list(ndt_meta_t *m, PyObject *list)
|
114
119
|
{
|
115
|
-
|
120
|
+
NDT_STATIC_CONTEXT(ctx);
|
116
121
|
PyObject *lst;
|
117
122
|
|
118
123
|
if (!PyList_Check(list)) {
|
@@ -166,99 +171,17 @@ rbuf_init_from_offset_list(ResourceBufferObject *rbuf, PyObject *list)
|
|
166
171
|
offsets[k] = (int32_t)x;
|
167
172
|
}
|
168
173
|
|
169
|
-
m->
|
170
|
-
m->offsets[m->ndims]
|
174
|
+
m->offsets[m->ndims] = ndt_offsets_from_ptr(offsets, (int32_t)noffsets, &ctx);
|
175
|
+
if (m->offsets[m->ndims] == NULL) {
|
176
|
+
(void)seterr(&ctx);
|
177
|
+
return -1;
|
178
|
+
}
|
171
179
|
m->ndims++;
|
172
180
|
}
|
173
181
|
|
174
182
|
return 0;
|
175
183
|
}
|
176
184
|
|
177
|
-
static PyObject *
|
178
|
-
rbuf_from_offset_lists(PyObject *list)
|
179
|
-
{
|
180
|
-
PyObject *rbuf;
|
181
|
-
|
182
|
-
rbuf = rbuf_alloc();
|
183
|
-
if (rbuf == NULL) {
|
184
|
-
return NULL;
|
185
|
-
}
|
186
|
-
|
187
|
-
if (rbuf_init_from_offset_list((ResourceBufferObject *)rbuf, list) < 0) {
|
188
|
-
Py_DECREF(rbuf);
|
189
|
-
return NULL;
|
190
|
-
}
|
191
|
-
|
192
|
-
return rbuf;
|
193
|
-
}
|
194
|
-
|
195
|
-
static PyTypeObject ResourceBuffer_Type = {
|
196
|
-
PyVarObject_HEAD_INIT(NULL, 0)
|
197
|
-
.tp_name = "_ndtypes.resource",
|
198
|
-
.tp_basicsize = sizeof(ResourceBufferObject),
|
199
|
-
.tp_dealloc = (destructor)rbuf_dealloc,
|
200
|
-
.tp_getattro = PyObject_GenericGetAttr,
|
201
|
-
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
|
202
|
-
.tp_traverse = (traverseproc)rbuf_traverse
|
203
|
-
};
|
204
|
-
|
205
|
-
|
206
|
-
/****************************************************************************/
|
207
|
-
/* Cached objects */
|
208
|
-
/****************************************************************************/
|
209
|
-
|
210
|
-
static PyObject *Deserialize = NULL;
|
211
|
-
static PyTypeObject *ApplySpec = NULL;
|
212
|
-
|
213
|
-
|
214
|
-
/****************************************************************************/
|
215
|
-
/* Error handling */
|
216
|
-
/****************************************************************************/
|
217
|
-
|
218
|
-
static PyObject *
|
219
|
-
seterr(ndt_context_t *ctx)
|
220
|
-
{
|
221
|
-
PyObject *exc = PyExc_RuntimeError;
|
222
|
-
|
223
|
-
switch (ctx->err) {
|
224
|
-
case NDT_Success: /* should never be set on error */
|
225
|
-
exc = PyExc_RuntimeError;
|
226
|
-
break;
|
227
|
-
case NDT_ValueError:
|
228
|
-
exc = PyExc_ValueError;
|
229
|
-
break;
|
230
|
-
case NDT_TypeError:
|
231
|
-
exc = PyExc_TypeError;
|
232
|
-
break;
|
233
|
-
case NDT_InvalidArgumentError:
|
234
|
-
exc = PyExc_ValueError;
|
235
|
-
break;
|
236
|
-
case NDT_NotImplementedError:
|
237
|
-
exc = PyExc_NotImplementedError;
|
238
|
-
break;
|
239
|
-
case NDT_IndexError:
|
240
|
-
exc = PyExc_IndexError;
|
241
|
-
break;
|
242
|
-
case NDT_LexError: case NDT_ParseError:
|
243
|
-
exc = PyExc_ValueError;
|
244
|
-
break;
|
245
|
-
case NDT_OSError:
|
246
|
-
exc = PyExc_OSError;
|
247
|
-
break;
|
248
|
-
case NDT_RuntimeError:
|
249
|
-
exc = PyExc_RuntimeError;
|
250
|
-
break;
|
251
|
-
case NDT_MemoryError:
|
252
|
-
exc = PyExc_MemoryError;
|
253
|
-
break;
|
254
|
-
}
|
255
|
-
|
256
|
-
PyErr_SetString(exc, ndt_context_msg(ctx));
|
257
|
-
ndt_context_del(ctx);
|
258
|
-
|
259
|
-
return NULL;
|
260
|
-
};
|
261
|
-
|
262
185
|
|
263
186
|
/****************************************************************************/
|
264
187
|
/* ndt object */
|
@@ -275,29 +198,40 @@ ndtype_alloc(PyTypeObject *type)
|
|
275
198
|
if (self == NULL) {
|
276
199
|
return NULL;
|
277
200
|
}
|
278
|
-
|
279
|
-
RBUF(self) = NULL;
|
201
|
+
self->hash = -1;
|
280
202
|
NDT(self) = NULL;
|
281
203
|
|
282
204
|
return (PyObject *)self;
|
283
205
|
}
|
284
206
|
|
285
|
-
static int
|
286
|
-
ndtype_traverse(NdtObject *self, visitproc visit, void *arg)
|
287
|
-
{
|
288
|
-
Py_VISIT(self->rbuf);
|
289
|
-
return 0;
|
290
|
-
}
|
291
|
-
|
292
207
|
static void
|
293
208
|
ndtype_dealloc(NdtObject *self)
|
294
209
|
{
|
295
|
-
|
296
|
-
ndt_del(NDT(self));
|
297
|
-
Py_CLEAR(self->rbuf);
|
210
|
+
ndt_decref(NDT(self));
|
298
211
|
Py_TYPE(self)->tp_free(self);
|
299
212
|
}
|
300
213
|
|
214
|
+
static const ndt_t *
|
215
|
+
from_string(PyObject *v)
|
216
|
+
{
|
217
|
+
NDT_STATIC_CONTEXT(ctx);
|
218
|
+
const char *cp;
|
219
|
+
const ndt_t *t;
|
220
|
+
|
221
|
+
cp = PyUnicode_AsUTF8(v);
|
222
|
+
if (cp == NULL) {
|
223
|
+
return NULL;
|
224
|
+
}
|
225
|
+
|
226
|
+
t = ndt_from_string(cp, &ctx);
|
227
|
+
if (t == NULL) {
|
228
|
+
(void)seterr(&ctx);
|
229
|
+
return NULL;
|
230
|
+
}
|
231
|
+
|
232
|
+
return t;
|
233
|
+
}
|
234
|
+
|
301
235
|
static PyObject *
|
302
236
|
ndtype_from_object(PyTypeObject *tp, PyObject *type)
|
303
237
|
{
|
@@ -320,13 +254,7 @@ ndtype_from_object(PyTypeObject *tp, PyObject *type)
|
|
320
254
|
return NULL;
|
321
255
|
}
|
322
256
|
|
323
|
-
|
324
|
-
if (RBUF(self) == NULL) {
|
325
|
-
Py_DECREF(self);
|
326
|
-
return NULL;
|
327
|
-
}
|
328
|
-
|
329
|
-
NDT(self) = ndt_from_string_fill_meta(RBUF_NDT_META(self), cp, &ctx);
|
257
|
+
NDT(self) = ndt_from_string(cp, &ctx);
|
330
258
|
if (NDT(self) == NULL) {
|
331
259
|
Py_DECREF(self);
|
332
260
|
return seterr(&ctx);
|
@@ -383,6 +311,7 @@ static PyObject *
|
|
383
311
|
ndtype_from_offsets_and_dtype(PyTypeObject *tp, PyObject *offsets, PyObject *dtype)
|
384
312
|
{
|
385
313
|
NDT_STATIC_CONTEXT(ctx);
|
314
|
+
ndt_meta_t m = {.ndims = 0, .offsets = {NULL}};
|
386
315
|
PyObject *self;
|
387
316
|
const char *cp;
|
388
317
|
|
@@ -396,14 +325,43 @@ ndtype_from_offsets_and_dtype(PyTypeObject *tp, PyObject *offsets, PyObject *dty
|
|
396
325
|
return NULL;
|
397
326
|
}
|
398
327
|
|
399
|
-
|
400
|
-
|
328
|
+
if (offsets_from_list(&m, offsets) < 0) {
|
329
|
+
ndt_meta_clear(&m);
|
401
330
|
Py_DECREF(self);
|
402
331
|
return NULL;
|
403
332
|
}
|
404
333
|
|
405
|
-
NDT(self) = ndt_from_metadata_and_dtype(
|
334
|
+
NDT(self) = ndt_from_metadata_and_dtype(&m, cp, &ctx);
|
335
|
+
ndt_meta_clear(&m);
|
336
|
+
if (NDT(self) == NULL) {
|
337
|
+
Py_DECREF(self);
|
338
|
+
return seterr(&ctx);
|
339
|
+
}
|
340
|
+
|
341
|
+
return self;
|
342
|
+
}
|
343
|
+
|
344
|
+
static PyObject *
|
345
|
+
ndtype_from_offsets_opt_and_dtype(PyTypeObject *tp, PyObject *offsets, bool *opt,
|
346
|
+
const ndt_t *dtype)
|
347
|
+
{
|
348
|
+
NDT_STATIC_CONTEXT(ctx);
|
349
|
+
ndt_meta_t m = {.ndims = 0, .offsets = {NULL}};
|
350
|
+
PyObject *self;
|
351
|
+
|
352
|
+
self = ndtype_alloc(tp);
|
353
|
+
if (self == NULL) {
|
354
|
+
return NULL;
|
355
|
+
}
|
406
356
|
|
357
|
+
if (offsets_from_list(&m, offsets) < 0) {
|
358
|
+
ndt_meta_clear(&m);
|
359
|
+
Py_DECREF(self);
|
360
|
+
return NULL;
|
361
|
+
}
|
362
|
+
|
363
|
+
NDT(self) = ndt_from_metadata_opt_and_dtype(&m, opt, dtype, &ctx);
|
364
|
+
ndt_meta_clear(&m);
|
407
365
|
if (NDT(self) == NULL) {
|
408
366
|
Py_DECREF(self);
|
409
367
|
return seterr(&ctx);
|
@@ -428,13 +386,7 @@ ndtype_deserialize(PyTypeObject *tp, PyObject *bytes)
|
|
428
386
|
return NULL;
|
429
387
|
}
|
430
388
|
|
431
|
-
|
432
|
-
if (RBUF(self) == NULL) {
|
433
|
-
Py_DECREF(self);
|
434
|
-
return NULL;
|
435
|
-
}
|
436
|
-
|
437
|
-
NDT(self) = ndt_deserialize(RBUF_NDT_META(self), PyBytes_AS_STRING(bytes),
|
389
|
+
NDT(self) = ndt_deserialize(PyBytes_AS_STRING(bytes),
|
438
390
|
PyBytes_GET_SIZE(bytes), &ctx);
|
439
391
|
if (NDT(self) == NULL) {
|
440
392
|
Py_DECREF(self);
|
@@ -601,6 +553,7 @@ Ndtype_BoolFunc(ndt_is_complex)
|
|
601
553
|
|
602
554
|
Ndtype_BoolFunc(ndt_is_c_contiguous)
|
603
555
|
Ndtype_BoolFunc(ndt_is_f_contiguous)
|
556
|
+
Ndtype_BoolFunc(ndt_is_var_contiguous)
|
604
557
|
|
605
558
|
|
606
559
|
static PyObject *
|
@@ -628,13 +581,62 @@ static Py_hash_t
|
|
628
581
|
ndtype_hash(PyObject *self)
|
629
582
|
{
|
630
583
|
NDT_STATIC_CONTEXT(ctx);
|
631
|
-
|
584
|
+
NdtObject *s = (NdtObject *)self;
|
632
585
|
|
633
|
-
|
634
|
-
|
635
|
-
(
|
586
|
+
if (s->hash == -1) {
|
587
|
+
s->hash = ndt_hash(NDT(self), &ctx);
|
588
|
+
if (s->hash == -1) {
|
589
|
+
(void)seterr(&ctx);
|
590
|
+
}
|
591
|
+
}
|
592
|
+
|
593
|
+
return s->hash;
|
594
|
+
}
|
595
|
+
|
596
|
+
static PyObject *
|
597
|
+
ndtype_at(PyObject *self, PyObject *args, PyObject *kwds)
|
598
|
+
{
|
599
|
+
static char *kwlist[] = {"n", "dtype", NULL};
|
600
|
+
NDT_STATIC_CONTEXT(ctx);
|
601
|
+
PyObject *dtype = Py_None;
|
602
|
+
int n = 0;
|
603
|
+
PyObject *res;
|
604
|
+
const ndt_t *t;
|
605
|
+
const ndt_t *dt;
|
606
|
+
|
607
|
+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "i|O", kwlist, &n, &dtype)) {
|
608
|
+
return NULL;
|
609
|
+
}
|
610
|
+
|
611
|
+
if (dtype == Py_None) {
|
612
|
+
dt = NULL;
|
613
|
+
}
|
614
|
+
else if (Ndt_Check(dtype)) {
|
615
|
+
dt = NDT(dtype);
|
616
|
+
ndt_incref(dt);
|
617
|
+
}
|
618
|
+
else if (PyUnicode_Check(dtype)) {
|
619
|
+
dt = from_string(dtype);
|
620
|
+
if (dt == NULL) {
|
621
|
+
return NULL;
|
622
|
+
}
|
623
|
+
}
|
624
|
+
else {
|
625
|
+
PyErr_SetString(PyExc_TypeError,
|
626
|
+
"dtype argument must be 'ndt' or 'str'");
|
627
|
+
return NULL;
|
628
|
+
}
|
629
|
+
|
630
|
+
t = ndt_copy_contiguous_at(NDT(self), n, dt, &ctx);
|
631
|
+
if (dt != NULL) {
|
632
|
+
ndt_decref(dt);
|
633
|
+
}
|
634
|
+
if (t == NULL) {
|
635
|
+
return seterr(&ctx);
|
636
636
|
}
|
637
637
|
|
638
|
+
res = Ndt_FromType(t);
|
639
|
+
ndt_decref(t);
|
638
640
|
return res;
|
639
641
|
}
|
640
642
|
|
@@ -658,40 +660,178 @@ ndtype_match(PyObject *self, PyObject *other)
|
|
658
660
|
}
|
659
661
|
|
660
662
|
static PyObject *
|
661
|
-
|
663
|
+
ndtype_unify(PyObject *self, PyObject *other)
|
662
664
|
{
|
663
665
|
NDT_STATIC_CONTEXT(ctx);
|
664
|
-
|
665
|
-
const ndt_t *
|
666
|
-
ndt_apply_spec_t spec;
|
667
|
-
PyObject *flags = NULL, *out = NULL, *broadcast = NULL, *outer_dims = NULL;
|
668
|
-
PyObject *res = NULL;
|
669
|
-
Py_ssize_t nin;
|
670
|
-
Py_ssize_t i;
|
666
|
+
PyObject *u;
|
667
|
+
const ndt_t *t;
|
671
668
|
|
672
|
-
if (!
|
673
|
-
PyErr_SetString(PyExc_TypeError, "
|
669
|
+
if (!Ndt_Check(other)) {
|
670
|
+
PyErr_SetString(PyExc_TypeError, "argument must be 'ndt'");
|
674
671
|
return NULL;
|
675
672
|
}
|
676
673
|
|
677
|
-
|
678
|
-
if (
|
679
|
-
|
680
|
-
|
674
|
+
t = ndt_unify(NDT(self), NDT(other), &ctx);
|
675
|
+
if (t == NULL) {
|
676
|
+
return seterr(&ctx);
|
677
|
+
}
|
678
|
+
|
679
|
+
u = Ndt_FromType(t);
|
680
|
+
ndt_decref(t);
|
681
|
+
return u;
|
682
|
+
}
|
683
|
+
|
684
|
+
static PyObject *
|
685
|
+
get_item_with_error(PyObject *d, const char *key)
|
686
|
+
{
|
687
|
+
PyObject *s, *v;
|
688
|
+
|
689
|
+
s = PyUnicode_FromString(key);
|
690
|
+
if (s == NULL) {
|
681
691
|
return NULL;
|
682
692
|
}
|
683
693
|
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
694
|
+
v = PyDict_GetItemWithError(d, s);
|
695
|
+
Py_DECREF(s);
|
696
|
+
return v;
|
697
|
+
}
|
698
|
+
|
699
|
+
static int
|
700
|
+
parse_args(const ndt_t *types[NDT_MAX_ARGS], int *py_nin, int *py_nout, int *py_nargs,
|
701
|
+
PyObject *args, PyObject *kwargs)
|
702
|
+
{
|
703
|
+
Py_ssize_t nin;
|
704
|
+
Py_ssize_t nout;
|
705
|
+
|
706
|
+
if (!args || !PyTuple_Check(args)) {
|
707
|
+
const char *tuple = args ? Py_TYPE(args)->tp_name : "NULL";
|
708
|
+
PyErr_Format(PyExc_SystemError,
|
709
|
+
"internal error: expected tuple, got '%.200s'",
|
710
|
+
tuple);
|
711
|
+
return -1;
|
712
|
+
}
|
713
|
+
|
714
|
+
if (kwargs && !PyDict_Check(kwargs)) {
|
715
|
+
PyErr_Format(PyExc_SystemError,
|
716
|
+
"internal error: expected dict, got '%.200s'",
|
717
|
+
Py_TYPE(kwargs)->tp_name);
|
718
|
+
return -1;
|
719
|
+
}
|
720
|
+
|
721
|
+
nin = PyTuple_GET_SIZE(args);
|
722
|
+
if (nin > NDT_MAX_ARGS) {
|
723
|
+
PyErr_Format(PyExc_TypeError,
|
724
|
+
"maximum number of arguments is %d, got %n", NDT_MAX_ARGS, nin);
|
725
|
+
return -1;
|
726
|
+
}
|
727
|
+
|
728
|
+
for (Py_ssize_t i = 0; i < nin; i++) {
|
729
|
+
PyObject *v = PyTuple_GET_ITEM(args, i);
|
730
|
+
if (!Ndt_Check(v)) {
|
731
|
+
PyErr_Format(PyExc_TypeError,
|
732
|
+
"expected ndt argument, got '%.200s'", Py_TYPE(v)->tp_name);
|
733
|
+
return -1;
|
689
734
|
}
|
690
|
-
|
735
|
+
|
736
|
+
types[i] = NDT(v);
|
691
737
|
}
|
692
738
|
|
693
|
-
|
694
|
-
|
739
|
+
if (kwargs == NULL || PyDict_Size(kwargs) == 0) {
|
740
|
+
nout = 0;
|
741
|
+
}
|
742
|
+
else if (PyDict_Size(kwargs) == 1) {
|
743
|
+
PyObject *out = get_item_with_error(kwargs, "out");
|
744
|
+
if (out == NULL) {
|
745
|
+
if (PyErr_Occurred()) {
|
746
|
+
return -1;
|
747
|
+
}
|
748
|
+
PyErr_SetString(PyExc_TypeError,
|
749
|
+
"the only supported keyword argument is 'out'");
|
750
|
+
return -1;
|
751
|
+
}
|
752
|
+
|
753
|
+
if (out == Py_None) {
|
754
|
+
nout = 0;
|
755
|
+
}
|
756
|
+
else if (Ndt_Check(out)) {
|
757
|
+
nout = 1;
|
758
|
+
if (nin+nout > NDT_MAX_ARGS) {
|
759
|
+
PyErr_Format(PyExc_TypeError,
|
760
|
+
"maximum number of arguments is %d, got %n", NDT_MAX_ARGS, nin+nout);
|
761
|
+
return -1;
|
762
|
+
}
|
763
|
+
|
764
|
+
types[nin] = NDT(out);
|
765
|
+
}
|
766
|
+
else if (PyTuple_Check(out)) {
|
767
|
+
nout = PyTuple_GET_SIZE(out);
|
768
|
+
if (nout > NDT_MAX_ARGS || nin+nout > NDT_MAX_ARGS) {
|
769
|
+
PyErr_Format(PyExc_TypeError,
|
770
|
+
"maximum number of arguments is %d, got %n", NDT_MAX_ARGS, nin+nout);
|
771
|
+
return -1;
|
772
|
+
}
|
773
|
+
|
774
|
+
for (Py_ssize_t i = 0; i < nout; i++) {
|
775
|
+
PyObject *v = PyTuple_GET_ITEM(out, i);
|
776
|
+
if (!Ndt_Check(v)) {
|
777
|
+
PyErr_Format(PyExc_TypeError,
|
778
|
+
"expected ndt argument, got '%.200s'", Py_TYPE(v)->tp_name);
|
779
|
+
return -1;
|
780
|
+
}
|
781
|
+
|
782
|
+
types[nin+i] = NDT(v);
|
783
|
+
}
|
784
|
+
}
|
785
|
+
else {
|
786
|
+
PyErr_Format(PyExc_TypeError,
|
787
|
+
"'out' argument must be ndt or a tuple of ndt, got '%.200s'",
|
788
|
+
Py_TYPE(out)->tp_name);
|
789
|
+
return -1;
|
790
|
+
}
|
791
|
+
}
|
792
|
+
else {
|
793
|
+
PyErr_SetString(PyExc_TypeError,
|
794
|
+
"the only supported keyword argument is 'out'");
|
795
|
+
return -1;
|
796
|
+
}
|
797
|
+
|
798
|
+
for (int i = 0; i < nin+nout; i++) {
|
799
|
+
ndt_incref(types[i]);
|
800
|
+
}
|
801
|
+
|
802
|
+
*py_nin = (int)nin;
|
803
|
+
*py_nout = (int)nout;
|
804
|
+
*py_nargs = (int)nin+(int)nout;
|
805
|
+
|
806
|
+
return 0;
|
807
|
+
}
|
808
|
+
|
809
|
+
static PyObject *
|
810
|
+
ndtype_apply(PyObject *self, PyObject *args, PyObject *kwargs)
|
811
|
+
{
|
812
|
+
NDT_STATIC_CONTEXT(ctx);
|
813
|
+
const ndt_t *sig = NDT(self);
|
814
|
+
const ndt_t *types[NDT_MAX_ARGS] = {NULL};
|
815
|
+
const int64_t li[NDT_MAX_ARGS] = {0};
|
816
|
+
ndt_apply_spec_t spec = ndt_apply_spec_empty;
|
817
|
+
int py_nin, py_nout, py_nargs;
|
818
|
+
PyObject *res = NULL;
|
819
|
+
PyObject *flags = NULL;
|
820
|
+
PyObject *outer_dims = NULL;
|
821
|
+
PyObject *nin = NULL;
|
822
|
+
PyObject *nout = NULL;
|
823
|
+
PyObject *nargs = NULL;
|
824
|
+
PyObject *lst = NULL;
|
825
|
+
int ret;
|
826
|
+
|
827
|
+
if (parse_args(types, &py_nin, &py_nout, &py_nargs, args, kwargs) < 0) {
|
828
|
+
return NULL;
|
829
|
+
}
|
830
|
+
|
831
|
+
ret = ndt_typecheck(&spec, sig, types, li, py_nin, py_nout, false,
|
832
|
+
NULL, NULL, &ctx);
|
833
|
+
ndt_type_array_clear(types, py_nargs);
|
834
|
+
if (ret < 0) {
|
695
835
|
return seterr(&ctx);
|
696
836
|
}
|
697
837
|
|
@@ -700,53 +840,52 @@ ndtype_apply(PyObject *self, PyObject *args)
|
|
700
840
|
return NULL;
|
701
841
|
}
|
702
842
|
|
703
|
-
|
704
|
-
if (
|
843
|
+
lst = PyList_New(spec.nargs);
|
844
|
+
if (lst == NULL) {
|
705
845
|
ndt_apply_spec_clear(&spec);
|
706
846
|
goto finish;
|
707
847
|
}
|
708
848
|
|
709
|
-
for (i=
|
849
|
+
for (int i = 0; i < spec.nargs; i++) {
|
710
850
|
PyObject *x = ndtype_alloc(&Ndt_Type);
|
711
851
|
if (x == NULL) {
|
712
852
|
ndt_apply_spec_clear(&spec);
|
713
853
|
goto finish;
|
714
854
|
}
|
715
|
-
NDT(x) = spec.
|
716
|
-
|
717
|
-
PyList_SET_ITEM(out, i, x);
|
855
|
+
NDT(x) = spec.types[i];
|
856
|
+
PyList_SET_ITEM(lst, i, x);
|
718
857
|
}
|
719
858
|
|
720
|
-
|
721
|
-
if (
|
722
|
-
ndt_apply_spec_clear(&spec);
|
859
|
+
outer_dims = PyLong_FromLong(spec.outer_dims);
|
860
|
+
if (outer_dims == NULL) {
|
723
861
|
goto finish;
|
724
862
|
}
|
725
863
|
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
ndt_apply_spec_clear(&spec);
|
730
|
-
goto finish;
|
731
|
-
}
|
732
|
-
NDT(x) = spec.broadcast[i];
|
733
|
-
spec.broadcast[i] = NULL; spec.nbroadcast--;
|
734
|
-
PyList_SET_ITEM(broadcast, i, x);
|
864
|
+
nin = PyLong_FromLong(spec.nin);
|
865
|
+
if (nin == NULL) {
|
866
|
+
goto finish;
|
735
867
|
}
|
736
868
|
|
737
|
-
|
738
|
-
if (
|
869
|
+
nout = PyLong_FromLong(spec.nout);
|
870
|
+
if (nout == NULL) {
|
871
|
+
goto finish;
|
872
|
+
}
|
873
|
+
|
874
|
+
nargs = PyLong_FromLong(spec.nargs);
|
875
|
+
if (nargs == NULL) {
|
739
876
|
goto finish;
|
740
877
|
}
|
741
878
|
|
742
|
-
res = PyObject_CallFunctionObjArgs((PyObject *)
|
743
|
-
|
879
|
+
res = PyObject_CallFunctionObjArgs((PyObject *)_ApplySpec, flags,
|
880
|
+
outer_dims, nin, nout, nargs, lst, NULL);
|
744
881
|
|
745
882
|
finish:
|
746
883
|
Py_XDECREF(flags);
|
747
|
-
Py_XDECREF(out);
|
748
|
-
Py_XDECREF(broadcast);
|
749
884
|
Py_XDECREF(outer_dims);
|
885
|
+
Py_XDECREF(nin);
|
886
|
+
Py_XDECREF(nout);
|
887
|
+
Py_XDECREF(nargs);
|
888
|
+
Py_XDECREF(lst);
|
750
889
|
return res;
|
751
890
|
}
|
752
891
|
|
@@ -777,6 +916,7 @@ static PyObject *
|
|
777
916
|
ndtype_ndim(PyObject *self, PyObject *args UNUSED)
|
778
917
|
{
|
779
918
|
const ndt_t *t = NDT(self);
|
919
|
+
int ldim;
|
780
920
|
|
781
921
|
if (ndt_is_abstract(t)) {
|
782
922
|
PyErr_SetString(PyExc_TypeError,
|
@@ -784,7 +924,8 @@ ndtype_ndim(PyObject *self, PyObject *args UNUSED)
|
|
784
924
|
return NULL;
|
785
925
|
}
|
786
926
|
|
787
|
-
|
927
|
+
ldim = ndt_logical_ndim(t);
|
928
|
+
return PyLong_FromLong(ldim);
|
788
929
|
}
|
789
930
|
|
790
931
|
static PyObject *
|
@@ -857,19 +998,8 @@ ndtype_strides(PyObject *self, PyObject *args UNUSED)
|
|
857
998
|
static PyObject *
|
858
999
|
ndtype_hidden_dtype(PyObject *self, PyObject *args UNUSED)
|
859
1000
|
{
|
860
|
-
|
861
|
-
|
862
|
-
const ndt_t *dtype;
|
863
|
-
ndt_t *u;
|
864
|
-
|
865
|
-
dtype = ndt_hidden_dtype(t);
|
866
|
-
|
867
|
-
u = ndt_copy(dtype, &ctx);
|
868
|
-
if (u == NULL) {
|
869
|
-
return seterr(&ctx);
|
870
|
-
}
|
871
|
-
|
872
|
-
return Ndt_FromType(u);
|
1001
|
+
const ndt_t *dtype = ndt_hidden_dtype(NDT(self));
|
1002
|
+
return Ndt_FromType(dtype);
|
873
1003
|
}
|
874
1004
|
|
875
1005
|
static PyObject *
|
@@ -970,10 +1100,13 @@ static PyMethodDef ndtype_methods [] =
|
|
970
1100
|
/* Boolean functions on array types */
|
971
1101
|
{ "is_c_contiguous", (PyCFunction)ndtype_ndt_is_c_contiguous, METH_NOARGS, doc_is_c_contiguous },
|
972
1102
|
{ "is_f_contiguous", (PyCFunction)ndtype_ndt_is_f_contiguous, METH_NOARGS, doc_is_f_contiguous },
|
1103
|
+
{ "is_var_contiguous", (PyCFunction)dtype_ndt_is_var_contiguous, METH_NOARGS, NULL },
|
973
1104
|
|
974
1105
|
/* Binary functions */
|
1106
|
+
{ "at", (PyCFunction)ndtype_at, METH_VARARGS|METH_KEYWORDS, NULL },
|
975
1107
|
{ "match", (PyCFunction)ndtype_match, METH_O, doc_match },
|
976
|
-
{ "
|
1108
|
+
{ "unify", (PyCFunction)ndtype_unify, METH_O, NULL },
|
1109
|
+
{ "apply", (PyCFunction)ndtype_apply, METH_VARARGS|METH_KEYWORDS, "method likely to change" },
|
977
1110
|
|
978
1111
|
/* Other functions */
|
979
1112
|
{ "to_format", (PyCFunction)ndtype_to_format, METH_NOARGS, NULL },
|
@@ -1005,14 +1138,12 @@ static PyTypeObject Ndt_Type =
|
|
1005
1138
|
.tp_hash = ndtype_hash,
|
1006
1139
|
.tp_str = (reprfunc) ndtype_str,
|
1007
1140
|
.tp_getattro = (getattrofunc) PyObject_GenericGetAttr,
|
1008
|
-
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
|
1009
|
-
.tp_traverse = (traverseproc)ndtype_traverse,
|
1141
|
+
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
|
1010
1142
|
.tp_richcompare = ndtype_richcompare,
|
1011
1143
|
.tp_methods = ndtype_methods,
|
1012
1144
|
.tp_getset = ndtype_getsets,
|
1013
|
-
.tp_alloc = PyType_GenericAlloc,
|
1014
1145
|
.tp_new = ndtype_new,
|
1015
|
-
.tp_free =
|
1146
|
+
.tp_free = PyObject_Del
|
1016
1147
|
};
|
1017
1148
|
|
1018
1149
|
|
@@ -1034,13 +1165,6 @@ Ndt_Check(const PyObject *v)
|
|
1034
1165
|
return PyObject_TypeCheck(v, &Ndt_Type);
|
1035
1166
|
}
|
1036
1167
|
|
1037
|
-
static const ndt_t *
|
1038
|
-
CONST_NDT(const PyObject *v)
|
1039
|
-
{
|
1040
|
-
assert(Ndt_Check(v));
|
1041
|
-
return ((NdtObject *)v)->ndt;
|
1042
|
-
}
|
1043
|
-
|
1044
1168
|
static PyObject *
|
1045
1169
|
Ndt_SetError(ndt_context_t *ctx)
|
1046
1170
|
{
|
@@ -1048,67 +1172,18 @@ Ndt_SetError(ndt_context_t *ctx)
|
|
1048
1172
|
}
|
1049
1173
|
|
1050
1174
|
static PyObject *
|
1051
|
-
|
1052
|
-
{
|
1053
|
-
NDT_STATIC_CONTEXT(ctx);
|
1054
|
-
PyObject *dest;
|
1055
|
-
|
1056
|
-
if (!Ndt_Check(src)) {
|
1057
|
-
PyErr_SetString(PyExc_TypeError, "expected ndt object");
|
1058
|
-
return NULL;
|
1059
|
-
}
|
1060
|
-
|
1061
|
-
dest = ndtype_alloc(Py_TYPE(src));
|
1062
|
-
if (dest == NULL) {
|
1063
|
-
return NULL;
|
1064
|
-
}
|
1065
|
-
|
1066
|
-
NDT(dest) = ndt_copy(t, &ctx);
|
1067
|
-
if (NDT(dest) == NULL) {
|
1068
|
-
return seterr(&ctx);
|
1069
|
-
}
|
1070
|
-
|
1071
|
-
RBUF(dest) = RBUF(src);
|
1072
|
-
Py_XINCREF(RBUF(dest));
|
1073
|
-
|
1074
|
-
return dest;
|
1075
|
-
}
|
1076
|
-
|
1077
|
-
static PyObject *
|
1078
|
-
Ndt_MoveSubtree(const PyObject *src, ndt_t *t)
|
1079
|
-
{
|
1080
|
-
PyObject *dest;
|
1081
|
-
|
1082
|
-
if (!Ndt_Check(src)) {
|
1083
|
-
PyErr_SetString(PyExc_TypeError, "expected ndt object");
|
1084
|
-
return NULL;
|
1085
|
-
}
|
1086
|
-
|
1087
|
-
dest = ndtype_alloc(Py_TYPE(src));
|
1088
|
-
if (dest == NULL) {
|
1089
|
-
ndt_del(t);
|
1090
|
-
return NULL;
|
1091
|
-
}
|
1092
|
-
|
1093
|
-
NDT(dest) = t;
|
1094
|
-
RBUF(dest) = RBUF(src);
|
1095
|
-
Py_XINCREF(RBUF(dest));
|
1096
|
-
|
1097
|
-
return dest;
|
1098
|
-
}
|
1099
|
-
|
1100
|
-
static PyObject *
|
1101
|
-
Ndt_FromType(ndt_t *type)
|
1175
|
+
Ndt_FromType(const ndt_t *t)
|
1102
1176
|
{
|
1103
1177
|
PyObject *self;
|
1104
1178
|
|
1105
1179
|
self = ndtype_alloc(&Ndt_Type);
|
1106
1180
|
if (self == NULL) {
|
1107
|
-
ndt_del(type);
|
1108
1181
|
return NULL;
|
1109
1182
|
}
|
1110
1183
|
|
1111
|
-
|
1184
|
+
ndt_incref(t);
|
1185
|
+
NDT(self) = t;
|
1186
|
+
|
1112
1187
|
return self;
|
1113
1188
|
}
|
1114
1189
|
|
@@ -1118,17 +1193,22 @@ Ndt_FromObject(PyObject *obj)
|
|
1118
1193
|
return ndtype_from_object(&Ndt_Type, obj);
|
1119
1194
|
}
|
1120
1195
|
|
1196
|
+
static PyObject *
|
1197
|
+
Ndt_FromOffsetsAndDtype(PyObject *offsets, bool *opt, const ndt_t *dtype)
|
1198
|
+
{
|
1199
|
+
return ndtype_from_offsets_opt_and_dtype(&Ndt_Type, offsets, opt, dtype);
|
1200
|
+
}
|
1201
|
+
|
1202
|
+
|
1121
1203
|
static PyObject *
|
1122
1204
|
init_api(void)
|
1123
1205
|
{
|
1124
1206
|
ndtypes_api[Ndt_CheckExact_INDEX] = (void *)Ndt_CheckExact;
|
1125
1207
|
ndtypes_api[Ndt_Check_INDEX] = (void *)Ndt_Check;
|
1126
|
-
ndtypes_api[CONST_NDT_INDEX] = (void *)CONST_NDT;
|
1127
1208
|
ndtypes_api[Ndt_SetError_INDEX] = (void *)Ndt_SetError;
|
1128
|
-
ndtypes_api[Ndt_CopySubtree_INDEX] = (void *)Ndt_CopySubtree;
|
1129
|
-
ndtypes_api[Ndt_MoveSubtree_INDEX] = (void *)Ndt_MoveSubtree;
|
1130
1209
|
ndtypes_api[Ndt_FromType_INDEX] = (void *)Ndt_FromType;
|
1131
1210
|
ndtypes_api[Ndt_FromObject_INDEX] = (void *)Ndt_FromObject;
|
1211
|
+
ndtypes_api[Ndt_FromOffsetsAndDtype_INDEX] = (void *)Ndt_FromOffsetsAndDtype;
|
1132
1212
|
|
1133
1213
|
return PyCapsule_New(ndtypes_api, "ndtypes._ndtypes._API", NULL);
|
1134
1214
|
}
|
@@ -1145,7 +1225,8 @@ ndtype_typedef(PyObject *mod UNUSED, PyObject *args, PyObject *kwds)
|
|
1145
1225
|
NDT_STATIC_CONTEXT(ctx);
|
1146
1226
|
PyObject *name, *type;
|
1147
1227
|
const char *cname, *ctype;
|
1148
|
-
ndt_t *t;
|
1228
|
+
const ndt_t *t;
|
1229
|
+
int ret;
|
1149
1230
|
|
1150
1231
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &name, &type)) {
|
1151
1232
|
return NULL;
|
@@ -1166,7 +1247,9 @@ ndtype_typedef(PyObject *mod UNUSED, PyObject *args, PyObject *kwds)
|
|
1166
1247
|
return seterr(&ctx);
|
1167
1248
|
}
|
1168
1249
|
|
1169
|
-
|
1250
|
+
ret = ndt_typedef(cname, t, NULL, &ctx);
|
1251
|
+
ndt_decref(t);
|
1252
|
+
if (ret < 0) {
|
1170
1253
|
return seterr(&ctx);
|
1171
1254
|
}
|
1172
1255
|
|
@@ -1179,9 +1262,10 @@ ndtype_instantiate(PyObject *mod UNUSED, PyObject *args, PyObject *kwds)
|
|
1179
1262
|
static char *kwlist[] = {"name", "type", NULL};
|
1180
1263
|
NDT_STATIC_CONTEXT(ctx);
|
1181
1264
|
PyObject *name, *type;
|
1265
|
+
PyObject *ret;
|
1266
|
+
const ndt_t *t;
|
1182
1267
|
const char *cname;
|
1183
1268
|
char *cp;
|
1184
|
-
ndt_t *t, *tp;
|
1185
1269
|
|
1186
1270
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, &name, &type)) {
|
1187
1271
|
return NULL;
|
@@ -1202,18 +1286,14 @@ ndtype_instantiate(PyObject *mod UNUSED, PyObject *args, PyObject *kwds)
|
|
1202
1286
|
return seterr(&ctx);
|
1203
1287
|
}
|
1204
1288
|
|
1205
|
-
|
1206
|
-
if (tp == NULL) {
|
1207
|
-
ndt_free(cp);
|
1208
|
-
return seterr(&ctx);
|
1209
|
-
}
|
1210
|
-
|
1211
|
-
t = ndt_nominal(cp, tp, &ctx);
|
1289
|
+
t = ndt_nominal(cp, NDT(type), false, &ctx);
|
1212
1290
|
if (t == NULL) {
|
1213
1291
|
return seterr(&ctx);
|
1214
1292
|
}
|
1215
1293
|
|
1216
|
-
|
1294
|
+
ret = Ndt_FromType(t);
|
1295
|
+
ndt_decref(t);
|
1296
|
+
return ret;
|
1217
1297
|
}
|
1218
1298
|
|
1219
1299
|
static PyMethodDef _ndtypes_methods [] =
|
@@ -1248,6 +1328,11 @@ PyInit__ndtypes(void)
|
|
1248
1328
|
static int initialized = 0;
|
1249
1329
|
|
1250
1330
|
if (!initialized) {
|
1331
|
+
ndt_mallocfunc = PyMem_Malloc;
|
1332
|
+
ndt_reallocfunc = PyMem_Realloc;
|
1333
|
+
ndt_callocfunc = PyMem_Calloc;
|
1334
|
+
ndt_freefunc = PyMem_Free;
|
1335
|
+
|
1251
1336
|
capsule = init_api();
|
1252
1337
|
if (capsule == NULL) {
|
1253
1338
|
return NULL;
|
@@ -1258,25 +1343,21 @@ PyInit__ndtypes(void)
|
|
1258
1343
|
initialized = 1;
|
1259
1344
|
}
|
1260
1345
|
|
1261
|
-
if (PyType_Ready(&ResourceBuffer_Type) < 0) {
|
1262
|
-
goto error;
|
1263
|
-
}
|
1264
|
-
|
1265
1346
|
Ndt_Type.tp_base = &PyBaseObject_Type;
|
1266
1347
|
if (PyType_Ready(&Ndt_Type) < 0) {
|
1267
1348
|
goto error;
|
1268
1349
|
}
|
1269
1350
|
|
1270
|
-
/*
|
1351
|
+
/* _ApplySpec */
|
1271
1352
|
collections = PyImport_ImportModule("collections");
|
1272
1353
|
if (collections == NULL) {
|
1273
1354
|
goto error;
|
1274
1355
|
}
|
1275
1356
|
|
1276
|
-
|
1357
|
+
_ApplySpec = (PyTypeObject *)PyObject_CallMethod(collections,
|
1277
1358
|
"namedtuple", "(ss)", "ApplySpec",
|
1278
|
-
"flags
|
1279
|
-
if (
|
1359
|
+
"flags outer_dims nin nout nargs types");
|
1360
|
+
if (_ApplySpec == NULL) {
|
1280
1361
|
goto error;
|
1281
1362
|
}
|
1282
1363
|
|
@@ -1285,7 +1366,7 @@ PyInit__ndtypes(void)
|
|
1285
1366
|
goto error;
|
1286
1367
|
}
|
1287
1368
|
|
1288
|
-
if (PyDict_SetItemString(
|
1369
|
+
if (PyDict_SetItemString(_ApplySpec->tp_dict, "__module__", obj) < 0) {
|
1289
1370
|
goto error;
|
1290
1371
|
}
|
1291
1372
|
Py_CLEAR(obj);
|
@@ -1306,8 +1387,8 @@ PyInit__ndtypes(void)
|
|
1306
1387
|
goto error;
|
1307
1388
|
}
|
1308
1389
|
|
1309
|
-
Py_INCREF(
|
1310
|
-
if (PyModule_AddObject(m, "
|
1390
|
+
Py_INCREF(_ApplySpec);
|
1391
|
+
if (PyModule_AddObject(m, "_ApplySpec", (PyObject *)_ApplySpec) < 0) {
|
1311
1392
|
goto error;
|
1312
1393
|
}
|
1313
1394
|
|