arithmetic.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. from __future__ import annotations
  2. from typing import Any
  3. import numpy as np
  4. import numpy.typing as npt
  5. import pytest
  6. c16 = np.complex128(1)
  7. f8 = np.float64(1)
  8. i8 = np.int64(1)
  9. u8 = np.uint64(1)
  10. c8 = np.complex64(1)
  11. f4 = np.float32(1)
  12. i4 = np.int32(1)
  13. u4 = np.uint32(1)
  14. dt = np.datetime64(1, "D")
  15. td = np.timedelta64(1, "D")
  16. b_ = np.bool(1)
  17. b = bool(1)
  18. c = complex(1)
  19. f = float(1)
  20. i = int(1)
  21. class Object:
  22. def __array__(self, dtype: np.typing.DTypeLike = None,
  23. copy: bool | None = None) -> np.ndarray[Any, np.dtype[np.object_]]:
  24. ret = np.empty((), dtype=object)
  25. ret[()] = self
  26. return ret
  27. def __sub__(self, value: Any) -> Object:
  28. return self
  29. def __rsub__(self, value: Any) -> Object:
  30. return self
  31. def __floordiv__(self, value: Any) -> Object:
  32. return self
  33. def __rfloordiv__(self, value: Any) -> Object:
  34. return self
  35. def __mul__(self, value: Any) -> Object:
  36. return self
  37. def __rmul__(self, value: Any) -> Object:
  38. return self
  39. def __pow__(self, value: Any) -> Object:
  40. return self
  41. def __rpow__(self, value: Any) -> Object:
  42. return self
  43. AR_b: npt.NDArray[np.bool] = np.array([True])
  44. AR_u: npt.NDArray[np.uint32] = np.array([1], dtype=np.uint32)
  45. AR_i: npt.NDArray[np.int64] = np.array([1])
  46. AR_f: npt.NDArray[np.float64] = np.array([1.0])
  47. AR_c: npt.NDArray[np.complex128] = np.array([1j])
  48. AR_m: npt.NDArray[np.timedelta64] = np.array([np.timedelta64(1, "D")])
  49. AR_M: npt.NDArray[np.datetime64] = np.array([np.datetime64(1, "D")])
  50. AR_O: npt.NDArray[np.object_] = np.array([Object()])
  51. AR_LIKE_b = [True]
  52. AR_LIKE_u = [np.uint32(1)]
  53. AR_LIKE_i = [1]
  54. AR_LIKE_f = [1.0]
  55. AR_LIKE_c = [1j]
  56. AR_LIKE_m = [np.timedelta64(1, "D")]
  57. AR_LIKE_M = [np.datetime64(1, "D")]
  58. AR_LIKE_O = [Object()]
  59. # Array subtractions
  60. AR_b - AR_LIKE_u
  61. AR_b - AR_LIKE_i
  62. AR_b - AR_LIKE_f
  63. AR_b - AR_LIKE_c
  64. AR_b - AR_LIKE_m
  65. AR_b - AR_LIKE_O
  66. AR_LIKE_u - AR_b
  67. AR_LIKE_i - AR_b
  68. AR_LIKE_f - AR_b
  69. AR_LIKE_c - AR_b
  70. AR_LIKE_m - AR_b
  71. AR_LIKE_M - AR_b
  72. AR_LIKE_O - AR_b
  73. AR_u - AR_LIKE_b
  74. AR_u - AR_LIKE_u
  75. AR_u - AR_LIKE_i
  76. AR_u - AR_LIKE_f
  77. AR_u - AR_LIKE_c
  78. AR_u - AR_LIKE_m
  79. AR_u - AR_LIKE_O
  80. AR_LIKE_b - AR_u
  81. AR_LIKE_u - AR_u
  82. AR_LIKE_i - AR_u
  83. AR_LIKE_f - AR_u
  84. AR_LIKE_c - AR_u
  85. AR_LIKE_m - AR_u
  86. AR_LIKE_M - AR_u
  87. AR_LIKE_O - AR_u
  88. AR_i - AR_LIKE_b
  89. AR_i - AR_LIKE_u
  90. AR_i - AR_LIKE_i
  91. AR_i - AR_LIKE_f
  92. AR_i - AR_LIKE_c
  93. AR_i - AR_LIKE_m
  94. AR_i - AR_LIKE_O
  95. AR_LIKE_b - AR_i
  96. AR_LIKE_u - AR_i
  97. AR_LIKE_i - AR_i
  98. AR_LIKE_f - AR_i
  99. AR_LIKE_c - AR_i
  100. AR_LIKE_m - AR_i
  101. AR_LIKE_M - AR_i
  102. AR_LIKE_O - AR_i
  103. AR_f - AR_LIKE_b
  104. AR_f - AR_LIKE_u
  105. AR_f - AR_LIKE_i
  106. AR_f - AR_LIKE_f
  107. AR_f - AR_LIKE_c
  108. AR_f - AR_LIKE_O
  109. AR_LIKE_b - AR_f
  110. AR_LIKE_u - AR_f
  111. AR_LIKE_i - AR_f
  112. AR_LIKE_f - AR_f
  113. AR_LIKE_c - AR_f
  114. AR_LIKE_O - AR_f
  115. AR_c - AR_LIKE_b
  116. AR_c - AR_LIKE_u
  117. AR_c - AR_LIKE_i
  118. AR_c - AR_LIKE_f
  119. AR_c - AR_LIKE_c
  120. AR_c - AR_LIKE_O
  121. AR_LIKE_b - AR_c
  122. AR_LIKE_u - AR_c
  123. AR_LIKE_i - AR_c
  124. AR_LIKE_f - AR_c
  125. AR_LIKE_c - AR_c
  126. AR_LIKE_O - AR_c
  127. AR_m - AR_LIKE_b
  128. AR_m - AR_LIKE_u
  129. AR_m - AR_LIKE_i
  130. AR_m - AR_LIKE_m
  131. AR_LIKE_b - AR_m
  132. AR_LIKE_u - AR_m
  133. AR_LIKE_i - AR_m
  134. AR_LIKE_m - AR_m
  135. AR_LIKE_M - AR_m
  136. AR_M - AR_LIKE_b
  137. AR_M - AR_LIKE_u
  138. AR_M - AR_LIKE_i
  139. AR_M - AR_LIKE_m
  140. AR_M - AR_LIKE_M
  141. AR_LIKE_M - AR_M
  142. AR_O - AR_LIKE_b
  143. AR_O - AR_LIKE_u
  144. AR_O - AR_LIKE_i
  145. AR_O - AR_LIKE_f
  146. AR_O - AR_LIKE_c
  147. AR_O - AR_LIKE_O
  148. AR_LIKE_b - AR_O
  149. AR_LIKE_u - AR_O
  150. AR_LIKE_i - AR_O
  151. AR_LIKE_f - AR_O
  152. AR_LIKE_c - AR_O
  153. AR_LIKE_O - AR_O
  154. AR_u += AR_b
  155. AR_u += AR_u
  156. AR_u += 1 # Allowed during runtime as long as the object is 0D and >=0
  157. # Array floor division
  158. AR_b // AR_LIKE_b
  159. AR_b // AR_LIKE_u
  160. AR_b // AR_LIKE_i
  161. AR_b // AR_LIKE_f
  162. AR_b // AR_LIKE_O
  163. AR_LIKE_b // AR_b
  164. AR_LIKE_u // AR_b
  165. AR_LIKE_i // AR_b
  166. AR_LIKE_f // AR_b
  167. AR_LIKE_O // AR_b
  168. AR_u // AR_LIKE_b
  169. AR_u // AR_LIKE_u
  170. AR_u // AR_LIKE_i
  171. AR_u // AR_LIKE_f
  172. AR_u // AR_LIKE_O
  173. AR_LIKE_b // AR_u
  174. AR_LIKE_u // AR_u
  175. AR_LIKE_i // AR_u
  176. AR_LIKE_f // AR_u
  177. AR_LIKE_m // AR_u
  178. AR_LIKE_O // AR_u
  179. AR_i // AR_LIKE_b
  180. AR_i // AR_LIKE_u
  181. AR_i // AR_LIKE_i
  182. AR_i // AR_LIKE_f
  183. AR_i // AR_LIKE_O
  184. AR_LIKE_b // AR_i
  185. AR_LIKE_u // AR_i
  186. AR_LIKE_i // AR_i
  187. AR_LIKE_f // AR_i
  188. AR_LIKE_m // AR_i
  189. AR_LIKE_O // AR_i
  190. AR_f // AR_LIKE_b
  191. AR_f // AR_LIKE_u
  192. AR_f // AR_LIKE_i
  193. AR_f // AR_LIKE_f
  194. AR_f // AR_LIKE_O
  195. AR_LIKE_b // AR_f
  196. AR_LIKE_u // AR_f
  197. AR_LIKE_i // AR_f
  198. AR_LIKE_f // AR_f
  199. AR_LIKE_m // AR_f
  200. AR_LIKE_O // AR_f
  201. AR_m // AR_LIKE_u
  202. AR_m // AR_LIKE_i
  203. AR_m // AR_LIKE_f
  204. AR_m // AR_LIKE_m
  205. AR_LIKE_m // AR_m
  206. AR_O // AR_LIKE_b
  207. AR_O // AR_LIKE_u
  208. AR_O // AR_LIKE_i
  209. AR_O // AR_LIKE_f
  210. AR_O // AR_LIKE_O
  211. AR_LIKE_b // AR_O
  212. AR_LIKE_u // AR_O
  213. AR_LIKE_i // AR_O
  214. AR_LIKE_f // AR_O
  215. AR_LIKE_O // AR_O
  216. # Inplace multiplication
  217. AR_b *= AR_LIKE_b
  218. AR_u *= AR_LIKE_b
  219. AR_u *= AR_LIKE_u
  220. AR_i *= AR_LIKE_b
  221. AR_i *= AR_LIKE_u
  222. AR_i *= AR_LIKE_i
  223. AR_f *= AR_LIKE_b
  224. AR_f *= AR_LIKE_u
  225. AR_f *= AR_LIKE_i
  226. AR_f *= AR_LIKE_f
  227. AR_c *= AR_LIKE_b
  228. AR_c *= AR_LIKE_u
  229. AR_c *= AR_LIKE_i
  230. AR_c *= AR_LIKE_f
  231. AR_c *= AR_LIKE_c
  232. AR_m *= AR_LIKE_b
  233. AR_m *= AR_LIKE_u
  234. AR_m *= AR_LIKE_i
  235. AR_m *= AR_LIKE_f
  236. AR_O *= AR_LIKE_b
  237. AR_O *= AR_LIKE_u
  238. AR_O *= AR_LIKE_i
  239. AR_O *= AR_LIKE_f
  240. AR_O *= AR_LIKE_c
  241. AR_O *= AR_LIKE_O
  242. # Inplace power
  243. AR_u **= AR_LIKE_b
  244. AR_u **= AR_LIKE_u
  245. AR_i **= AR_LIKE_b
  246. AR_i **= AR_LIKE_u
  247. AR_i **= AR_LIKE_i
  248. AR_f **= AR_LIKE_b
  249. AR_f **= AR_LIKE_u
  250. AR_f **= AR_LIKE_i
  251. AR_f **= AR_LIKE_f
  252. AR_c **= AR_LIKE_b
  253. AR_c **= AR_LIKE_u
  254. AR_c **= AR_LIKE_i
  255. AR_c **= AR_LIKE_f
  256. AR_c **= AR_LIKE_c
  257. AR_O **= AR_LIKE_b
  258. AR_O **= AR_LIKE_u
  259. AR_O **= AR_LIKE_i
  260. AR_O **= AR_LIKE_f
  261. AR_O **= AR_LIKE_c
  262. AR_O **= AR_LIKE_O
  263. # unary ops
  264. -c16
  265. -c8
  266. -f8
  267. -f4
  268. -i8
  269. -i4
  270. with pytest.warns(RuntimeWarning):
  271. -u8
  272. -u4
  273. -td
  274. -AR_f
  275. +c16
  276. +c8
  277. +f8
  278. +f4
  279. +i8
  280. +i4
  281. +u8
  282. +u4
  283. +td
  284. +AR_f
  285. abs(c16)
  286. abs(c8)
  287. abs(f8)
  288. abs(f4)
  289. abs(i8)
  290. abs(i4)
  291. abs(u8)
  292. abs(u4)
  293. abs(td)
  294. abs(b_)
  295. abs(AR_f)
  296. # Time structures
  297. dt + td
  298. dt + i
  299. dt + i4
  300. dt + i8
  301. dt - dt
  302. dt - i
  303. dt - i4
  304. dt - i8
  305. td + td
  306. td + i
  307. td + i4
  308. td + i8
  309. td - td
  310. td - i
  311. td - i4
  312. td - i8
  313. td / f
  314. td / f4
  315. td / f8
  316. td / td
  317. td // td
  318. td % td
  319. # boolean
  320. b_ / b
  321. b_ / b_
  322. b_ / i
  323. b_ / i8
  324. b_ / i4
  325. b_ / u8
  326. b_ / u4
  327. b_ / f
  328. b_ / f8
  329. b_ / f4
  330. b_ / c
  331. b_ / c16
  332. b_ / c8
  333. b / b_
  334. b_ / b_
  335. i / b_
  336. i8 / b_
  337. i4 / b_
  338. u8 / b_
  339. u4 / b_
  340. f / b_
  341. f8 / b_
  342. f4 / b_
  343. c / b_
  344. c16 / b_
  345. c8 / b_
  346. # Complex
  347. c16 + c16
  348. c16 + f8
  349. c16 + i8
  350. c16 + c8
  351. c16 + f4
  352. c16 + i4
  353. c16 + b_
  354. c16 + b
  355. c16 + c
  356. c16 + f
  357. c16 + i
  358. c16 + AR_f
  359. c16 + c16
  360. f8 + c16
  361. i8 + c16
  362. c8 + c16
  363. f4 + c16
  364. i4 + c16
  365. b_ + c16
  366. b + c16
  367. c + c16
  368. f + c16
  369. i + c16
  370. AR_f + c16
  371. c8 + c16
  372. c8 + f8
  373. c8 + i8
  374. c8 + c8
  375. c8 + f4
  376. c8 + i4
  377. c8 + b_
  378. c8 + b
  379. c8 + c
  380. c8 + f
  381. c8 + i
  382. c8 + AR_f
  383. c16 + c8
  384. f8 + c8
  385. i8 + c8
  386. c8 + c8
  387. f4 + c8
  388. i4 + c8
  389. b_ + c8
  390. b + c8
  391. c + c8
  392. f + c8
  393. i + c8
  394. AR_f + c8
  395. # Float
  396. f8 + f8
  397. f8 + i8
  398. f8 + f4
  399. f8 + i4
  400. f8 + b_
  401. f8 + b
  402. f8 + c
  403. f8 + f
  404. f8 + i
  405. f8 + AR_f
  406. f8 + f8
  407. i8 + f8
  408. f4 + f8
  409. i4 + f8
  410. b_ + f8
  411. b + f8
  412. c + f8
  413. f + f8
  414. i + f8
  415. AR_f + f8
  416. f4 + f8
  417. f4 + i8
  418. f4 + f4
  419. f4 + i4
  420. f4 + b_
  421. f4 + b
  422. f4 + c
  423. f4 + f
  424. f4 + i
  425. f4 + AR_f
  426. f8 + f4
  427. i8 + f4
  428. f4 + f4
  429. i4 + f4
  430. b_ + f4
  431. b + f4
  432. c + f4
  433. f + f4
  434. i + f4
  435. AR_f + f4
  436. # Int
  437. i8 + i8
  438. i8 + u8
  439. i8 + i4
  440. i8 + u4
  441. i8 + b_
  442. i8 + b
  443. i8 + c
  444. i8 + f
  445. i8 + i
  446. i8 + AR_f
  447. u8 + u8
  448. u8 + i4
  449. u8 + u4
  450. u8 + b_
  451. u8 + b
  452. u8 + c
  453. u8 + f
  454. u8 + i
  455. u8 + AR_f
  456. i8 + i8
  457. u8 + i8
  458. i4 + i8
  459. u4 + i8
  460. b_ + i8
  461. b + i8
  462. c + i8
  463. f + i8
  464. i + i8
  465. AR_f + i8
  466. u8 + u8
  467. i4 + u8
  468. u4 + u8
  469. b_ + u8
  470. b + u8
  471. c + u8
  472. f + u8
  473. i + u8
  474. AR_f + u8
  475. i4 + i8
  476. i4 + i4
  477. i4 + i
  478. i4 + b_
  479. i4 + b
  480. i4 + AR_f
  481. u4 + i8
  482. u4 + i4
  483. u4 + u8
  484. u4 + u4
  485. u4 + i
  486. u4 + b_
  487. u4 + b
  488. u4 + AR_f
  489. i8 + i4
  490. i4 + i4
  491. i + i4
  492. b_ + i4
  493. b + i4
  494. AR_f + i4
  495. i8 + u4
  496. i4 + u4
  497. u8 + u4
  498. u4 + u4
  499. b_ + u4
  500. b + u4
  501. i + u4
  502. AR_f + u4