arithmetic.py 7.3 KB

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