@@ -87,7 +87,7 @@ def __init__(
87
87
if _no_initial_dtype :
88
88
raise TypeError ("Expected to receive the initial dtype due to the x being a data pointer." )
89
89
90
- _type_char = dtype .typecode
90
+ _type_char = dtype .typecode # type: ignore[assignment] # FIXME
91
91
92
92
else :
93
93
raise TypeError ("Passed object x is an object of unsupported class." )
@@ -138,6 +138,8 @@ def __repr__(self) -> str: # FIXME
138
138
def __len__ (self ) -> int :
139
139
return self .shape [0 ] if self .shape else 0 # type: ignore[return-value]
140
140
141
+ # Arithmetic Operators
142
+
141
143
def __pos__ (self ) -> Array :
142
144
"""
143
145
Return +self
@@ -148,7 +150,7 @@ def __neg__(self) -> Array:
148
150
"""
149
151
Return -self
150
152
"""
151
- return 0 - self
153
+ return 0 - self # type: ignore[no-any-return, operator] # FIXME
152
154
153
155
def __add__ (self , other : int | float | Array , / ) -> Array :
154
156
# TODO discuss either we need to support complex and bool as other input type
@@ -191,10 +193,92 @@ def __pow__(self, other: int | float | bool | complex | Array, /) -> Array:
191
193
"""
192
194
return _process_c_function (self , other , backend .get ().af_pow )
193
195
196
+ # Array Operators
197
+
194
198
def __matmul__ (self , other : Array , / ) -> Array :
195
199
# TODO
196
200
return NotImplemented
197
201
202
+ # Bitwise Operators
203
+
204
+ def __invert__ (self ) -> Array :
205
+ """
206
+ Return ~self.
207
+ """
208
+ out = Array ()
209
+ safe_call (backend .get ().af_bitnot (ctypes .pointer (out .arr ), self .arr ))
210
+ return out
211
+
212
+ def __and__ (self , other : int | bool | Array , / ) -> Array :
213
+ """
214
+ Return self & other.
215
+ """
216
+ return _process_c_function (self , other , backend .get ().af_bitand )
217
+
218
+ def __or__ (self , other : int | bool | Array , / ) -> Array :
219
+ """
220
+ Return self | other.
221
+ """
222
+ return _process_c_function (self , other , backend .get ().af_bitor )
223
+
224
+ def __xor__ (self , other : int | bool | Array , / ) -> Array :
225
+ """
226
+ Return self ^ other.
227
+ """
228
+ return _process_c_function (self , other , backend .get ().af_bitxor )
229
+
230
+ def __lshift__ (self , other : int | Array , / ) -> Array :
231
+ """
232
+ Return self << other.
233
+ """
234
+ return _process_c_function (self , other , backend .get ().af_bitshiftl )
235
+
236
+ def __rshift__ (self , other : int | Array , / ) -> Array :
237
+ """
238
+ Return self >> other.
239
+ """
240
+ return _process_c_function (self , other , backend .get ().af_bitshiftr )
241
+
242
+ # Comparison Operators
243
+
244
+ def __lt__ (self , other : int | float | Array , / ) -> Array :
245
+ """
246
+ Return self < other.
247
+ """
248
+ return _process_c_function (self , other , backend .get ().af_lt )
249
+
250
+ def __le__ (self , other : int | float | Array , / ) -> Array :
251
+ """
252
+ Return self <= other.
253
+ """
254
+ return _process_c_function (self , other , backend .get ().af_le )
255
+
256
+ def __gt__ (self , other : int | float | Array , / ) -> Array :
257
+ """
258
+ Return self > other.
259
+ """
260
+ return _process_c_function (self , other , backend .get ().af_gt )
261
+
262
+ def __ge__ (self , other : int | float | Array , / ) -> Array :
263
+ """
264
+ Return self >= other.
265
+ """
266
+ return _process_c_function (self , other , backend .get ().af_ge )
267
+
268
+ def __eq__ (self , other : int | float | bool | Array , / ) -> Array : # type: ignore[override] # FIXME
269
+ """
270
+ Return self == other.
271
+ """
272
+ return _process_c_function (self , other , backend .get ().af_eq )
273
+
274
+ def __ne__ (self , other : int | float | bool | Array , / ) -> Array : # type: ignore[override] # FIXME
275
+ """
276
+ Return self != other.
277
+ """
278
+ return _process_c_function (self , other , backend .get ().af_neq )
279
+
280
+ # Reflected Arithmetic Operators
281
+
198
282
def __radd__ (self , other : Array , / ) -> Array :
199
283
# TODO discuss either we need to support complex and bool as other input type
200
284
"""
@@ -236,10 +320,125 @@ def __rpow__(self, other: Array, /) -> Array:
236
320
"""
237
321
return _process_c_function (other , self , backend .get ().af_pow )
238
322
323
+ # Reflected Array Operators
324
+
239
325
def __rmatmul__ (self , other : Array , / ) -> Array :
240
326
# TODO
241
327
return NotImplemented
242
328
329
+ # Reflected Bitwise Operators
330
+
331
+ def __rand__ (self , other : Array , / ) -> Array :
332
+ """
333
+ Return other & self.
334
+ """
335
+ return _process_c_function (other , self , backend .get ().af_bitand )
336
+
337
+ def __ror__ (self , other : Array , / ) -> Array :
338
+ """
339
+ Return other & self.
340
+ """
341
+ return _process_c_function (other , self , backend .get ().af_bitor )
342
+
343
+ def __rxor__ (self , other : Array , / ) -> Array :
344
+ """
345
+ Return other ^ self.
346
+ """
347
+ return _process_c_function (other , self , backend .get ().af_bitxor )
348
+
349
+ def __rlshift__ (self , other : Array , / ) -> Array :
350
+ """
351
+ Return other << self.
352
+ """
353
+ return _process_c_function (other , self , backend .get ().af_bitshiftl )
354
+
355
+ def __rrshift__ (self , other : Array , / ) -> Array :
356
+ """
357
+ Return other >> self.
358
+ """
359
+ return _process_c_function (other , self , backend .get ().af_bitshiftr )
360
+
361
+ # In-place Arithmetic Operators
362
+
363
+ def __iadd__ (self , other : int | float | Array , / ) -> Array :
364
+ # TODO discuss either we need to support complex and bool as other input type
365
+ """
366
+ Return self += other.
367
+ """
368
+ return _process_c_function (self , other , backend .get ().af_add )
369
+
370
+ def __isub__ (self , other : int | float | bool | complex | Array , / ) -> Array :
371
+ """
372
+ Return self -= other.
373
+ """
374
+ return _process_c_function (self , other , backend .get ().af_sub )
375
+
376
+ def __imul__ (self , other : int | float | bool | complex | Array , / ) -> Array :
377
+ """
378
+ Return self *= other.
379
+ """
380
+ return _process_c_function (self , other , backend .get ().af_mul )
381
+
382
+ def __itruediv__ (self , other : int | float | bool | complex | Array , / ) -> Array :
383
+ """
384
+ Return self /= other.
385
+ """
386
+ return _process_c_function (self , other , backend .get ().af_div )
387
+
388
+ def __ifloordiv__ (self , other : int | float | bool | complex | Array , / ) -> Array :
389
+ # TODO
390
+ return NotImplemented
391
+
392
+ def __imod__ (self , other : int | float | bool | complex | Array , / ) -> Array :
393
+ """
394
+ Return self %= other.
395
+ """
396
+ return _process_c_function (self , other , backend .get ().af_mod )
397
+
398
+ def __ipow__ (self , other : int | float | bool | complex | Array , / ) -> Array :
399
+ """
400
+ Return self **= other.
401
+ """
402
+ return _process_c_function (self , other , backend .get ().af_pow )
403
+
404
+ # In-place Array Operators
405
+
406
+ def __imatmul__ (self , other : Array , / ) -> Array :
407
+ # TODO
408
+ return NotImplemented
409
+
410
+ # In-place Bitwise Operators
411
+
412
+ def __iand__ (self , other : int | bool | Array , / ) -> Array :
413
+ """
414
+ Return self &= other.
415
+ """
416
+ return _process_c_function (self , other , backend .get ().af_bitand )
417
+
418
+ def __ior__ (self , other : int | bool | Array , / ) -> Array :
419
+ """
420
+ Return self |= other.
421
+ """
422
+ return _process_c_function (self , other , backend .get ().af_bitor )
423
+
424
+ def __ixor__ (self , other : int | bool | Array , / ) -> Array :
425
+ """
426
+ Return self ^= other.
427
+ """
428
+ return _process_c_function (self , other , backend .get ().af_bitxor )
429
+
430
+ def __ilshift__ (self , other : int | Array , / ) -> Array :
431
+ """
432
+ Return self <<= other.
433
+ """
434
+ return _process_c_function (self , other , backend .get ().af_bitshiftl )
435
+
436
+ def __irshift__ (self , other : int | Array , / ) -> Array :
437
+ """
438
+ Return self >>= other.
439
+ """
440
+ return _process_c_function (self , other , backend .get ().af_bitshiftr )
441
+
243
442
def __getitem__ (self , key : int | slice | tuple [int | slice ] | Array , / ) -> Array :
244
443
# TODO: API Specification - key: int | slice | ellipsis | tuple[int | slice] | Array
245
444
# TODO: refactor
@@ -405,6 +604,7 @@ def _constant_array(value: int | float | bool | complex, shape: CShape, dtype: D
405
604
ctypes .pointer (out .arr ), ctypes .c_double (value .real ), ctypes .c_double (value .imag ), 4 ,
406
605
ctypes .pointer (shape .c_array ), dtype .c_api_value ))
407
606
elif dtype == af_int64 :
607
+ # TODO discuss workaround for passing float to ctypes
408
608
safe_call (backend .get ().af_constant_long (
409
609
ctypes .pointer (out .arr ), ctypes .c_longlong (value .real ), 4 , ctypes .pointer (shape .c_array )))
410
610
elif dtype == af_uint64 :
0 commit comments