1
- from typing import Literal as L , TypeAlias , overload , type_check_only
1
+ from typing import Generic , Literal as L , Protocol , TypeAlias , overload , type_check_only
2
+ from typing_extensions import TypeVar , override
2
3
3
4
import numpy as np
5
+ import optype as op
4
6
import optype .numpy as onp
7
+ from scipy ._typing import Falsy , Truthy
5
8
from scipy .sparse import coo_matrix , dok_matrix
6
9
7
10
__all__ = ["cKDTree" ]
8
11
9
12
_Weights : TypeAlias = onp .ToFloatND | tuple [onp .ToFloatND , onp .ToFloatND ]
13
+ _Indices : TypeAlias = onp .Array1D [np .intp ]
14
+ _Float1D : TypeAlias = onp .Array1D [np .float64 ]
15
+ _Float2D : TypeAlias = onp .Array2D [np .float64 ]
16
+
17
+ _NodeT_co = TypeVar ("_NodeT_co" , bound = _KDTreeNode | None , default = _KDTreeNode | None , covariant = True )
18
+ _BoxSizeT_co = TypeVar ("_BoxSizeT_co" , bound = _Float2D | None , default = _Float2D | None , covariant = True )
19
+ _BoxSizeDataT_co = TypeVar ("_BoxSizeDataT_co" , bound = _Float1D | None , default = _Float1D | None , covariant = True )
10
20
11
21
@type_check_only
12
22
class _CythonMixin :
13
23
def __setstate_cython__ (self , pyx_state : object , / ) -> None : ...
14
24
def __reduce_cython__ (self , / ) -> None : ...
15
25
16
- class cKDTreeNode (_CythonMixin ):
17
- @property
18
- def data_points (self , / ) -> onp .ArrayND [np .float64 ]: ...
19
- @property
20
- def indices (self , / ) -> onp .ArrayND [np .intp ]: ...
21
-
22
- # These are read-only attributes in cython, which behave like properties
26
+ # workaround for mypy's lack of cyclical TypeVar support
27
+ @type_check_only
28
+ class _KDTreeNode (Protocol ):
23
29
@property
24
30
def level (self , / ) -> int : ...
25
31
@property
26
32
def split_dim (self , / ) -> int : ...
27
33
@property
34
+ def split (self , / ) -> float : ...
35
+ @property
28
36
def children (self , / ) -> int : ...
29
37
@property
38
+ def data_points (self , / ) -> _Float2D : ...
39
+ @property
40
+ def indices (self , / ) -> _Indices : ...
41
+ @property
30
42
def start_idx (self , / ) -> int : ...
31
43
@property
32
44
def end_idx (self , / ) -> int : ...
33
45
@property
34
- def split (self , / ) -> float : ...
35
- @property
36
- def lesser (self , / ) -> cKDTreeNode | None : ...
46
+ def lesser (self , / ) -> _KDTreeNode | None : ...
37
47
@property
38
- def greater (self , / ) -> cKDTreeNode | None : ...
48
+ def greater (self , / ) -> _KDTreeNode | None : ...
49
+
50
+ ###
39
51
40
- class cKDTree (_CythonMixin ):
52
+ class cKDTreeNode (_CythonMixin , _KDTreeNode , Generic [ _NodeT_co ] ):
41
53
@property
42
- def n (self , / ) -> int : ...
54
+ @override
55
+ def lesser (self , / ) -> _NodeT_co : ...
43
56
@property
44
- def m (self , / ) -> int : ...
57
+ @override
58
+ def greater (self , / ) -> _NodeT_co : ...
59
+
60
+ class cKDTree (_CythonMixin , Generic [_BoxSizeT_co , _BoxSizeDataT_co ]):
61
+ @property
62
+ def data (self , / ) -> _Float2D : ...
45
63
@property
46
64
def leafsize (self , / ) -> int : ...
47
65
@property
48
- def size (self , / ) -> int : ...
66
+ def m (self , / ) -> int : ...
49
67
@property
50
- def tree (self , / ) -> cKDTreeNode : ...
51
-
52
- # These are read-only attributes in cython, which behave like properties
68
+ def n (self , / ) -> int : ...
69
+ @ property
70
+ def maxes ( self , / ) -> _Float1D : ...
53
71
@property
54
- def data (self , / ) -> onp . ArrayND [ np . float64 ] : ...
72
+ def mins (self , / ) -> _Float1D : ...
55
73
@property
56
- def maxes (self , / ) -> onp . ArrayND [ np . float64 ] : ...
74
+ def tree (self , / ) -> cKDTreeNode : ...
57
75
@property
58
- def mins (self , / ) -> onp . ArrayND [ np . float64 ] : ...
76
+ def size (self , / ) -> int : ...
59
77
@property
60
- def indices (self , / ) -> onp . ArrayND [ np . float64 ] : ...
78
+ def indices (self , / ) -> _Indices : ...
61
79
@property
62
- def boxsize (self , / ) -> onp .ArrayND [np .float64 ] | None : ...
80
+ def boxsize (self , / ) -> _BoxSizeT_co : ...
81
+ boxsize_data : _BoxSizeDataT_co
63
82
64
83
#
84
+ @overload
65
85
def __init__ (
66
- self ,
86
+ self : cKDTree [ None , None ] ,
67
87
/ ,
68
- data : onp .ToComplexND ,
69
- leafsize : int = ...,
70
- compact_nodes : bool = ...,
71
- copy_data : bool = ...,
72
- balanced_tree : bool = ...,
73
- boxsize : onp .ToFloat2D | None = ...,
88
+ data : onp .ToFloat2D ,
89
+ leafsize : int = 16 ,
90
+ compact_nodes : bool = True ,
91
+ copy_data : bool = False ,
92
+ balanced_tree : bool = True ,
93
+ boxsize : None = None ,
94
+ ) -> None : ...
95
+ @overload
96
+ def __init__ (
97
+ self : cKDTree [_Float2D , _Float1D ],
98
+ / ,
99
+ data : onp .ToFloat2D ,
100
+ leafsize : int ,
101
+ compact_nodes : bool ,
102
+ copy_data : bool ,
103
+ balanced_tree : bool ,
104
+ boxsize : onp .ToFloat2D ,
105
+ ) -> None : ...
106
+ @overload
107
+ def __init__ (
108
+ self : cKDTree [_Float2D , _Float1D ],
109
+ / ,
110
+ data : onp .ToFloat2D ,
111
+ leafsize : int = 16 ,
112
+ compact_nodes : bool = True ,
113
+ copy_data : bool = False ,
114
+ balanced_tree : bool = True ,
115
+ * ,
116
+ boxsize : onp .ToFloat2D ,
74
117
) -> None : ...
75
118
76
119
#
@@ -79,24 +122,124 @@ class cKDTree(_CythonMixin):
79
122
/ ,
80
123
x : onp .ToFloat1D ,
81
124
k : onp .ToInt | onp .ToInt1D = 1 ,
82
- eps : onp .ToFloat = 0.0 ,
83
- p : onp .ToFloat = 2.0 ,
84
- distance_upper_bound : float = ... , # inf
85
- workers : int | None = None ,
125
+ eps : onp .ToFloat = ... ,
126
+ p : onp .ToFloat = ... ,
127
+ distance_upper_bound : float = float ( "inf" ) , # noqa: PYI011
128
+ workers : int | None = ... ,
86
129
) -> tuple [float , np .intp ] | tuple [onp .ArrayND [np .float64 ], onp .ArrayND [np .intp ]]: ...
87
130
88
131
#
132
+ @overload
133
+ def query_ball_point (
134
+ self ,
135
+ / ,
136
+ x : onp .ToFloatStrict1D ,
137
+ r : onp .ToFloat ,
138
+ p : onp .ToFloat = 2.0 ,
139
+ eps : onp .ToFloat = ...,
140
+ workers : op .CanIndex | None = None ,
141
+ return_sorted : onp .ToBool | None = None ,
142
+ return_length : Falsy = False ,
143
+ ) -> list [int ]: ...
144
+ @overload
145
+ def query_ball_point (
146
+ self ,
147
+ / ,
148
+ x : onp .ToFloatStrict1D ,
149
+ r : onp .ToFloat ,
150
+ p : onp .ToFloat ,
151
+ eps : onp .ToFloat ,
152
+ workers : op .CanIndex | None ,
153
+ return_sorted : onp .ToBool | None ,
154
+ return_length : Truthy ,
155
+ ) -> np .intp : ...
156
+ @overload
157
+ def query_ball_point (
158
+ self ,
159
+ / ,
160
+ x : onp .ToFloatStrict1D ,
161
+ r : onp .ToFloat ,
162
+ p : onp .ToFloat = 2.0 ,
163
+ eps : onp .ToFloat = ...,
164
+ workers : op .CanIndex | None = None ,
165
+ return_sorted : onp .ToBool | None = None ,
166
+ * ,
167
+ return_length : Truthy ,
168
+ ) -> np .intp : ...
169
+ @overload
170
+ def query_ball_point (
171
+ self ,
172
+ / ,
173
+ x : onp .ToFloatND ,
174
+ r : onp .ToFloatND ,
175
+ p : onp .ToFloat = 2.0 ,
176
+ eps : onp .ToFloat = ...,
177
+ workers : op .CanIndex | None = None ,
178
+ return_sorted : onp .ToBool | None = None ,
179
+ return_length : Falsy = False ,
180
+ ) -> onp .ArrayND [np .object_ ]: ...
181
+ @overload
182
+ def query_ball_point (
183
+ self ,
184
+ / ,
185
+ x : onp .ToFloatND ,
186
+ r : onp .ToFloatND ,
187
+ p : onp .ToFloat ,
188
+ eps : onp .ToFloat ,
189
+ workers : op .CanIndex | None ,
190
+ return_sorted : onp .ToBool | None ,
191
+ return_length : Truthy ,
192
+ ) -> onp .ArrayND [np .intp ]: ...
193
+ @overload
194
+ def query_ball_point (
195
+ self ,
196
+ / ,
197
+ x : onp .ToFloatND ,
198
+ r : onp .ToFloatND ,
199
+ p : onp .ToFloat = 2.0 ,
200
+ eps : onp .ToFloat = ...,
201
+ workers : op .CanIndex | None = None ,
202
+ return_sorted : onp .ToBool | None = None ,
203
+ * ,
204
+ return_length : Truthy ,
205
+ ) -> onp .ArrayND [np .intp ]: ...
206
+ @overload
89
207
def query_ball_point (
90
208
self ,
91
209
/ ,
92
210
x : onp .ToFloatND ,
93
211
r : onp .ToFloat | onp .ToFloatND ,
94
212
p : onp .ToFloat = 2.0 ,
95
- eps : onp .ToFloat = 0.0 ,
96
- workers : int | None = None ,
97
- return_sorted : bool | None = None ,
98
- return_length : bool = False ,
213
+ eps : onp .ToFloat = ... ,
214
+ workers : op . CanIndex | None = None ,
215
+ return_sorted : onp . ToBool | None = None ,
216
+ return_length : Falsy = False ,
99
217
) -> list [int ] | onp .ArrayND [np .object_ ]: ...
218
+ @overload
219
+ def query_ball_point (
220
+ self ,
221
+ / ,
222
+ x : onp .ToFloatND ,
223
+ r : onp .ToFloat | onp .ToFloatND ,
224
+ p : onp .ToFloat ,
225
+ eps : onp .ToFloat ,
226
+ workers : op .CanIndex | None ,
227
+ return_sorted : onp .ToBool | None ,
228
+ return_length : Truthy ,
229
+ ) -> np .intp | onp .ArrayND [np .intp ]: ...
230
+ @overload
231
+ def query_ball_point (
232
+ self ,
233
+ / ,
234
+ x : onp .ToFloatND ,
235
+ r : onp .ToFloat | onp .ToFloatND ,
236
+ p : onp .ToFloat = 2.0 ,
237
+ eps : onp .ToFloat = ...,
238
+ workers : op .CanIndex | None = None ,
239
+ return_sorted : onp .ToBool | None = None ,
240
+ * ,
241
+ return_length : Truthy ,
242
+ ) -> np .intp | onp .ArrayND [np .intp ]: ...
100
243
101
244
#
102
245
def query_ball_tree (
@@ -105,7 +248,7 @@ class cKDTree(_CythonMixin):
105
248
other : cKDTree ,
106
249
r : onp .ToFloat ,
107
250
p : onp .ToFloat = 2.0 ,
108
- eps : onp .ToFloat = 0.0 ,
251
+ eps : onp .ToFloat = ..., # defaults to ` 0.0`, but is overridden in `KDTree` with `0` as default
109
252
) -> list [list [int ]]: ...
110
253
111
254
#
@@ -144,7 +287,7 @@ class cKDTree(_CythonMixin):
144
287
self ,
145
288
/ ,
146
289
other : cKDTree ,
147
- r : onp .ToScalar ,
290
+ r : onp .ToFloat ,
148
291
p : onp .ToFloat = 2.0 ,
149
292
weights : tuple [None , None ] | None = None ,
150
293
cumulative : bool = True ,
@@ -154,7 +297,7 @@ class cKDTree(_CythonMixin):
154
297
self ,
155
298
/ ,
156
299
other : cKDTree ,
157
- r : onp .ToScalar ,
300
+ r : onp .ToFloat ,
158
301
p : onp .ToFloat ,
159
302
weights : _Weights ,
160
303
cumulative : bool = True ,
@@ -164,7 +307,7 @@ class cKDTree(_CythonMixin):
164
307
self ,
165
308
/ ,
166
309
other : cKDTree ,
167
- r : onp .ToScalar ,
310
+ r : onp .ToFloat ,
168
311
p : onp .ToFloat = 2.0 ,
169
312
* ,
170
313
weights : _Weights ,
@@ -175,32 +318,32 @@ class cKDTree(_CythonMixin):
175
318
self ,
176
319
/ ,
177
320
other : cKDTree ,
178
- r : onp .ToFloat | onp .ToFloatND ,
321
+ r : onp .ToFloat | onp .ToFloat1D ,
179
322
p : onp .ToFloat = 2.0 ,
180
323
weights : tuple [None , None ] | None = ...,
181
324
cumulative : bool = True ,
182
- ) -> np .float64 | np . intp | onp .ArrayND [np .intp ]: ...
325
+ ) -> np .intp | onp .Array1D [np .intp ]: ...
183
326
@overload
184
327
def count_neighbors (
185
328
self ,
186
329
/ ,
187
330
other : cKDTree ,
188
- r : onp .ToFloat | onp .ToFloatND ,
331
+ r : onp .ToFloat | onp .ToFloat1D ,
189
332
p : onp .ToFloat ,
190
333
weights : _Weights ,
191
334
cumulative : bool = True ,
192
- ) -> np .float64 | np . intp | onp .ArrayND [np .float64 ]: ...
335
+ ) -> np .float64 | onp .Array1D [np .float64 ]: ...
193
336
@overload
194
337
def count_neighbors (
195
338
self ,
196
339
/ ,
197
340
other : cKDTree ,
198
- r : onp .ToFloat | onp .ToFloatND ,
341
+ r : onp .ToFloat | onp .ToFloat1D ,
199
342
p : onp .ToFloat = 2.0 ,
200
343
* ,
201
344
weights : _Weights ,
202
345
cumulative : bool = True ,
203
- ) -> np .float64 | np . intp | onp .ArrayND [np .float64 ]: ...
346
+ ) -> np .float64 | onp .Array1D [np .float64 ]: ...
204
347
205
348
#
206
349
@overload
@@ -211,7 +354,7 @@ class cKDTree(_CythonMixin):
211
354
max_distance : onp .ToFloat ,
212
355
p : onp .ToFloat = 2.0 ,
213
356
output_type : L ["dok_matrix" ] = ...,
214
- ) -> dok_matrix : ...
357
+ ) -> dok_matrix [ np . float64 ] : ...
215
358
@overload
216
359
def sparse_distance_matrix (
217
360
self ,
@@ -221,7 +364,7 @@ class cKDTree(_CythonMixin):
221
364
p : onp .ToFloat = 2.0 ,
222
365
* ,
223
366
output_type : L ["coo_matrix" ],
224
- ) -> coo_matrix : ...
367
+ ) -> coo_matrix [ np . float64 ] : ...
225
368
@overload
226
369
def sparse_distance_matrix (
227
370
self ,
0 commit comments