ndtypes 0.2.0dev4

Sign up to get free protection for your applications and to get access to all the features.
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,166 @@
1
+ .. meta::
2
+ :robots: index,follow
3
+ :description: libndtypes documentation
4
+
5
+ .. sectionauthor:: Stefan Krah <skrah at bytereef.org>
6
+
7
+
8
+ Utilities
9
+ =========
10
+
11
+ This section contains utility functions that are meant to be used by other
12
+ applications. Some of these functions are not yet in the stable API and
13
+ are subject to change.
14
+
15
+
16
+ Stable API
17
+ ----------
18
+
19
+ .. topic:: ndt_strdup
20
+
21
+ .. code-block:: c
22
+
23
+ char *ndt_strdup(const char *s, ndt_context_t *ctx);
24
+
25
+ Same as :func:`strdup`, but uses libndtypes's custom allocators. On failure,
26
+ set an error in the context and return :c:macro:`NULL`. The result must be
27
+ deallocated using :func:`ndt_free`.
28
+
29
+
30
+ .. topic:: ndt_asprintf
31
+
32
+ .. code-block:: c
33
+
34
+ char *ndt_asprintf(ndt_context_t *ctx, const char *fmt, ...);
35
+
36
+ Print to a string allocated by libndtypes's custom allocators. On failure,
37
+ set an error in the context and return :c:macro:`NULL`. The result must be
38
+ deallocated using :func:`ndt_free`.
39
+
40
+
41
+ .. topic:: ndt_strtobool
42
+
43
+ .. code-block:: c
44
+
45
+ bool ndt_strtobool(const char *v, ndt_context_t *ctx);
46
+
47
+ Convert string *v* to a bool. *v* must be "true" or "false". Return *0*
48
+ and set :c:macro:`NDT_InvalidArgumentError` if the conversion fails.
49
+
50
+
51
+ .. topic:: ndt_strtochar
52
+
53
+ .. code-block:: c
54
+
55
+ char ndt_strtochar(const char *v, ndt_context_t *ctx);
56
+
57
+ Convert string *v* to a char. *v* must have length *1*. Return *0* and
58
+ set :c:macro:`NDT_InvalidArgumentError` if the conversion fails.
59
+
60
+
61
+
62
+ .. topic:: ndt_strtol
63
+
64
+ .. code-block:: c
65
+
66
+ char ndt_strtol(const char *v, ndt_context_t *ctx);
67
+
68
+ Convert string *v* to a long. In case of an error, use the return value
69
+ from :func:`strtol`.
70
+
71
+ If *v* is not an integer, set :c:macro:`NDT_InvalidArgumentError`.
72
+
73
+ If *v* is out of range, set :c:macro:`NDT_ValueError`.
74
+
75
+
76
+ .. code-block:: c
77
+
78
+ long long ndt_strtoll(const char *v, long long min, long long max, ndt_context_t *ctx);
79
+
80
+ Convert string *v* to a long long.
81
+
82
+ If *v* is not an integer, set :c:macro:`NDT_InvalidArgumentError`.
83
+
84
+ If *v* is not in the range [*min*, *max*] , set :c:macro:`NDT_ValueError`.
85
+
86
+
87
+
88
+ .. code-block:: c
89
+
90
+ unsigned long long ndt_strtoll(const char *v, long long min, long long max, ndt_context_t *ctx);
91
+
92
+ Convert string *v* to an unsigned long long.
93
+
94
+ If *v* is not an integer, set :c:macro:`NDT_InvalidArgumentError`.
95
+
96
+ If *v* is not in the range [*min*, *max*] , set :c:macro:`NDT_ValueError`.
97
+
98
+
99
+ .. code-block:: c
100
+
101
+ float ndt_strtof(const char *v, ndt_context_t *ctx);
102
+
103
+ Convert string *v* to a float.
104
+
105
+ If *v* is not an integer, set :c:macro:`NDT_InvalidArgumentError`.
106
+
107
+ If *v* is out of range, set :c:macro:`NDT_ValueError`.
108
+
109
+
110
+ .. code-block:: c
111
+
112
+ double ndt_strtod(const char *v, ndt_context_t *ctx);
113
+
114
+ Convert string *v* to a double.
115
+
116
+ If *v* is not an integer, set :c:macro:`NDT_InvalidArgumentError`.
117
+
118
+
119
+ If *v* is out of range, set :c:macro:`NDT_ValueError`.
120
+
121
+
122
+ Unstable API
123
+ ------------
124
+
125
+ .. topic:: ndt_dtype
126
+
127
+ .. code-block:: c
128
+
129
+ const ndt_t *ndt_dtype(const ndt_t *t);
130
+
131
+ Return the dtype (element type) of an array. If the argument is not an array,
132
+ return *t* itself. The function cannot fail.
133
+
134
+
135
+ .. topic:: ndt_dims_dtype
136
+
137
+ .. code-block:: c
138
+
139
+ int ndt_dims_dtype(const ndt_t *dims[NDT_MAX_DIM], const ndt_t **dtype, const ndt_t *t);
140
+
141
+ Extract constant pointers to the dimensions and the dtype of an array and return
142
+ the number of dimensions. The function cannot fail.
143
+
144
+
145
+ .. topic:: ndt_as_ndarray
146
+
147
+ .. code-block:: c
148
+
149
+ int ndt_as_ndarray(ndt_ndarray_t *a, const ndt_t *t, ndt_context_t *ctx);
150
+
151
+ Convert *t* to its ndarray representation *a*. On success, return 0.
152
+ If *t* is abstract or not representable as an ndarray, set an error in
153
+ the context and return -1.
154
+
155
+
156
+ .. topic:: ndt_hash
157
+
158
+ .. code-block:: c
159
+
160
+ ndt_ssize_t ndt_hash(ndt_t *t, ndt_context_t *ctx);
161
+
162
+ Hash a type. This is currently implemented by converting the type to its
163
+ string representation and hashing the string.
164
+
165
+
166
+
@@ -0,0 +1,27 @@
1
+ .. meta::
2
+ :robots: index,follow
3
+ :description: ndtypes
4
+ :keywords: ndtypes, buffer protocol
5
+
6
+ .. sectionauthor:: Stefan Krah <skrah at bytereef.org>
7
+
8
+
9
+ Buffer protocol
10
+ ===============
11
+
12
+ ndtypes supports conversion from PEP-3118 format strings to datashape:
13
+
14
+ .. doctest::
15
+
16
+ >>> from ndtypes import ndt
17
+ >>> ndt.from_format("T{<b:a:Q:b:}")
18
+ ndt("{a : <int8, b : uint64}")
19
+
20
+
21
+ Note that there are a couple of open issues around the buffer protocol,
22
+ e.g. https://bugs.python.org/issue26746 .
23
+
24
+
25
+
26
+
27
+
@@ -0,0 +1,21 @@
1
+ .. meta::
2
+ :robots: index, follow
3
+ :description: ndtypes documentation
4
+ :keywords: Python, array computing
5
+
6
+ .. sectionauthor:: Stefan Krah <skrah at bytereef.org>
7
+
8
+
9
+ ndtypes
10
+ -------
11
+
12
+ ndtypes is a Python module based on libndtypes.
13
+
14
+
15
+
16
+ .. toctree::
17
+
18
+ quickstart.rst
19
+ types.rst
20
+ pattern-matching.rst
21
+ buffer-protocol.rst
@@ -0,0 +1,330 @@
1
+ .. meta::
2
+ :robots: index,follow
3
+ :description: ndtypes pattern matching
4
+ :keywords: ndtypes, pattern matching
5
+
6
+ .. sectionauthor:: Stefan Krah <skrah at bytereef.org>
7
+
8
+
9
+
10
+ ################
11
+ Pattern matching
12
+ ################
13
+
14
+ The libndtypes implementation of datashape is dynamically typed with strict type
15
+ checking. Static type checking of datashape would be far more complex, since
16
+ datashape allows dependent types [#f1]_, i.e. types depending on values.
17
+
18
+ Dynamic pattern matching is used for checking function arguments, return
19
+ values, broadcasting and general array functions.
20
+
21
+ Again, we will be using the :py:mod:`ndtypes` module included in
22
+ `ndtypes <https://github.com/plures/ndtypes>`_ to demonstrate
23
+ datashape pattern matching. The rest of this document assumes that the
24
+ :py:mod:`ndtypes` module has been imported:
25
+
26
+ .. testcode::
27
+
28
+ from ndtypes import ndt
29
+
30
+
31
+ *************
32
+ General notes
33
+ *************
34
+
35
+ :py:class:`ndt` instances have a :py:meth:`match` method for determining
36
+ whether the argument type is compatible with the instance type. The match
37
+ succeeds if and only if the set of types described by the right hand side
38
+ is a subset of the set of types described by the left hand side.
39
+
40
+
41
+ Simple example
42
+ --------------
43
+
44
+ .. doctest::
45
+
46
+ >>> p = ndt("Any")
47
+ >>> c = ndt("int32")
48
+ >>> p.match(c)
49
+ True
50
+
51
+
52
+ Non-commutativity
53
+ -----------------
54
+
55
+ From the above definition it follows that pattern matching is not commutative:
56
+
57
+ .. doctest::
58
+
59
+ >>> p = ndt("int32")
60
+ >>> c = ndt("Any")
61
+ >>> p.match(c)
62
+ False
63
+
64
+
65
+ Concrete matching
66
+ -----------------
67
+
68
+ Much like members of the alphabet in regular expressions, concrete types
69
+ match themselves:
70
+
71
+ .. doctest::
72
+
73
+ >>> p = ndt("int32")
74
+ >>> c = ndt("int32")
75
+ >>> p.match(c)
76
+ True
77
+
78
+ >>> p = ndt("10 * float64")
79
+ >>> c = ndt("10 * float32")
80
+ >>> p.match(c)
81
+ False
82
+
83
+
84
+ .. _type-kinds-matching:
85
+
86
+ **********
87
+ Type kinds
88
+ **********
89
+
90
+ :ref:`Type kinds <type-kinds>` are named subsets of :ref:`types <types>`.
91
+
92
+ Unlike :ref:`dtype variables <dtype-vars-matching>`, matching type kinds
93
+ does not require that a well defined substitution exists. Two instances
94
+ of a type kind can match different types:
95
+
96
+ .. doctest::
97
+
98
+ >>> p = ndt("(Any, Any)")
99
+ >>> c = ndt("(float64, int32)")
100
+ >>> p.match(c)
101
+ True
102
+
103
+
104
+ Any
105
+ ---
106
+
107
+ The *Any* type kind is the most general and describes the set of all
108
+ :ref:`types <types>`.
109
+
110
+ Here's how to match a dtype against the set of all types:
111
+
112
+ .. doctest::
113
+
114
+ >>> p = ndt("Any")
115
+ >>> c = ndt("int32")
116
+ >>> p.match(c)
117
+ True
118
+
119
+
120
+ This matches an array type against the set of all types:
121
+
122
+ .. doctest::
123
+
124
+ >>> p = ndt("Any")
125
+ >>> c = ndt("10 * 5 * { v: float64, t: float64 }")
126
+ >>> p.match(c)
127
+ True
128
+
129
+
130
+ Scalar
131
+ ------
132
+
133
+ The *Scalar* type kind stands for the set of all :ref:`scalars <scalars>`.
134
+
135
+ :c:type:`int32` is a member of the set of all scalars:
136
+
137
+ .. doctest::
138
+
139
+ >>> p = ndt("Scalar")
140
+ >>> c = ndt("int32")
141
+ >>> p.match(c)
142
+ True
143
+
144
+
145
+ Unlike with type variables, different types match a type kind:
146
+
147
+ .. doctest::
148
+
149
+ >>> p = ndt("(Scalar, Scalar)")
150
+ >>> c = ndt("(uint8, float64)")
151
+ >>> p.match(c)
152
+ True
153
+
154
+
155
+ FixedString
156
+ -----------
157
+
158
+ The set of all :ref:`fixed string <fixed-string>` types.
159
+
160
+ .. doctest::
161
+
162
+ >>> p = ndt("FixedString")
163
+ >>> c = ndt("fixed_string(100)")
164
+ >>> p.match(c)
165
+ True
166
+
167
+ >>> p = ndt("FixedString")
168
+ >>> c = ndt("fixed_string(100, 'utf16')")
169
+ >>> p.match(c)
170
+ True
171
+
172
+ >>> p = ndt("FixedString")
173
+ >>> c = ndt("string")
174
+ >>> p.match(c)
175
+ False
176
+
177
+
178
+ FixedBytes
179
+ ----------
180
+
181
+ The set of all :ref:`fixed bytes <fixed-bytes>` types.
182
+
183
+ .. doctest::
184
+
185
+ >>> p = ndt("FixedBytes")
186
+ >>> c = ndt("fixed_bytes(size=100)")
187
+ >>> p.match(c)
188
+ True
189
+
190
+ >>> p = ndt("FixedBytes")
191
+ >>> c = ndt("fixed_bytes(size=100, align=2)")
192
+ >>> p.match(c)
193
+ True
194
+
195
+ >>> p = ndt("FixedBytes")
196
+ >>> c = ndt("bytes(align=2)")
197
+ >>> p.match(c)
198
+ False
199
+
200
+
201
+ ***************
202
+ Dimension kinds
203
+ ***************
204
+
205
+ :ref:`Dimension kinds <arrays>` stand for the set of all instances of
206
+ the respective kind.
207
+
208
+ Fixed
209
+ -----
210
+
211
+ The set of all instances of the :ref:`fixed dimension <arrays>` kind.
212
+
213
+ .. doctest::
214
+
215
+ >>> p = ndt("Fixed * 20 * bool")
216
+ >>> c = ndt("10 * 20 * bool")
217
+ >>> p.match(c)
218
+ True
219
+
220
+ >>> p = ndt("Fixed * Fixed * bool")
221
+ >>> c = ndt("var * var * bool")
222
+ >>> p.match(c)
223
+ False
224
+
225
+
226
+ .. _dtype-vars-matching:
227
+
228
+ ***************
229
+ Dtype variables
230
+ ***************
231
+
232
+ :ref:`dtype variables <dtype-variables>` are placeholders for dtypes. It is important
233
+ to note that they are *not* general type variables. For example, they do not match
234
+ :ref:`array types <arrays>`, a concept which is used in general array functions [#f2]_,
235
+ whose base cases may operate on a dtype.
236
+
237
+
238
+ This matches a record against a single :ref:`dtype <dtypes>` variable:
239
+
240
+ .. doctest::
241
+
242
+ >>> p = ndt("T")
243
+ >>> c = ndt("{v: float64, t: float64}")
244
+ >>> p.match(c)
245
+ True
246
+
247
+
248
+ Match against several dtype variables in a tuple type:
249
+
250
+ .. doctest::
251
+
252
+ >>> p = ndt("T")
253
+ >>> c = ndt("(int32, int32, bool)")
254
+ >>> p.match(c)
255
+ True
256
+
257
+ >>> p = ndt("(T, T, S)")
258
+ >>> c = ndt("(int32, int64, bool)")
259
+ >>> p.match(c)
260
+ False
261
+
262
+
263
+ .. _symbolic-dim-matching:
264
+
265
+ *******************
266
+ Symbolic dimensions
267
+ *******************
268
+
269
+ Recall that :ref:`array <arrays>` types include the dimension kind, which
270
+ can be symbolic.
271
+
272
+
273
+ Simple symbolic match
274
+ ---------------------
275
+
276
+ This matches a concrete fixed size array against the set of all one-dimensional
277
+ fixed size arrays:
278
+
279
+ .. doctest::
280
+
281
+ >>> p = ndt("N * float64")
282
+ >>> c = ndt("100 * float64")
283
+ >>> p.match(c)
284
+ True
285
+
286
+
287
+ Symbolic+Dtypevar
288
+ -----------------
289
+
290
+ Symbolic dimensions can be used in conjunction with dtype variables:
291
+
292
+ .. doctest::
293
+
294
+ >>> p = ndt("N * T")
295
+ >>> c = ndt("10 * float32")
296
+ >>> p.match(c)
297
+ True
298
+
299
+
300
+ Ellipsis match
301
+ --------------
302
+
303
+ Finally, all dimension kinds (including multiple dimensions) match against
304
+ ellipsis dimensions (named or unnamed):
305
+
306
+ .. doctest::
307
+
308
+ >>> p = ndt("... * float64")
309
+ >>> c = ndt("10 * 2 * float64")
310
+ >>> p.match(c)
311
+ True
312
+
313
+ >>> p = ndt("Dim... * float64")
314
+ >>> c = ndt("10 * 20 * float64")
315
+ >>> p.match(c)
316
+ True
317
+
318
+
319
+ This is used in broadcasting [#f2]_.
320
+
321
+
322
+
323
+ |
324
+ |
325
+
326
+ .. [#f1] An argument is often made that the term *dependent types* should
327
+ be reserved for static type systems. We use it here while explicitly
328
+ acknowledging that the datashape implementation is dynamically typed.
329
+
330
+ .. [#f2] Additional section needed.