numpy 2.4.1__pp311-pypy311_pp73-macosx_14_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1039) hide show
  1. numpy/__config__.py +170 -0
  2. numpy/__config__.pyi +108 -0
  3. numpy/__init__.cython-30.pxd +1242 -0
  4. numpy/__init__.pxd +1155 -0
  5. numpy/__init__.py +942 -0
  6. numpy/__init__.pyi +6202 -0
  7. numpy/_array_api_info.py +346 -0
  8. numpy/_array_api_info.pyi +206 -0
  9. numpy/_configtool.py +39 -0
  10. numpy/_configtool.pyi +1 -0
  11. numpy/_core/__init__.py +201 -0
  12. numpy/_core/__init__.pyi +666 -0
  13. numpy/_core/_add_newdocs.py +7151 -0
  14. numpy/_core/_add_newdocs.pyi +2 -0
  15. numpy/_core/_add_newdocs_scalars.py +381 -0
  16. numpy/_core/_add_newdocs_scalars.pyi +16 -0
  17. numpy/_core/_asarray.py +130 -0
  18. numpy/_core/_asarray.pyi +43 -0
  19. numpy/_core/_dtype.py +366 -0
  20. numpy/_core/_dtype.pyi +56 -0
  21. numpy/_core/_dtype_ctypes.py +120 -0
  22. numpy/_core/_dtype_ctypes.pyi +83 -0
  23. numpy/_core/_exceptions.py +162 -0
  24. numpy/_core/_exceptions.pyi +54 -0
  25. numpy/_core/_internal.py +968 -0
  26. numpy/_core/_internal.pyi +61 -0
  27. numpy/_core/_methods.py +252 -0
  28. numpy/_core/_methods.pyi +22 -0
  29. numpy/_core/_multiarray_tests.pypy311-pp73-darwin.so +0 -0
  30. numpy/_core/_multiarray_umath.pypy311-pp73-darwin.so +0 -0
  31. numpy/_core/_operand_flag_tests.pypy311-pp73-darwin.so +0 -0
  32. numpy/_core/_rational_tests.pypy311-pp73-darwin.so +0 -0
  33. numpy/_core/_simd.pyi +35 -0
  34. numpy/_core/_simd.pypy311-pp73-darwin.so +0 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.pypy311-pp73-darwin.so +0 -0
  38. numpy/_core/_type_aliases.py +131 -0
  39. numpy/_core/_type_aliases.pyi +86 -0
  40. numpy/_core/_ufunc_config.py +515 -0
  41. numpy/_core/_ufunc_config.pyi +69 -0
  42. numpy/_core/_umath_tests.pyi +47 -0
  43. numpy/_core/_umath_tests.pypy311-pp73-darwin.so +0 -0
  44. numpy/_core/arrayprint.py +1779 -0
  45. numpy/_core/arrayprint.pyi +158 -0
  46. numpy/_core/cversions.py +13 -0
  47. numpy/_core/defchararray.py +1414 -0
  48. numpy/_core/defchararray.pyi +1150 -0
  49. numpy/_core/einsumfunc.py +1650 -0
  50. numpy/_core/einsumfunc.pyi +184 -0
  51. numpy/_core/fromnumeric.py +4233 -0
  52. numpy/_core/fromnumeric.pyi +1735 -0
  53. numpy/_core/function_base.py +547 -0
  54. numpy/_core/function_base.pyi +276 -0
  55. numpy/_core/getlimits.py +462 -0
  56. numpy/_core/getlimits.pyi +124 -0
  57. numpy/_core/include/numpy/__multiarray_api.c +376 -0
  58. numpy/_core/include/numpy/__multiarray_api.h +1628 -0
  59. numpy/_core/include/numpy/__ufunc_api.c +55 -0
  60. numpy/_core/include/numpy/__ufunc_api.h +349 -0
  61. numpy/_core/include/numpy/_neighborhood_iterator_imp.h +90 -0
  62. numpy/_core/include/numpy/_numpyconfig.h +33 -0
  63. numpy/_core/include/numpy/_public_dtype_api_table.h +86 -0
  64. numpy/_core/include/numpy/arrayobject.h +7 -0
  65. numpy/_core/include/numpy/arrayscalars.h +198 -0
  66. numpy/_core/include/numpy/dtype_api.h +547 -0
  67. numpy/_core/include/numpy/halffloat.h +70 -0
  68. numpy/_core/include/numpy/ndarrayobject.h +304 -0
  69. numpy/_core/include/numpy/ndarraytypes.h +1982 -0
  70. numpy/_core/include/numpy/npy_2_compat.h +249 -0
  71. numpy/_core/include/numpy/npy_2_complexcompat.h +28 -0
  72. numpy/_core/include/numpy/npy_3kcompat.h +374 -0
  73. numpy/_core/include/numpy/npy_common.h +989 -0
  74. numpy/_core/include/numpy/npy_cpu.h +126 -0
  75. numpy/_core/include/numpy/npy_endian.h +79 -0
  76. numpy/_core/include/numpy/npy_math.h +602 -0
  77. numpy/_core/include/numpy/npy_no_deprecated_api.h +20 -0
  78. numpy/_core/include/numpy/npy_os.h +42 -0
  79. numpy/_core/include/numpy/numpyconfig.h +185 -0
  80. numpy/_core/include/numpy/random/LICENSE.txt +21 -0
  81. numpy/_core/include/numpy/random/bitgen.h +20 -0
  82. numpy/_core/include/numpy/random/distributions.h +209 -0
  83. numpy/_core/include/numpy/random/libdivide.h +2079 -0
  84. numpy/_core/include/numpy/ufuncobject.h +343 -0
  85. numpy/_core/include/numpy/utils.h +37 -0
  86. numpy/_core/lib/libnpymath.a +0 -0
  87. numpy/_core/lib/npy-pkg-config/mlib.ini +12 -0
  88. numpy/_core/lib/npy-pkg-config/npymath.ini +20 -0
  89. numpy/_core/lib/pkgconfig/numpy.pc +7 -0
  90. numpy/_core/memmap.py +363 -0
  91. numpy/_core/memmap.pyi +3 -0
  92. numpy/_core/multiarray.py +1740 -0
  93. numpy/_core/multiarray.pyi +1316 -0
  94. numpy/_core/numeric.py +2758 -0
  95. numpy/_core/numeric.pyi +1276 -0
  96. numpy/_core/numerictypes.py +633 -0
  97. numpy/_core/numerictypes.pyi +196 -0
  98. numpy/_core/overrides.py +188 -0
  99. numpy/_core/overrides.pyi +47 -0
  100. numpy/_core/printoptions.py +32 -0
  101. numpy/_core/printoptions.pyi +28 -0
  102. numpy/_core/records.py +1088 -0
  103. numpy/_core/records.pyi +340 -0
  104. numpy/_core/shape_base.py +996 -0
  105. numpy/_core/shape_base.pyi +182 -0
  106. numpy/_core/strings.py +1813 -0
  107. numpy/_core/strings.pyi +536 -0
  108. numpy/_core/tests/_locales.py +72 -0
  109. numpy/_core/tests/_natype.py +144 -0
  110. numpy/_core/tests/data/astype_copy.pkl +0 -0
  111. numpy/_core/tests/data/generate_umath_validation_data.cpp +170 -0
  112. numpy/_core/tests/data/recarray_from_file.fits +0 -0
  113. numpy/_core/tests/data/umath-validation-set-README.txt +15 -0
  114. numpy/_core/tests/data/umath-validation-set-arccos.csv +1429 -0
  115. numpy/_core/tests/data/umath-validation-set-arccosh.csv +1429 -0
  116. numpy/_core/tests/data/umath-validation-set-arcsin.csv +1429 -0
  117. numpy/_core/tests/data/umath-validation-set-arcsinh.csv +1429 -0
  118. numpy/_core/tests/data/umath-validation-set-arctan.csv +1429 -0
  119. numpy/_core/tests/data/umath-validation-set-arctanh.csv +1429 -0
  120. numpy/_core/tests/data/umath-validation-set-cbrt.csv +1429 -0
  121. numpy/_core/tests/data/umath-validation-set-cos.csv +1375 -0
  122. numpy/_core/tests/data/umath-validation-set-cosh.csv +1429 -0
  123. numpy/_core/tests/data/umath-validation-set-exp.csv +412 -0
  124. numpy/_core/tests/data/umath-validation-set-exp2.csv +1429 -0
  125. numpy/_core/tests/data/umath-validation-set-expm1.csv +1429 -0
  126. numpy/_core/tests/data/umath-validation-set-log.csv +271 -0
  127. numpy/_core/tests/data/umath-validation-set-log10.csv +1629 -0
  128. numpy/_core/tests/data/umath-validation-set-log1p.csv +1429 -0
  129. numpy/_core/tests/data/umath-validation-set-log2.csv +1629 -0
  130. numpy/_core/tests/data/umath-validation-set-sin.csv +1370 -0
  131. numpy/_core/tests/data/umath-validation-set-sinh.csv +1429 -0
  132. numpy/_core/tests/data/umath-validation-set-tan.csv +1429 -0
  133. numpy/_core/tests/data/umath-validation-set-tanh.csv +1429 -0
  134. numpy/_core/tests/examples/cython/checks.pyx +373 -0
  135. numpy/_core/tests/examples/cython/meson.build +43 -0
  136. numpy/_core/tests/examples/cython/setup.py +39 -0
  137. numpy/_core/tests/examples/limited_api/limited_api1.c +17 -0
  138. numpy/_core/tests/examples/limited_api/limited_api2.pyx +11 -0
  139. numpy/_core/tests/examples/limited_api/limited_api_latest.c +19 -0
  140. numpy/_core/tests/examples/limited_api/meson.build +59 -0
  141. numpy/_core/tests/examples/limited_api/setup.py +24 -0
  142. numpy/_core/tests/test__exceptions.py +90 -0
  143. numpy/_core/tests/test_abc.py +54 -0
  144. numpy/_core/tests/test_api.py +655 -0
  145. numpy/_core/tests/test_argparse.py +90 -0
  146. numpy/_core/tests/test_array_api_info.py +113 -0
  147. numpy/_core/tests/test_array_coercion.py +928 -0
  148. numpy/_core/tests/test_array_interface.py +222 -0
  149. numpy/_core/tests/test_arraymethod.py +84 -0
  150. numpy/_core/tests/test_arrayobject.py +75 -0
  151. numpy/_core/tests/test_arrayprint.py +1324 -0
  152. numpy/_core/tests/test_casting_floatingpoint_errors.py +154 -0
  153. numpy/_core/tests/test_casting_unittests.py +955 -0
  154. numpy/_core/tests/test_conversion_utils.py +209 -0
  155. numpy/_core/tests/test_cpu_dispatcher.py +48 -0
  156. numpy/_core/tests/test_cpu_features.py +450 -0
  157. numpy/_core/tests/test_custom_dtypes.py +393 -0
  158. numpy/_core/tests/test_cython.py +352 -0
  159. numpy/_core/tests/test_datetime.py +2792 -0
  160. numpy/_core/tests/test_defchararray.py +858 -0
  161. numpy/_core/tests/test_deprecations.py +460 -0
  162. numpy/_core/tests/test_dlpack.py +190 -0
  163. numpy/_core/tests/test_dtype.py +2110 -0
  164. numpy/_core/tests/test_einsum.py +1351 -0
  165. numpy/_core/tests/test_errstate.py +131 -0
  166. numpy/_core/tests/test_extint128.py +217 -0
  167. numpy/_core/tests/test_finfo.py +86 -0
  168. numpy/_core/tests/test_function_base.py +504 -0
  169. numpy/_core/tests/test_getlimits.py +171 -0
  170. numpy/_core/tests/test_half.py +593 -0
  171. numpy/_core/tests/test_hashtable.py +36 -0
  172. numpy/_core/tests/test_indexerrors.py +122 -0
  173. numpy/_core/tests/test_indexing.py +1692 -0
  174. numpy/_core/tests/test_item_selection.py +167 -0
  175. numpy/_core/tests/test_limited_api.py +102 -0
  176. numpy/_core/tests/test_longdouble.py +370 -0
  177. numpy/_core/tests/test_mem_overlap.py +933 -0
  178. numpy/_core/tests/test_mem_policy.py +453 -0
  179. numpy/_core/tests/test_memmap.py +248 -0
  180. numpy/_core/tests/test_multiarray.py +11008 -0
  181. numpy/_core/tests/test_multiprocessing.py +55 -0
  182. numpy/_core/tests/test_multithreading.py +377 -0
  183. numpy/_core/tests/test_nditer.py +3533 -0
  184. numpy/_core/tests/test_nep50_promotions.py +287 -0
  185. numpy/_core/tests/test_numeric.py +4295 -0
  186. numpy/_core/tests/test_numerictypes.py +650 -0
  187. numpy/_core/tests/test_overrides.py +800 -0
  188. numpy/_core/tests/test_print.py +202 -0
  189. numpy/_core/tests/test_protocols.py +46 -0
  190. numpy/_core/tests/test_records.py +544 -0
  191. numpy/_core/tests/test_regression.py +2677 -0
  192. numpy/_core/tests/test_scalar_ctors.py +203 -0
  193. numpy/_core/tests/test_scalar_methods.py +328 -0
  194. numpy/_core/tests/test_scalarbuffer.py +153 -0
  195. numpy/_core/tests/test_scalarinherit.py +105 -0
  196. numpy/_core/tests/test_scalarmath.py +1168 -0
  197. numpy/_core/tests/test_scalarprint.py +403 -0
  198. numpy/_core/tests/test_shape_base.py +904 -0
  199. numpy/_core/tests/test_simd.py +1345 -0
  200. numpy/_core/tests/test_simd_module.py +105 -0
  201. numpy/_core/tests/test_stringdtype.py +1855 -0
  202. numpy/_core/tests/test_strings.py +1523 -0
  203. numpy/_core/tests/test_ufunc.py +3405 -0
  204. numpy/_core/tests/test_umath.py +4962 -0
  205. numpy/_core/tests/test_umath_accuracy.py +132 -0
  206. numpy/_core/tests/test_umath_complex.py +631 -0
  207. numpy/_core/tests/test_unicode.py +369 -0
  208. numpy/_core/umath.py +60 -0
  209. numpy/_core/umath.pyi +232 -0
  210. numpy/_distributor_init.py +15 -0
  211. numpy/_distributor_init.pyi +1 -0
  212. numpy/_expired_attrs_2_0.py +78 -0
  213. numpy/_expired_attrs_2_0.pyi +61 -0
  214. numpy/_globals.py +121 -0
  215. numpy/_globals.pyi +17 -0
  216. numpy/_pyinstaller/__init__.py +0 -0
  217. numpy/_pyinstaller/__init__.pyi +0 -0
  218. numpy/_pyinstaller/hook-numpy.py +36 -0
  219. numpy/_pyinstaller/hook-numpy.pyi +6 -0
  220. numpy/_pyinstaller/tests/__init__.py +16 -0
  221. numpy/_pyinstaller/tests/pyinstaller-smoke.py +32 -0
  222. numpy/_pyinstaller/tests/test_pyinstaller.py +35 -0
  223. numpy/_pytesttester.py +201 -0
  224. numpy/_pytesttester.pyi +18 -0
  225. numpy/_typing/__init__.py +173 -0
  226. numpy/_typing/_add_docstring.py +153 -0
  227. numpy/_typing/_array_like.py +106 -0
  228. numpy/_typing/_char_codes.py +213 -0
  229. numpy/_typing/_dtype_like.py +114 -0
  230. numpy/_typing/_extended_precision.py +15 -0
  231. numpy/_typing/_nbit.py +19 -0
  232. numpy/_typing/_nbit_base.py +94 -0
  233. numpy/_typing/_nbit_base.pyi +39 -0
  234. numpy/_typing/_nested_sequence.py +79 -0
  235. numpy/_typing/_scalars.py +20 -0
  236. numpy/_typing/_shape.py +8 -0
  237. numpy/_typing/_ufunc.py +7 -0
  238. numpy/_typing/_ufunc.pyi +975 -0
  239. numpy/_utils/__init__.py +95 -0
  240. numpy/_utils/__init__.pyi +28 -0
  241. numpy/_utils/_convertions.py +18 -0
  242. numpy/_utils/_convertions.pyi +4 -0
  243. numpy/_utils/_inspect.py +192 -0
  244. numpy/_utils/_inspect.pyi +70 -0
  245. numpy/_utils/_pep440.py +486 -0
  246. numpy/_utils/_pep440.pyi +118 -0
  247. numpy/char/__init__.py +2 -0
  248. numpy/char/__init__.pyi +111 -0
  249. numpy/conftest.py +248 -0
  250. numpy/core/__init__.py +33 -0
  251. numpy/core/__init__.pyi +0 -0
  252. numpy/core/_dtype.py +10 -0
  253. numpy/core/_dtype.pyi +0 -0
  254. numpy/core/_dtype_ctypes.py +10 -0
  255. numpy/core/_dtype_ctypes.pyi +0 -0
  256. numpy/core/_internal.py +27 -0
  257. numpy/core/_multiarray_umath.py +57 -0
  258. numpy/core/_utils.py +21 -0
  259. numpy/core/arrayprint.py +10 -0
  260. numpy/core/defchararray.py +10 -0
  261. numpy/core/einsumfunc.py +10 -0
  262. numpy/core/fromnumeric.py +10 -0
  263. numpy/core/function_base.py +10 -0
  264. numpy/core/getlimits.py +10 -0
  265. numpy/core/multiarray.py +25 -0
  266. numpy/core/numeric.py +12 -0
  267. numpy/core/numerictypes.py +10 -0
  268. numpy/core/overrides.py +10 -0
  269. numpy/core/overrides.pyi +7 -0
  270. numpy/core/records.py +10 -0
  271. numpy/core/shape_base.py +10 -0
  272. numpy/core/umath.py +10 -0
  273. numpy/ctypeslib/__init__.py +13 -0
  274. numpy/ctypeslib/__init__.pyi +15 -0
  275. numpy/ctypeslib/_ctypeslib.py +603 -0
  276. numpy/ctypeslib/_ctypeslib.pyi +236 -0
  277. numpy/distutils/__init__.py +64 -0
  278. numpy/distutils/__init__.pyi +4 -0
  279. numpy/distutils/__pycache__/conv_template.pypy311.pyc +0 -0
  280. numpy/distutils/_shell_utils.py +87 -0
  281. numpy/distutils/armccompiler.py +26 -0
  282. numpy/distutils/ccompiler.py +826 -0
  283. numpy/distutils/ccompiler_opt.py +2668 -0
  284. numpy/distutils/checks/cpu_asimd.c +27 -0
  285. numpy/distutils/checks/cpu_asimddp.c +16 -0
  286. numpy/distutils/checks/cpu_asimdfhm.c +19 -0
  287. numpy/distutils/checks/cpu_asimdhp.c +15 -0
  288. numpy/distutils/checks/cpu_avx.c +20 -0
  289. numpy/distutils/checks/cpu_avx2.c +20 -0
  290. numpy/distutils/checks/cpu_avx512_clx.c +22 -0
  291. numpy/distutils/checks/cpu_avx512_cnl.c +24 -0
  292. numpy/distutils/checks/cpu_avx512_icl.c +26 -0
  293. numpy/distutils/checks/cpu_avx512_knl.c +25 -0
  294. numpy/distutils/checks/cpu_avx512_knm.c +30 -0
  295. numpy/distutils/checks/cpu_avx512_skx.c +26 -0
  296. numpy/distutils/checks/cpu_avx512_spr.c +26 -0
  297. numpy/distutils/checks/cpu_avx512cd.c +20 -0
  298. numpy/distutils/checks/cpu_avx512f.c +20 -0
  299. numpy/distutils/checks/cpu_f16c.c +22 -0
  300. numpy/distutils/checks/cpu_fma3.c +22 -0
  301. numpy/distutils/checks/cpu_fma4.c +13 -0
  302. numpy/distutils/checks/cpu_lsx.c +11 -0
  303. numpy/distutils/checks/cpu_neon.c +19 -0
  304. numpy/distutils/checks/cpu_neon_fp16.c +11 -0
  305. numpy/distutils/checks/cpu_neon_vfpv4.c +21 -0
  306. numpy/distutils/checks/cpu_popcnt.c +32 -0
  307. numpy/distutils/checks/cpu_rvv.c +13 -0
  308. numpy/distutils/checks/cpu_sse.c +20 -0
  309. numpy/distutils/checks/cpu_sse2.c +20 -0
  310. numpy/distutils/checks/cpu_sse3.c +20 -0
  311. numpy/distutils/checks/cpu_sse41.c +20 -0
  312. numpy/distutils/checks/cpu_sse42.c +20 -0
  313. numpy/distutils/checks/cpu_ssse3.c +20 -0
  314. numpy/distutils/checks/cpu_sve.c +14 -0
  315. numpy/distutils/checks/cpu_vsx.c +21 -0
  316. numpy/distutils/checks/cpu_vsx2.c +13 -0
  317. numpy/distutils/checks/cpu_vsx3.c +13 -0
  318. numpy/distutils/checks/cpu_vsx4.c +14 -0
  319. numpy/distutils/checks/cpu_vx.c +16 -0
  320. numpy/distutils/checks/cpu_vxe.c +25 -0
  321. numpy/distutils/checks/cpu_vxe2.c +21 -0
  322. numpy/distutils/checks/cpu_xop.c +12 -0
  323. numpy/distutils/checks/extra_avx512bw_mask.c +18 -0
  324. numpy/distutils/checks/extra_avx512dq_mask.c +16 -0
  325. numpy/distutils/checks/extra_avx512f_reduce.c +41 -0
  326. numpy/distutils/checks/extra_vsx3_half_double.c +12 -0
  327. numpy/distutils/checks/extra_vsx4_mma.c +21 -0
  328. numpy/distutils/checks/extra_vsx_asm.c +36 -0
  329. numpy/distutils/checks/test_flags.c +1 -0
  330. numpy/distutils/command/__init__.py +41 -0
  331. numpy/distutils/command/autodist.py +148 -0
  332. numpy/distutils/command/bdist_rpm.py +22 -0
  333. numpy/distutils/command/build.py +62 -0
  334. numpy/distutils/command/build_clib.py +469 -0
  335. numpy/distutils/command/build_ext.py +752 -0
  336. numpy/distutils/command/build_py.py +31 -0
  337. numpy/distutils/command/build_scripts.py +49 -0
  338. numpy/distutils/command/build_src.py +773 -0
  339. numpy/distutils/command/config.py +516 -0
  340. numpy/distutils/command/config_compiler.py +126 -0
  341. numpy/distutils/command/develop.py +15 -0
  342. numpy/distutils/command/egg_info.py +25 -0
  343. numpy/distutils/command/install.py +79 -0
  344. numpy/distutils/command/install_clib.py +40 -0
  345. numpy/distutils/command/install_data.py +24 -0
  346. numpy/distutils/command/install_headers.py +25 -0
  347. numpy/distutils/command/sdist.py +27 -0
  348. numpy/distutils/conv_template.py +329 -0
  349. numpy/distutils/core.py +215 -0
  350. numpy/distutils/cpuinfo.py +683 -0
  351. numpy/distutils/exec_command.py +315 -0
  352. numpy/distutils/extension.py +101 -0
  353. numpy/distutils/fcompiler/__init__.py +1035 -0
  354. numpy/distutils/fcompiler/absoft.py +158 -0
  355. numpy/distutils/fcompiler/arm.py +71 -0
  356. numpy/distutils/fcompiler/compaq.py +120 -0
  357. numpy/distutils/fcompiler/environment.py +88 -0
  358. numpy/distutils/fcompiler/fujitsu.py +46 -0
  359. numpy/distutils/fcompiler/g95.py +42 -0
  360. numpy/distutils/fcompiler/gnu.py +555 -0
  361. numpy/distutils/fcompiler/hpux.py +41 -0
  362. numpy/distutils/fcompiler/ibm.py +97 -0
  363. numpy/distutils/fcompiler/intel.py +211 -0
  364. numpy/distutils/fcompiler/lahey.py +45 -0
  365. numpy/distutils/fcompiler/mips.py +54 -0
  366. numpy/distutils/fcompiler/nag.py +87 -0
  367. numpy/distutils/fcompiler/none.py +28 -0
  368. numpy/distutils/fcompiler/nv.py +53 -0
  369. numpy/distutils/fcompiler/pathf95.py +33 -0
  370. numpy/distutils/fcompiler/pg.py +128 -0
  371. numpy/distutils/fcompiler/sun.py +51 -0
  372. numpy/distutils/fcompiler/vast.py +52 -0
  373. numpy/distutils/from_template.py +261 -0
  374. numpy/distutils/fujitsuccompiler.py +28 -0
  375. numpy/distutils/intelccompiler.py +106 -0
  376. numpy/distutils/lib2def.py +116 -0
  377. numpy/distutils/line_endings.py +77 -0
  378. numpy/distutils/log.py +111 -0
  379. numpy/distutils/mingw/gfortran_vs2003_hack.c +6 -0
  380. numpy/distutils/mingw32ccompiler.py +620 -0
  381. numpy/distutils/misc_util.py +2484 -0
  382. numpy/distutils/msvc9compiler.py +63 -0
  383. numpy/distutils/msvccompiler.py +76 -0
  384. numpy/distutils/npy_pkg_config.py +441 -0
  385. numpy/distutils/numpy_distribution.py +17 -0
  386. numpy/distutils/pathccompiler.py +21 -0
  387. numpy/distutils/system_info.py +3267 -0
  388. numpy/distutils/tests/__init__.py +0 -0
  389. numpy/distutils/tests/test_build_ext.py +74 -0
  390. numpy/distutils/tests/test_ccompiler_opt.py +808 -0
  391. numpy/distutils/tests/test_ccompiler_opt_conf.py +176 -0
  392. numpy/distutils/tests/test_exec_command.py +217 -0
  393. numpy/distutils/tests/test_fcompiler.py +43 -0
  394. numpy/distutils/tests/test_fcompiler_gnu.py +55 -0
  395. numpy/distutils/tests/test_fcompiler_intel.py +30 -0
  396. numpy/distutils/tests/test_fcompiler_nagfor.py +22 -0
  397. numpy/distutils/tests/test_from_template.py +44 -0
  398. numpy/distutils/tests/test_log.py +34 -0
  399. numpy/distutils/tests/test_mingw32ccompiler.py +47 -0
  400. numpy/distutils/tests/test_misc_util.py +88 -0
  401. numpy/distutils/tests/test_npy_pkg_config.py +84 -0
  402. numpy/distutils/tests/test_shell_utils.py +79 -0
  403. numpy/distutils/tests/test_system_info.py +334 -0
  404. numpy/distutils/tests/utilities.py +90 -0
  405. numpy/distutils/unixccompiler.py +141 -0
  406. numpy/doc/ufuncs.py +138 -0
  407. numpy/dtypes.py +41 -0
  408. numpy/dtypes.pyi +630 -0
  409. numpy/exceptions.py +246 -0
  410. numpy/exceptions.pyi +27 -0
  411. numpy/f2py/__init__.py +86 -0
  412. numpy/f2py/__init__.pyi +5 -0
  413. numpy/f2py/__main__.py +5 -0
  414. numpy/f2py/__version__.py +1 -0
  415. numpy/f2py/__version__.pyi +1 -0
  416. numpy/f2py/_backends/__init__.py +9 -0
  417. numpy/f2py/_backends/__init__.pyi +5 -0
  418. numpy/f2py/_backends/_backend.py +44 -0
  419. numpy/f2py/_backends/_backend.pyi +46 -0
  420. numpy/f2py/_backends/_distutils.py +76 -0
  421. numpy/f2py/_backends/_distutils.pyi +13 -0
  422. numpy/f2py/_backends/_meson.py +244 -0
  423. numpy/f2py/_backends/_meson.pyi +62 -0
  424. numpy/f2py/_backends/meson.build.template +58 -0
  425. numpy/f2py/_isocbind.py +62 -0
  426. numpy/f2py/_isocbind.pyi +13 -0
  427. numpy/f2py/_src_pyf.py +247 -0
  428. numpy/f2py/_src_pyf.pyi +28 -0
  429. numpy/f2py/auxfuncs.py +1004 -0
  430. numpy/f2py/auxfuncs.pyi +262 -0
  431. numpy/f2py/capi_maps.py +811 -0
  432. numpy/f2py/capi_maps.pyi +33 -0
  433. numpy/f2py/cb_rules.py +665 -0
  434. numpy/f2py/cb_rules.pyi +17 -0
  435. numpy/f2py/cfuncs.py +1563 -0
  436. numpy/f2py/cfuncs.pyi +31 -0
  437. numpy/f2py/common_rules.py +143 -0
  438. numpy/f2py/common_rules.pyi +9 -0
  439. numpy/f2py/crackfortran.py +3725 -0
  440. numpy/f2py/crackfortran.pyi +266 -0
  441. numpy/f2py/diagnose.py +149 -0
  442. numpy/f2py/diagnose.pyi +1 -0
  443. numpy/f2py/f2py2e.py +788 -0
  444. numpy/f2py/f2py2e.pyi +74 -0
  445. numpy/f2py/f90mod_rules.py +269 -0
  446. numpy/f2py/f90mod_rules.pyi +16 -0
  447. numpy/f2py/func2subr.py +329 -0
  448. numpy/f2py/func2subr.pyi +7 -0
  449. numpy/f2py/rules.py +1629 -0
  450. numpy/f2py/rules.pyi +41 -0
  451. numpy/f2py/setup.cfg +3 -0
  452. numpy/f2py/src/fortranobject.c +1436 -0
  453. numpy/f2py/src/fortranobject.h +173 -0
  454. numpy/f2py/symbolic.py +1518 -0
  455. numpy/f2py/symbolic.pyi +219 -0
  456. numpy/f2py/tests/__init__.py +16 -0
  457. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  458. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  459. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  460. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  461. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  462. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  463. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  464. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  465. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  466. numpy/f2py/tests/src/callback/foo.f +62 -0
  467. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  468. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  469. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  470. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  471. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  472. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  473. numpy/f2py/tests/src/cli/hi77.f +3 -0
  474. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  475. numpy/f2py/tests/src/common/block.f +11 -0
  476. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  477. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  478. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  479. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  480. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  481. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  482. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  483. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  484. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  485. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  486. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  487. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  488. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  489. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  490. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  491. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  492. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  493. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  494. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  495. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  496. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  497. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  498. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  499. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  500. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  501. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  502. numpy/f2py/tests/src/mixed/foo.f +5 -0
  503. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  504. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  505. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  506. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  507. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  508. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  509. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  510. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  511. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  512. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  513. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  514. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  515. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  516. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  517. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  518. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  519. numpy/f2py/tests/src/regression/AB.inc +1 -0
  520. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  521. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  522. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  523. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  524. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  525. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  526. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  527. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  528. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  529. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  530. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  531. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  532. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  533. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  534. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  535. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  536. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  537. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  538. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  539. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  540. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  541. numpy/f2py/tests/src/routines/subrout.f +4 -0
  542. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  543. numpy/f2py/tests/src/size/foo.f90 +44 -0
  544. numpy/f2py/tests/src/string/char.f90 +29 -0
  545. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  546. numpy/f2py/tests/src/string/gh24008.f +8 -0
  547. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  548. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  549. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  550. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  551. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  552. numpy/f2py/tests/src/string/string.f +12 -0
  553. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  554. numpy/f2py/tests/test_abstract_interface.py +26 -0
  555. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  556. numpy/f2py/tests/test_assumed_shape.py +50 -0
  557. numpy/f2py/tests/test_block_docstring.py +20 -0
  558. numpy/f2py/tests/test_callback.py +263 -0
  559. numpy/f2py/tests/test_character.py +641 -0
  560. numpy/f2py/tests/test_common.py +23 -0
  561. numpy/f2py/tests/test_crackfortran.py +421 -0
  562. numpy/f2py/tests/test_data.py +71 -0
  563. numpy/f2py/tests/test_docs.py +66 -0
  564. numpy/f2py/tests/test_f2cmap.py +17 -0
  565. numpy/f2py/tests/test_f2py2e.py +983 -0
  566. numpy/f2py/tests/test_isoc.py +56 -0
  567. numpy/f2py/tests/test_kind.py +52 -0
  568. numpy/f2py/tests/test_mixed.py +35 -0
  569. numpy/f2py/tests/test_modules.py +83 -0
  570. numpy/f2py/tests/test_parameter.py +129 -0
  571. numpy/f2py/tests/test_pyf_src.py +43 -0
  572. numpy/f2py/tests/test_quoted_character.py +18 -0
  573. numpy/f2py/tests/test_regression.py +187 -0
  574. numpy/f2py/tests/test_return_character.py +48 -0
  575. numpy/f2py/tests/test_return_complex.py +67 -0
  576. numpy/f2py/tests/test_return_integer.py +55 -0
  577. numpy/f2py/tests/test_return_logical.py +65 -0
  578. numpy/f2py/tests/test_return_real.py +109 -0
  579. numpy/f2py/tests/test_routines.py +29 -0
  580. numpy/f2py/tests/test_semicolon_split.py +75 -0
  581. numpy/f2py/tests/test_size.py +45 -0
  582. numpy/f2py/tests/test_string.py +100 -0
  583. numpy/f2py/tests/test_symbolic.py +500 -0
  584. numpy/f2py/tests/test_value_attrspec.py +15 -0
  585. numpy/f2py/tests/util.py +442 -0
  586. numpy/f2py/use_rules.py +99 -0
  587. numpy/f2py/use_rules.pyi +9 -0
  588. numpy/fft/__init__.py +213 -0
  589. numpy/fft/__init__.pyi +38 -0
  590. numpy/fft/_helper.py +235 -0
  591. numpy/fft/_helper.pyi +44 -0
  592. numpy/fft/_pocketfft.py +1693 -0
  593. numpy/fft/_pocketfft.pyi +137 -0
  594. numpy/fft/_pocketfft_umath.pypy311-pp73-darwin.so +0 -0
  595. numpy/fft/tests/__init__.py +0 -0
  596. numpy/fft/tests/test_helper.py +167 -0
  597. numpy/fft/tests/test_pocketfft.py +589 -0
  598. numpy/lib/__init__.py +97 -0
  599. numpy/lib/__init__.pyi +52 -0
  600. numpy/lib/_array_utils_impl.py +62 -0
  601. numpy/lib/_array_utils_impl.pyi +10 -0
  602. numpy/lib/_arraypad_impl.py +926 -0
  603. numpy/lib/_arraypad_impl.pyi +88 -0
  604. numpy/lib/_arraysetops_impl.py +1158 -0
  605. numpy/lib/_arraysetops_impl.pyi +462 -0
  606. numpy/lib/_arrayterator_impl.py +224 -0
  607. numpy/lib/_arrayterator_impl.pyi +45 -0
  608. numpy/lib/_datasource.py +700 -0
  609. numpy/lib/_datasource.pyi +30 -0
  610. numpy/lib/_format_impl.py +1036 -0
  611. numpy/lib/_format_impl.pyi +56 -0
  612. numpy/lib/_function_base_impl.py +5760 -0
  613. numpy/lib/_function_base_impl.pyi +2324 -0
  614. numpy/lib/_histograms_impl.py +1085 -0
  615. numpy/lib/_histograms_impl.pyi +40 -0
  616. numpy/lib/_index_tricks_impl.py +1048 -0
  617. numpy/lib/_index_tricks_impl.pyi +267 -0
  618. numpy/lib/_iotools.py +900 -0
  619. numpy/lib/_iotools.pyi +116 -0
  620. numpy/lib/_nanfunctions_impl.py +2006 -0
  621. numpy/lib/_nanfunctions_impl.pyi +48 -0
  622. numpy/lib/_npyio_impl.py +2583 -0
  623. numpy/lib/_npyio_impl.pyi +299 -0
  624. numpy/lib/_polynomial_impl.py +1465 -0
  625. numpy/lib/_polynomial_impl.pyi +338 -0
  626. numpy/lib/_scimath_impl.py +642 -0
  627. numpy/lib/_scimath_impl.pyi +93 -0
  628. numpy/lib/_shape_base_impl.py +1289 -0
  629. numpy/lib/_shape_base_impl.pyi +236 -0
  630. numpy/lib/_stride_tricks_impl.py +582 -0
  631. numpy/lib/_stride_tricks_impl.pyi +73 -0
  632. numpy/lib/_twodim_base_impl.py +1201 -0
  633. numpy/lib/_twodim_base_impl.pyi +408 -0
  634. numpy/lib/_type_check_impl.py +710 -0
  635. numpy/lib/_type_check_impl.pyi +348 -0
  636. numpy/lib/_ufunclike_impl.py +199 -0
  637. numpy/lib/_ufunclike_impl.pyi +60 -0
  638. numpy/lib/_user_array_impl.py +310 -0
  639. numpy/lib/_user_array_impl.pyi +226 -0
  640. numpy/lib/_utils_impl.py +784 -0
  641. numpy/lib/_utils_impl.pyi +22 -0
  642. numpy/lib/_version.py +153 -0
  643. numpy/lib/_version.pyi +17 -0
  644. numpy/lib/array_utils.py +7 -0
  645. numpy/lib/array_utils.pyi +6 -0
  646. numpy/lib/format.py +24 -0
  647. numpy/lib/format.pyi +24 -0
  648. numpy/lib/introspect.py +94 -0
  649. numpy/lib/introspect.pyi +3 -0
  650. numpy/lib/mixins.py +180 -0
  651. numpy/lib/mixins.pyi +78 -0
  652. numpy/lib/npyio.py +1 -0
  653. numpy/lib/npyio.pyi +5 -0
  654. numpy/lib/recfunctions.py +1681 -0
  655. numpy/lib/recfunctions.pyi +444 -0
  656. numpy/lib/scimath.py +13 -0
  657. numpy/lib/scimath.pyi +12 -0
  658. numpy/lib/stride_tricks.py +1 -0
  659. numpy/lib/stride_tricks.pyi +4 -0
  660. numpy/lib/tests/__init__.py +0 -0
  661. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  662. numpy/lib/tests/data/py2-objarr.npy +0 -0
  663. numpy/lib/tests/data/py2-objarr.npz +0 -0
  664. numpy/lib/tests/data/py3-objarr.npy +0 -0
  665. numpy/lib/tests/data/py3-objarr.npz +0 -0
  666. numpy/lib/tests/data/python3.npy +0 -0
  667. numpy/lib/tests/data/win64python2.npy +0 -0
  668. numpy/lib/tests/test__datasource.py +328 -0
  669. numpy/lib/tests/test__iotools.py +358 -0
  670. numpy/lib/tests/test__version.py +64 -0
  671. numpy/lib/tests/test_array_utils.py +32 -0
  672. numpy/lib/tests/test_arraypad.py +1427 -0
  673. numpy/lib/tests/test_arraysetops.py +1302 -0
  674. numpy/lib/tests/test_arrayterator.py +45 -0
  675. numpy/lib/tests/test_format.py +1054 -0
  676. numpy/lib/tests/test_function_base.py +4750 -0
  677. numpy/lib/tests/test_histograms.py +855 -0
  678. numpy/lib/tests/test_index_tricks.py +693 -0
  679. numpy/lib/tests/test_io.py +2857 -0
  680. numpy/lib/tests/test_loadtxt.py +1099 -0
  681. numpy/lib/tests/test_mixins.py +215 -0
  682. numpy/lib/tests/test_nanfunctions.py +1438 -0
  683. numpy/lib/tests/test_packbits.py +376 -0
  684. numpy/lib/tests/test_polynomial.py +325 -0
  685. numpy/lib/tests/test_recfunctions.py +1042 -0
  686. numpy/lib/tests/test_regression.py +231 -0
  687. numpy/lib/tests/test_shape_base.py +813 -0
  688. numpy/lib/tests/test_stride_tricks.py +655 -0
  689. numpy/lib/tests/test_twodim_base.py +559 -0
  690. numpy/lib/tests/test_type_check.py +473 -0
  691. numpy/lib/tests/test_ufunclike.py +97 -0
  692. numpy/lib/tests/test_utils.py +80 -0
  693. numpy/lib/user_array.py +1 -0
  694. numpy/lib/user_array.pyi +1 -0
  695. numpy/linalg/__init__.py +95 -0
  696. numpy/linalg/__init__.pyi +71 -0
  697. numpy/linalg/_linalg.py +3657 -0
  698. numpy/linalg/_linalg.pyi +548 -0
  699. numpy/linalg/_umath_linalg.pyi +60 -0
  700. numpy/linalg/_umath_linalg.pypy311-pp73-darwin.so +0 -0
  701. numpy/linalg/lapack_lite.pyi +143 -0
  702. numpy/linalg/lapack_lite.pypy311-pp73-darwin.so +0 -0
  703. numpy/linalg/tests/__init__.py +0 -0
  704. numpy/linalg/tests/test_deprecations.py +21 -0
  705. numpy/linalg/tests/test_linalg.py +2442 -0
  706. numpy/linalg/tests/test_regression.py +182 -0
  707. numpy/ma/API_CHANGES.txt +135 -0
  708. numpy/ma/LICENSE +24 -0
  709. numpy/ma/README.rst +236 -0
  710. numpy/ma/__init__.py +53 -0
  711. numpy/ma/__init__.pyi +458 -0
  712. numpy/ma/core.py +8929 -0
  713. numpy/ma/core.pyi +3720 -0
  714. numpy/ma/extras.py +2266 -0
  715. numpy/ma/extras.pyi +297 -0
  716. numpy/ma/mrecords.py +762 -0
  717. numpy/ma/mrecords.pyi +96 -0
  718. numpy/ma/tests/__init__.py +0 -0
  719. numpy/ma/tests/test_arrayobject.py +40 -0
  720. numpy/ma/tests/test_core.py +6008 -0
  721. numpy/ma/tests/test_deprecations.py +65 -0
  722. numpy/ma/tests/test_extras.py +1945 -0
  723. numpy/ma/tests/test_mrecords.py +495 -0
  724. numpy/ma/tests/test_old_ma.py +939 -0
  725. numpy/ma/tests/test_regression.py +83 -0
  726. numpy/ma/tests/test_subclassing.py +469 -0
  727. numpy/ma/testutils.py +294 -0
  728. numpy/ma/testutils.pyi +69 -0
  729. numpy/matlib.py +380 -0
  730. numpy/matlib.pyi +580 -0
  731. numpy/matrixlib/__init__.py +12 -0
  732. numpy/matrixlib/__init__.pyi +3 -0
  733. numpy/matrixlib/defmatrix.py +1119 -0
  734. numpy/matrixlib/defmatrix.pyi +218 -0
  735. numpy/matrixlib/tests/__init__.py +0 -0
  736. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  737. numpy/matrixlib/tests/test_interaction.py +360 -0
  738. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  739. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  740. numpy/matrixlib/tests/test_multiarray.py +17 -0
  741. numpy/matrixlib/tests/test_numeric.py +18 -0
  742. numpy/matrixlib/tests/test_regression.py +31 -0
  743. numpy/polynomial/__init__.py +187 -0
  744. numpy/polynomial/__init__.pyi +31 -0
  745. numpy/polynomial/_polybase.py +1191 -0
  746. numpy/polynomial/_polybase.pyi +262 -0
  747. numpy/polynomial/_polytypes.pyi +501 -0
  748. numpy/polynomial/chebyshev.py +2001 -0
  749. numpy/polynomial/chebyshev.pyi +180 -0
  750. numpy/polynomial/hermite.py +1738 -0
  751. numpy/polynomial/hermite.pyi +106 -0
  752. numpy/polynomial/hermite_e.py +1640 -0
  753. numpy/polynomial/hermite_e.pyi +106 -0
  754. numpy/polynomial/laguerre.py +1673 -0
  755. numpy/polynomial/laguerre.pyi +100 -0
  756. numpy/polynomial/legendre.py +1603 -0
  757. numpy/polynomial/legendre.pyi +100 -0
  758. numpy/polynomial/polynomial.py +1625 -0
  759. numpy/polynomial/polynomial.pyi +109 -0
  760. numpy/polynomial/polyutils.py +759 -0
  761. numpy/polynomial/polyutils.pyi +307 -0
  762. numpy/polynomial/tests/__init__.py +0 -0
  763. numpy/polynomial/tests/test_chebyshev.py +618 -0
  764. numpy/polynomial/tests/test_classes.py +613 -0
  765. numpy/polynomial/tests/test_hermite.py +553 -0
  766. numpy/polynomial/tests/test_hermite_e.py +554 -0
  767. numpy/polynomial/tests/test_laguerre.py +535 -0
  768. numpy/polynomial/tests/test_legendre.py +566 -0
  769. numpy/polynomial/tests/test_polynomial.py +691 -0
  770. numpy/polynomial/tests/test_polyutils.py +123 -0
  771. numpy/polynomial/tests/test_printing.py +557 -0
  772. numpy/polynomial/tests/test_symbol.py +217 -0
  773. numpy/py.typed +0 -0
  774. numpy/random/LICENSE.md +71 -0
  775. numpy/random/__init__.pxd +14 -0
  776. numpy/random/__init__.py +213 -0
  777. numpy/random/__init__.pyi +124 -0
  778. numpy/random/_bounded_integers.pxd +29 -0
  779. numpy/random/_bounded_integers.pyi +1 -0
  780. numpy/random/_bounded_integers.pypy311-pp73-darwin.so +0 -0
  781. numpy/random/_common.pxd +110 -0
  782. numpy/random/_common.pyi +16 -0
  783. numpy/random/_common.pypy311-pp73-darwin.so +0 -0
  784. numpy/random/_examples/cffi/extending.py +44 -0
  785. numpy/random/_examples/cffi/parse.py +53 -0
  786. numpy/random/_examples/cython/extending.pyx +77 -0
  787. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  788. numpy/random/_examples/cython/meson.build +53 -0
  789. numpy/random/_examples/numba/extending.py +86 -0
  790. numpy/random/_examples/numba/extending_distributions.py +67 -0
  791. numpy/random/_generator.pyi +862 -0
  792. numpy/random/_generator.pypy311-pp73-darwin.so +0 -0
  793. numpy/random/_mt19937.pyi +27 -0
  794. numpy/random/_mt19937.pypy311-pp73-darwin.so +0 -0
  795. numpy/random/_pcg64.pyi +41 -0
  796. numpy/random/_pcg64.pypy311-pp73-darwin.so +0 -0
  797. numpy/random/_philox.pyi +36 -0
  798. numpy/random/_philox.pypy311-pp73-darwin.so +0 -0
  799. numpy/random/_pickle.py +88 -0
  800. numpy/random/_pickle.pyi +43 -0
  801. numpy/random/_sfc64.pyi +25 -0
  802. numpy/random/_sfc64.pypy311-pp73-darwin.so +0 -0
  803. numpy/random/bit_generator.pxd +40 -0
  804. numpy/random/bit_generator.pyi +123 -0
  805. numpy/random/bit_generator.pypy311-pp73-darwin.so +0 -0
  806. numpy/random/c_distributions.pxd +119 -0
  807. numpy/random/lib/libnpyrandom.a +0 -0
  808. numpy/random/mtrand.pyi +759 -0
  809. numpy/random/mtrand.pypy311-pp73-darwin.so +0 -0
  810. numpy/random/tests/__init__.py +0 -0
  811. numpy/random/tests/data/__init__.py +0 -0
  812. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  813. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  814. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  815. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  816. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  817. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  818. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  819. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  820. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  821. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  822. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  823. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  824. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  825. numpy/random/tests/test_direct.py +595 -0
  826. numpy/random/tests/test_extending.py +131 -0
  827. numpy/random/tests/test_generator_mt19937.py +2825 -0
  828. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  829. numpy/random/tests/test_random.py +1724 -0
  830. numpy/random/tests/test_randomstate.py +2099 -0
  831. numpy/random/tests/test_randomstate_regression.py +213 -0
  832. numpy/random/tests/test_regression.py +175 -0
  833. numpy/random/tests/test_seed_sequence.py +79 -0
  834. numpy/random/tests/test_smoke.py +882 -0
  835. numpy/rec/__init__.py +2 -0
  836. numpy/rec/__init__.pyi +23 -0
  837. numpy/strings/__init__.py +2 -0
  838. numpy/strings/__init__.pyi +97 -0
  839. numpy/testing/__init__.py +22 -0
  840. numpy/testing/__init__.pyi +107 -0
  841. numpy/testing/_private/__init__.py +0 -0
  842. numpy/testing/_private/__init__.pyi +0 -0
  843. numpy/testing/_private/extbuild.py +250 -0
  844. numpy/testing/_private/extbuild.pyi +25 -0
  845. numpy/testing/_private/utils.py +2830 -0
  846. numpy/testing/_private/utils.pyi +505 -0
  847. numpy/testing/overrides.py +84 -0
  848. numpy/testing/overrides.pyi +10 -0
  849. numpy/testing/print_coercion_tables.py +207 -0
  850. numpy/testing/print_coercion_tables.pyi +26 -0
  851. numpy/testing/tests/__init__.py +0 -0
  852. numpy/testing/tests/test_utils.py +2123 -0
  853. numpy/tests/__init__.py +0 -0
  854. numpy/tests/test__all__.py +10 -0
  855. numpy/tests/test_configtool.py +51 -0
  856. numpy/tests/test_ctypeslib.py +383 -0
  857. numpy/tests/test_lazyloading.py +42 -0
  858. numpy/tests/test_matlib.py +59 -0
  859. numpy/tests/test_numpy_config.py +47 -0
  860. numpy/tests/test_numpy_version.py +54 -0
  861. numpy/tests/test_public_api.py +807 -0
  862. numpy/tests/test_reloading.py +76 -0
  863. numpy/tests/test_scripts.py +48 -0
  864. numpy/tests/test_warnings.py +79 -0
  865. numpy/typing/__init__.py +233 -0
  866. numpy/typing/__init__.pyi +3 -0
  867. numpy/typing/mypy_plugin.py +200 -0
  868. numpy/typing/tests/__init__.py +0 -0
  869. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  870. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  871. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  872. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  873. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  874. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  875. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  876. numpy/typing/tests/data/fail/char.pyi +63 -0
  877. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  878. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  879. numpy/typing/tests/data/fail/constants.pyi +3 -0
  880. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  881. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  882. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  883. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  884. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  885. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  886. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  887. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  888. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  889. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  890. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  891. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  892. numpy/typing/tests/data/fail/ma.pyi +155 -0
  893. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  894. numpy/typing/tests/data/fail/modules.pyi +17 -0
  895. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  896. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  897. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  898. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  899. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  900. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  901. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  902. numpy/typing/tests/data/fail/random.pyi +62 -0
  903. numpy/typing/tests/data/fail/rec.pyi +17 -0
  904. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  905. numpy/typing/tests/data/fail/shape.pyi +7 -0
  906. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  907. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  908. numpy/typing/tests/data/fail/strings.pyi +52 -0
  909. numpy/typing/tests/data/fail/testing.pyi +28 -0
  910. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  911. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  912. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  913. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  914. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  915. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  916. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  917. numpy/typing/tests/data/mypy.ini +8 -0
  918. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  919. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  920. numpy/typing/tests/data/pass/array_like.py +43 -0
  921. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  922. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  923. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  924. numpy/typing/tests/data/pass/comparisons.py +316 -0
  925. numpy/typing/tests/data/pass/dtype.py +57 -0
  926. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  927. numpy/typing/tests/data/pass/flatiter.py +26 -0
  928. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  929. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  930. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  931. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  932. numpy/typing/tests/data/pass/lib_version.py +18 -0
  933. numpy/typing/tests/data/pass/literal.py +52 -0
  934. numpy/typing/tests/data/pass/ma.py +199 -0
  935. numpy/typing/tests/data/pass/mod.py +149 -0
  936. numpy/typing/tests/data/pass/modules.py +45 -0
  937. numpy/typing/tests/data/pass/multiarray.py +77 -0
  938. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  939. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  940. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  941. numpy/typing/tests/data/pass/nditer.py +4 -0
  942. numpy/typing/tests/data/pass/numeric.py +90 -0
  943. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  944. numpy/typing/tests/data/pass/random.py +1498 -0
  945. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  946. numpy/typing/tests/data/pass/scalars.py +249 -0
  947. numpy/typing/tests/data/pass/shape.py +19 -0
  948. numpy/typing/tests/data/pass/simple.py +170 -0
  949. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  950. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  951. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  952. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  953. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  954. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  955. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  956. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  957. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  958. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  959. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  960. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  961. numpy/typing/tests/data/reveal/char.pyi +225 -0
  962. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  963. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  964. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  965. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  966. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  967. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  968. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  969. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  970. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  971. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  972. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  973. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  974. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  975. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  976. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  977. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  978. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  979. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  980. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  981. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  982. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  983. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  984. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  985. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  986. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  987. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  988. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  989. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  990. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  991. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  992. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  993. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  994. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  995. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  996. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  997. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  998. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  999. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  1000. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  1001. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  1002. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  1003. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  1004. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  1005. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  1006. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  1007. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  1008. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  1009. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  1010. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  1011. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  1012. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  1013. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  1014. numpy/typing/tests/test_isfile.py +38 -0
  1015. numpy/typing/tests/test_runtime.py +110 -0
  1016. numpy/typing/tests/test_typing.py +205 -0
  1017. numpy/version.py +11 -0
  1018. numpy/version.pyi +9 -0
  1019. numpy-2.4.1.dist-info/METADATA +139 -0
  1020. numpy-2.4.1.dist-info/RECORD +1039 -0
  1021. numpy-2.4.1.dist-info/WHEEL +6 -0
  1022. numpy-2.4.1.dist-info/entry_points.txt +13 -0
  1023. numpy-2.4.1.dist-info/licenses/LICENSE.txt +935 -0
  1024. numpy-2.4.1.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  1025. numpy-2.4.1.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  1026. numpy-2.4.1.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  1027. numpy-2.4.1.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  1028. numpy-2.4.1.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  1029. numpy-2.4.1.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  1030. numpy-2.4.1.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  1031. numpy-2.4.1.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  1032. numpy-2.4.1.dist-info/licenses/numpy/ma/LICENSE +24 -0
  1033. numpy-2.4.1.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  1034. numpy-2.4.1.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  1035. numpy-2.4.1.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  1036. numpy-2.4.1.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  1037. numpy-2.4.1.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  1038. numpy-2.4.1.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  1039. numpy-2.4.1.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
@@ -0,0 +1,2123 @@
1
+ import itertools
2
+ import os
3
+ import re
4
+ import sys
5
+ import warnings
6
+ import weakref
7
+
8
+ import pytest
9
+
10
+ import numpy as np
11
+ import numpy._core._multiarray_umath as ncu
12
+ from numpy.testing import (
13
+ HAS_REFCOUNT,
14
+ assert_,
15
+ assert_allclose,
16
+ assert_almost_equal,
17
+ assert_approx_equal,
18
+ assert_array_almost_equal,
19
+ assert_array_almost_equal_nulp,
20
+ assert_array_equal,
21
+ assert_array_less,
22
+ assert_array_max_ulp,
23
+ assert_equal,
24
+ assert_no_gc_cycles,
25
+ assert_no_warnings,
26
+ assert_raises,
27
+ assert_string_equal,
28
+ assert_warns,
29
+ build_err_msg,
30
+ clear_and_catch_warnings,
31
+ suppress_warnings,
32
+ tempdir,
33
+ temppath,
34
+ )
35
+
36
+
37
+ class _GenericTest:
38
+
39
+ def _assert_func(self, *args, **kwargs):
40
+ pass
41
+
42
+ def _test_equal(self, a, b):
43
+ self._assert_func(a, b)
44
+
45
+ def _test_not_equal(self, a, b):
46
+ with assert_raises(AssertionError):
47
+ self._assert_func(a, b)
48
+
49
+ def test_array_rank1_eq(self):
50
+ """Test two equal array of rank 1 are found equal."""
51
+ a = np.array([1, 2])
52
+ b = np.array([1, 2])
53
+
54
+ self._test_equal(a, b)
55
+
56
+ def test_array_rank1_noteq(self):
57
+ """Test two different array of rank 1 are found not equal."""
58
+ a = np.array([1, 2])
59
+ b = np.array([2, 2])
60
+
61
+ self._test_not_equal(a, b)
62
+
63
+ def test_array_rank2_eq(self):
64
+ """Test two equal array of rank 2 are found equal."""
65
+ a = np.array([[1, 2], [3, 4]])
66
+ b = np.array([[1, 2], [3, 4]])
67
+
68
+ self._test_equal(a, b)
69
+
70
+ def test_array_diffshape(self):
71
+ """Test two arrays with different shapes are found not equal."""
72
+ a = np.array([1, 2])
73
+ b = np.array([[1, 2], [1, 2]])
74
+
75
+ self._test_not_equal(a, b)
76
+
77
+ def test_objarray(self):
78
+ """Test object arrays."""
79
+ a = np.array([1, 1], dtype=object)
80
+ self._test_equal(a, 1)
81
+
82
+ def test_array_likes(self):
83
+ self._test_equal([1, 2, 3], (1, 2, 3))
84
+
85
+
86
+ class TestArrayEqual(_GenericTest):
87
+
88
+ def _assert_func(self, *args, **kwargs):
89
+ assert_array_equal(*args, **kwargs)
90
+
91
+ def test_generic_rank1(self):
92
+ """Test rank 1 array for all dtypes."""
93
+ def foo(t):
94
+ a = np.empty(2, t)
95
+ a.fill(1)
96
+ b = a.copy()
97
+ c = a.copy()
98
+ c.fill(0)
99
+ self._test_equal(a, b)
100
+ self._test_not_equal(c, b)
101
+
102
+ # Test numeric types and object
103
+ for t in '?bhilqpBHILQPfdgFDG':
104
+ foo(t)
105
+
106
+ # Test strings
107
+ for t in ['S1', 'U1']:
108
+ foo(t)
109
+
110
+ def test_0_ndim_array(self):
111
+ x = np.array(473963742225900817127911193656584771)
112
+ y = np.array(18535119325151578301457182298393896)
113
+
114
+ with pytest.raises(AssertionError) as exc_info:
115
+ self._assert_func(x, y)
116
+ msg = str(exc_info.value)
117
+ assert_('Mismatched elements: 1 / 1 (100%)\n'
118
+ in msg)
119
+
120
+ y = x
121
+ self._assert_func(x, y)
122
+
123
+ x = np.array(4395065348745.5643764887869876)
124
+ y = np.array(0)
125
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
126
+ 'Max absolute difference among violations: '
127
+ '4.39506535e+12\n'
128
+ 'Max relative difference among violations: inf\n')
129
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
130
+ self._assert_func(x, y)
131
+
132
+ x = y
133
+ self._assert_func(x, y)
134
+
135
+ def test_generic_rank3(self):
136
+ """Test rank 3 array for all dtypes."""
137
+ def foo(t):
138
+ a = np.empty((4, 2, 3), t)
139
+ a.fill(1)
140
+ b = a.copy()
141
+ c = a.copy()
142
+ c.fill(0)
143
+ self._test_equal(a, b)
144
+ self._test_not_equal(c, b)
145
+
146
+ # Test numeric types and object
147
+ for t in '?bhilqpBHILQPfdgFDG':
148
+ foo(t)
149
+
150
+ # Test strings
151
+ for t in ['S1', 'U1']:
152
+ foo(t)
153
+
154
+ def test_nan_array(self):
155
+ """Test arrays with nan values in them."""
156
+ a = np.array([1, 2, np.nan])
157
+ b = np.array([1, 2, np.nan])
158
+
159
+ self._test_equal(a, b)
160
+
161
+ c = np.array([1, 2, 3])
162
+ self._test_not_equal(c, b)
163
+
164
+ def test_string_arrays(self):
165
+ """Test two arrays with different shapes are found not equal."""
166
+ a = np.array(['floupi', 'floupa'])
167
+ b = np.array(['floupi', 'floupa'])
168
+
169
+ self._test_equal(a, b)
170
+
171
+ c = np.array(['floupipi', 'floupa'])
172
+
173
+ self._test_not_equal(c, b)
174
+
175
+ def test_recarrays(self):
176
+ """Test record arrays."""
177
+ a = np.empty(2, [('floupi', float), ('floupa', float)])
178
+ a['floupi'] = [1, 2]
179
+ a['floupa'] = [1, 2]
180
+ b = a.copy()
181
+
182
+ self._test_equal(a, b)
183
+
184
+ c = np.empty(2, [('floupipi', float),
185
+ ('floupi', float), ('floupa', float)])
186
+ c['floupipi'] = a['floupi'].copy()
187
+ c['floupa'] = a['floupa'].copy()
188
+
189
+ with pytest.raises(TypeError):
190
+ self._test_not_equal(c, b)
191
+
192
+ def test_masked_nan_inf(self):
193
+ # Regression test for gh-11121
194
+ a = np.ma.MaskedArray([3., 4., 6.5], mask=[False, True, False])
195
+ b = np.array([3., np.nan, 6.5])
196
+ self._test_equal(a, b)
197
+ self._test_equal(b, a)
198
+ a = np.ma.MaskedArray([3., 4., 6.5], mask=[True, False, False])
199
+ b = np.array([np.inf, 4., 6.5])
200
+ self._test_equal(a, b)
201
+ self._test_equal(b, a)
202
+
203
+ # Also provides test cases for gh-11121
204
+ def test_masked_scalar(self):
205
+ # Test masked scalar vs. plain/masked scalar
206
+ for a_val, b_val, b_masked in itertools.product(
207
+ [3., np.nan, np.inf],
208
+ [3., 4., np.nan, np.inf, -np.inf],
209
+ [False, True],
210
+ ):
211
+ a = np.ma.MaskedArray(a_val, mask=True)
212
+ b = np.ma.MaskedArray(b_val, mask=True) if b_masked else np.array(b_val)
213
+ self._test_equal(a, b)
214
+ self._test_equal(b, a)
215
+
216
+ # Test masked scalar vs. plain array
217
+ for a_val, b_val in itertools.product(
218
+ [3., np.nan, -np.inf],
219
+ itertools.product([3., 4., np.nan, np.inf, -np.inf], repeat=2),
220
+ ):
221
+ a = np.ma.MaskedArray(a_val, mask=True)
222
+ b = np.array(b_val)
223
+ self._test_equal(a, b)
224
+ self._test_equal(b, a)
225
+
226
+ # Test masked scalar vs. masked array
227
+ for a_val, b_val, b_mask in itertools.product(
228
+ [3., np.nan, np.inf],
229
+ itertools.product([3., 4., np.nan, np.inf, -np.inf], repeat=2),
230
+ itertools.product([False, True], repeat=2),
231
+ ):
232
+ a = np.ma.MaskedArray(a_val, mask=True)
233
+ b = np.ma.MaskedArray(b_val, mask=b_mask)
234
+ self._test_equal(a, b)
235
+ self._test_equal(b, a)
236
+
237
+ def test_subclass_that_overrides_eq(self):
238
+ # While we cannot guarantee testing functions will always work for
239
+ # subclasses, the tests should ideally rely only on subclasses having
240
+ # comparison operators, not on them being able to store booleans
241
+ # (which, e.g., astropy Quantity cannot usefully do). See gh-8452.
242
+ class MyArray(np.ndarray):
243
+ def __eq__(self, other):
244
+ return bool(np.equal(self, other).all())
245
+
246
+ def __ne__(self, other):
247
+ return not self == other
248
+
249
+ a = np.array([1., 2.]).view(MyArray)
250
+ b = np.array([2., 3.]).view(MyArray)
251
+ assert_(type(a == a), bool)
252
+ assert_(a == a)
253
+ assert_(a != b)
254
+ self._test_equal(a, a)
255
+ self._test_not_equal(a, b)
256
+ self._test_not_equal(b, a)
257
+
258
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
259
+ 'Max absolute difference among violations: 1.\n'
260
+ 'Max relative difference among violations: 0.5')
261
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
262
+ self._test_equal(a, b)
263
+
264
+ c = np.array([0., 2.9]).view(MyArray)
265
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
266
+ 'Max absolute difference among violations: 2.\n'
267
+ 'Max relative difference among violations: inf')
268
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
269
+ self._test_equal(b, c)
270
+
271
+ def test_subclass_that_does_not_implement_npall(self):
272
+ class MyArray(np.ndarray):
273
+ def __array_function__(self, *args, **kwargs):
274
+ return NotImplemented
275
+
276
+ a = np.array([1., 2.]).view(MyArray)
277
+ b = np.array([2., 3.]).view(MyArray)
278
+ with assert_raises(TypeError):
279
+ np.all(a)
280
+ self._test_equal(a, a)
281
+ self._test_not_equal(a, b)
282
+ self._test_not_equal(b, a)
283
+
284
+ def test_suppress_overflow_warnings(self):
285
+ # Based on issue #18992
286
+ with pytest.raises(AssertionError):
287
+ with np.errstate(all="raise"):
288
+ np.testing.assert_array_equal(
289
+ np.array([1, 2, 3], np.float32),
290
+ np.array([1, 1e-40, 3], np.float32))
291
+
292
+ def test_array_vs_scalar_is_equal(self):
293
+ """Test comparing an array with a scalar when all values are equal."""
294
+ a = np.array([1., 1., 1.])
295
+ b = 1.
296
+
297
+ self._test_equal(a, b)
298
+
299
+ def test_array_vs_array_not_equal(self):
300
+ """Test comparing an array with a scalar when not all values equal."""
301
+ a = np.array([34986, 545676, 439655, 563766])
302
+ b = np.array([34986, 545676, 439655, 0])
303
+
304
+ expected_msg = ('Mismatched elements: 1 / 4 (25%)\n'
305
+ 'Mismatch at index:\n'
306
+ ' [3]: 563766 (ACTUAL), 0 (DESIRED)\n'
307
+ 'Max absolute difference among violations: 563766\n'
308
+ 'Max relative difference among violations: inf')
309
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
310
+ self._assert_func(a, b)
311
+
312
+ a = np.array([34986, 545676, 439655.2, 563766])
313
+ expected_msg = ('Mismatched elements: 2 / 4 (50%)\n'
314
+ 'Mismatch at indices:\n'
315
+ ' [2]: 439655.2 (ACTUAL), 439655 (DESIRED)\n'
316
+ ' [3]: 563766.0 (ACTUAL), 0 (DESIRED)\n'
317
+ 'Max absolute difference among violations: '
318
+ '563766.\n'
319
+ 'Max relative difference among violations: '
320
+ '4.54902139e-07')
321
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
322
+ self._assert_func(a, b)
323
+
324
+ def test_array_vs_scalar_strict(self):
325
+ """Test comparing an array with a scalar with strict option."""
326
+ a = np.array([1., 1., 1.])
327
+ b = 1.
328
+
329
+ with pytest.raises(AssertionError):
330
+ self._assert_func(a, b, strict=True)
331
+
332
+ def test_array_vs_array_strict(self):
333
+ """Test comparing two arrays with strict option."""
334
+ a = np.array([1., 1., 1.])
335
+ b = np.array([1., 1., 1.])
336
+
337
+ self._assert_func(a, b, strict=True)
338
+
339
+ def test_array_vs_float_array_strict(self):
340
+ """Test comparing two arrays with strict option."""
341
+ a = np.array([1, 1, 1])
342
+ b = np.array([1., 1., 1.])
343
+
344
+ with pytest.raises(AssertionError):
345
+ self._assert_func(a, b, strict=True)
346
+
347
+
348
+ class TestBuildErrorMessage:
349
+
350
+ def test_build_err_msg_defaults(self):
351
+ x = np.array([1.00001, 2.00002, 3.00003])
352
+ y = np.array([1.00002, 2.00003, 3.00004])
353
+ err_msg = 'There is a mismatch'
354
+
355
+ a = build_err_msg([x, y], err_msg)
356
+ b = ('\nItems are not equal: There is a mismatch\n ACTUAL: array(['
357
+ '1.00001, 2.00002, 3.00003])\n DESIRED: array([1.00002, '
358
+ '2.00003, 3.00004])')
359
+ assert_equal(a, b)
360
+
361
+ def test_build_err_msg_no_verbose(self):
362
+ x = np.array([1.00001, 2.00002, 3.00003])
363
+ y = np.array([1.00002, 2.00003, 3.00004])
364
+ err_msg = 'There is a mismatch'
365
+
366
+ a = build_err_msg([x, y], err_msg, verbose=False)
367
+ b = '\nItems are not equal: There is a mismatch'
368
+ assert_equal(a, b)
369
+
370
+ def test_build_err_msg_custom_names(self):
371
+ x = np.array([1.00001, 2.00002, 3.00003])
372
+ y = np.array([1.00002, 2.00003, 3.00004])
373
+ err_msg = 'There is a mismatch'
374
+
375
+ a = build_err_msg([x, y], err_msg, names=('FOO', 'BAR'))
376
+ b = ('\nItems are not equal: There is a mismatch\n FOO: array(['
377
+ '1.00001, 2.00002, 3.00003])\n BAR: array([1.00002, 2.00003, '
378
+ '3.00004])')
379
+ assert_equal(a, b)
380
+
381
+ def test_build_err_msg_custom_precision(self):
382
+ x = np.array([1.000000001, 2.00002, 3.00003])
383
+ y = np.array([1.000000002, 2.00003, 3.00004])
384
+ err_msg = 'There is a mismatch'
385
+
386
+ a = build_err_msg([x, y], err_msg, precision=10)
387
+ b = ('\nItems are not equal: There is a mismatch\n ACTUAL: array(['
388
+ '1.000000001, 2.00002 , 3.00003 ])\n DESIRED: array(['
389
+ '1.000000002, 2.00003 , 3.00004 ])')
390
+ assert_equal(a, b)
391
+
392
+
393
+ class TestEqual(TestArrayEqual):
394
+
395
+ def _assert_func(self, *args, **kwargs):
396
+ assert_equal(*args, **kwargs)
397
+
398
+ def test_nan_items(self):
399
+ self._assert_func(np.nan, np.nan)
400
+ self._assert_func([np.nan], [np.nan])
401
+ self._test_not_equal(np.nan, [np.nan])
402
+ self._test_not_equal(np.nan, 1)
403
+
404
+ def test_inf_items(self):
405
+ self._assert_func(np.inf, np.inf)
406
+ self._assert_func([np.inf], [np.inf])
407
+ self._test_not_equal(np.inf, [np.inf])
408
+
409
+ def test_datetime(self):
410
+ self._test_equal(
411
+ np.datetime64("2017-01-01", "s"),
412
+ np.datetime64("2017-01-01", "s")
413
+ )
414
+ self._test_equal(
415
+ np.datetime64("2017-01-01", "s"),
416
+ np.datetime64("2017-01-01", "m")
417
+ )
418
+
419
+ # gh-10081
420
+ self._test_not_equal(
421
+ np.datetime64("2017-01-01", "s"),
422
+ np.datetime64("2017-01-02", "s")
423
+ )
424
+ self._test_not_equal(
425
+ np.datetime64("2017-01-01", "s"),
426
+ np.datetime64("2017-01-02", "m")
427
+ )
428
+
429
+ def test_nat_items(self):
430
+ # not a datetime
431
+ nadt_no_unit = np.datetime64("NaT")
432
+ nadt_s = np.datetime64("NaT", "s")
433
+ nadt_d = np.datetime64("NaT", "ns")
434
+ # not a timedelta
435
+ natd_no_unit = np.timedelta64("NaT")
436
+ natd_s = np.timedelta64("NaT", "s")
437
+ natd_d = np.timedelta64("NaT", "ns")
438
+
439
+ dts = [nadt_no_unit, nadt_s, nadt_d]
440
+ tds = [natd_no_unit, natd_s, natd_d]
441
+ for a, b in itertools.product(dts, dts):
442
+ self._assert_func(a, b)
443
+ self._assert_func([a], [b])
444
+ self._test_not_equal([a], b)
445
+
446
+ for a, b in itertools.product(tds, tds):
447
+ self._assert_func(a, b)
448
+ self._assert_func([a], [b])
449
+ self._test_not_equal([a], b)
450
+
451
+ for a, b in itertools.product(tds, dts):
452
+ self._test_not_equal(a, b)
453
+ self._test_not_equal(a, [b])
454
+ self._test_not_equal([a], [b])
455
+ self._test_not_equal([a], np.datetime64("2017-01-01", "s"))
456
+ self._test_not_equal([b], np.datetime64("2017-01-01", "s"))
457
+ self._test_not_equal([a], np.timedelta64(123, "s"))
458
+ self._test_not_equal([b], np.timedelta64(123, "s"))
459
+
460
+ def test_non_numeric(self):
461
+ self._assert_func('ab', 'ab')
462
+ self._test_not_equal('ab', 'abb')
463
+
464
+ def test_complex_item(self):
465
+ self._assert_func(complex(1, 2), complex(1, 2))
466
+ self._assert_func(complex(1, np.nan), complex(1, np.nan))
467
+ self._test_not_equal(complex(1, np.nan), complex(1, 2))
468
+ self._test_not_equal(complex(np.nan, 1), complex(1, np.nan))
469
+ self._test_not_equal(complex(np.nan, np.inf), complex(np.nan, 2))
470
+
471
+ def test_negative_zero(self):
472
+ self._test_not_equal(ncu.PZERO, ncu.NZERO)
473
+
474
+ def test_complex(self):
475
+ x = np.array([complex(1, 2), complex(1, np.nan)])
476
+ y = np.array([complex(1, 2), complex(1, 2)])
477
+ self._assert_func(x, x)
478
+ self._test_not_equal(x, y)
479
+
480
+ def test_object(self):
481
+ # gh-12942
482
+ import datetime
483
+ a = np.array([datetime.datetime(2000, 1, 1),
484
+ datetime.datetime(2000, 1, 2)])
485
+ self._test_not_equal(a, a[::-1])
486
+
487
+
488
+ class TestArrayAlmostEqual(_GenericTest):
489
+
490
+ def _assert_func(self, *args, **kwargs):
491
+ assert_array_almost_equal(*args, **kwargs)
492
+
493
+ def test_closeness(self):
494
+ # Note that in the course of time we ended up with
495
+ # `abs(x - y) < 1.5 * 10**(-decimal)`
496
+ # instead of the previously documented
497
+ # `abs(x - y) < 0.5 * 10**(-decimal)`
498
+ # so this check serves to preserve the wrongness.
499
+
500
+ # test scalars
501
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
502
+ 'Max absolute difference among violations: 1.5\n'
503
+ 'Max relative difference among violations: inf')
504
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
505
+ self._assert_func(1.5, 0.0, decimal=0)
506
+
507
+ # test arrays
508
+ self._assert_func([1.499999], [0.0], decimal=0)
509
+
510
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
511
+ 'Mismatch at index:\n'
512
+ ' [0]: 1.5 (ACTUAL), 0.0 (DESIRED)\n'
513
+ 'Max absolute difference among violations: 1.5\n'
514
+ 'Max relative difference among violations: inf')
515
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
516
+ self._assert_func([1.5], [0.0], decimal=0)
517
+
518
+ a = [1.4999999, 0.00003]
519
+ b = [1.49999991, 0]
520
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
521
+ 'Mismatch at index:\n'
522
+ ' [1]: 3e-05 (ACTUAL), 0.0 (DESIRED)\n'
523
+ 'Max absolute difference among violations: 3.e-05\n'
524
+ 'Max relative difference among violations: inf')
525
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
526
+ self._assert_func(a, b, decimal=7)
527
+
528
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
529
+ 'Mismatch at index:\n'
530
+ ' [1]: 0.0 (ACTUAL), 3e-05 (DESIRED)\n'
531
+ 'Max absolute difference among violations: 3.e-05\n'
532
+ 'Max relative difference among violations: 1.')
533
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
534
+ self._assert_func(b, a, decimal=7)
535
+
536
+ def test_simple(self):
537
+ x = np.array([1234.2222])
538
+ y = np.array([1234.2223])
539
+
540
+ self._assert_func(x, y, decimal=3)
541
+ self._assert_func(x, y, decimal=4)
542
+
543
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
544
+ 'Mismatch at index:\n'
545
+ ' [0]: 1234.2222 (ACTUAL), 1234.2223 (DESIRED)\n'
546
+ 'Max absolute difference among violations: '
547
+ '1.e-04\n'
548
+ 'Max relative difference among violations: '
549
+ '8.10226812e-08')
550
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
551
+ self._assert_func(x, y, decimal=5)
552
+
553
+ def test_array_vs_scalar(self):
554
+ a = [5498.42354, 849.54345, 0.00]
555
+ b = 5498.42354
556
+ expected_msg = ('Mismatched elements: 2 / 3 (66.7%)\n'
557
+ 'Mismatch at indices:\n'
558
+ ' [1]: 849.54345 (ACTUAL), 5498.42354 (DESIRED)\n'
559
+ ' [2]: 0.0 (ACTUAL), 5498.42354 (DESIRED)\n'
560
+ 'Max absolute difference among violations: '
561
+ '5498.42354\n'
562
+ 'Max relative difference among violations: 1.')
563
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
564
+ self._assert_func(a, b, decimal=9)
565
+
566
+ expected_msg = ('Mismatched elements: 2 / 3 (66.7%)\n'
567
+ 'Mismatch at indices:\n'
568
+ ' [1]: 5498.42354 (ACTUAL), 849.54345 (DESIRED)\n'
569
+ ' [2]: 5498.42354 (ACTUAL), 0.0 (DESIRED)\n'
570
+ 'Max absolute difference among violations: '
571
+ '5498.42354\n'
572
+ 'Max relative difference among violations: 5.4722099')
573
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
574
+ self._assert_func(b, a, decimal=9)
575
+
576
+ a = [5498.42354, 0.00]
577
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
578
+ 'Mismatch at index:\n'
579
+ ' [1]: 5498.42354 (ACTUAL), 0.0 (DESIRED)\n'
580
+ 'Max absolute difference among violations: '
581
+ '5498.42354\n'
582
+ 'Max relative difference among violations: inf')
583
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
584
+ self._assert_func(b, a, decimal=7)
585
+
586
+ b = 0
587
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
588
+ 'Mismatch at index:\n'
589
+ ' [0]: 5498.42354 (ACTUAL), 0 (DESIRED)\n'
590
+ 'Max absolute difference among violations: '
591
+ '5498.42354\n'
592
+ 'Max relative difference among violations: inf')
593
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
594
+ self._assert_func(a, b, decimal=7)
595
+
596
+ def test_nan(self):
597
+ anan = np.array([np.nan])
598
+ aone = np.array([1])
599
+ ainf = np.array([np.inf])
600
+ self._assert_func(anan, anan)
601
+ assert_raises(AssertionError,
602
+ lambda: self._assert_func(anan, aone))
603
+ assert_raises(AssertionError,
604
+ lambda: self._assert_func(anan, ainf))
605
+ assert_raises(AssertionError,
606
+ lambda: self._assert_func(ainf, anan))
607
+
608
+ def test_inf(self):
609
+ a = np.array([[1., 2.], [3., 4.]])
610
+ b = a.copy()
611
+ a[0, 0] = np.inf
612
+ assert_raises(AssertionError,
613
+ lambda: self._assert_func(a, b))
614
+ b[0, 0] = -np.inf
615
+ assert_raises(AssertionError,
616
+ lambda: self._assert_func(a, b))
617
+
618
+ def test_complex_inf(self):
619
+ a = np.array([np.inf + 1.j, 2. + 1.j, 3. + 1.j])
620
+ b = a.copy()
621
+ self._assert_func(a, b)
622
+ b[1] = 3. + 1.j
623
+ expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n'
624
+ 'Mismatch at index:\n'
625
+ ' [1]: (2+1j) (ACTUAL), (3+1j) (DESIRED)\n'
626
+ 'Max absolute difference among violations: 1.\n')
627
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
628
+ self._assert_func(a, b)
629
+
630
+ def test_subclass(self):
631
+ a = np.array([[1., 2.], [3., 4.]])
632
+ b = np.ma.masked_array([[1., 2.], [0., 4.]],
633
+ [[False, False], [True, False]])
634
+ self._assert_func(a, b)
635
+ self._assert_func(b, a)
636
+ self._assert_func(b, b)
637
+
638
+ # Test fully masked as well (see gh-11123).
639
+ a = np.ma.MaskedArray(3.5, mask=True)
640
+ b = np.array([3., 4., 6.5])
641
+ self._test_equal(a, b)
642
+ self._test_equal(b, a)
643
+ a = np.ma.masked
644
+ b = np.array([3., 4., 6.5])
645
+ self._test_equal(a, b)
646
+ self._test_equal(b, a)
647
+ a = np.ma.MaskedArray([3., 4., 6.5], mask=[True, True, True])
648
+ b = np.array([1., 2., 3.])
649
+ self._test_equal(a, b)
650
+ self._test_equal(b, a)
651
+ a = np.ma.MaskedArray([3., 4., 6.5], mask=[True, True, True])
652
+ b = np.array(1.)
653
+ self._test_equal(a, b)
654
+ self._test_equal(b, a)
655
+
656
+ def test_subclass_2(self):
657
+ # While we cannot guarantee testing functions will always work for
658
+ # subclasses, the tests should ideally rely only on subclasses having
659
+ # comparison operators, not on them being able to store booleans
660
+ # (which, e.g., astropy Quantity cannot usefully do). See gh-8452.
661
+ class MyArray(np.ndarray):
662
+ def __eq__(self, other):
663
+ return super().__eq__(other).view(np.ndarray)
664
+
665
+ def __lt__(self, other):
666
+ return super().__lt__(other).view(np.ndarray)
667
+
668
+ def all(self, *args, **kwargs):
669
+ return all(self)
670
+
671
+ a = np.array([1., 2.]).view(MyArray)
672
+ self._assert_func(a, a)
673
+
674
+ z = np.array([True, True]).view(MyArray)
675
+ all(z)
676
+ b = np.array([1., 202]).view(MyArray)
677
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
678
+ 'Mismatch at index:\n'
679
+ ' [1]: 2.0 (ACTUAL), 202.0 (DESIRED)\n'
680
+ 'Max absolute difference among violations: 200.\n'
681
+ 'Max relative difference among violations: 0.99009')
682
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
683
+ self._assert_func(a, b)
684
+
685
+ def test_subclass_that_cannot_be_bool(self):
686
+ # While we cannot guarantee testing functions will always work for
687
+ # subclasses, the tests should ideally rely only on subclasses having
688
+ # comparison operators, not on them being able to store booleans
689
+ # (which, e.g., astropy Quantity cannot usefully do). See gh-8452.
690
+ class MyArray(np.ndarray):
691
+ def __eq__(self, other):
692
+ return super().__eq__(other).view(np.ndarray)
693
+
694
+ def __lt__(self, other):
695
+ return super().__lt__(other).view(np.ndarray)
696
+
697
+ def all(self, *args, **kwargs):
698
+ raise NotImplementedError
699
+
700
+ a = np.array([1., 2.]).view(MyArray)
701
+ self._assert_func(a, a)
702
+
703
+
704
+ class TestAlmostEqual(_GenericTest):
705
+
706
+ def _assert_func(self, *args, **kwargs):
707
+ assert_almost_equal(*args, **kwargs)
708
+
709
+ def test_closeness(self):
710
+ # Note that in the course of time we ended up with
711
+ # `abs(x - y) < 1.5 * 10**(-decimal)`
712
+ # instead of the previously documented
713
+ # `abs(x - y) < 0.5 * 10**(-decimal)`
714
+ # so this check serves to preserve the wrongness.
715
+
716
+ # test scalars
717
+ self._assert_func(1.499999, 0.0, decimal=0)
718
+ assert_raises(AssertionError,
719
+ lambda: self._assert_func(1.5, 0.0, decimal=0))
720
+
721
+ # test arrays
722
+ self._assert_func([1.499999], [0.0], decimal=0)
723
+ assert_raises(AssertionError,
724
+ lambda: self._assert_func([1.5], [0.0], decimal=0))
725
+
726
+ def test_nan_item(self):
727
+ self._assert_func(np.nan, np.nan)
728
+ assert_raises(AssertionError,
729
+ lambda: self._assert_func(np.nan, 1))
730
+ assert_raises(AssertionError,
731
+ lambda: self._assert_func(np.nan, np.inf))
732
+ assert_raises(AssertionError,
733
+ lambda: self._assert_func(np.inf, np.nan))
734
+
735
+ def test_inf_item(self):
736
+ self._assert_func(np.inf, np.inf)
737
+ self._assert_func(-np.inf, -np.inf)
738
+ assert_raises(AssertionError,
739
+ lambda: self._assert_func(np.inf, 1))
740
+ assert_raises(AssertionError,
741
+ lambda: self._assert_func(-np.inf, np.inf))
742
+
743
+ def test_simple_item(self):
744
+ self._test_not_equal(1, 2)
745
+
746
+ def test_complex_item(self):
747
+ self._assert_func(complex(1, 2), complex(1, 2))
748
+ self._assert_func(complex(1, np.nan), complex(1, np.nan))
749
+ self._assert_func(complex(np.inf, np.nan), complex(np.inf, np.nan))
750
+ self._test_not_equal(complex(1, np.nan), complex(1, 2))
751
+ self._test_not_equal(complex(np.nan, 1), complex(1, np.nan))
752
+ self._test_not_equal(complex(np.nan, np.inf), complex(np.nan, 2))
753
+
754
+ def test_complex(self):
755
+ x = np.array([complex(1, 2), complex(1, np.nan)])
756
+ z = np.array([complex(1, 2), complex(np.nan, 1)])
757
+ y = np.array([complex(1, 2), complex(1, 2)])
758
+ self._assert_func(x, x)
759
+ self._test_not_equal(x, y)
760
+ self._test_not_equal(x, z)
761
+
762
+ def test_error_message(self):
763
+ """Check the message is formatted correctly for the decimal value.
764
+ Also check the message when input includes inf or nan (gh12200)"""
765
+ x = np.array([1.00000000001, 2.00000000002, 3.00003])
766
+ y = np.array([1.00000000002, 2.00000000003, 3.00004])
767
+
768
+ # Test with a different amount of decimal digits
769
+ expected_msg = ('Mismatched elements: 3 / 3 (100%)\n'
770
+ 'Mismatch at indices:\n'
771
+ ' [0]: 1.00000000001 (ACTUAL), 1.00000000002 (DESIRED)\n'
772
+ ' [1]: 2.00000000002 (ACTUAL), 2.00000000003 (DESIRED)\n'
773
+ ' [2]: 3.00003 (ACTUAL), 3.00004 (DESIRED)\n'
774
+ 'Max absolute difference among violations: 1.e-05\n'
775
+ 'Max relative difference among violations: '
776
+ '3.33328889e-06\n'
777
+ ' ACTUAL: array([1.00000000001, '
778
+ '2.00000000002, '
779
+ '3.00003 ])\n'
780
+ ' DESIRED: array([1.00000000002, 2.00000000003, '
781
+ '3.00004 ])')
782
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
783
+ self._assert_func(x, y, decimal=12)
784
+
785
+ # With the default value of decimal digits, only the 3rd element
786
+ # differs. Note that we only check for the formatting of the arrays
787
+ # themselves.
788
+ expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n'
789
+ 'Mismatch at index:\n'
790
+ ' [2]: 3.00003 (ACTUAL), 3.00004 (DESIRED)\n'
791
+ 'Max absolute difference among violations: 1.e-05\n'
792
+ 'Max relative difference among violations: '
793
+ '3.33328889e-06\n'
794
+ ' ACTUAL: array([1. , 2. , 3.00003])\n'
795
+ ' DESIRED: array([1. , 2. , 3.00004])')
796
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
797
+ self._assert_func(x, y)
798
+
799
+ # Check the error message when input includes inf
800
+ x = np.array([np.inf, 0])
801
+ y = np.array([np.inf, 1])
802
+ expected_msg = ('Mismatched elements: 1 / 2 (50%)\n'
803
+ 'Mismatch at index:\n'
804
+ ' [1]: 0.0 (ACTUAL), 1.0 (DESIRED)\n'
805
+ 'Max absolute difference among violations: 1.\n'
806
+ 'Max relative difference among violations: 1.\n'
807
+ ' ACTUAL: array([inf, 0.])\n'
808
+ ' DESIRED: array([inf, 1.])')
809
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
810
+ self._assert_func(x, y)
811
+
812
+ # Check the error message when dividing by zero
813
+ x = np.array([1, 2])
814
+ y = np.array([0, 0])
815
+ expected_msg = ('Mismatched elements: 2 / 2 (100%)\n'
816
+ 'Mismatch at indices:\n'
817
+ ' [0]: 1 (ACTUAL), 0 (DESIRED)\n'
818
+ ' [1]: 2 (ACTUAL), 0 (DESIRED)\n'
819
+ 'Max absolute difference among violations: 2\n'
820
+ 'Max relative difference among violations: inf')
821
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
822
+ self._assert_func(x, y)
823
+
824
+ def test_error_message_2(self):
825
+ """Check the message is formatted correctly """
826
+ """when either x or y is a scalar."""
827
+ x = 2
828
+ y = np.ones(20)
829
+ expected_msg = ('Mismatched elements: 20 / 20 (100%)\n'
830
+ 'First 5 mismatches are at indices:\n'
831
+ ' [0]: 2 (ACTUAL), 1.0 (DESIRED)\n'
832
+ ' [1]: 2 (ACTUAL), 1.0 (DESIRED)\n'
833
+ ' [2]: 2 (ACTUAL), 1.0 (DESIRED)\n'
834
+ ' [3]: 2 (ACTUAL), 1.0 (DESIRED)\n'
835
+ ' [4]: 2 (ACTUAL), 1.0 (DESIRED)\n'
836
+ 'Max absolute difference among violations: 1.\n'
837
+ 'Max relative difference among violations: 1.')
838
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
839
+ self._assert_func(x, y)
840
+
841
+ y = 2
842
+ x = np.ones(20)
843
+ expected_msg = ('Mismatched elements: 20 / 20 (100%)\n'
844
+ 'First 5 mismatches are at indices:\n'
845
+ ' [0]: 1.0 (ACTUAL), 2 (DESIRED)\n'
846
+ ' [1]: 1.0 (ACTUAL), 2 (DESIRED)\n'
847
+ ' [2]: 1.0 (ACTUAL), 2 (DESIRED)\n'
848
+ ' [3]: 1.0 (ACTUAL), 2 (DESIRED)\n'
849
+ ' [4]: 1.0 (ACTUAL), 2 (DESIRED)\n'
850
+ 'Max absolute difference among violations: 1.\n'
851
+ 'Max relative difference among violations: 0.5')
852
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
853
+ self._assert_func(x, y)
854
+
855
+ def test_subclass_that_cannot_be_bool(self):
856
+ # While we cannot guarantee testing functions will always work for
857
+ # subclasses, the tests should ideally rely only on subclasses having
858
+ # comparison operators, not on them being able to store booleans
859
+ # (which, e.g., astropy Quantity cannot usefully do). See gh-8452.
860
+ class MyArray(np.ndarray):
861
+ def __eq__(self, other):
862
+ return super().__eq__(other).view(np.ndarray)
863
+
864
+ def __lt__(self, other):
865
+ return super().__lt__(other).view(np.ndarray)
866
+
867
+ def all(self, *args, **kwargs):
868
+ raise NotImplementedError
869
+
870
+ a = np.array([1., 2.]).view(MyArray)
871
+ self._assert_func(a, a)
872
+
873
+
874
+ class TestApproxEqual:
875
+
876
+ def _assert_func(self, *args, **kwargs):
877
+ assert_approx_equal(*args, **kwargs)
878
+
879
+ def test_simple_0d_arrays(self):
880
+ x = np.array(1234.22)
881
+ y = np.array(1234.23)
882
+
883
+ self._assert_func(x, y, significant=5)
884
+ self._assert_func(x, y, significant=6)
885
+ assert_raises(AssertionError,
886
+ lambda: self._assert_func(x, y, significant=7))
887
+
888
+ def test_simple_items(self):
889
+ x = 1234.22
890
+ y = 1234.23
891
+
892
+ self._assert_func(x, y, significant=4)
893
+ self._assert_func(x, y, significant=5)
894
+ self._assert_func(x, y, significant=6)
895
+ assert_raises(AssertionError,
896
+ lambda: self._assert_func(x, y, significant=7))
897
+
898
+ def test_nan_array(self):
899
+ anan = np.array(np.nan)
900
+ aone = np.array(1)
901
+ ainf = np.array(np.inf)
902
+ self._assert_func(anan, anan)
903
+ assert_raises(AssertionError, lambda: self._assert_func(anan, aone))
904
+ assert_raises(AssertionError, lambda: self._assert_func(anan, ainf))
905
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, anan))
906
+
907
+ def test_nan_items(self):
908
+ anan = np.array(np.nan)
909
+ aone = np.array(1)
910
+ ainf = np.array(np.inf)
911
+ self._assert_func(anan, anan)
912
+ assert_raises(AssertionError, lambda: self._assert_func(anan, aone))
913
+ assert_raises(AssertionError, lambda: self._assert_func(anan, ainf))
914
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, anan))
915
+
916
+
917
+ class TestArrayAssertLess:
918
+
919
+ def _assert_func(self, *args, **kwargs):
920
+ assert_array_less(*args, **kwargs)
921
+
922
+ def test_simple_arrays(self):
923
+ x = np.array([1.1, 2.2])
924
+ y = np.array([1.2, 2.3])
925
+
926
+ self._assert_func(x, y)
927
+ assert_raises(AssertionError, lambda: self._assert_func(y, x))
928
+
929
+ y = np.array([1.0, 2.3])
930
+
931
+ assert_raises(AssertionError, lambda: self._assert_func(x, y))
932
+ assert_raises(AssertionError, lambda: self._assert_func(y, x))
933
+
934
+ a = np.array([1, 3, 6, 20])
935
+ b = np.array([2, 4, 6, 8])
936
+
937
+ expected_msg = ('Mismatched elements: 2 / 4 (50%)\n'
938
+ 'Mismatch at indices:\n'
939
+ ' [2]: 6 (x), 6 (y)\n'
940
+ ' [3]: 20 (x), 8 (y)\n'
941
+ 'Max absolute difference among violations: 12\n'
942
+ 'Max relative difference among violations: 1.5')
943
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
944
+ self._assert_func(a, b)
945
+
946
+ def test_rank2(self):
947
+ x = np.array([[1.1, 2.2], [3.3, 4.4]])
948
+ y = np.array([[1.2, 2.3], [3.4, 4.5]])
949
+
950
+ self._assert_func(x, y)
951
+ expected_msg = ('Mismatched elements: 4 / 4 (100%)\n'
952
+ 'Mismatch at indices:\n'
953
+ ' [0, 0]: 1.2 (x), 1.1 (y)\n'
954
+ ' [0, 1]: 2.3 (x), 2.2 (y)\n'
955
+ ' [1, 0]: 3.4 (x), 3.3 (y)\n'
956
+ ' [1, 1]: 4.5 (x), 4.4 (y)\n'
957
+ 'Max absolute difference among violations: 0.1\n'
958
+ 'Max relative difference among violations: 0.09090909')
959
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
960
+ self._assert_func(y, x)
961
+
962
+ y = np.array([[1.0, 2.3], [3.4, 4.5]])
963
+ assert_raises(AssertionError, lambda: self._assert_func(x, y))
964
+ assert_raises(AssertionError, lambda: self._assert_func(y, x))
965
+
966
+ def test_rank3(self):
967
+ x = np.ones(shape=(2, 2, 2))
968
+ y = np.ones(shape=(2, 2, 2)) + 1
969
+
970
+ self._assert_func(x, y)
971
+ assert_raises(AssertionError, lambda: self._assert_func(y, x))
972
+
973
+ y[0, 0, 0] = 0
974
+ expected_msg = ('Mismatched elements: 1 / 8 (12.5%)\n'
975
+ 'Mismatch at index:\n'
976
+ ' [0, 0, 0]: 1.0 (x), 0.0 (y)\n'
977
+ 'Max absolute difference among violations: 1.\n'
978
+ 'Max relative difference among violations: inf')
979
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
980
+ self._assert_func(x, y)
981
+
982
+ assert_raises(AssertionError, lambda: self._assert_func(y, x))
983
+
984
+ def test_simple_items(self):
985
+ x = 1.1
986
+ y = 2.2
987
+
988
+ self._assert_func(x, y)
989
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
990
+ 'Max absolute difference among violations: 1.1\n'
991
+ 'Max relative difference among violations: 1.')
992
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
993
+ self._assert_func(y, x)
994
+
995
+ y = np.array([2.2, 3.3])
996
+
997
+ self._assert_func(x, y)
998
+ assert_raises(AssertionError, lambda: self._assert_func(y, x))
999
+
1000
+ y = np.array([1.0, 3.3])
1001
+
1002
+ assert_raises(AssertionError, lambda: self._assert_func(x, y))
1003
+
1004
+ def test_simple_items_and_array(self):
1005
+ x = np.array([[621.345454, 390.5436, 43.54657, 626.4535],
1006
+ [54.54, 627.3399, 13., 405.5435],
1007
+ [543.545, 8.34, 91.543, 333.3]])
1008
+ y = 627.34
1009
+ self._assert_func(x, y)
1010
+
1011
+ y = 8.339999
1012
+ self._assert_func(y, x)
1013
+
1014
+ x = np.array([[3.4536, 2390.5436, 435.54657, 324525.4535],
1015
+ [5449.54, 999090.54, 130303.54, 405.5435],
1016
+ [543.545, 8.34, 91.543, 999090.53999]])
1017
+ y = 999090.54
1018
+
1019
+ expected_msg = ('Mismatched elements: 1 / 12 (8.33%)\n'
1020
+ 'Mismatch at index:\n'
1021
+ ' [1, 1]: 999090.54 (x), 999090.54 (y)\n'
1022
+ 'Max absolute difference among violations: 0.\n'
1023
+ 'Max relative difference among violations: 0.')
1024
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1025
+ self._assert_func(x, y)
1026
+
1027
+ expected_msg = ('Mismatched elements: 12 / 12 (100%)\n'
1028
+ 'First 5 mismatches are at indices:\n'
1029
+ ' [0, 0]: 999090.54 (x), 3.4536 (y)\n'
1030
+ ' [0, 1]: 999090.54 (x), 2390.5436 (y)\n'
1031
+ ' [0, 2]: 999090.54 (x), 435.54657 (y)\n'
1032
+ ' [0, 3]: 999090.54 (x), 324525.4535 (y)\n'
1033
+ ' [1, 0]: 999090.54 (x), 5449.54 (y)\n'
1034
+ 'Max absolute difference among violations: '
1035
+ '999087.0864\n'
1036
+ 'Max relative difference among violations: '
1037
+ '289288.5934676')
1038
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1039
+ self._assert_func(y, x)
1040
+
1041
+ def test_zeroes(self):
1042
+ x = np.array([546456., 0, 15.455])
1043
+ y = np.array(87654.)
1044
+
1045
+ expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n'
1046
+ 'Mismatch at index:\n'
1047
+ ' [0]: 546456.0 (x), 87654.0 (y)\n'
1048
+ 'Max absolute difference among violations: 458802.\n'
1049
+ 'Max relative difference among violations: 5.23423917')
1050
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1051
+ self._assert_func(x, y)
1052
+
1053
+ expected_msg = ('Mismatched elements: 2 / 3 (66.7%)\n'
1054
+ 'Mismatch at indices:\n'
1055
+ ' [1]: 87654.0 (x), 0.0 (y)\n'
1056
+ ' [2]: 87654.0 (x), 15.455 (y)\n'
1057
+ 'Max absolute difference among violations: 87654.\n'
1058
+ 'Max relative difference among violations: '
1059
+ '5670.5626011')
1060
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1061
+ self._assert_func(y, x)
1062
+
1063
+ y = 0
1064
+
1065
+ expected_msg = ('Mismatched elements: 3 / 3 (100%)\n'
1066
+ 'Mismatch at indices:\n'
1067
+ ' [0]: 546456.0 (x), 0 (y)\n'
1068
+ ' [1]: 0.0 (x), 0 (y)\n'
1069
+ ' [2]: 15.455 (x), 0 (y)\n'
1070
+ 'Max absolute difference among violations: 546456.\n'
1071
+ 'Max relative difference among violations: inf')
1072
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1073
+ self._assert_func(x, y)
1074
+
1075
+ expected_msg = ('Mismatched elements: 1 / 3 (33.3%)\n'
1076
+ 'Mismatch at index:\n'
1077
+ ' [1]: 0 (x), 0.0 (y)\n'
1078
+ 'Max absolute difference among violations: 0.\n'
1079
+ 'Max relative difference among violations: inf')
1080
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1081
+ self._assert_func(y, x)
1082
+
1083
+ def test_nan_noncompare(self):
1084
+ anan = np.array(np.nan)
1085
+ aone = np.array(1)
1086
+ ainf = np.array(np.inf)
1087
+ self._assert_func(anan, anan)
1088
+ assert_raises(AssertionError, lambda: self._assert_func(aone, anan))
1089
+ assert_raises(AssertionError, lambda: self._assert_func(anan, aone))
1090
+ assert_raises(AssertionError, lambda: self._assert_func(anan, ainf))
1091
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, anan))
1092
+
1093
+ def test_nan_noncompare_array(self):
1094
+ x = np.array([1.1, 2.2, 3.3])
1095
+ anan = np.array(np.nan)
1096
+
1097
+ assert_raises(AssertionError, lambda: self._assert_func(x, anan))
1098
+ assert_raises(AssertionError, lambda: self._assert_func(anan, x))
1099
+
1100
+ x = np.array([1.1, 2.2, np.nan])
1101
+
1102
+ assert_raises(AssertionError, lambda: self._assert_func(x, anan))
1103
+ assert_raises(AssertionError, lambda: self._assert_func(anan, x))
1104
+
1105
+ y = np.array([1.0, 2.0, np.nan])
1106
+
1107
+ self._assert_func(y, x)
1108
+ assert_raises(AssertionError, lambda: self._assert_func(x, y))
1109
+
1110
+ def test_inf_compare(self):
1111
+ aone = np.array(1)
1112
+ ainf = np.array(np.inf)
1113
+
1114
+ self._assert_func(aone, ainf)
1115
+ self._assert_func(-ainf, aone)
1116
+ self._assert_func(-ainf, ainf)
1117
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, aone))
1118
+ assert_raises(AssertionError, lambda: self._assert_func(aone, -ainf))
1119
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, ainf))
1120
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, -ainf))
1121
+ assert_raises(AssertionError, lambda: self._assert_func(-ainf, -ainf))
1122
+
1123
+ def test_inf_compare_array(self):
1124
+ x = np.array([1.1, 2.2, np.inf])
1125
+ ainf = np.array(np.inf)
1126
+
1127
+ assert_raises(AssertionError, lambda: self._assert_func(x, ainf))
1128
+ assert_raises(AssertionError, lambda: self._assert_func(ainf, x))
1129
+ assert_raises(AssertionError, lambda: self._assert_func(x, -ainf))
1130
+ assert_raises(AssertionError, lambda: self._assert_func(-x, -ainf))
1131
+ assert_raises(AssertionError, lambda: self._assert_func(-ainf, -x))
1132
+ self._assert_func(-ainf, x)
1133
+
1134
+ def test_strict(self):
1135
+ """Test the behavior of the `strict` option."""
1136
+ x = np.zeros(3)
1137
+ y = np.ones(())
1138
+ self._assert_func(x, y)
1139
+ with pytest.raises(AssertionError):
1140
+ self._assert_func(x, y, strict=True)
1141
+ y = np.broadcast_to(y, x.shape)
1142
+ self._assert_func(x, y)
1143
+ with pytest.raises(AssertionError):
1144
+ self._assert_func(x, y.astype(np.float32), strict=True)
1145
+
1146
+ @pytest.mark.filterwarnings(
1147
+ "ignore:.*NumPy warning suppression and assertion utilities are deprecated"
1148
+ ".*:DeprecationWarning")
1149
+ @pytest.mark.thread_unsafe(reason="checks global module & deprecated warnings")
1150
+ class TestWarns:
1151
+
1152
+ def test_warn(self):
1153
+ def f():
1154
+ warnings.warn("yo")
1155
+ return 3
1156
+
1157
+ before_filters = sys.modules['warnings'].filters[:]
1158
+ assert_equal(assert_warns(UserWarning, f), 3)
1159
+ after_filters = sys.modules['warnings'].filters
1160
+
1161
+ assert_raises(AssertionError, assert_no_warnings, f)
1162
+ assert_equal(assert_no_warnings(lambda x: x, 1), 1)
1163
+
1164
+ # Check that the warnings state is unchanged
1165
+ assert_equal(before_filters, after_filters,
1166
+ "assert_warns does not preserver warnings state")
1167
+
1168
+ def test_context_manager(self):
1169
+
1170
+ before_filters = sys.modules['warnings'].filters[:]
1171
+ with assert_warns(UserWarning):
1172
+ warnings.warn("yo")
1173
+ after_filters = sys.modules['warnings'].filters
1174
+
1175
+ def no_warnings():
1176
+ with assert_no_warnings():
1177
+ warnings.warn("yo")
1178
+
1179
+ assert_raises(AssertionError, no_warnings)
1180
+ assert_equal(before_filters, after_filters,
1181
+ "assert_warns does not preserver warnings state")
1182
+
1183
+ def test_args(self):
1184
+ def f(a=0, b=1):
1185
+ warnings.warn("yo")
1186
+ return a + b
1187
+
1188
+ assert assert_warns(UserWarning, f, b=20) == 20
1189
+
1190
+ with pytest.raises(RuntimeError) as exc:
1191
+ # assert_warns cannot do regexp matching, use pytest.warns
1192
+ with assert_warns(UserWarning, match="A"):
1193
+ warnings.warn("B", UserWarning)
1194
+ assert "assert_warns" in str(exc)
1195
+ assert "pytest.warns" in str(exc)
1196
+
1197
+ with pytest.raises(RuntimeError) as exc:
1198
+ # assert_warns cannot do regexp matching, use pytest.warns
1199
+ with assert_warns(UserWarning, wrong="A"):
1200
+ warnings.warn("B", UserWarning)
1201
+ assert "assert_warns" in str(exc)
1202
+ assert "pytest.warns" not in str(exc)
1203
+
1204
+ def test_warn_wrong_warning(self):
1205
+ def f():
1206
+ warnings.warn("yo", DeprecationWarning)
1207
+
1208
+ failed = False
1209
+ with warnings.catch_warnings():
1210
+ warnings.simplefilter("error", DeprecationWarning)
1211
+ try:
1212
+ # Should raise a DeprecationWarning
1213
+ assert_warns(UserWarning, f)
1214
+ failed = True
1215
+ except DeprecationWarning:
1216
+ pass
1217
+
1218
+ if failed:
1219
+ raise AssertionError("wrong warning caught by assert_warn")
1220
+
1221
+
1222
+ class TestAssertAllclose:
1223
+
1224
+ def test_simple(self):
1225
+ x = 1e-3
1226
+ y = 1e-9
1227
+
1228
+ assert_allclose(x, y, atol=1)
1229
+ assert_raises(AssertionError, assert_allclose, x, y)
1230
+
1231
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
1232
+ 'Max absolute difference among violations: 0.001\n'
1233
+ 'Max relative difference among violations: 999999.')
1234
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1235
+ assert_allclose(x, y)
1236
+
1237
+ z = 0
1238
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
1239
+ 'Max absolute difference among violations: 1.e-09\n'
1240
+ 'Max relative difference among violations: inf')
1241
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1242
+ assert_allclose(y, z)
1243
+
1244
+ expected_msg = ('Mismatched elements: 1 / 1 (100%)\n'
1245
+ 'Max absolute difference among violations: 1.e-09\n'
1246
+ 'Max relative difference among violations: 1.')
1247
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1248
+ assert_allclose(z, y)
1249
+
1250
+ a = np.array([x, y, x, y])
1251
+ b = np.array([x, y, x, x])
1252
+
1253
+ assert_allclose(a, b, atol=1)
1254
+ assert_raises(AssertionError, assert_allclose, a, b)
1255
+
1256
+ b[-1] = y * (1 + 1e-8)
1257
+ assert_allclose(a, b)
1258
+ assert_raises(AssertionError, assert_allclose, a, b, rtol=1e-9)
1259
+
1260
+ assert_allclose(6, 10, rtol=0.5)
1261
+ assert_raises(AssertionError, assert_allclose, 10, 6, rtol=0.5)
1262
+
1263
+ b = np.array([x, y, x, x])
1264
+ c = np.array([x, y, x, z])
1265
+ expected_msg = ('Mismatched elements: 1 / 4 (25%)\n'
1266
+ 'Mismatch at index:\n'
1267
+ ' [3]: 0.001 (ACTUAL), 0.0 (DESIRED)\n'
1268
+ 'Max absolute difference among violations: 0.001\n'
1269
+ 'Max relative difference among violations: inf')
1270
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1271
+ assert_allclose(b, c)
1272
+
1273
+ expected_msg = ('Mismatched elements: 1 / 4 (25%)\n'
1274
+ 'Mismatch at index:\n'
1275
+ ' [3]: 0.0 (ACTUAL), 0.001 (DESIRED)\n'
1276
+ 'Max absolute difference among violations: 0.001\n'
1277
+ 'Max relative difference among violations: 1.')
1278
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1279
+ assert_allclose(c, b)
1280
+
1281
+ def test_min_int(self):
1282
+ a = np.array([np.iinfo(np.int_).min], dtype=np.int_)
1283
+ # Should not raise:
1284
+ assert_allclose(a, a)
1285
+
1286
+ def test_report_fail_percentage(self):
1287
+ a = np.array([1, 1, 1, 1])
1288
+ b = np.array([1, 1, 1, 2])
1289
+
1290
+ expected_msg = ('Mismatched elements: 1 / 4 (25%)\n'
1291
+ 'Mismatch at index:\n'
1292
+ ' [3]: 1 (ACTUAL), 2 (DESIRED)\n'
1293
+ 'Max absolute difference among violations: 1\n'
1294
+ 'Max relative difference among violations: 0.5')
1295
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1296
+ assert_allclose(a, b)
1297
+
1298
+ def test_equal_nan(self):
1299
+ a = np.array([np.nan])
1300
+ b = np.array([np.nan])
1301
+ # Should not raise:
1302
+ assert_allclose(a, b, equal_nan=True)
1303
+
1304
+ a = np.array([complex(np.nan, np.inf)])
1305
+ b = np.array([complex(np.nan, np.inf)])
1306
+ assert_allclose(a, b, equal_nan=True)
1307
+ b = np.array([complex(np.nan, -np.inf)])
1308
+ assert_allclose(a, b, equal_nan=True)
1309
+
1310
+ def test_not_equal_nan(self):
1311
+ a = np.array([np.nan])
1312
+ b = np.array([np.nan])
1313
+ assert_raises(AssertionError, assert_allclose, a, b, equal_nan=False)
1314
+
1315
+ a = np.array([complex(np.nan, np.inf)])
1316
+ b = np.array([complex(np.nan, np.inf)])
1317
+ assert_raises(AssertionError, assert_allclose, a, b, equal_nan=False)
1318
+
1319
+ def test_equal_nan_default(self):
1320
+ # Make sure equal_nan default behavior remains unchanged. (All
1321
+ # of these functions use assert_array_compare under the hood.)
1322
+ # None of these should raise.
1323
+ a = np.array([np.nan])
1324
+ b = np.array([np.nan])
1325
+ assert_array_equal(a, b)
1326
+ assert_array_almost_equal(a, b)
1327
+ assert_array_less(a, b)
1328
+ assert_allclose(a, b)
1329
+
1330
+ def test_report_max_relative_error(self):
1331
+ a = np.array([0, 1])
1332
+ b = np.array([0, 2])
1333
+
1334
+ expected_msg = 'Max relative difference among violations: 0.5'
1335
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1336
+ assert_allclose(a, b)
1337
+
1338
+ def test_timedelta(self):
1339
+ # see gh-18286
1340
+ a = np.array([[1, 2, 3, "NaT"]], dtype="m8[ns]")
1341
+ assert_allclose(a, a)
1342
+
1343
+ def test_error_message_unsigned(self):
1344
+ """Check the message is formatted correctly when overflow can occur
1345
+ (gh21768)"""
1346
+ # Ensure to test for potential overflow in the case of:
1347
+ # x - y
1348
+ # and
1349
+ # y - x
1350
+ x = np.asarray([0, 1, 8], dtype='uint8')
1351
+ y = np.asarray([4, 4, 4], dtype='uint8')
1352
+ expected_msg = 'Max absolute difference among violations: 4'
1353
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1354
+ assert_allclose(x, y, atol=3)
1355
+
1356
+ def test_strict(self):
1357
+ """Test the behavior of the `strict` option."""
1358
+ x = np.ones(3)
1359
+ y = np.ones(())
1360
+ assert_allclose(x, y)
1361
+ with pytest.raises(AssertionError):
1362
+ assert_allclose(x, y, strict=True)
1363
+ assert_allclose(x, x)
1364
+ with pytest.raises(AssertionError):
1365
+ assert_allclose(x, x.astype(np.float32), strict=True)
1366
+
1367
+ def test_infs(self):
1368
+ a = np.array([np.inf])
1369
+ b = np.array([np.inf])
1370
+ assert_allclose(a, b)
1371
+
1372
+ b = np.array([3.])
1373
+ expected_msg = 'inf location mismatch:'
1374
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1375
+ assert_allclose(a, b)
1376
+
1377
+ b = np.array([-np.inf])
1378
+ expected_msg = 'inf values mismatch:'
1379
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1380
+ assert_allclose(a, b)
1381
+ b = np.array([complex(np.inf, 1.)])
1382
+ expected_msg = 'inf values mismatch:'
1383
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1384
+ assert_allclose(a, b)
1385
+
1386
+ a = np.array([complex(np.inf, 1.)])
1387
+ b = np.array([complex(np.inf, 1.)])
1388
+ assert_allclose(a, b)
1389
+
1390
+ b = np.array([complex(np.inf, 2.)])
1391
+ expected_msg = 'inf values mismatch:'
1392
+ with pytest.raises(AssertionError, match=re.escape(expected_msg)):
1393
+ assert_allclose(a, b)
1394
+
1395
+ class TestArrayAlmostEqualNulp:
1396
+
1397
+ def test_float64_pass(self):
1398
+ # The number of units of least precision
1399
+ # In this case, use a few places above the lowest level (ie nulp=1)
1400
+ nulp = 5
1401
+ x = np.linspace(-20, 20, 50, dtype=np.float64)
1402
+ x = 10**x
1403
+ x = np.r_[-x, x]
1404
+
1405
+ # Addition
1406
+ eps = np.finfo(x.dtype).eps
1407
+ y = x + x * eps * nulp / 2.
1408
+ assert_array_almost_equal_nulp(x, y, nulp)
1409
+
1410
+ # Subtraction
1411
+ epsneg = np.finfo(x.dtype).epsneg
1412
+ y = x - x * epsneg * nulp / 2.
1413
+ assert_array_almost_equal_nulp(x, y, nulp)
1414
+
1415
+ def test_float64_fail(self):
1416
+ nulp = 5
1417
+ x = np.linspace(-20, 20, 50, dtype=np.float64)
1418
+ x = 10**x
1419
+ x = np.r_[-x, x]
1420
+
1421
+ eps = np.finfo(x.dtype).eps
1422
+ y = x + x * eps * nulp * 2.
1423
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1424
+ x, y, nulp)
1425
+
1426
+ epsneg = np.finfo(x.dtype).epsneg
1427
+ y = x - x * epsneg * nulp * 2.
1428
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1429
+ x, y, nulp)
1430
+
1431
+ def test_float64_ignore_nan(self):
1432
+ # Ignore ULP differences between various NAN's
1433
+ # Note that MIPS may reverse quiet and signaling nans
1434
+ # so we use the builtin version as a base.
1435
+ offset = np.uint64(0xffffffff)
1436
+ nan1_i64 = np.array(np.nan, dtype=np.float64).view(np.uint64)
1437
+ nan2_i64 = nan1_i64 ^ offset # nan payload on MIPS is all ones.
1438
+ nan1_f64 = nan1_i64.view(np.float64)
1439
+ nan2_f64 = nan2_i64.view(np.float64)
1440
+ assert_array_max_ulp(nan1_f64, nan2_f64, 0)
1441
+
1442
+ def test_float32_pass(self):
1443
+ nulp = 5
1444
+ x = np.linspace(-20, 20, 50, dtype=np.float32)
1445
+ x = 10**x
1446
+ x = np.r_[-x, x]
1447
+
1448
+ eps = np.finfo(x.dtype).eps
1449
+ y = x + x * eps * nulp / 2.
1450
+ assert_array_almost_equal_nulp(x, y, nulp)
1451
+
1452
+ epsneg = np.finfo(x.dtype).epsneg
1453
+ y = x - x * epsneg * nulp / 2.
1454
+ assert_array_almost_equal_nulp(x, y, nulp)
1455
+
1456
+ def test_float32_fail(self):
1457
+ nulp = 5
1458
+ x = np.linspace(-20, 20, 50, dtype=np.float32)
1459
+ x = 10**x
1460
+ x = np.r_[-x, x]
1461
+
1462
+ eps = np.finfo(x.dtype).eps
1463
+ y = x + x * eps * nulp * 2.
1464
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1465
+ x, y, nulp)
1466
+
1467
+ epsneg = np.finfo(x.dtype).epsneg
1468
+ y = x - x * epsneg * nulp * 2.
1469
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1470
+ x, y, nulp)
1471
+
1472
+ def test_float32_ignore_nan(self):
1473
+ # Ignore ULP differences between various NAN's
1474
+ # Note that MIPS may reverse quiet and signaling nans
1475
+ # so we use the builtin version as a base.
1476
+ offset = np.uint32(0xffff)
1477
+ nan1_i32 = np.array(np.nan, dtype=np.float32).view(np.uint32)
1478
+ nan2_i32 = nan1_i32 ^ offset # nan payload on MIPS is all ones.
1479
+ nan1_f32 = nan1_i32.view(np.float32)
1480
+ nan2_f32 = nan2_i32.view(np.float32)
1481
+ assert_array_max_ulp(nan1_f32, nan2_f32, 0)
1482
+
1483
+ def test_float16_pass(self):
1484
+ nulp = 5
1485
+ x = np.linspace(-4, 4, 10, dtype=np.float16)
1486
+ x = 10**x
1487
+ x = np.r_[-x, x]
1488
+
1489
+ eps = np.finfo(x.dtype).eps
1490
+ y = x + x * eps * nulp / 2.
1491
+ assert_array_almost_equal_nulp(x, y, nulp)
1492
+
1493
+ epsneg = np.finfo(x.dtype).epsneg
1494
+ y = x - x * epsneg * nulp / 2.
1495
+ assert_array_almost_equal_nulp(x, y, nulp)
1496
+
1497
+ def test_float16_fail(self):
1498
+ nulp = 5
1499
+ x = np.linspace(-4, 4, 10, dtype=np.float16)
1500
+ x = 10**x
1501
+ x = np.r_[-x, x]
1502
+
1503
+ eps = np.finfo(x.dtype).eps
1504
+ y = x + x * eps * nulp * 2.
1505
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1506
+ x, y, nulp)
1507
+
1508
+ epsneg = np.finfo(x.dtype).epsneg
1509
+ y = x - x * epsneg * nulp * 2.
1510
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1511
+ x, y, nulp)
1512
+
1513
+ def test_float16_ignore_nan(self):
1514
+ # Ignore ULP differences between various NAN's
1515
+ # Note that MIPS may reverse quiet and signaling nans
1516
+ # so we use the builtin version as a base.
1517
+ offset = np.uint16(0xff)
1518
+ nan1_i16 = np.array(np.nan, dtype=np.float16).view(np.uint16)
1519
+ nan2_i16 = nan1_i16 ^ offset # nan payload on MIPS is all ones.
1520
+ nan1_f16 = nan1_i16.view(np.float16)
1521
+ nan2_f16 = nan2_i16.view(np.float16)
1522
+ assert_array_max_ulp(nan1_f16, nan2_f16, 0)
1523
+
1524
+ def test_complex128_pass(self):
1525
+ nulp = 5
1526
+ x = np.linspace(-20, 20, 50, dtype=np.float64)
1527
+ x = 10**x
1528
+ x = np.r_[-x, x]
1529
+ xi = x + x * 1j
1530
+
1531
+ eps = np.finfo(x.dtype).eps
1532
+ y = x + x * eps * nulp / 2.
1533
+ assert_array_almost_equal_nulp(xi, x + y * 1j, nulp)
1534
+ assert_array_almost_equal_nulp(xi, y + x * 1j, nulp)
1535
+ # The test condition needs to be at least a factor of sqrt(2) smaller
1536
+ # because the real and imaginary parts both change
1537
+ y = x + x * eps * nulp / 4.
1538
+ assert_array_almost_equal_nulp(xi, y + y * 1j, nulp)
1539
+
1540
+ epsneg = np.finfo(x.dtype).epsneg
1541
+ y = x - x * epsneg * nulp / 2.
1542
+ assert_array_almost_equal_nulp(xi, x + y * 1j, nulp)
1543
+ assert_array_almost_equal_nulp(xi, y + x * 1j, nulp)
1544
+ y = x - x * epsneg * nulp / 4.
1545
+ assert_array_almost_equal_nulp(xi, y + y * 1j, nulp)
1546
+
1547
+ def test_complex128_fail(self):
1548
+ nulp = 5
1549
+ x = np.linspace(-20, 20, 50, dtype=np.float64)
1550
+ x = 10**x
1551
+ x = np.r_[-x, x]
1552
+ xi = x + x * 1j
1553
+
1554
+ eps = np.finfo(x.dtype).eps
1555
+ y = x + x * eps * nulp * 2.
1556
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1557
+ xi, x + y * 1j, nulp)
1558
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1559
+ xi, y + x * 1j, nulp)
1560
+ # The test condition needs to be at least a factor of sqrt(2) smaller
1561
+ # because the real and imaginary parts both change
1562
+ y = x + x * eps * nulp
1563
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1564
+ xi, y + y * 1j, nulp)
1565
+
1566
+ epsneg = np.finfo(x.dtype).epsneg
1567
+ y = x - x * epsneg * nulp * 2.
1568
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1569
+ xi, x + y * 1j, nulp)
1570
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1571
+ xi, y + x * 1j, nulp)
1572
+ y = x - x * epsneg * nulp
1573
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1574
+ xi, y + y * 1j, nulp)
1575
+
1576
+ def test_complex64_pass(self):
1577
+ nulp = 5
1578
+ x = np.linspace(-20, 20, 50, dtype=np.float32)
1579
+ x = 10**x
1580
+ x = np.r_[-x, x]
1581
+ xi = x + x * 1j
1582
+
1583
+ eps = np.finfo(x.dtype).eps
1584
+ y = x + x * eps * nulp / 2.
1585
+ assert_array_almost_equal_nulp(xi, x + y * 1j, nulp)
1586
+ assert_array_almost_equal_nulp(xi, y + x * 1j, nulp)
1587
+ y = x + x * eps * nulp / 4.
1588
+ assert_array_almost_equal_nulp(xi, y + y * 1j, nulp)
1589
+
1590
+ epsneg = np.finfo(x.dtype).epsneg
1591
+ y = x - x * epsneg * nulp / 2.
1592
+ assert_array_almost_equal_nulp(xi, x + y * 1j, nulp)
1593
+ assert_array_almost_equal_nulp(xi, y + x * 1j, nulp)
1594
+ y = x - x * epsneg * nulp / 4.
1595
+ assert_array_almost_equal_nulp(xi, y + y * 1j, nulp)
1596
+
1597
+ def test_complex64_fail(self):
1598
+ nulp = 5
1599
+ x = np.linspace(-20, 20, 50, dtype=np.float32)
1600
+ x = 10**x
1601
+ x = np.r_[-x, x]
1602
+ xi = x + x * 1j
1603
+
1604
+ eps = np.finfo(x.dtype).eps
1605
+ y = x + x * eps * nulp * 2.
1606
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1607
+ xi, x + y * 1j, nulp)
1608
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1609
+ xi, y + x * 1j, nulp)
1610
+ y = x + x * eps * nulp
1611
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1612
+ xi, y + y * 1j, nulp)
1613
+
1614
+ epsneg = np.finfo(x.dtype).epsneg
1615
+ y = x - x * epsneg * nulp * 2.
1616
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1617
+ xi, x + y * 1j, nulp)
1618
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1619
+ xi, y + x * 1j, nulp)
1620
+ y = x - x * epsneg * nulp
1621
+ assert_raises(AssertionError, assert_array_almost_equal_nulp,
1622
+ xi, y + y * 1j, nulp)
1623
+
1624
+
1625
+ class TestULP:
1626
+
1627
+ def test_equal(self):
1628
+ x = np.random.randn(10)
1629
+ assert_array_max_ulp(x, x, maxulp=0)
1630
+
1631
+ def test_single(self):
1632
+ # Generate 1 + small deviation, check that adding eps gives a few UNL
1633
+ x = np.ones(10).astype(np.float32)
1634
+ x += 0.01 * np.random.randn(10).astype(np.float32)
1635
+ eps = np.finfo(np.float32).eps
1636
+ assert_array_max_ulp(x, x + eps, maxulp=20)
1637
+
1638
+ def test_double(self):
1639
+ # Generate 1 + small deviation, check that adding eps gives a few UNL
1640
+ x = np.ones(10).astype(np.float64)
1641
+ x += 0.01 * np.random.randn(10).astype(np.float64)
1642
+ eps = np.finfo(np.float64).eps
1643
+ assert_array_max_ulp(x, x + eps, maxulp=200)
1644
+
1645
+ def test_inf(self):
1646
+ for dt in [np.float32, np.float64]:
1647
+ inf = np.array([np.inf]).astype(dt)
1648
+ big = np.array([np.finfo(dt).max])
1649
+ assert_array_max_ulp(inf, big, maxulp=200)
1650
+
1651
+ def test_nan(self):
1652
+ # Test that nan is 'far' from small, tiny, inf, max and min
1653
+ for dt in [np.float32, np.float64]:
1654
+ if dt == np.float32:
1655
+ maxulp = 1e6
1656
+ else:
1657
+ maxulp = 1e12
1658
+ inf = np.array([np.inf]).astype(dt)
1659
+ nan = np.array([np.nan]).astype(dt)
1660
+ big = np.array([np.finfo(dt).max])
1661
+ tiny = np.array([np.finfo(dt).tiny])
1662
+ zero = np.array([0.0]).astype(dt)
1663
+ nzero = np.array([-0.0]).astype(dt)
1664
+ assert_raises(AssertionError,
1665
+ lambda: assert_array_max_ulp(nan, inf,
1666
+ maxulp=maxulp))
1667
+ assert_raises(AssertionError,
1668
+ lambda: assert_array_max_ulp(nan, big,
1669
+ maxulp=maxulp))
1670
+ assert_raises(AssertionError,
1671
+ lambda: assert_array_max_ulp(nan, tiny,
1672
+ maxulp=maxulp))
1673
+ assert_raises(AssertionError,
1674
+ lambda: assert_array_max_ulp(nan, zero,
1675
+ maxulp=maxulp))
1676
+ assert_raises(AssertionError,
1677
+ lambda: assert_array_max_ulp(nan, nzero,
1678
+ maxulp=maxulp))
1679
+
1680
+
1681
+ class TestStringEqual:
1682
+ def test_simple(self):
1683
+ assert_string_equal("hello", "hello")
1684
+ assert_string_equal("hello\nmultiline", "hello\nmultiline")
1685
+
1686
+ with pytest.raises(AssertionError) as exc_info:
1687
+ assert_string_equal("foo\nbar", "hello\nbar")
1688
+ msg = str(exc_info.value)
1689
+ assert_equal(msg, "Differences in strings:\n- foo\n+ hello")
1690
+
1691
+ assert_raises(AssertionError,
1692
+ lambda: assert_string_equal("foo", "hello"))
1693
+
1694
+ def test_regex(self):
1695
+ assert_string_equal("a+*b", "a+*b")
1696
+
1697
+ assert_raises(AssertionError,
1698
+ lambda: assert_string_equal("aaa", "a+b"))
1699
+
1700
+
1701
+ def assert_warn_len_equal(mod, n_in_context):
1702
+ try:
1703
+ mod_warns = mod.__warningregistry__
1704
+ except AttributeError:
1705
+ # the lack of a __warningregistry__
1706
+ # attribute means that no warning has
1707
+ # occurred; this can be triggered in
1708
+ # a parallel test scenario, while in
1709
+ # a serial test scenario an initial
1710
+ # warning (and therefore the attribute)
1711
+ # are always created first
1712
+ mod_warns = {}
1713
+
1714
+ num_warns = len(mod_warns)
1715
+
1716
+ if 'version' in mod_warns:
1717
+ # Python adds a 'version' entry to the registry,
1718
+ # do not count it.
1719
+ num_warns -= 1
1720
+
1721
+ assert_equal(num_warns, n_in_context)
1722
+
1723
+
1724
+ def test_warn_len_equal_call_scenarios():
1725
+ # assert_warn_len_equal is called under
1726
+ # varying circumstances depending on serial
1727
+ # vs. parallel test scenarios; this test
1728
+ # simply aims to probe both code paths and
1729
+ # check that no assertion is uncaught
1730
+
1731
+ # parallel scenario -- no warning issued yet
1732
+ class mod:
1733
+ pass
1734
+
1735
+ mod_inst = mod()
1736
+
1737
+ assert_warn_len_equal(mod=mod_inst,
1738
+ n_in_context=0)
1739
+
1740
+ # serial test scenario -- the __warningregistry__
1741
+ # attribute should be present
1742
+ class mod:
1743
+ def __init__(self):
1744
+ self.__warningregistry__ = {'warning1': 1,
1745
+ 'warning2': 2}
1746
+
1747
+ mod_inst = mod()
1748
+ assert_warn_len_equal(mod=mod_inst,
1749
+ n_in_context=2)
1750
+
1751
+
1752
+ def _get_fresh_mod():
1753
+ # Get this module, with warning registry empty
1754
+ my_mod = sys.modules[__name__]
1755
+ try:
1756
+ my_mod.__warningregistry__.clear()
1757
+ except AttributeError:
1758
+ # will not have a __warningregistry__ unless warning has been
1759
+ # raised in the module at some point
1760
+ pass
1761
+ return my_mod
1762
+
1763
+
1764
+ @pytest.mark.thread_unsafe(reason="checks global module & deprecated warnings")
1765
+ def test_clear_and_catch_warnings():
1766
+ # Initial state of module, no warnings
1767
+ my_mod = _get_fresh_mod()
1768
+ assert_equal(getattr(my_mod, '__warningregistry__', {}), {})
1769
+ with clear_and_catch_warnings(modules=[my_mod]):
1770
+ warnings.simplefilter('ignore')
1771
+ warnings.warn('Some warning')
1772
+ assert_equal(my_mod.__warningregistry__, {})
1773
+ # Without specified modules, don't clear warnings during context.
1774
+ # catch_warnings doesn't make an entry for 'ignore'.
1775
+ with clear_and_catch_warnings():
1776
+ warnings.simplefilter('ignore')
1777
+ warnings.warn('Some warning')
1778
+ assert_warn_len_equal(my_mod, 0)
1779
+
1780
+ # Manually adding two warnings to the registry:
1781
+ my_mod.__warningregistry__ = {'warning1': 1,
1782
+ 'warning2': 2}
1783
+
1784
+ # Confirm that specifying module keeps old warning, does not add new
1785
+ with clear_and_catch_warnings(modules=[my_mod]):
1786
+ warnings.simplefilter('ignore')
1787
+ warnings.warn('Another warning')
1788
+ assert_warn_len_equal(my_mod, 2)
1789
+
1790
+ # Another warning, no module spec it clears up registry
1791
+ with clear_and_catch_warnings():
1792
+ warnings.simplefilter('ignore')
1793
+ warnings.warn('Another warning')
1794
+ assert_warn_len_equal(my_mod, 0)
1795
+
1796
+
1797
+ @pytest.mark.filterwarnings(
1798
+ "ignore:.*NumPy warning suppression and assertion utilities are deprecated"
1799
+ ".*:DeprecationWarning")
1800
+ @pytest.mark.thread_unsafe(reason="checks global module & deprecated warnings")
1801
+ def test_suppress_warnings_module():
1802
+ # Initial state of module, no warnings
1803
+ my_mod = _get_fresh_mod()
1804
+ assert_equal(getattr(my_mod, '__warningregistry__', {}), {})
1805
+
1806
+ def warn_other_module():
1807
+ # Apply along axis is implemented in python; stacklevel=2 means
1808
+ # we end up inside its module, not ours.
1809
+ def warn(arr):
1810
+ warnings.warn("Some warning 2", stacklevel=2)
1811
+ return arr
1812
+ np.apply_along_axis(warn, 0, [0])
1813
+
1814
+ # Test module based warning suppression:
1815
+ assert_warn_len_equal(my_mod, 0)
1816
+ with suppress_warnings() as sup:
1817
+ sup.record(UserWarning)
1818
+ # suppress warning from other module (may have .pyc ending),
1819
+ # if apply_along_axis is moved, had to be changed.
1820
+ sup.filter(module=np.lib._shape_base_impl)
1821
+ warnings.warn("Some warning")
1822
+ warn_other_module()
1823
+ # Check that the suppression did test the file correctly (this module
1824
+ # got filtered)
1825
+ assert_equal(len(sup.log), 1)
1826
+ assert_equal(sup.log[0].message.args[0], "Some warning")
1827
+ assert_warn_len_equal(my_mod, 0)
1828
+ sup = suppress_warnings()
1829
+ # Will have to be changed if apply_along_axis is moved:
1830
+ sup.filter(module=my_mod)
1831
+ with sup:
1832
+ warnings.warn('Some warning')
1833
+ assert_warn_len_equal(my_mod, 0)
1834
+ # And test repeat works:
1835
+ sup.filter(module=my_mod)
1836
+ with sup:
1837
+ warnings.warn('Some warning')
1838
+ assert_warn_len_equal(my_mod, 0)
1839
+
1840
+ # Without specified modules
1841
+ with suppress_warnings():
1842
+ warnings.simplefilter('ignore')
1843
+ warnings.warn('Some warning')
1844
+ assert_warn_len_equal(my_mod, 0)
1845
+
1846
+
1847
+ @pytest.mark.filterwarnings(
1848
+ "ignore:.*NumPy warning suppression and assertion utilities are deprecated"
1849
+ ".*:DeprecationWarning")
1850
+ @pytest.mark.thread_unsafe(reason="checks global module & deprecated warnings")
1851
+ def test_suppress_warnings_type():
1852
+ # Initial state of module, no warnings
1853
+ my_mod = _get_fresh_mod()
1854
+ assert_equal(getattr(my_mod, '__warningregistry__', {}), {})
1855
+
1856
+ # Test module based warning suppression:
1857
+ with suppress_warnings() as sup:
1858
+ sup.filter(UserWarning)
1859
+ warnings.warn('Some warning')
1860
+ assert_warn_len_equal(my_mod, 0)
1861
+ sup = suppress_warnings()
1862
+ sup.filter(UserWarning)
1863
+ with sup:
1864
+ warnings.warn('Some warning')
1865
+ assert_warn_len_equal(my_mod, 0)
1866
+ # And test repeat works:
1867
+ sup.filter(module=my_mod)
1868
+ with sup:
1869
+ warnings.warn('Some warning')
1870
+ assert_warn_len_equal(my_mod, 0)
1871
+
1872
+ # Without specified modules
1873
+ with suppress_warnings():
1874
+ warnings.simplefilter('ignore')
1875
+ warnings.warn('Some warning')
1876
+ assert_warn_len_equal(my_mod, 0)
1877
+
1878
+
1879
+ @pytest.mark.filterwarnings(
1880
+ "ignore:.*NumPy warning suppression and assertion utilities are deprecated"
1881
+ ".*:DeprecationWarning")
1882
+ @pytest.mark.thread_unsafe(
1883
+ reason="uses deprecated thread-unsafe warnings control utilities"
1884
+ )
1885
+ def test_suppress_warnings_decorate_no_record():
1886
+ sup = suppress_warnings()
1887
+ sup.filter(UserWarning)
1888
+
1889
+ @sup
1890
+ def warn(category):
1891
+ warnings.warn('Some warning', category)
1892
+
1893
+ with warnings.catch_warnings(record=True) as w:
1894
+ warnings.simplefilter("always")
1895
+ warn(UserWarning) # should be suppressed
1896
+ warn(RuntimeWarning)
1897
+ assert_equal(len(w), 1)
1898
+
1899
+
1900
+ @pytest.mark.filterwarnings(
1901
+ "ignore:.*NumPy warning suppression and assertion utilities are deprecated"
1902
+ ".*:DeprecationWarning")
1903
+ @pytest.mark.thread_unsafe(
1904
+ reason="uses deprecated thread-unsafe warnings control utilities"
1905
+ )
1906
+ def test_suppress_warnings_record():
1907
+ sup = suppress_warnings()
1908
+ log1 = sup.record()
1909
+
1910
+ with sup:
1911
+ log2 = sup.record(message='Some other warning 2')
1912
+ sup.filter(message='Some warning')
1913
+ warnings.warn('Some warning')
1914
+ warnings.warn('Some other warning')
1915
+ warnings.warn('Some other warning 2')
1916
+
1917
+ assert_equal(len(sup.log), 2)
1918
+ assert_equal(len(log1), 1)
1919
+ assert_equal(len(log2), 1)
1920
+ assert_equal(log2[0].message.args[0], 'Some other warning 2')
1921
+
1922
+ # Do it again, with the same context to see if some warnings survived:
1923
+ with sup:
1924
+ log2 = sup.record(message='Some other warning 2')
1925
+ sup.filter(message='Some warning')
1926
+ warnings.warn('Some warning')
1927
+ warnings.warn('Some other warning')
1928
+ warnings.warn('Some other warning 2')
1929
+
1930
+ assert_equal(len(sup.log), 2)
1931
+ assert_equal(len(log1), 1)
1932
+ assert_equal(len(log2), 1)
1933
+ assert_equal(log2[0].message.args[0], 'Some other warning 2')
1934
+
1935
+ # Test nested:
1936
+ with suppress_warnings() as sup:
1937
+ sup.record()
1938
+ with suppress_warnings() as sup2:
1939
+ sup2.record(message='Some warning')
1940
+ warnings.warn('Some warning')
1941
+ warnings.warn('Some other warning')
1942
+ assert_equal(len(sup2.log), 1)
1943
+ # includes a DeprecationWarning for suppress_warnings
1944
+ assert_equal(len(sup.log), 2)
1945
+
1946
+
1947
+ @pytest.mark.filterwarnings(
1948
+ "ignore:.*NumPy warning suppression and assertion utilities are deprecated"
1949
+ ".*:DeprecationWarning")
1950
+ @pytest.mark.thread_unsafe(
1951
+ reason="uses deprecated thread-unsafe warnings control utilities"
1952
+ )
1953
+ def test_suppress_warnings_forwarding():
1954
+ def warn_other_module():
1955
+ # Apply along axis is implemented in python; stacklevel=2 means
1956
+ # we end up inside its module, not ours.
1957
+ def warn(arr):
1958
+ warnings.warn("Some warning", stacklevel=2)
1959
+ return arr
1960
+ np.apply_along_axis(warn, 0, [0])
1961
+
1962
+ with suppress_warnings() as sup:
1963
+ sup.record()
1964
+ with suppress_warnings("always"):
1965
+ for i in range(2):
1966
+ warnings.warn("Some warning")
1967
+
1968
+ # includes a DeprecationWarning for suppress_warnings
1969
+ assert_equal(len(sup.log), 3)
1970
+
1971
+ with suppress_warnings() as sup:
1972
+ sup.record()
1973
+ with suppress_warnings("location"):
1974
+ for i in range(2):
1975
+ warnings.warn("Some warning")
1976
+ warnings.warn("Some warning")
1977
+
1978
+ # includes a DeprecationWarning for suppress_warnings
1979
+ assert_equal(len(sup.log), 3)
1980
+
1981
+ with suppress_warnings() as sup:
1982
+ sup.record()
1983
+ with suppress_warnings("module"):
1984
+ for i in range(2):
1985
+ warnings.warn("Some warning")
1986
+ warnings.warn("Some warning")
1987
+ warn_other_module()
1988
+
1989
+ # includes a DeprecationWarning for suppress_warnings
1990
+ assert_equal(len(sup.log), 3)
1991
+
1992
+ with suppress_warnings() as sup:
1993
+ sup.record()
1994
+ with suppress_warnings("once"):
1995
+ for i in range(2):
1996
+ warnings.warn("Some warning")
1997
+ warnings.warn("Some other warning")
1998
+ warn_other_module()
1999
+
2000
+ # includes a DeprecationWarning for suppress_warnings
2001
+ assert_equal(len(sup.log), 3)
2002
+
2003
+
2004
+ def test_tempdir():
2005
+ with tempdir() as tdir:
2006
+ fpath = os.path.join(tdir, 'tmp')
2007
+ with open(fpath, 'w'):
2008
+ pass
2009
+ assert_(not os.path.isdir(tdir))
2010
+
2011
+ raised = False
2012
+ try:
2013
+ with tempdir() as tdir:
2014
+ raise ValueError
2015
+ except ValueError:
2016
+ raised = True
2017
+ assert_(raised)
2018
+ assert_(not os.path.isdir(tdir))
2019
+
2020
+
2021
+ def test_temppath():
2022
+ with temppath() as fpath:
2023
+ with open(fpath, 'w'):
2024
+ pass
2025
+ assert_(not os.path.isfile(fpath))
2026
+
2027
+ raised = False
2028
+ try:
2029
+ with temppath() as fpath:
2030
+ raise ValueError
2031
+ except ValueError:
2032
+ raised = True
2033
+ assert_(raised)
2034
+ assert_(not os.path.isfile(fpath))
2035
+
2036
+
2037
+ class my_cacw(clear_and_catch_warnings):
2038
+
2039
+ class_modules = (sys.modules[__name__],)
2040
+
2041
+
2042
+ @pytest.mark.thread_unsafe(reason="checks global module & deprecated warnings")
2043
+ def test_clear_and_catch_warnings_inherit():
2044
+ # Test can subclass and add default modules
2045
+ my_mod = _get_fresh_mod()
2046
+ with my_cacw():
2047
+ warnings.simplefilter('ignore')
2048
+ warnings.warn('Some warning')
2049
+ assert_equal(my_mod.__warningregistry__, {})
2050
+
2051
+
2052
+ @pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts")
2053
+ @pytest.mark.thread_unsafe(reason="garbage collector is global state")
2054
+ class TestAssertNoGcCycles:
2055
+ """ Test assert_no_gc_cycles """
2056
+
2057
+ def test_passes(self):
2058
+ def no_cycle():
2059
+ b = []
2060
+ b.append([])
2061
+ return b
2062
+
2063
+ with assert_no_gc_cycles():
2064
+ no_cycle()
2065
+
2066
+ assert_no_gc_cycles(no_cycle)
2067
+
2068
+ def test_asserts(self):
2069
+ def make_cycle():
2070
+ a = []
2071
+ a.append(a)
2072
+ a.append(a)
2073
+ return a
2074
+
2075
+ with assert_raises(AssertionError):
2076
+ with assert_no_gc_cycles():
2077
+ make_cycle()
2078
+
2079
+ with assert_raises(AssertionError):
2080
+ assert_no_gc_cycles(make_cycle)
2081
+
2082
+ @pytest.mark.slow
2083
+ def test_fails(self):
2084
+ """
2085
+ Test that in cases where the garbage cannot be collected, we raise an
2086
+ error, instead of hanging forever trying to clear it.
2087
+ """
2088
+
2089
+ class ReferenceCycleInDel:
2090
+ """
2091
+ An object that not only contains a reference cycle, but creates new
2092
+ cycles whenever it's garbage-collected and its __del__ runs
2093
+ """
2094
+ make_cycle = True
2095
+
2096
+ def __init__(self):
2097
+ self.cycle = self
2098
+
2099
+ def __del__(self):
2100
+ # break the current cycle so that `self` can be freed
2101
+ self.cycle = None
2102
+
2103
+ if ReferenceCycleInDel.make_cycle:
2104
+ # but create a new one so that the garbage collector (GC) has more
2105
+ # work to do.
2106
+ ReferenceCycleInDel()
2107
+
2108
+ try:
2109
+ w = weakref.ref(ReferenceCycleInDel())
2110
+ try:
2111
+ with assert_raises(RuntimeError):
2112
+ # this will be unable to get a baseline empty garbage
2113
+ assert_no_gc_cycles(lambda: None)
2114
+ except AssertionError:
2115
+ # the above test is only necessary if the GC actually tried to free
2116
+ # our object anyway.
2117
+ if w() is not None:
2118
+ pytest.skip("GC does not call __del__ on cyclic objects")
2119
+ raise
2120
+
2121
+ finally:
2122
+ # make sure that we stop creating reference cycles
2123
+ ReferenceCycleInDel.make_cycle = False