numpy 2.4.0__cp313-cp313t-musllinux_1_2_aarch64.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 (915) 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.cpython-313t-aarch64-linux-musl.so +0 -0
  30. numpy/_core/_multiarray_umath.cpython-313t-aarch64-linux-musl.so +0 -0
  31. numpy/_core/_operand_flag_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  32. numpy/_core/_rational_tests.cpython-313t-aarch64-linux-musl.so +0 -0
  33. numpy/_core/_simd.cpython-313t-aarch64-linux-musl.so +0 -0
  34. numpy/_core/_simd.pyi +35 -0
  35. numpy/_core/_string_helpers.py +100 -0
  36. numpy/_core/_string_helpers.pyi +12 -0
  37. numpy/_core/_struct_ufunc_tests.cpython-313t-aarch64-linux-musl.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.cpython-313t-aarch64-linux-musl.so +0 -0
  43. numpy/_core/_umath_tests.pyi +47 -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 +353 -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 +1515 -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/doc/ufuncs.py +138 -0
  278. numpy/dtypes.py +41 -0
  279. numpy/dtypes.pyi +630 -0
  280. numpy/exceptions.py +246 -0
  281. numpy/exceptions.pyi +27 -0
  282. numpy/f2py/__init__.py +86 -0
  283. numpy/f2py/__init__.pyi +5 -0
  284. numpy/f2py/__main__.py +5 -0
  285. numpy/f2py/__version__.py +1 -0
  286. numpy/f2py/__version__.pyi +1 -0
  287. numpy/f2py/_backends/__init__.py +9 -0
  288. numpy/f2py/_backends/__init__.pyi +5 -0
  289. numpy/f2py/_backends/_backend.py +44 -0
  290. numpy/f2py/_backends/_backend.pyi +46 -0
  291. numpy/f2py/_backends/_distutils.py +76 -0
  292. numpy/f2py/_backends/_distutils.pyi +13 -0
  293. numpy/f2py/_backends/_meson.py +244 -0
  294. numpy/f2py/_backends/_meson.pyi +62 -0
  295. numpy/f2py/_backends/meson.build.template +58 -0
  296. numpy/f2py/_isocbind.py +62 -0
  297. numpy/f2py/_isocbind.pyi +13 -0
  298. numpy/f2py/_src_pyf.py +247 -0
  299. numpy/f2py/_src_pyf.pyi +28 -0
  300. numpy/f2py/auxfuncs.py +1004 -0
  301. numpy/f2py/auxfuncs.pyi +262 -0
  302. numpy/f2py/capi_maps.py +811 -0
  303. numpy/f2py/capi_maps.pyi +33 -0
  304. numpy/f2py/cb_rules.py +665 -0
  305. numpy/f2py/cb_rules.pyi +17 -0
  306. numpy/f2py/cfuncs.py +1563 -0
  307. numpy/f2py/cfuncs.pyi +31 -0
  308. numpy/f2py/common_rules.py +143 -0
  309. numpy/f2py/common_rules.pyi +9 -0
  310. numpy/f2py/crackfortran.py +3725 -0
  311. numpy/f2py/crackfortran.pyi +266 -0
  312. numpy/f2py/diagnose.py +149 -0
  313. numpy/f2py/diagnose.pyi +1 -0
  314. numpy/f2py/f2py2e.py +788 -0
  315. numpy/f2py/f2py2e.pyi +74 -0
  316. numpy/f2py/f90mod_rules.py +269 -0
  317. numpy/f2py/f90mod_rules.pyi +16 -0
  318. numpy/f2py/func2subr.py +329 -0
  319. numpy/f2py/func2subr.pyi +7 -0
  320. numpy/f2py/rules.py +1629 -0
  321. numpy/f2py/rules.pyi +41 -0
  322. numpy/f2py/setup.cfg +3 -0
  323. numpy/f2py/src/fortranobject.c +1436 -0
  324. numpy/f2py/src/fortranobject.h +173 -0
  325. numpy/f2py/symbolic.py +1518 -0
  326. numpy/f2py/symbolic.pyi +219 -0
  327. numpy/f2py/tests/__init__.py +16 -0
  328. numpy/f2py/tests/src/abstract_interface/foo.f90 +34 -0
  329. numpy/f2py/tests/src/abstract_interface/gh18403_mod.f90 +6 -0
  330. numpy/f2py/tests/src/array_from_pyobj/wrapmodule.c +235 -0
  331. numpy/f2py/tests/src/assumed_shape/.f2py_f2cmap +1 -0
  332. numpy/f2py/tests/src/assumed_shape/foo_free.f90 +34 -0
  333. numpy/f2py/tests/src/assumed_shape/foo_mod.f90 +41 -0
  334. numpy/f2py/tests/src/assumed_shape/foo_use.f90 +19 -0
  335. numpy/f2py/tests/src/assumed_shape/precision.f90 +4 -0
  336. numpy/f2py/tests/src/block_docstring/foo.f +6 -0
  337. numpy/f2py/tests/src/callback/foo.f +62 -0
  338. numpy/f2py/tests/src/callback/gh17797.f90 +7 -0
  339. numpy/f2py/tests/src/callback/gh18335.f90 +17 -0
  340. numpy/f2py/tests/src/callback/gh25211.f +10 -0
  341. numpy/f2py/tests/src/callback/gh25211.pyf +18 -0
  342. numpy/f2py/tests/src/callback/gh26681.f90 +18 -0
  343. numpy/f2py/tests/src/cli/gh_22819.pyf +6 -0
  344. numpy/f2py/tests/src/cli/hi77.f +3 -0
  345. numpy/f2py/tests/src/cli/hiworld.f90 +3 -0
  346. numpy/f2py/tests/src/common/block.f +11 -0
  347. numpy/f2py/tests/src/common/gh19161.f90 +10 -0
  348. numpy/f2py/tests/src/crackfortran/accesstype.f90 +13 -0
  349. numpy/f2py/tests/src/crackfortran/common_with_division.f +17 -0
  350. numpy/f2py/tests/src/crackfortran/data_common.f +8 -0
  351. numpy/f2py/tests/src/crackfortran/data_multiplier.f +5 -0
  352. numpy/f2py/tests/src/crackfortran/data_stmts.f90 +20 -0
  353. numpy/f2py/tests/src/crackfortran/data_with_comments.f +8 -0
  354. numpy/f2py/tests/src/crackfortran/foo_deps.f90 +6 -0
  355. numpy/f2py/tests/src/crackfortran/gh15035.f +16 -0
  356. numpy/f2py/tests/src/crackfortran/gh17859.f +12 -0
  357. numpy/f2py/tests/src/crackfortran/gh22648.pyf +7 -0
  358. numpy/f2py/tests/src/crackfortran/gh23533.f +5 -0
  359. numpy/f2py/tests/src/crackfortran/gh23598.f90 +4 -0
  360. numpy/f2py/tests/src/crackfortran/gh23598Warn.f90 +11 -0
  361. numpy/f2py/tests/src/crackfortran/gh23879.f90 +20 -0
  362. numpy/f2py/tests/src/crackfortran/gh27697.f90 +12 -0
  363. numpy/f2py/tests/src/crackfortran/gh2848.f90 +13 -0
  364. numpy/f2py/tests/src/crackfortran/operators.f90 +49 -0
  365. numpy/f2py/tests/src/crackfortran/privatemod.f90 +11 -0
  366. numpy/f2py/tests/src/crackfortran/publicmod.f90 +10 -0
  367. numpy/f2py/tests/src/crackfortran/pubprivmod.f90 +10 -0
  368. numpy/f2py/tests/src/crackfortran/unicode_comment.f90 +4 -0
  369. numpy/f2py/tests/src/f2cmap/.f2py_f2cmap +1 -0
  370. numpy/f2py/tests/src/f2cmap/isoFortranEnvMap.f90 +9 -0
  371. numpy/f2py/tests/src/isocintrin/isoCtests.f90 +34 -0
  372. numpy/f2py/tests/src/kind/foo.f90 +20 -0
  373. numpy/f2py/tests/src/mixed/foo.f +5 -0
  374. numpy/f2py/tests/src/mixed/foo_fixed.f90 +8 -0
  375. numpy/f2py/tests/src/mixed/foo_free.f90 +8 -0
  376. numpy/f2py/tests/src/modules/gh25337/data.f90 +8 -0
  377. numpy/f2py/tests/src/modules/gh25337/use_data.f90 +6 -0
  378. numpy/f2py/tests/src/modules/gh26920/two_mods_with_no_public_entities.f90 +21 -0
  379. numpy/f2py/tests/src/modules/gh26920/two_mods_with_one_public_routine.f90 +21 -0
  380. numpy/f2py/tests/src/modules/module_data_docstring.f90 +12 -0
  381. numpy/f2py/tests/src/modules/use_modules.f90 +20 -0
  382. numpy/f2py/tests/src/negative_bounds/issue_20853.f90 +7 -0
  383. numpy/f2py/tests/src/parameter/constant_array.f90 +45 -0
  384. numpy/f2py/tests/src/parameter/constant_both.f90 +57 -0
  385. numpy/f2py/tests/src/parameter/constant_compound.f90 +15 -0
  386. numpy/f2py/tests/src/parameter/constant_integer.f90 +22 -0
  387. numpy/f2py/tests/src/parameter/constant_non_compound.f90 +23 -0
  388. numpy/f2py/tests/src/parameter/constant_real.f90 +23 -0
  389. numpy/f2py/tests/src/quoted_character/foo.f +14 -0
  390. numpy/f2py/tests/src/regression/AB.inc +1 -0
  391. numpy/f2py/tests/src/regression/assignOnlyModule.f90 +25 -0
  392. numpy/f2py/tests/src/regression/datonly.f90 +17 -0
  393. numpy/f2py/tests/src/regression/f77comments.f +26 -0
  394. numpy/f2py/tests/src/regression/f77fixedform.f95 +5 -0
  395. numpy/f2py/tests/src/regression/f90continuation.f90 +9 -0
  396. numpy/f2py/tests/src/regression/incfile.f90 +5 -0
  397. numpy/f2py/tests/src/regression/inout.f90 +9 -0
  398. numpy/f2py/tests/src/regression/lower_f2py_fortran.f90 +5 -0
  399. numpy/f2py/tests/src/regression/mod_derived_types.f90 +23 -0
  400. numpy/f2py/tests/src/return_character/foo77.f +45 -0
  401. numpy/f2py/tests/src/return_character/foo90.f90 +48 -0
  402. numpy/f2py/tests/src/return_complex/foo77.f +45 -0
  403. numpy/f2py/tests/src/return_complex/foo90.f90 +48 -0
  404. numpy/f2py/tests/src/return_integer/foo77.f +56 -0
  405. numpy/f2py/tests/src/return_integer/foo90.f90 +59 -0
  406. numpy/f2py/tests/src/return_logical/foo77.f +56 -0
  407. numpy/f2py/tests/src/return_logical/foo90.f90 +59 -0
  408. numpy/f2py/tests/src/return_real/foo77.f +45 -0
  409. numpy/f2py/tests/src/return_real/foo90.f90 +48 -0
  410. numpy/f2py/tests/src/routines/funcfortranname.f +5 -0
  411. numpy/f2py/tests/src/routines/funcfortranname.pyf +11 -0
  412. numpy/f2py/tests/src/routines/subrout.f +4 -0
  413. numpy/f2py/tests/src/routines/subrout.pyf +10 -0
  414. numpy/f2py/tests/src/size/foo.f90 +44 -0
  415. numpy/f2py/tests/src/string/char.f90 +29 -0
  416. numpy/f2py/tests/src/string/fixed_string.f90 +34 -0
  417. numpy/f2py/tests/src/string/gh24008.f +8 -0
  418. numpy/f2py/tests/src/string/gh24662.f90 +7 -0
  419. numpy/f2py/tests/src/string/gh25286.f90 +14 -0
  420. numpy/f2py/tests/src/string/gh25286.pyf +12 -0
  421. numpy/f2py/tests/src/string/gh25286_bc.pyf +12 -0
  422. numpy/f2py/tests/src/string/scalar_string.f90 +9 -0
  423. numpy/f2py/tests/src/string/string.f +12 -0
  424. numpy/f2py/tests/src/value_attrspec/gh21665.f90 +9 -0
  425. numpy/f2py/tests/test_abstract_interface.py +26 -0
  426. numpy/f2py/tests/test_array_from_pyobj.py +678 -0
  427. numpy/f2py/tests/test_assumed_shape.py +50 -0
  428. numpy/f2py/tests/test_block_docstring.py +20 -0
  429. numpy/f2py/tests/test_callback.py +263 -0
  430. numpy/f2py/tests/test_character.py +641 -0
  431. numpy/f2py/tests/test_common.py +23 -0
  432. numpy/f2py/tests/test_crackfortran.py +421 -0
  433. numpy/f2py/tests/test_data.py +71 -0
  434. numpy/f2py/tests/test_docs.py +66 -0
  435. numpy/f2py/tests/test_f2cmap.py +17 -0
  436. numpy/f2py/tests/test_f2py2e.py +983 -0
  437. numpy/f2py/tests/test_isoc.py +56 -0
  438. numpy/f2py/tests/test_kind.py +52 -0
  439. numpy/f2py/tests/test_mixed.py +35 -0
  440. numpy/f2py/tests/test_modules.py +83 -0
  441. numpy/f2py/tests/test_parameter.py +129 -0
  442. numpy/f2py/tests/test_pyf_src.py +43 -0
  443. numpy/f2py/tests/test_quoted_character.py +18 -0
  444. numpy/f2py/tests/test_regression.py +187 -0
  445. numpy/f2py/tests/test_return_character.py +48 -0
  446. numpy/f2py/tests/test_return_complex.py +67 -0
  447. numpy/f2py/tests/test_return_integer.py +55 -0
  448. numpy/f2py/tests/test_return_logical.py +65 -0
  449. numpy/f2py/tests/test_return_real.py +109 -0
  450. numpy/f2py/tests/test_routines.py +29 -0
  451. numpy/f2py/tests/test_semicolon_split.py +75 -0
  452. numpy/f2py/tests/test_size.py +45 -0
  453. numpy/f2py/tests/test_string.py +100 -0
  454. numpy/f2py/tests/test_symbolic.py +500 -0
  455. numpy/f2py/tests/test_value_attrspec.py +15 -0
  456. numpy/f2py/tests/util.py +442 -0
  457. numpy/f2py/use_rules.py +99 -0
  458. numpy/f2py/use_rules.pyi +9 -0
  459. numpy/fft/__init__.py +213 -0
  460. numpy/fft/__init__.pyi +38 -0
  461. numpy/fft/_helper.py +235 -0
  462. numpy/fft/_helper.pyi +44 -0
  463. numpy/fft/_pocketfft.py +1693 -0
  464. numpy/fft/_pocketfft.pyi +137 -0
  465. numpy/fft/_pocketfft_umath.cpython-313t-aarch64-linux-musl.so +0 -0
  466. numpy/fft/tests/__init__.py +0 -0
  467. numpy/fft/tests/test_helper.py +167 -0
  468. numpy/fft/tests/test_pocketfft.py +589 -0
  469. numpy/lib/__init__.py +97 -0
  470. numpy/lib/__init__.pyi +52 -0
  471. numpy/lib/_array_utils_impl.py +62 -0
  472. numpy/lib/_array_utils_impl.pyi +10 -0
  473. numpy/lib/_arraypad_impl.py +926 -0
  474. numpy/lib/_arraypad_impl.pyi +88 -0
  475. numpy/lib/_arraysetops_impl.py +1158 -0
  476. numpy/lib/_arraysetops_impl.pyi +462 -0
  477. numpy/lib/_arrayterator_impl.py +224 -0
  478. numpy/lib/_arrayterator_impl.pyi +45 -0
  479. numpy/lib/_datasource.py +700 -0
  480. numpy/lib/_datasource.pyi +30 -0
  481. numpy/lib/_format_impl.py +1036 -0
  482. numpy/lib/_format_impl.pyi +56 -0
  483. numpy/lib/_function_base_impl.py +5758 -0
  484. numpy/lib/_function_base_impl.pyi +2324 -0
  485. numpy/lib/_histograms_impl.py +1085 -0
  486. numpy/lib/_histograms_impl.pyi +40 -0
  487. numpy/lib/_index_tricks_impl.py +1048 -0
  488. numpy/lib/_index_tricks_impl.pyi +267 -0
  489. numpy/lib/_iotools.py +900 -0
  490. numpy/lib/_iotools.pyi +116 -0
  491. numpy/lib/_nanfunctions_impl.py +2001 -0
  492. numpy/lib/_nanfunctions_impl.pyi +48 -0
  493. numpy/lib/_npyio_impl.py +2583 -0
  494. numpy/lib/_npyio_impl.pyi +299 -0
  495. numpy/lib/_polynomial_impl.py +1465 -0
  496. numpy/lib/_polynomial_impl.pyi +338 -0
  497. numpy/lib/_scimath_impl.py +642 -0
  498. numpy/lib/_scimath_impl.pyi +93 -0
  499. numpy/lib/_shape_base_impl.py +1289 -0
  500. numpy/lib/_shape_base_impl.pyi +236 -0
  501. numpy/lib/_stride_tricks_impl.py +582 -0
  502. numpy/lib/_stride_tricks_impl.pyi +73 -0
  503. numpy/lib/_twodim_base_impl.py +1201 -0
  504. numpy/lib/_twodim_base_impl.pyi +408 -0
  505. numpy/lib/_type_check_impl.py +710 -0
  506. numpy/lib/_type_check_impl.pyi +348 -0
  507. numpy/lib/_ufunclike_impl.py +199 -0
  508. numpy/lib/_ufunclike_impl.pyi +60 -0
  509. numpy/lib/_user_array_impl.py +310 -0
  510. numpy/lib/_user_array_impl.pyi +226 -0
  511. numpy/lib/_utils_impl.py +784 -0
  512. numpy/lib/_utils_impl.pyi +22 -0
  513. numpy/lib/_version.py +153 -0
  514. numpy/lib/_version.pyi +17 -0
  515. numpy/lib/array_utils.py +7 -0
  516. numpy/lib/array_utils.pyi +6 -0
  517. numpy/lib/format.py +24 -0
  518. numpy/lib/format.pyi +24 -0
  519. numpy/lib/introspect.py +94 -0
  520. numpy/lib/introspect.pyi +3 -0
  521. numpy/lib/mixins.py +180 -0
  522. numpy/lib/mixins.pyi +78 -0
  523. numpy/lib/npyio.py +1 -0
  524. numpy/lib/npyio.pyi +5 -0
  525. numpy/lib/recfunctions.py +1681 -0
  526. numpy/lib/recfunctions.pyi +444 -0
  527. numpy/lib/scimath.py +13 -0
  528. numpy/lib/scimath.pyi +12 -0
  529. numpy/lib/stride_tricks.py +1 -0
  530. numpy/lib/stride_tricks.pyi +4 -0
  531. numpy/lib/tests/__init__.py +0 -0
  532. numpy/lib/tests/data/py2-np0-objarr.npy +0 -0
  533. numpy/lib/tests/data/py2-objarr.npy +0 -0
  534. numpy/lib/tests/data/py2-objarr.npz +0 -0
  535. numpy/lib/tests/data/py3-objarr.npy +0 -0
  536. numpy/lib/tests/data/py3-objarr.npz +0 -0
  537. numpy/lib/tests/data/python3.npy +0 -0
  538. numpy/lib/tests/data/win64python2.npy +0 -0
  539. numpy/lib/tests/test__datasource.py +328 -0
  540. numpy/lib/tests/test__iotools.py +358 -0
  541. numpy/lib/tests/test__version.py +64 -0
  542. numpy/lib/tests/test_array_utils.py +32 -0
  543. numpy/lib/tests/test_arraypad.py +1427 -0
  544. numpy/lib/tests/test_arraysetops.py +1302 -0
  545. numpy/lib/tests/test_arrayterator.py +45 -0
  546. numpy/lib/tests/test_format.py +1054 -0
  547. numpy/lib/tests/test_function_base.py +4705 -0
  548. numpy/lib/tests/test_histograms.py +855 -0
  549. numpy/lib/tests/test_index_tricks.py +693 -0
  550. numpy/lib/tests/test_io.py +2857 -0
  551. numpy/lib/tests/test_loadtxt.py +1099 -0
  552. numpy/lib/tests/test_mixins.py +215 -0
  553. numpy/lib/tests/test_nanfunctions.py +1438 -0
  554. numpy/lib/tests/test_packbits.py +376 -0
  555. numpy/lib/tests/test_polynomial.py +325 -0
  556. numpy/lib/tests/test_recfunctions.py +1042 -0
  557. numpy/lib/tests/test_regression.py +231 -0
  558. numpy/lib/tests/test_shape_base.py +813 -0
  559. numpy/lib/tests/test_stride_tricks.py +655 -0
  560. numpy/lib/tests/test_twodim_base.py +559 -0
  561. numpy/lib/tests/test_type_check.py +473 -0
  562. numpy/lib/tests/test_ufunclike.py +97 -0
  563. numpy/lib/tests/test_utils.py +80 -0
  564. numpy/lib/user_array.py +1 -0
  565. numpy/lib/user_array.pyi +1 -0
  566. numpy/linalg/__init__.py +95 -0
  567. numpy/linalg/__init__.pyi +71 -0
  568. numpy/linalg/_linalg.py +3657 -0
  569. numpy/linalg/_linalg.pyi +548 -0
  570. numpy/linalg/_umath_linalg.cpython-313t-aarch64-linux-musl.so +0 -0
  571. numpy/linalg/_umath_linalg.pyi +60 -0
  572. numpy/linalg/lapack_lite.cpython-313t-aarch64-linux-musl.so +0 -0
  573. numpy/linalg/lapack_lite.pyi +143 -0
  574. numpy/linalg/tests/__init__.py +0 -0
  575. numpy/linalg/tests/test_deprecations.py +21 -0
  576. numpy/linalg/tests/test_linalg.py +2442 -0
  577. numpy/linalg/tests/test_regression.py +182 -0
  578. numpy/ma/API_CHANGES.txt +135 -0
  579. numpy/ma/LICENSE +24 -0
  580. numpy/ma/README.rst +236 -0
  581. numpy/ma/__init__.py +53 -0
  582. numpy/ma/__init__.pyi +458 -0
  583. numpy/ma/core.py +8929 -0
  584. numpy/ma/core.pyi +3720 -0
  585. numpy/ma/extras.py +2266 -0
  586. numpy/ma/extras.pyi +297 -0
  587. numpy/ma/mrecords.py +762 -0
  588. numpy/ma/mrecords.pyi +96 -0
  589. numpy/ma/tests/__init__.py +0 -0
  590. numpy/ma/tests/test_arrayobject.py +40 -0
  591. numpy/ma/tests/test_core.py +6008 -0
  592. numpy/ma/tests/test_deprecations.py +65 -0
  593. numpy/ma/tests/test_extras.py +1945 -0
  594. numpy/ma/tests/test_mrecords.py +495 -0
  595. numpy/ma/tests/test_old_ma.py +939 -0
  596. numpy/ma/tests/test_regression.py +83 -0
  597. numpy/ma/tests/test_subclassing.py +469 -0
  598. numpy/ma/testutils.py +294 -0
  599. numpy/ma/testutils.pyi +69 -0
  600. numpy/matlib.py +380 -0
  601. numpy/matlib.pyi +580 -0
  602. numpy/matrixlib/__init__.py +12 -0
  603. numpy/matrixlib/__init__.pyi +3 -0
  604. numpy/matrixlib/defmatrix.py +1119 -0
  605. numpy/matrixlib/defmatrix.pyi +218 -0
  606. numpy/matrixlib/tests/__init__.py +0 -0
  607. numpy/matrixlib/tests/test_defmatrix.py +455 -0
  608. numpy/matrixlib/tests/test_interaction.py +360 -0
  609. numpy/matrixlib/tests/test_masked_matrix.py +240 -0
  610. numpy/matrixlib/tests/test_matrix_linalg.py +110 -0
  611. numpy/matrixlib/tests/test_multiarray.py +17 -0
  612. numpy/matrixlib/tests/test_numeric.py +18 -0
  613. numpy/matrixlib/tests/test_regression.py +31 -0
  614. numpy/polynomial/__init__.py +187 -0
  615. numpy/polynomial/__init__.pyi +31 -0
  616. numpy/polynomial/_polybase.py +1191 -0
  617. numpy/polynomial/_polybase.pyi +262 -0
  618. numpy/polynomial/_polytypes.pyi +501 -0
  619. numpy/polynomial/chebyshev.py +2001 -0
  620. numpy/polynomial/chebyshev.pyi +180 -0
  621. numpy/polynomial/hermite.py +1738 -0
  622. numpy/polynomial/hermite.pyi +106 -0
  623. numpy/polynomial/hermite_e.py +1640 -0
  624. numpy/polynomial/hermite_e.pyi +106 -0
  625. numpy/polynomial/laguerre.py +1673 -0
  626. numpy/polynomial/laguerre.pyi +100 -0
  627. numpy/polynomial/legendre.py +1603 -0
  628. numpy/polynomial/legendre.pyi +100 -0
  629. numpy/polynomial/polynomial.py +1625 -0
  630. numpy/polynomial/polynomial.pyi +109 -0
  631. numpy/polynomial/polyutils.py +759 -0
  632. numpy/polynomial/polyutils.pyi +307 -0
  633. numpy/polynomial/tests/__init__.py +0 -0
  634. numpy/polynomial/tests/test_chebyshev.py +618 -0
  635. numpy/polynomial/tests/test_classes.py +613 -0
  636. numpy/polynomial/tests/test_hermite.py +553 -0
  637. numpy/polynomial/tests/test_hermite_e.py +554 -0
  638. numpy/polynomial/tests/test_laguerre.py +535 -0
  639. numpy/polynomial/tests/test_legendre.py +566 -0
  640. numpy/polynomial/tests/test_polynomial.py +691 -0
  641. numpy/polynomial/tests/test_polyutils.py +123 -0
  642. numpy/polynomial/tests/test_printing.py +557 -0
  643. numpy/polynomial/tests/test_symbol.py +217 -0
  644. numpy/py.typed +0 -0
  645. numpy/random/LICENSE.md +71 -0
  646. numpy/random/__init__.pxd +14 -0
  647. numpy/random/__init__.py +213 -0
  648. numpy/random/__init__.pyi +124 -0
  649. numpy/random/_bounded_integers.cpython-313t-aarch64-linux-musl.so +0 -0
  650. numpy/random/_bounded_integers.pxd +29 -0
  651. numpy/random/_bounded_integers.pyi +1 -0
  652. numpy/random/_common.cpython-313t-aarch64-linux-musl.so +0 -0
  653. numpy/random/_common.pxd +107 -0
  654. numpy/random/_common.pyi +16 -0
  655. numpy/random/_examples/cffi/extending.py +44 -0
  656. numpy/random/_examples/cffi/parse.py +53 -0
  657. numpy/random/_examples/cython/extending.pyx +77 -0
  658. numpy/random/_examples/cython/extending_distributions.pyx +117 -0
  659. numpy/random/_examples/cython/meson.build +53 -0
  660. numpy/random/_examples/numba/extending.py +86 -0
  661. numpy/random/_examples/numba/extending_distributions.py +67 -0
  662. numpy/random/_generator.cpython-313t-aarch64-linux-musl.so +0 -0
  663. numpy/random/_generator.pyi +862 -0
  664. numpy/random/_mt19937.cpython-313t-aarch64-linux-musl.so +0 -0
  665. numpy/random/_mt19937.pyi +27 -0
  666. numpy/random/_pcg64.cpython-313t-aarch64-linux-musl.so +0 -0
  667. numpy/random/_pcg64.pyi +41 -0
  668. numpy/random/_philox.cpython-313t-aarch64-linux-musl.so +0 -0
  669. numpy/random/_philox.pyi +36 -0
  670. numpy/random/_pickle.py +88 -0
  671. numpy/random/_pickle.pyi +43 -0
  672. numpy/random/_sfc64.cpython-313t-aarch64-linux-musl.so +0 -0
  673. numpy/random/_sfc64.pyi +25 -0
  674. numpy/random/bit_generator.cpython-313t-aarch64-linux-musl.so +0 -0
  675. numpy/random/bit_generator.pxd +35 -0
  676. numpy/random/bit_generator.pyi +123 -0
  677. numpy/random/c_distributions.pxd +119 -0
  678. numpy/random/lib/libnpyrandom.a +0 -0
  679. numpy/random/mtrand.cpython-313t-aarch64-linux-musl.so +0 -0
  680. numpy/random/mtrand.pyi +759 -0
  681. numpy/random/tests/__init__.py +0 -0
  682. numpy/random/tests/data/__init__.py +0 -0
  683. numpy/random/tests/data/generator_pcg64_np121.pkl.gz +0 -0
  684. numpy/random/tests/data/generator_pcg64_np126.pkl.gz +0 -0
  685. numpy/random/tests/data/mt19937-testset-1.csv +1001 -0
  686. numpy/random/tests/data/mt19937-testset-2.csv +1001 -0
  687. numpy/random/tests/data/pcg64-testset-1.csv +1001 -0
  688. numpy/random/tests/data/pcg64-testset-2.csv +1001 -0
  689. numpy/random/tests/data/pcg64dxsm-testset-1.csv +1001 -0
  690. numpy/random/tests/data/pcg64dxsm-testset-2.csv +1001 -0
  691. numpy/random/tests/data/philox-testset-1.csv +1001 -0
  692. numpy/random/tests/data/philox-testset-2.csv +1001 -0
  693. numpy/random/tests/data/sfc64-testset-1.csv +1001 -0
  694. numpy/random/tests/data/sfc64-testset-2.csv +1001 -0
  695. numpy/random/tests/data/sfc64_np126.pkl.gz +0 -0
  696. numpy/random/tests/test_direct.py +595 -0
  697. numpy/random/tests/test_extending.py +131 -0
  698. numpy/random/tests/test_generator_mt19937.py +2825 -0
  699. numpy/random/tests/test_generator_mt19937_regressions.py +221 -0
  700. numpy/random/tests/test_random.py +1724 -0
  701. numpy/random/tests/test_randomstate.py +2099 -0
  702. numpy/random/tests/test_randomstate_regression.py +213 -0
  703. numpy/random/tests/test_regression.py +175 -0
  704. numpy/random/tests/test_seed_sequence.py +79 -0
  705. numpy/random/tests/test_smoke.py +882 -0
  706. numpy/rec/__init__.py +2 -0
  707. numpy/rec/__init__.pyi +23 -0
  708. numpy/strings/__init__.py +2 -0
  709. numpy/strings/__init__.pyi +97 -0
  710. numpy/testing/__init__.py +22 -0
  711. numpy/testing/__init__.pyi +107 -0
  712. numpy/testing/_private/__init__.py +0 -0
  713. numpy/testing/_private/__init__.pyi +0 -0
  714. numpy/testing/_private/extbuild.py +250 -0
  715. numpy/testing/_private/extbuild.pyi +25 -0
  716. numpy/testing/_private/utils.py +2830 -0
  717. numpy/testing/_private/utils.pyi +505 -0
  718. numpy/testing/overrides.py +84 -0
  719. numpy/testing/overrides.pyi +10 -0
  720. numpy/testing/print_coercion_tables.py +207 -0
  721. numpy/testing/print_coercion_tables.pyi +26 -0
  722. numpy/testing/tests/__init__.py +0 -0
  723. numpy/testing/tests/test_utils.py +2123 -0
  724. numpy/tests/__init__.py +0 -0
  725. numpy/tests/test__all__.py +10 -0
  726. numpy/tests/test_configtool.py +51 -0
  727. numpy/tests/test_ctypeslib.py +383 -0
  728. numpy/tests/test_lazyloading.py +42 -0
  729. numpy/tests/test_matlib.py +59 -0
  730. numpy/tests/test_numpy_config.py +47 -0
  731. numpy/tests/test_numpy_version.py +54 -0
  732. numpy/tests/test_public_api.py +804 -0
  733. numpy/tests/test_reloading.py +76 -0
  734. numpy/tests/test_scripts.py +48 -0
  735. numpy/tests/test_warnings.py +79 -0
  736. numpy/typing/__init__.py +233 -0
  737. numpy/typing/__init__.pyi +3 -0
  738. numpy/typing/mypy_plugin.py +200 -0
  739. numpy/typing/tests/__init__.py +0 -0
  740. numpy/typing/tests/data/fail/arithmetic.pyi +126 -0
  741. numpy/typing/tests/data/fail/array_constructors.pyi +34 -0
  742. numpy/typing/tests/data/fail/array_like.pyi +15 -0
  743. numpy/typing/tests/data/fail/array_pad.pyi +6 -0
  744. numpy/typing/tests/data/fail/arrayprint.pyi +15 -0
  745. numpy/typing/tests/data/fail/arrayterator.pyi +14 -0
  746. numpy/typing/tests/data/fail/bitwise_ops.pyi +17 -0
  747. numpy/typing/tests/data/fail/char.pyi +63 -0
  748. numpy/typing/tests/data/fail/chararray.pyi +61 -0
  749. numpy/typing/tests/data/fail/comparisons.pyi +27 -0
  750. numpy/typing/tests/data/fail/constants.pyi +3 -0
  751. numpy/typing/tests/data/fail/datasource.pyi +16 -0
  752. numpy/typing/tests/data/fail/dtype.pyi +17 -0
  753. numpy/typing/tests/data/fail/einsumfunc.pyi +12 -0
  754. numpy/typing/tests/data/fail/flatiter.pyi +38 -0
  755. numpy/typing/tests/data/fail/fromnumeric.pyi +148 -0
  756. numpy/typing/tests/data/fail/histograms.pyi +12 -0
  757. numpy/typing/tests/data/fail/index_tricks.pyi +14 -0
  758. numpy/typing/tests/data/fail/lib_function_base.pyi +60 -0
  759. numpy/typing/tests/data/fail/lib_polynomial.pyi +29 -0
  760. numpy/typing/tests/data/fail/lib_utils.pyi +3 -0
  761. numpy/typing/tests/data/fail/lib_version.pyi +6 -0
  762. numpy/typing/tests/data/fail/linalg.pyi +52 -0
  763. numpy/typing/tests/data/fail/ma.pyi +155 -0
  764. numpy/typing/tests/data/fail/memmap.pyi +5 -0
  765. numpy/typing/tests/data/fail/modules.pyi +17 -0
  766. numpy/typing/tests/data/fail/multiarray.pyi +52 -0
  767. numpy/typing/tests/data/fail/ndarray.pyi +11 -0
  768. numpy/typing/tests/data/fail/ndarray_misc.pyi +49 -0
  769. numpy/typing/tests/data/fail/nditer.pyi +8 -0
  770. numpy/typing/tests/data/fail/nested_sequence.pyi +17 -0
  771. numpy/typing/tests/data/fail/npyio.pyi +24 -0
  772. numpy/typing/tests/data/fail/numerictypes.pyi +5 -0
  773. numpy/typing/tests/data/fail/random.pyi +62 -0
  774. numpy/typing/tests/data/fail/rec.pyi +17 -0
  775. numpy/typing/tests/data/fail/scalars.pyi +86 -0
  776. numpy/typing/tests/data/fail/shape.pyi +7 -0
  777. numpy/typing/tests/data/fail/shape_base.pyi +8 -0
  778. numpy/typing/tests/data/fail/stride_tricks.pyi +9 -0
  779. numpy/typing/tests/data/fail/strings.pyi +52 -0
  780. numpy/typing/tests/data/fail/testing.pyi +28 -0
  781. numpy/typing/tests/data/fail/twodim_base.pyi +39 -0
  782. numpy/typing/tests/data/fail/type_check.pyi +12 -0
  783. numpy/typing/tests/data/fail/ufunc_config.pyi +21 -0
  784. numpy/typing/tests/data/fail/ufunclike.pyi +21 -0
  785. numpy/typing/tests/data/fail/ufuncs.pyi +17 -0
  786. numpy/typing/tests/data/fail/warnings_and_errors.pyi +5 -0
  787. numpy/typing/tests/data/misc/extended_precision.pyi +9 -0
  788. numpy/typing/tests/data/mypy.ini +8 -0
  789. numpy/typing/tests/data/pass/arithmetic.py +614 -0
  790. numpy/typing/tests/data/pass/array_constructors.py +138 -0
  791. numpy/typing/tests/data/pass/array_like.py +43 -0
  792. numpy/typing/tests/data/pass/arrayprint.py +37 -0
  793. numpy/typing/tests/data/pass/arrayterator.py +28 -0
  794. numpy/typing/tests/data/pass/bitwise_ops.py +131 -0
  795. numpy/typing/tests/data/pass/comparisons.py +316 -0
  796. numpy/typing/tests/data/pass/dtype.py +57 -0
  797. numpy/typing/tests/data/pass/einsumfunc.py +36 -0
  798. numpy/typing/tests/data/pass/flatiter.py +26 -0
  799. numpy/typing/tests/data/pass/fromnumeric.py +272 -0
  800. numpy/typing/tests/data/pass/index_tricks.py +62 -0
  801. numpy/typing/tests/data/pass/lib_user_array.py +22 -0
  802. numpy/typing/tests/data/pass/lib_utils.py +19 -0
  803. numpy/typing/tests/data/pass/lib_version.py +18 -0
  804. numpy/typing/tests/data/pass/literal.py +52 -0
  805. numpy/typing/tests/data/pass/ma.py +199 -0
  806. numpy/typing/tests/data/pass/mod.py +149 -0
  807. numpy/typing/tests/data/pass/modules.py +45 -0
  808. numpy/typing/tests/data/pass/multiarray.py +77 -0
  809. numpy/typing/tests/data/pass/ndarray_conversion.py +81 -0
  810. numpy/typing/tests/data/pass/ndarray_misc.py +199 -0
  811. numpy/typing/tests/data/pass/ndarray_shape_manipulation.py +47 -0
  812. numpy/typing/tests/data/pass/nditer.py +4 -0
  813. numpy/typing/tests/data/pass/numeric.py +90 -0
  814. numpy/typing/tests/data/pass/numerictypes.py +17 -0
  815. numpy/typing/tests/data/pass/random.py +1498 -0
  816. numpy/typing/tests/data/pass/recfunctions.py +164 -0
  817. numpy/typing/tests/data/pass/scalars.py +249 -0
  818. numpy/typing/tests/data/pass/shape.py +19 -0
  819. numpy/typing/tests/data/pass/simple.py +170 -0
  820. numpy/typing/tests/data/pass/ufunc_config.py +64 -0
  821. numpy/typing/tests/data/pass/ufunclike.py +52 -0
  822. numpy/typing/tests/data/pass/ufuncs.py +16 -0
  823. numpy/typing/tests/data/pass/warnings_and_errors.py +6 -0
  824. numpy/typing/tests/data/reveal/arithmetic.pyi +719 -0
  825. numpy/typing/tests/data/reveal/array_api_info.pyi +70 -0
  826. numpy/typing/tests/data/reveal/array_constructors.pyi +277 -0
  827. numpy/typing/tests/data/reveal/arraypad.pyi +27 -0
  828. numpy/typing/tests/data/reveal/arrayprint.pyi +25 -0
  829. numpy/typing/tests/data/reveal/arraysetops.pyi +74 -0
  830. numpy/typing/tests/data/reveal/arrayterator.pyi +27 -0
  831. numpy/typing/tests/data/reveal/bitwise_ops.pyi +166 -0
  832. numpy/typing/tests/data/reveal/char.pyi +225 -0
  833. numpy/typing/tests/data/reveal/chararray.pyi +138 -0
  834. numpy/typing/tests/data/reveal/comparisons.pyi +264 -0
  835. numpy/typing/tests/data/reveal/constants.pyi +14 -0
  836. numpy/typing/tests/data/reveal/ctypeslib.pyi +81 -0
  837. numpy/typing/tests/data/reveal/datasource.pyi +23 -0
  838. numpy/typing/tests/data/reveal/dtype.pyi +132 -0
  839. numpy/typing/tests/data/reveal/einsumfunc.pyi +39 -0
  840. numpy/typing/tests/data/reveal/emath.pyi +54 -0
  841. numpy/typing/tests/data/reveal/fft.pyi +37 -0
  842. numpy/typing/tests/data/reveal/flatiter.pyi +86 -0
  843. numpy/typing/tests/data/reveal/fromnumeric.pyi +347 -0
  844. numpy/typing/tests/data/reveal/getlimits.pyi +53 -0
  845. numpy/typing/tests/data/reveal/histograms.pyi +25 -0
  846. numpy/typing/tests/data/reveal/index_tricks.pyi +70 -0
  847. numpy/typing/tests/data/reveal/lib_function_base.pyi +409 -0
  848. numpy/typing/tests/data/reveal/lib_polynomial.pyi +147 -0
  849. numpy/typing/tests/data/reveal/lib_utils.pyi +17 -0
  850. numpy/typing/tests/data/reveal/lib_version.pyi +20 -0
  851. numpy/typing/tests/data/reveal/linalg.pyi +154 -0
  852. numpy/typing/tests/data/reveal/ma.pyi +1098 -0
  853. numpy/typing/tests/data/reveal/matrix.pyi +73 -0
  854. numpy/typing/tests/data/reveal/memmap.pyi +19 -0
  855. numpy/typing/tests/data/reveal/mod.pyi +178 -0
  856. numpy/typing/tests/data/reveal/modules.pyi +51 -0
  857. numpy/typing/tests/data/reveal/multiarray.pyi +197 -0
  858. numpy/typing/tests/data/reveal/nbit_base_example.pyi +20 -0
  859. numpy/typing/tests/data/reveal/ndarray_assignability.pyi +82 -0
  860. numpy/typing/tests/data/reveal/ndarray_conversion.pyi +83 -0
  861. numpy/typing/tests/data/reveal/ndarray_misc.pyi +246 -0
  862. numpy/typing/tests/data/reveal/ndarray_shape_manipulation.pyi +47 -0
  863. numpy/typing/tests/data/reveal/nditer.pyi +49 -0
  864. numpy/typing/tests/data/reveal/nested_sequence.pyi +25 -0
  865. numpy/typing/tests/data/reveal/npyio.pyi +83 -0
  866. numpy/typing/tests/data/reveal/numeric.pyi +170 -0
  867. numpy/typing/tests/data/reveal/numerictypes.pyi +16 -0
  868. numpy/typing/tests/data/reveal/polynomial_polybase.pyi +217 -0
  869. numpy/typing/tests/data/reveal/polynomial_polyutils.pyi +218 -0
  870. numpy/typing/tests/data/reveal/polynomial_series.pyi +138 -0
  871. numpy/typing/tests/data/reveal/random.pyi +1546 -0
  872. numpy/typing/tests/data/reveal/rec.pyi +171 -0
  873. numpy/typing/tests/data/reveal/scalars.pyi +191 -0
  874. numpy/typing/tests/data/reveal/shape.pyi +13 -0
  875. numpy/typing/tests/data/reveal/shape_base.pyi +52 -0
  876. numpy/typing/tests/data/reveal/stride_tricks.pyi +27 -0
  877. numpy/typing/tests/data/reveal/strings.pyi +196 -0
  878. numpy/typing/tests/data/reveal/testing.pyi +198 -0
  879. numpy/typing/tests/data/reveal/twodim_base.pyi +225 -0
  880. numpy/typing/tests/data/reveal/type_check.pyi +67 -0
  881. numpy/typing/tests/data/reveal/ufunc_config.pyi +29 -0
  882. numpy/typing/tests/data/reveal/ufunclike.pyi +31 -0
  883. numpy/typing/tests/data/reveal/ufuncs.pyi +142 -0
  884. numpy/typing/tests/data/reveal/warnings_and_errors.pyi +11 -0
  885. numpy/typing/tests/test_isfile.py +38 -0
  886. numpy/typing/tests/test_runtime.py +110 -0
  887. numpy/typing/tests/test_typing.py +205 -0
  888. numpy/version.py +11 -0
  889. numpy/version.pyi +9 -0
  890. numpy-2.4.0.dist-info/METADATA +139 -0
  891. numpy-2.4.0.dist-info/RECORD +915 -0
  892. numpy-2.4.0.dist-info/WHEEL +5 -0
  893. numpy-2.4.0.dist-info/entry_points.txt +13 -0
  894. numpy-2.4.0.dist-info/licenses/LICENSE.txt +935 -0
  895. numpy-2.4.0.dist-info/licenses/numpy/_core/include/numpy/libdivide/LICENSE.txt +21 -0
  896. numpy-2.4.0.dist-info/licenses/numpy/_core/src/common/pythoncapi-compat/COPYING +14 -0
  897. numpy-2.4.0.dist-info/licenses/numpy/_core/src/highway/LICENSE +371 -0
  898. numpy-2.4.0.dist-info/licenses/numpy/_core/src/multiarray/dragon4_LICENSE.txt +27 -0
  899. numpy-2.4.0.dist-info/licenses/numpy/_core/src/npysort/x86-simd-sort/LICENSE.md +28 -0
  900. numpy-2.4.0.dist-info/licenses/numpy/_core/src/umath/svml/LICENSE +30 -0
  901. numpy-2.4.0.dist-info/licenses/numpy/fft/pocketfft/LICENSE.md +25 -0
  902. numpy-2.4.0.dist-info/licenses/numpy/linalg/lapack_lite/LICENSE.txt +48 -0
  903. numpy-2.4.0.dist-info/licenses/numpy/ma/LICENSE +24 -0
  904. numpy-2.4.0.dist-info/licenses/numpy/random/LICENSE.md +71 -0
  905. numpy-2.4.0.dist-info/licenses/numpy/random/src/distributions/LICENSE.md +61 -0
  906. numpy-2.4.0.dist-info/licenses/numpy/random/src/mt19937/LICENSE.md +61 -0
  907. numpy-2.4.0.dist-info/licenses/numpy/random/src/pcg64/LICENSE.md +22 -0
  908. numpy-2.4.0.dist-info/licenses/numpy/random/src/philox/LICENSE.md +31 -0
  909. numpy-2.4.0.dist-info/licenses/numpy/random/src/sfc64/LICENSE.md +27 -0
  910. numpy-2.4.0.dist-info/licenses/numpy/random/src/splitmix64/LICENSE.md +9 -0
  911. numpy.libs/libgcc_s-2d945d6c-767fb991.so.1 +0 -0
  912. numpy.libs/libgcc_s-2d945d6c.so.1 +0 -0
  913. numpy.libs/libgfortran-67378ab2-e7e7cfab.so.5.0.0 +0 -0
  914. numpy.libs/libscipy_openblas64_-1fc386ee.so +0 -0
  915. numpy.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
@@ -0,0 +1,1436 @@
1
+ #define FORTRANOBJECT_C
2
+ #include "fortranobject.h"
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <stdarg.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+
12
+ /*
13
+ This file implements: FortranObject, array_from_pyobj, copy_ND_array
14
+
15
+ Author: Pearu Peterson <pearu@cens.ioc.ee>
16
+ $Revision: 1.52 $
17
+ $Date: 2005/07/11 07:44:20 $
18
+ */
19
+
20
+ int
21
+ F2PyDict_SetItemString(PyObject *dict, char *name, PyObject *obj)
22
+ {
23
+ if (obj == NULL) {
24
+ fprintf(stderr, "Error loading %s\n", name);
25
+ if (PyErr_Occurred()) {
26
+ PyErr_Print();
27
+ PyErr_Clear();
28
+ }
29
+ return -1;
30
+ }
31
+ return PyDict_SetItemString(dict, name, obj);
32
+ }
33
+
34
+ /*
35
+ * Python-only fallback for thread-local callback pointers
36
+ */
37
+ void *
38
+ F2PySwapThreadLocalCallbackPtr(char *key, void *ptr)
39
+ {
40
+ PyObject *local_dict, *value;
41
+ void *prev;
42
+
43
+ local_dict = PyThreadState_GetDict();
44
+ if (local_dict == NULL) {
45
+ Py_FatalError(
46
+ "F2PySwapThreadLocalCallbackPtr: PyThreadState_GetDict "
47
+ "failed");
48
+ }
49
+
50
+ value = PyDict_GetItemString(local_dict, key); // noqa: borrowed-ref OK
51
+ if (value != NULL) {
52
+ prev = PyLong_AsVoidPtr(value);
53
+ if (PyErr_Occurred()) {
54
+ Py_FatalError(
55
+ "F2PySwapThreadLocalCallbackPtr: PyLong_AsVoidPtr failed");
56
+ }
57
+ }
58
+ else {
59
+ prev = NULL;
60
+ }
61
+
62
+ value = PyLong_FromVoidPtr((void *)ptr);
63
+ if (value == NULL) {
64
+ Py_FatalError(
65
+ "F2PySwapThreadLocalCallbackPtr: PyLong_FromVoidPtr failed");
66
+ }
67
+
68
+ if (PyDict_SetItemString(local_dict, key, value) != 0) {
69
+ Py_FatalError(
70
+ "F2PySwapThreadLocalCallbackPtr: PyDict_SetItemString failed");
71
+ }
72
+
73
+ Py_DECREF(value);
74
+
75
+ return prev;
76
+ }
77
+
78
+ void *
79
+ F2PyGetThreadLocalCallbackPtr(char *key)
80
+ {
81
+ PyObject *local_dict, *value;
82
+ void *prev;
83
+
84
+ local_dict = PyThreadState_GetDict();
85
+ if (local_dict == NULL) {
86
+ Py_FatalError(
87
+ "F2PyGetThreadLocalCallbackPtr: PyThreadState_GetDict failed");
88
+ }
89
+
90
+ value = PyDict_GetItemString(local_dict, key); // noqa: borrowed-ref OK
91
+ if (value != NULL) {
92
+ prev = PyLong_AsVoidPtr(value);
93
+ if (PyErr_Occurred()) {
94
+ Py_FatalError(
95
+ "F2PyGetThreadLocalCallbackPtr: PyLong_AsVoidPtr failed");
96
+ }
97
+ }
98
+ else {
99
+ prev = NULL;
100
+ }
101
+
102
+ return prev;
103
+ }
104
+
105
+ static PyArray_Descr *
106
+ get_descr_from_type_and_elsize(const int type_num, const int elsize) {
107
+ PyArray_Descr * descr = PyArray_DescrFromType(type_num);
108
+ if (type_num == NPY_STRING) {
109
+ // PyArray_DescrFromType returns descr with elsize = 0.
110
+ PyArray_DESCR_REPLACE(descr);
111
+ if (descr == NULL) {
112
+ return NULL;
113
+ }
114
+ PyDataType_SET_ELSIZE(descr, elsize);
115
+ }
116
+ return descr;
117
+ }
118
+
119
+ /************************* FortranObject *******************************/
120
+
121
+ typedef PyObject *(*fortranfunc)(PyObject *, PyObject *, PyObject *, void *);
122
+
123
+ PyObject *
124
+ PyFortranObject_New(FortranDataDef *defs, f2py_void_func init)
125
+ {
126
+ int i;
127
+ PyFortranObject *fp = NULL;
128
+ PyObject *v = NULL;
129
+ if (init != NULL) { /* Initialize F90 module objects */
130
+ (*(init))();
131
+ }
132
+ fp = PyObject_New(PyFortranObject, &PyFortran_Type);
133
+ if (fp == NULL) {
134
+ return NULL;
135
+ }
136
+ if ((fp->dict = PyDict_New()) == NULL) {
137
+ Py_DECREF(fp);
138
+ return NULL;
139
+ }
140
+ fp->len = 0;
141
+ while (defs[fp->len].name != NULL) {
142
+ fp->len++;
143
+ }
144
+ if (fp->len == 0) {
145
+ goto fail;
146
+ }
147
+ fp->defs = defs;
148
+ for (i = 0; i < fp->len; i++) {
149
+ if (fp->defs[i].rank == -1) { /* Is Fortran routine */
150
+ v = PyFortranObject_NewAsAttr(&(fp->defs[i]));
151
+ if (v == NULL) {
152
+ goto fail;
153
+ }
154
+ PyDict_SetItemString(fp->dict, fp->defs[i].name, v);
155
+ Py_XDECREF(v);
156
+ }
157
+ else if ((fp->defs[i].data) !=
158
+ NULL) { /* Is Fortran variable or array (not allocatable) */
159
+ PyArray_Descr *
160
+ descr = get_descr_from_type_and_elsize(fp->defs[i].type,
161
+ fp->defs[i].elsize);
162
+ if (descr == NULL) {
163
+ goto fail;
164
+ }
165
+ v = PyArray_NewFromDescr(&PyArray_Type, descr, fp->defs[i].rank,
166
+ fp->defs[i].dims.d, NULL, fp->defs[i].data,
167
+ NPY_ARRAY_FARRAY, NULL);
168
+ if (v == NULL) {
169
+ Py_DECREF(descr);
170
+ goto fail;
171
+ }
172
+ PyDict_SetItemString(fp->dict, fp->defs[i].name, v);
173
+ Py_XDECREF(v);
174
+ }
175
+ }
176
+ return (PyObject *)fp;
177
+ fail:
178
+ Py_XDECREF(fp);
179
+ return NULL;
180
+ }
181
+
182
+ PyObject *
183
+ PyFortranObject_NewAsAttr(FortranDataDef *defs)
184
+ { /* used for calling F90 module routines */
185
+ PyFortranObject *fp = NULL;
186
+ fp = PyObject_New(PyFortranObject, &PyFortran_Type);
187
+ if (fp == NULL)
188
+ return NULL;
189
+ if ((fp->dict = PyDict_New()) == NULL) {
190
+ PyObject_Del(fp);
191
+ return NULL;
192
+ }
193
+ fp->len = 1;
194
+ fp->defs = defs;
195
+ if (defs->rank == -1) {
196
+ PyDict_SetItemString(fp->dict, "__name__", PyUnicode_FromFormat("function %s", defs->name));
197
+ } else if (defs->rank == 0) {
198
+ PyDict_SetItemString(fp->dict, "__name__", PyUnicode_FromFormat("scalar %s", defs->name));
199
+ } else {
200
+ PyDict_SetItemString(fp->dict, "__name__", PyUnicode_FromFormat("array %s", defs->name));
201
+ }
202
+ return (PyObject *)fp;
203
+ }
204
+
205
+ /* Fortran methods */
206
+
207
+ static void
208
+ fortran_dealloc(PyFortranObject *fp)
209
+ {
210
+ Py_XDECREF(fp->dict);
211
+ PyObject_Del(fp);
212
+ }
213
+
214
+ /* Returns number of bytes consumed from buf, or -1 on error. */
215
+ static Py_ssize_t
216
+ format_def(char *buf, Py_ssize_t size, FortranDataDef def)
217
+ {
218
+ char *p = buf;
219
+ int i;
220
+ npy_intp n;
221
+
222
+ n = PyOS_snprintf(p, size, "array(%" NPY_INTP_FMT, def.dims.d[0]);
223
+ if (n < 0 || n >= size) {
224
+ return -1;
225
+ }
226
+ p += n;
227
+ size -= n;
228
+
229
+ for (i = 1; i < def.rank; i++) {
230
+ n = PyOS_snprintf(p, size, ",%" NPY_INTP_FMT, def.dims.d[i]);
231
+ if (n < 0 || n >= size) {
232
+ return -1;
233
+ }
234
+ p += n;
235
+ size -= n;
236
+ }
237
+
238
+ if (size <= 0) {
239
+ return -1;
240
+ }
241
+
242
+ *p++ = ')';
243
+ size--;
244
+
245
+ if (def.data == NULL) {
246
+ static const char notalloc[] = ", not allocated";
247
+ if ((size_t)size < sizeof(notalloc)) {
248
+ return -1;
249
+ }
250
+ memcpy(p, notalloc, sizeof(notalloc));
251
+ p += sizeof(notalloc);
252
+ size -= sizeof(notalloc);
253
+ }
254
+
255
+ return p - buf;
256
+ }
257
+
258
+ static PyObject *
259
+ fortran_doc(FortranDataDef def)
260
+ {
261
+ char *buf, *p;
262
+ PyObject *s = NULL;
263
+ Py_ssize_t n, origsize, size = 100;
264
+
265
+ if (def.doc != NULL) {
266
+ size += strlen(def.doc);
267
+ }
268
+ origsize = size;
269
+ buf = p = (char *)PyMem_Malloc(size);
270
+ if (buf == NULL) {
271
+ return PyErr_NoMemory();
272
+ }
273
+
274
+ if (def.rank == -1) {
275
+ if (def.doc) {
276
+ n = strlen(def.doc);
277
+ if (n > size) {
278
+ goto fail;
279
+ }
280
+ memcpy(p, def.doc, n);
281
+ p += n;
282
+ size -= n;
283
+ }
284
+ else {
285
+ n = PyOS_snprintf(p, size, "%s - no docs available", def.name);
286
+ if (n < 0 || n >= size) {
287
+ goto fail;
288
+ }
289
+ p += n;
290
+ size -= n;
291
+ }
292
+ }
293
+ else {
294
+ PyArray_Descr *d = PyArray_DescrFromType(def.type);
295
+ n = PyOS_snprintf(p, size, "%s : '%c'-", def.name, d->type);
296
+ Py_DECREF(d);
297
+ if (n < 0 || n >= size) {
298
+ goto fail;
299
+ }
300
+ p += n;
301
+ size -= n;
302
+
303
+ if (def.data == NULL) {
304
+ n = format_def(p, size, def);
305
+ if (n < 0) {
306
+ goto fail;
307
+ }
308
+ p += n;
309
+ size -= n;
310
+ }
311
+ else if (def.rank > 0) {
312
+ n = format_def(p, size, def);
313
+ if (n < 0) {
314
+ goto fail;
315
+ }
316
+ p += n;
317
+ size -= n;
318
+ }
319
+ else {
320
+ n = strlen("scalar");
321
+ if (size < n) {
322
+ goto fail;
323
+ }
324
+ memcpy(p, "scalar", n);
325
+ p += n;
326
+ size -= n;
327
+ }
328
+ }
329
+ if (size <= 1) {
330
+ goto fail;
331
+ }
332
+ *p++ = '\n';
333
+ size--;
334
+
335
+ /* p now points one beyond the last character of the string in buf */
336
+ s = PyUnicode_FromStringAndSize(buf, p - buf);
337
+
338
+ PyMem_Free(buf);
339
+ return s;
340
+
341
+ fail:
342
+ fprintf(stderr,
343
+ "fortranobject.c: fortran_doc: len(p)=%zd>%zd=size:"
344
+ " too long docstring required, increase size\n",
345
+ p - buf, origsize);
346
+ PyMem_Free(buf);
347
+ return NULL;
348
+ }
349
+
350
+ static FortranDataDef *save_def; /* save pointer of an allocatable array */
351
+ static void
352
+ set_data(char *d, npy_intp *f)
353
+ { /* callback from Fortran */
354
+ if (*f) /* In fortran f=allocated(d) */
355
+ save_def->data = d;
356
+ else
357
+ save_def->data = NULL;
358
+ /* printf("set_data: d=%p,f=%d\n",d,*f); */
359
+ }
360
+
361
+ static PyObject *
362
+ fortran_getattr(PyFortranObject *fp, char *name)
363
+ {
364
+ int i, j, k, flag;
365
+ if (fp->dict != NULL) {
366
+ // python 3.13 added PyDict_GetItemRef
367
+ #if PY_VERSION_HEX < 0x030D0000
368
+ PyObject *v = _PyDict_GetItemStringWithError(fp->dict, name); // noqa: borrowed-ref OK
369
+ if (v == NULL && PyErr_Occurred()) {
370
+ return NULL;
371
+ }
372
+ else if (v != NULL) {
373
+ Py_INCREF(v);
374
+ return v;
375
+ }
376
+ #else
377
+ PyObject *v;
378
+ int result = PyDict_GetItemStringRef(fp->dict, name, &v);
379
+ if (result == -1) {
380
+ return NULL;
381
+ }
382
+ else if (result == 1) {
383
+ return v;
384
+ }
385
+ #endif
386
+
387
+ }
388
+ for (i = 0, j = 1; i < fp->len && (j = strcmp(name, fp->defs[i].name));
389
+ i++)
390
+ ;
391
+ if (j == 0)
392
+ if (fp->defs[i].rank != -1) { /* F90 allocatable array */
393
+ if (fp->defs[i].func == NULL)
394
+ return NULL;
395
+ for (k = 0; k < fp->defs[i].rank; ++k) fp->defs[i].dims.d[k] = -1;
396
+ save_def = &fp->defs[i];
397
+ (*(fp->defs[i].func))(&fp->defs[i].rank, fp->defs[i].dims.d,
398
+ set_data, &flag);
399
+ if (flag == 2)
400
+ k = fp->defs[i].rank + 1;
401
+ else
402
+ k = fp->defs[i].rank;
403
+ if (fp->defs[i].data != NULL) { /* array is allocated */
404
+ PyObject *v = PyArray_New(
405
+ &PyArray_Type, k, fp->defs[i].dims.d, fp->defs[i].type,
406
+ NULL, fp->defs[i].data, 0, NPY_ARRAY_FARRAY, NULL);
407
+ if (v == NULL)
408
+ return NULL;
409
+ /* Py_INCREF(v); */
410
+ return v;
411
+ }
412
+ else { /* array is not allocated */
413
+ Py_RETURN_NONE;
414
+ }
415
+ }
416
+ if (strcmp(name, "__dict__") == 0) {
417
+ Py_INCREF(fp->dict);
418
+ return fp->dict;
419
+ }
420
+ if (strcmp(name, "__doc__") == 0) {
421
+ PyObject *s = PyUnicode_FromString(""), *s2, *s3;
422
+ for (i = 0; i < fp->len; i++) {
423
+ s2 = fortran_doc(fp->defs[i]);
424
+ s3 = PyUnicode_Concat(s, s2);
425
+ Py_DECREF(s2);
426
+ Py_DECREF(s);
427
+ s = s3;
428
+ }
429
+ if (PyDict_SetItemString(fp->dict, name, s))
430
+ return NULL;
431
+ return s;
432
+ }
433
+ if ((strcmp(name, "_cpointer") == 0) && (fp->len == 1)) {
434
+ PyObject *cobj =
435
+ F2PyCapsule_FromVoidPtr((void *)(fp->defs[0].data), NULL);
436
+ if (PyDict_SetItemString(fp->dict, name, cobj))
437
+ return NULL;
438
+ return cobj;
439
+ }
440
+ PyObject *str, *ret;
441
+ str = PyUnicode_FromString(name);
442
+ ret = PyObject_GenericGetAttr((PyObject *)fp, str);
443
+ Py_DECREF(str);
444
+ return ret;
445
+ }
446
+
447
+ static int
448
+ fortran_setattr(PyFortranObject *fp, char *name, PyObject *v)
449
+ {
450
+ int i, j, flag;
451
+ PyArrayObject *arr = NULL;
452
+ for (i = 0, j = 1; i < fp->len && (j = strcmp(name, fp->defs[i].name));
453
+ i++)
454
+ ;
455
+ if (j == 0) {
456
+ if (fp->defs[i].rank == -1) {
457
+ PyErr_SetString(PyExc_AttributeError,
458
+ "over-writing fortran routine");
459
+ return -1;
460
+ }
461
+ if (fp->defs[i].func != NULL) { /* is allocatable array */
462
+ npy_intp dims[F2PY_MAX_DIMS];
463
+ int k;
464
+ save_def = &fp->defs[i];
465
+ if (v != Py_None) { /* set new value (reallocate if needed --
466
+ see f2py generated code for more
467
+ details ) */
468
+ for (k = 0; k < fp->defs[i].rank; k++) dims[k] = -1;
469
+ if ((arr = array_from_pyobj(fp->defs[i].type, dims,
470
+ fp->defs[i].rank, F2PY_INTENT_IN,
471
+ v)) == NULL)
472
+ return -1;
473
+ (*(fp->defs[i].func))(&fp->defs[i].rank, PyArray_DIMS(arr),
474
+ set_data, &flag);
475
+ }
476
+ else { /* deallocate */
477
+ for (k = 0; k < fp->defs[i].rank; k++) dims[k] = 0;
478
+ (*(fp->defs[i].func))(&fp->defs[i].rank, dims, set_data,
479
+ &flag);
480
+ for (k = 0; k < fp->defs[i].rank; k++) dims[k] = -1;
481
+ }
482
+ memcpy(fp->defs[i].dims.d, dims,
483
+ fp->defs[i].rank * sizeof(npy_intp));
484
+ }
485
+ else { /* not allocatable array */
486
+ if ((arr = array_from_pyobj(fp->defs[i].type, fp->defs[i].dims.d,
487
+ fp->defs[i].rank, F2PY_INTENT_IN,
488
+ v)) == NULL)
489
+ return -1;
490
+ }
491
+ if (fp->defs[i].data !=
492
+ NULL) { /* copy Python object to Fortran array */
493
+ npy_intp s = PyArray_MultiplyList(fp->defs[i].dims.d,
494
+ PyArray_NDIM(arr));
495
+ if (s == -1)
496
+ s = PyArray_MultiplyList(PyArray_DIMS(arr), PyArray_NDIM(arr));
497
+ if (s < 0 || (memcpy(fp->defs[i].data, PyArray_DATA(arr),
498
+ s * PyArray_ITEMSIZE(arr))) == NULL) {
499
+ if ((PyObject *)arr != v) {
500
+ Py_DECREF(arr);
501
+ }
502
+ return -1;
503
+ }
504
+ if ((PyObject *)arr != v) {
505
+ Py_DECREF(arr);
506
+ }
507
+ }
508
+ else
509
+ return (fp->defs[i].func == NULL ? -1 : 0);
510
+ return 0; /* successful */
511
+ }
512
+ if (fp->dict == NULL) {
513
+ fp->dict = PyDict_New();
514
+ if (fp->dict == NULL)
515
+ return -1;
516
+ }
517
+ if (v == NULL) {
518
+ int rv = PyDict_DelItemString(fp->dict, name);
519
+ if (rv < 0)
520
+ PyErr_SetString(PyExc_AttributeError,
521
+ "delete non-existing fortran attribute");
522
+ return rv;
523
+ }
524
+ else
525
+ return PyDict_SetItemString(fp->dict, name, v);
526
+ }
527
+
528
+ static PyObject *
529
+ fortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw)
530
+ {
531
+ int i = 0;
532
+ /* printf("fortran call
533
+ name=%s,func=%p,data=%p,%p\n",fp->defs[i].name,
534
+ fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */
535
+ if (fp->defs[i].rank == -1) { /* is Fortran routine */
536
+ if (fp->defs[i].func == NULL) {
537
+ PyErr_Format(PyExc_RuntimeError, "no function to call");
538
+ return NULL;
539
+ }
540
+ else if (fp->defs[i].data == NULL)
541
+ /* dummy routine */
542
+ return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp, arg,
543
+ kw, NULL);
544
+ else
545
+ return (*((fortranfunc)(fp->defs[i].func)))(
546
+ (PyObject *)fp, arg, kw, (void *)fp->defs[i].data);
547
+ }
548
+ PyErr_Format(PyExc_TypeError, "this fortran object is not callable");
549
+ return NULL;
550
+ }
551
+
552
+ static PyObject *
553
+ fortran_repr(PyFortranObject *fp)
554
+ {
555
+ PyObject *name = NULL, *repr = NULL;
556
+ name = PyObject_GetAttrString((PyObject *)fp, "__name__");
557
+ PyErr_Clear();
558
+ if (name != NULL && PyUnicode_Check(name)) {
559
+ repr = PyUnicode_FromFormat("<fortran %U>", name);
560
+ }
561
+ else {
562
+ repr = PyUnicode_FromString("<fortran object>");
563
+ }
564
+ Py_XDECREF(name);
565
+ return repr;
566
+ }
567
+
568
+ PyTypeObject PyFortran_Type = {
569
+ PyVarObject_HEAD_INIT(NULL, 0).tp_name = "fortran",
570
+ .tp_basicsize = sizeof(PyFortranObject),
571
+ .tp_dealloc = (destructor)fortran_dealloc,
572
+ .tp_getattr = (getattrfunc)fortran_getattr,
573
+ .tp_setattr = (setattrfunc)fortran_setattr,
574
+ .tp_repr = (reprfunc)fortran_repr,
575
+ .tp_call = (ternaryfunc)fortran_call,
576
+ };
577
+
578
+ /************************* f2py_report_atexit *******************************/
579
+
580
+ #ifdef F2PY_REPORT_ATEXIT
581
+ static int passed_time = 0;
582
+ static int passed_counter = 0;
583
+ static int passed_call_time = 0;
584
+ static struct timeb start_time;
585
+ static struct timeb stop_time;
586
+ static struct timeb start_call_time;
587
+ static struct timeb stop_call_time;
588
+ static int cb_passed_time = 0;
589
+ static int cb_passed_counter = 0;
590
+ static int cb_passed_call_time = 0;
591
+ static struct timeb cb_start_time;
592
+ static struct timeb cb_stop_time;
593
+ static struct timeb cb_start_call_time;
594
+ static struct timeb cb_stop_call_time;
595
+
596
+ extern void
597
+ f2py_start_clock(void)
598
+ {
599
+ ftime(&start_time);
600
+ }
601
+ extern void
602
+ f2py_start_call_clock(void)
603
+ {
604
+ f2py_stop_clock();
605
+ ftime(&start_call_time);
606
+ }
607
+ extern void
608
+ f2py_stop_clock(void)
609
+ {
610
+ ftime(&stop_time);
611
+ passed_time += 1000 * (stop_time.time - start_time.time);
612
+ passed_time += stop_time.millitm - start_time.millitm;
613
+ }
614
+ extern void
615
+ f2py_stop_call_clock(void)
616
+ {
617
+ ftime(&stop_call_time);
618
+ passed_call_time += 1000 * (stop_call_time.time - start_call_time.time);
619
+ passed_call_time += stop_call_time.millitm - start_call_time.millitm;
620
+ passed_counter += 1;
621
+ f2py_start_clock();
622
+ }
623
+
624
+ extern void
625
+ f2py_cb_start_clock(void)
626
+ {
627
+ ftime(&cb_start_time);
628
+ }
629
+ extern void
630
+ f2py_cb_start_call_clock(void)
631
+ {
632
+ f2py_cb_stop_clock();
633
+ ftime(&cb_start_call_time);
634
+ }
635
+ extern void
636
+ f2py_cb_stop_clock(void)
637
+ {
638
+ ftime(&cb_stop_time);
639
+ cb_passed_time += 1000 * (cb_stop_time.time - cb_start_time.time);
640
+ cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;
641
+ }
642
+ extern void
643
+ f2py_cb_stop_call_clock(void)
644
+ {
645
+ ftime(&cb_stop_call_time);
646
+ cb_passed_call_time +=
647
+ 1000 * (cb_stop_call_time.time - cb_start_call_time.time);
648
+ cb_passed_call_time +=
649
+ cb_stop_call_time.millitm - cb_start_call_time.millitm;
650
+ cb_passed_counter += 1;
651
+ f2py_cb_start_clock();
652
+ }
653
+
654
+ static int f2py_report_on_exit_been_here = 0;
655
+ extern void
656
+ f2py_report_on_exit(int exit_flag, void *name)
657
+ {
658
+ if (f2py_report_on_exit_been_here) {
659
+ fprintf(stderr, " %s\n", (char *)name);
660
+ return;
661
+ }
662
+ f2py_report_on_exit_been_here = 1;
663
+ fprintf(stderr, " /-----------------------\\\n");
664
+ fprintf(stderr, " < F2PY performance report >\n");
665
+ fprintf(stderr, " \\-----------------------/\n");
666
+ fprintf(stderr, "Overall time spent in ...\n");
667
+ fprintf(stderr, "(a) wrapped (Fortran/C) functions : %8d msec\n",
668
+ passed_call_time);
669
+ fprintf(stderr, "(b) f2py interface, %6d calls : %8d msec\n",
670
+ passed_counter, passed_time);
671
+ fprintf(stderr, "(c) call-back (Python) functions : %8d msec\n",
672
+ cb_passed_call_time);
673
+ fprintf(stderr, "(d) f2py call-back interface, %6d calls : %8d msec\n",
674
+ cb_passed_counter, cb_passed_time);
675
+
676
+ fprintf(stderr,
677
+ "(e) wrapped (Fortran/C) functions (actual) : %8d msec\n\n",
678
+ passed_call_time - cb_passed_call_time - cb_passed_time);
679
+ fprintf(stderr,
680
+ "Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\n");
681
+ fprintf(stderr, "Exit status: %d\n", exit_flag);
682
+ fprintf(stderr, "Modules : %s\n", (char *)name);
683
+ }
684
+ #endif
685
+
686
+ /********************** report on array copy ****************************/
687
+
688
+ #ifdef F2PY_REPORT_ON_ARRAY_COPY
689
+ static void
690
+ f2py_report_on_array_copy(PyArrayObject *arr)
691
+ {
692
+ const npy_intp arr_size = PyArray_Size((PyObject *)arr);
693
+ if (arr_size > F2PY_REPORT_ON_ARRAY_COPY) {
694
+ fprintf(stderr,
695
+ "copied an array: size=%ld, elsize=%" NPY_INTP_FMT "\n",
696
+ arr_size, (npy_intp)PyArray_ITEMSIZE(arr));
697
+ }
698
+ }
699
+ static void
700
+ f2py_report_on_array_copy_fromany(void)
701
+ {
702
+ fprintf(stderr, "created an array from object\n");
703
+ }
704
+
705
+ #define F2PY_REPORT_ON_ARRAY_COPY_FROMARR \
706
+ f2py_report_on_array_copy((PyArrayObject *)arr)
707
+ #define F2PY_REPORT_ON_ARRAY_COPY_FROMANY f2py_report_on_array_copy_fromany()
708
+ #else
709
+ #define F2PY_REPORT_ON_ARRAY_COPY_FROMARR
710
+ #define F2PY_REPORT_ON_ARRAY_COPY_FROMANY
711
+ #endif
712
+
713
+ /************************* array_from_obj *******************************/
714
+
715
+ /*
716
+ * File: array_from_pyobj.c
717
+ *
718
+ * Description:
719
+ * ------------
720
+ * Provides array_from_pyobj function that returns a contiguous array
721
+ * object with the given dimensions and required storage order, either
722
+ * in row-major (C) or column-major (Fortran) order. The function
723
+ * array_from_pyobj is very flexible about its Python object argument
724
+ * that can be any number, list, tuple, or array.
725
+ *
726
+ * array_from_pyobj is used in f2py generated Python extension
727
+ * modules.
728
+ *
729
+ * Author: Pearu Peterson <pearu@cens.ioc.ee>
730
+ * Created: 13-16 January 2002
731
+ * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $
732
+ */
733
+
734
+ static int check_and_fix_dimensions(const PyArrayObject* arr,
735
+ const int rank,
736
+ npy_intp *dims,
737
+ const char *errmess);
738
+
739
+ static int
740
+ find_first_negative_dimension(const int rank, const npy_intp *dims)
741
+ {
742
+ int i;
743
+ for (i = 0; i < rank; ++i) {
744
+ if (dims[i] < 0) {
745
+ return i;
746
+ }
747
+ }
748
+ return -1;
749
+ }
750
+
751
+ #ifdef DEBUG_COPY_ND_ARRAY
752
+ void
753
+ dump_dims(int rank, npy_intp const *dims)
754
+ {
755
+ int i;
756
+ printf("[");
757
+ for (i = 0; i < rank; ++i) {
758
+ printf("%3" NPY_INTP_FMT, dims[i]);
759
+ }
760
+ printf("]\n");
761
+ }
762
+ void
763
+ dump_attrs(const PyArrayObject *obj)
764
+ {
765
+ const PyArrayObject_fields *arr = (const PyArrayObject_fields *)obj;
766
+ int rank = PyArray_NDIM(arr);
767
+ npy_intp size = PyArray_Size((PyObject *)arr);
768
+ printf("\trank = %d, flags = %d, size = %" NPY_INTP_FMT "\n", rank,
769
+ arr->flags, size);
770
+ printf("\tstrides = ");
771
+ dump_dims(rank, arr->strides);
772
+ printf("\tdimensions = ");
773
+ dump_dims(rank, arr->dimensions);
774
+ }
775
+ #endif
776
+
777
+ #define SWAPTYPE(a, b, t) \
778
+ { \
779
+ t c; \
780
+ c = (a); \
781
+ (a) = (b); \
782
+ (b) = c; \
783
+ }
784
+
785
+ static int
786
+ swap_arrays(PyArrayObject *obj1, PyArrayObject *obj2)
787
+ {
788
+ PyArrayObject_fields *arr1 = (PyArrayObject_fields *)obj1,
789
+ *arr2 = (PyArrayObject_fields *)obj2;
790
+ SWAPTYPE(arr1->data, arr2->data, char *);
791
+ SWAPTYPE(arr1->nd, arr2->nd, int);
792
+ SWAPTYPE(arr1->dimensions, arr2->dimensions, npy_intp *);
793
+ SWAPTYPE(arr1->strides, arr2->strides, npy_intp *);
794
+ SWAPTYPE(arr1->base, arr2->base, PyObject *);
795
+ SWAPTYPE(arr1->descr, arr2->descr, PyArray_Descr *);
796
+ SWAPTYPE(arr1->flags, arr2->flags, int);
797
+ /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */
798
+ return 0;
799
+ }
800
+
801
+ #define ARRAY_ISCOMPATIBLE(arr,type_num) \
802
+ ((PyArray_ISINTEGER(arr) && PyTypeNum_ISINTEGER(type_num)) || \
803
+ (PyArray_ISFLOAT(arr) && PyTypeNum_ISFLOAT(type_num)) || \
804
+ (PyArray_ISCOMPLEX(arr) && PyTypeNum_ISCOMPLEX(type_num)) || \
805
+ (PyArray_ISBOOL(arr) && PyTypeNum_ISBOOL(type_num)) || \
806
+ (PyArray_ISSTRING(arr) && PyTypeNum_ISSTRING(type_num)))
807
+
808
+ static int
809
+ get_elsize(PyObject *obj) {
810
+ /*
811
+ get_elsize determines array itemsize from a Python object. Returns
812
+ elsize if successful, -1 otherwise.
813
+
814
+ Supported types of the input are: numpy.ndarray, bytes, str, tuple,
815
+ list.
816
+ */
817
+
818
+ if (PyArray_Check(obj)) {
819
+ return PyArray_ITEMSIZE((PyArrayObject *)obj);
820
+ } else if (PyBytes_Check(obj)) {
821
+ return PyBytes_GET_SIZE(obj);
822
+ } else if (PyUnicode_Check(obj)) {
823
+ return PyUnicode_GET_LENGTH(obj);
824
+ } else if (PySequence_Check(obj)) {
825
+ PyObject* fast = PySequence_Fast(obj, "f2py:fortranobject.c:get_elsize"); // noqa: borrowed-ref OK
826
+ if (fast != NULL) {
827
+ Py_ssize_t i, n = PySequence_Fast_GET_SIZE(fast);
828
+ int sz, elsize = 0;
829
+ for (i=0; i<n; i++) {
830
+ sz = get_elsize(PySequence_Fast_GET_ITEM(fast, i) /* borrowed */);
831
+ if (sz > elsize) {
832
+ elsize = sz;
833
+ }
834
+ }
835
+ Py_DECREF(fast);
836
+ return elsize;
837
+ }
838
+ }
839
+ return -1;
840
+ }
841
+
842
+ extern PyArrayObject *
843
+ ndarray_from_pyobj(const int type_num,
844
+ const int elsize_,
845
+ npy_intp *dims,
846
+ const int rank,
847
+ const int intent,
848
+ PyObject *obj,
849
+ const char *errmess) {
850
+ /*
851
+ * Return an array with given element type and shape from a Python
852
+ * object while taking into account the usage intent of the array.
853
+ *
854
+ * - element type is defined by type_num and elsize
855
+ * - shape is defined by dims and rank
856
+ *
857
+ * ndarray_from_pyobj is used to convert Python object arguments
858
+ * to numpy ndarrays with given type and shape that data is passed
859
+ * to interfaced Fortran or C functions.
860
+ *
861
+ * errmess (if not NULL), contains a prefix of an error message
862
+ * for an exception to be triggered within this function.
863
+ *
864
+ * Negative elsize value means that elsize is to be determined
865
+ * from the Python object in runtime.
866
+ *
867
+ * Note on strings
868
+ * ---------------
869
+ *
870
+ * String type (type_num == NPY_STRING) does not have fixed
871
+ * element size and, by default, the type object sets it to
872
+ * 0. Therefore, for string types, one has to use elsize
873
+ * argument. For other types, elsize value is ignored.
874
+ *
875
+ * NumPy defines the type of a fixed-width string as
876
+ * dtype('S<width>'). In addition, there is also dtype('c'), that
877
+ * appears as dtype('S1') (these have the same type_num value),
878
+ * but is actually different (.char attribute is either 'S' or
879
+ * 'c', respectively).
880
+ *
881
+ * In Fortran, character arrays and strings are different
882
+ * concepts. The relation between Fortran types, NumPy dtypes,
883
+ * and type_num-elsize pairs, is defined as follows:
884
+ *
885
+ * character*5 foo | dtype('S5') | elsize=5, shape=()
886
+ * character(5) foo | dtype('S1') | elsize=1, shape=(5)
887
+ * character*5 foo(n) | dtype('S5') | elsize=5, shape=(n,)
888
+ * character(5) foo(n) | dtype('S1') | elsize=1, shape=(5, n)
889
+ * character*(*) foo | dtype('S') | elsize=-1, shape=()
890
+ *
891
+ * Note about reference counting
892
+ * -----------------------------
893
+ *
894
+ * If the caller returns the array to Python, it must be done with
895
+ * Py_BuildValue("N",arr). Otherwise, if obj!=arr then the caller
896
+ * must call Py_DECREF(arr).
897
+ *
898
+ * Note on intent(cache,out,..)
899
+ * ----------------------------
900
+ * Don't expect correct data when returning intent(cache) array.
901
+ *
902
+ */
903
+ char mess[F2PY_MESSAGE_BUFFER_SIZE];
904
+ PyArrayObject *arr = NULL;
905
+ int elsize = (elsize_ < 0 ? get_elsize(obj) : elsize_);
906
+ if (elsize < 0) {
907
+ if (errmess != NULL) {
908
+ strcpy(mess, errmess);
909
+ }
910
+ sprintf(mess + strlen(mess),
911
+ " -- failed to determine element size from %s",
912
+ Py_TYPE(obj)->tp_name);
913
+ PyErr_SetString(PyExc_SystemError, mess);
914
+ return NULL;
915
+ }
916
+ PyArray_Descr * descr = get_descr_from_type_and_elsize(type_num, elsize); // new reference
917
+ if (descr == NULL) {
918
+ return NULL;
919
+ }
920
+ elsize = PyDataType_ELSIZE(descr);
921
+ if ((intent & F2PY_INTENT_HIDE)
922
+ || ((intent & F2PY_INTENT_CACHE) && (obj == Py_None))
923
+ || ((intent & F2PY_OPTIONAL) && (obj == Py_None))
924
+ ) {
925
+ /* intent(cache), optional, intent(hide) */
926
+ int ineg = find_first_negative_dimension(rank, dims);
927
+ if (ineg >= 0) {
928
+ int i;
929
+ strcpy(mess, "failed to create intent(cache|hide)|optional array"
930
+ "-- must have defined dimensions but got (");
931
+ for(i = 0; i < rank; ++i)
932
+ sprintf(mess + strlen(mess), "%" NPY_INTP_FMT ",", dims[i]);
933
+ strcat(mess, ")");
934
+ PyErr_SetString(PyExc_ValueError, mess);
935
+ Py_DECREF(descr);
936
+ return NULL;
937
+ }
938
+ arr = (PyArrayObject *) \
939
+ PyArray_NewFromDescr(&PyArray_Type, descr, rank, dims,
940
+ NULL, NULL, !(intent & F2PY_INTENT_C), NULL);
941
+ if (arr == NULL) {
942
+ Py_DECREF(descr);
943
+ return NULL;
944
+ }
945
+ if (PyArray_ITEMSIZE(arr) != elsize) {
946
+ strcpy(mess, "failed to create intent(cache|hide)|optional array");
947
+ sprintf(mess+strlen(mess)," -- expected elsize=%d got %" NPY_INTP_FMT, elsize, (npy_intp)PyArray_ITEMSIZE(arr));
948
+ PyErr_SetString(PyExc_ValueError,mess);
949
+ Py_DECREF(arr);
950
+ return NULL;
951
+ }
952
+ if (!(intent & F2PY_INTENT_CACHE)) {
953
+ PyArray_FILLWBYTE(arr, 0);
954
+ }
955
+ return arr;
956
+ }
957
+
958
+ if (PyArray_Check(obj)) {
959
+ arr = (PyArrayObject *)obj;
960
+ if (intent & F2PY_INTENT_CACHE) {
961
+ /* intent(cache) */
962
+ if (PyArray_ISONESEGMENT(arr)
963
+ && PyArray_ITEMSIZE(arr) >= elsize) {
964
+ if (check_and_fix_dimensions(arr, rank, dims, errmess)) {
965
+ Py_DECREF(descr);
966
+ return NULL;
967
+ }
968
+ if (intent & F2PY_INTENT_OUT)
969
+ Py_INCREF(arr);
970
+ Py_DECREF(descr);
971
+ return arr;
972
+ }
973
+ strcpy(mess, "failed to initialize intent(cache) array");
974
+ if (!PyArray_ISONESEGMENT(arr))
975
+ strcat(mess, " -- input must be in one segment");
976
+ if (PyArray_ITEMSIZE(arr) < elsize)
977
+ sprintf(mess + strlen(mess),
978
+ " -- expected at least elsize=%d but got "
979
+ "%" NPY_INTP_FMT,
980
+ elsize, (npy_intp)PyArray_ITEMSIZE(arr));
981
+ PyErr_SetString(PyExc_ValueError, mess);
982
+ Py_DECREF(descr);
983
+ return NULL;
984
+ }
985
+
986
+ /* here we have always intent(in) or intent(inout) or intent(inplace)
987
+ */
988
+
989
+ if (check_and_fix_dimensions(arr, rank, dims, errmess)) {
990
+ Py_DECREF(descr);
991
+ return NULL;
992
+ }
993
+ /*
994
+ printf("intent alignment=%d\n", F2PY_GET_ALIGNMENT(intent));
995
+ printf("alignment check=%d\n", F2PY_CHECK_ALIGNMENT(arr, intent));
996
+ int i;
997
+ for (i=1;i<=16;i++)
998
+ printf("i=%d isaligned=%d\n", i, ARRAY_ISALIGNED(arr, i));
999
+ */
1000
+ if ((! (intent & F2PY_INTENT_COPY)) &&
1001
+ PyArray_ITEMSIZE(arr) == elsize &&
1002
+ ARRAY_ISCOMPATIBLE(arr,type_num) &&
1003
+ F2PY_CHECK_ALIGNMENT(arr, intent)) {
1004
+ if ((intent & F2PY_INTENT_INOUT || intent & F2PY_INTENT_INPLACE)
1005
+ ? ((intent & F2PY_INTENT_C) ? PyArray_ISCARRAY(arr) : PyArray_ISFARRAY(arr))
1006
+ : ((intent & F2PY_INTENT_C) ? PyArray_ISCARRAY_RO(arr) : PyArray_ISFARRAY_RO(arr))) {
1007
+ if ((intent & F2PY_INTENT_OUT)) {
1008
+ Py_INCREF(arr);
1009
+ }
1010
+ /* Returning input array */
1011
+ Py_DECREF(descr);
1012
+ return arr;
1013
+ }
1014
+ }
1015
+ if (intent & F2PY_INTENT_INOUT) {
1016
+ strcpy(mess, "failed to initialize intent(inout) array");
1017
+ /* Must use PyArray_IS*ARRAY because intent(inout) requires
1018
+ * writable input */
1019
+ if ((intent & F2PY_INTENT_C) && !PyArray_ISCARRAY(arr))
1020
+ strcat(mess, " -- input not contiguous");
1021
+ if (!(intent & F2PY_INTENT_C) && !PyArray_ISFARRAY(arr))
1022
+ strcat(mess, " -- input not fortran contiguous");
1023
+ if (PyArray_ITEMSIZE(arr) != elsize)
1024
+ sprintf(mess + strlen(mess),
1025
+ " -- expected elsize=%d but got %" NPY_INTP_FMT,
1026
+ elsize,
1027
+ (npy_intp)PyArray_ITEMSIZE(arr)
1028
+ );
1029
+ if (!(ARRAY_ISCOMPATIBLE(arr, type_num))) {
1030
+ sprintf(mess + strlen(mess),
1031
+ " -- input '%c' not compatible to '%c'",
1032
+ PyArray_DESCR(arr)->type, descr->type);
1033
+ }
1034
+ if (!(F2PY_CHECK_ALIGNMENT(arr, intent)))
1035
+ sprintf(mess + strlen(mess), " -- input not %d-aligned",
1036
+ F2PY_GET_ALIGNMENT(intent));
1037
+ PyErr_SetString(PyExc_ValueError, mess);
1038
+ Py_DECREF(descr);
1039
+ return NULL;
1040
+ }
1041
+
1042
+ /* here we have always intent(in) or intent(inplace) */
1043
+
1044
+ {
1045
+ PyArrayObject * retarr = (PyArrayObject *) \
1046
+ PyArray_NewFromDescr(&PyArray_Type, descr, PyArray_NDIM(arr), PyArray_DIMS(arr),
1047
+ NULL, NULL, !(intent & F2PY_INTENT_C), NULL);
1048
+ if (retarr==NULL) {
1049
+ Py_DECREF(descr);
1050
+ return NULL;
1051
+ }
1052
+ F2PY_REPORT_ON_ARRAY_COPY_FROMARR;
1053
+ if (PyArray_CopyInto(retarr, arr)) {
1054
+ Py_DECREF(retarr);
1055
+ return NULL;
1056
+ }
1057
+ if (intent & F2PY_INTENT_INPLACE) {
1058
+ if (swap_arrays(arr,retarr)) {
1059
+ Py_DECREF(retarr);
1060
+ return NULL; /* XXX: set exception */
1061
+ }
1062
+ Py_XDECREF(retarr);
1063
+ if (intent & F2PY_INTENT_OUT)
1064
+ Py_INCREF(arr);
1065
+ } else {
1066
+ arr = retarr;
1067
+ }
1068
+ }
1069
+ return arr;
1070
+ }
1071
+
1072
+ if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE) ||
1073
+ (intent & F2PY_INTENT_CACHE)) {
1074
+ PyErr_Format(PyExc_TypeError,
1075
+ "failed to initialize intent(inout|inplace|cache) "
1076
+ "array, input '%s' object is not an array",
1077
+ Py_TYPE(obj)->tp_name);
1078
+ Py_DECREF(descr);
1079
+ return NULL;
1080
+ }
1081
+
1082
+ {
1083
+ F2PY_REPORT_ON_ARRAY_COPY_FROMANY;
1084
+ arr = (PyArrayObject *)PyArray_FromAny(
1085
+ obj, descr, 0, 0,
1086
+ ((intent & F2PY_INTENT_C) ? NPY_ARRAY_CARRAY
1087
+ : NPY_ARRAY_FARRAY) |
1088
+ NPY_ARRAY_FORCECAST,
1089
+ NULL);
1090
+ // Warning: in the case of NPY_STRING, PyArray_FromAny may
1091
+ // reset descr->elsize, e.g. dtype('S0') becomes dtype('S1').
1092
+ if (arr == NULL) {
1093
+ Py_DECREF(descr);
1094
+ return NULL;
1095
+ }
1096
+ if (type_num != NPY_STRING && PyArray_ITEMSIZE(arr) != elsize) {
1097
+ // This is internal sanity tests: elsize has been set to
1098
+ // descr->elsize in the beginning of this function.
1099
+ strcpy(mess, "failed to initialize intent(in) array");
1100
+ sprintf(mess + strlen(mess),
1101
+ " -- expected elsize=%d got %" NPY_INTP_FMT, elsize,
1102
+ (npy_intp)PyArray_ITEMSIZE(arr));
1103
+ PyErr_SetString(PyExc_ValueError, mess);
1104
+ Py_DECREF(arr);
1105
+ return NULL;
1106
+ }
1107
+ if (check_and_fix_dimensions(arr, rank, dims, errmess)) {
1108
+ Py_DECREF(arr);
1109
+ return NULL;
1110
+ }
1111
+ return arr;
1112
+ }
1113
+ }
1114
+
1115
+ extern PyArrayObject *
1116
+ array_from_pyobj(const int type_num,
1117
+ npy_intp *dims,
1118
+ const int rank,
1119
+ const int intent,
1120
+ PyObject *obj) {
1121
+ /*
1122
+ Same as ndarray_from_pyobj but with elsize determined from type,
1123
+ if possible. Provided for backward compatibility.
1124
+ */
1125
+ PyArray_Descr* descr = PyArray_DescrFromType(type_num);
1126
+ int elsize = PyDataType_ELSIZE(descr);
1127
+ Py_DECREF(descr);
1128
+ return ndarray_from_pyobj(type_num, elsize, dims, rank, intent, obj, NULL);
1129
+ }
1130
+
1131
+ /*****************************************/
1132
+ /* Helper functions for array_from_pyobj */
1133
+ /*****************************************/
1134
+
1135
+ static int
1136
+ check_and_fix_dimensions(const PyArrayObject* arr, const int rank,
1137
+ npy_intp *dims, const char *errmess)
1138
+ {
1139
+ /*
1140
+ * This function fills in blanks (that are -1's) in dims list using
1141
+ * the dimensions from arr. It also checks that non-blank dims will
1142
+ * match with the corresponding values in arr dimensions.
1143
+ *
1144
+ * Returns 0 if the function is successful.
1145
+ *
1146
+ * If an error condition is detected, an exception is set and 1 is
1147
+ * returned.
1148
+ */
1149
+ char mess[F2PY_MESSAGE_BUFFER_SIZE];
1150
+ const npy_intp arr_size =
1151
+ (PyArray_NDIM(arr)) ? PyArray_Size((PyObject *)arr) : 1;
1152
+ #ifdef DEBUG_COPY_ND_ARRAY
1153
+ dump_attrs(arr);
1154
+ printf("check_and_fix_dimensions:init: dims=");
1155
+ dump_dims(rank, dims);
1156
+ #endif
1157
+ if (rank > PyArray_NDIM(arr)) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */
1158
+ npy_intp new_size = 1;
1159
+ int free_axe = -1;
1160
+ int i;
1161
+ npy_intp d;
1162
+ /* Fill dims where -1 or 0; check dimensions; calc new_size; */
1163
+ for (i = 0; i < PyArray_NDIM(arr); ++i) {
1164
+ d = PyArray_DIM(arr, i);
1165
+ if (dims[i] >= 0) {
1166
+ if (d > 1 && dims[i] != d) {
1167
+ PyErr_Format(
1168
+ PyExc_ValueError,
1169
+ "%d-th dimension must be fixed to %" NPY_INTP_FMT
1170
+ " but got %" NPY_INTP_FMT "\n",
1171
+ i, dims[i], d);
1172
+ return 1;
1173
+ }
1174
+ if (!dims[i])
1175
+ dims[i] = 1;
1176
+ }
1177
+ else {
1178
+ dims[i] = d ? d : 1;
1179
+ }
1180
+ new_size *= dims[i];
1181
+ }
1182
+ for (i = PyArray_NDIM(arr); i < rank; ++i)
1183
+ if (dims[i] > 1) {
1184
+ PyErr_Format(PyExc_ValueError,
1185
+ "%d-th dimension must be %" NPY_INTP_FMT
1186
+ " but got 0 (not defined).\n",
1187
+ i, dims[i]);
1188
+ return 1;
1189
+ }
1190
+ else if (free_axe < 0)
1191
+ free_axe = i;
1192
+ else
1193
+ dims[i] = 1;
1194
+ if (free_axe >= 0) {
1195
+ dims[free_axe] = arr_size / new_size;
1196
+ new_size *= dims[free_axe];
1197
+ }
1198
+ if (new_size != arr_size) {
1199
+ PyErr_Format(PyExc_ValueError,
1200
+ "unexpected array size: new_size=%" NPY_INTP_FMT
1201
+ ", got array with arr_size=%" NPY_INTP_FMT
1202
+ " (maybe too many free indices)\n",
1203
+ new_size, arr_size);
1204
+ return 1;
1205
+ }
1206
+ }
1207
+ else if (rank == PyArray_NDIM(arr)) {
1208
+ npy_intp new_size = 1;
1209
+ int i;
1210
+ npy_intp d;
1211
+ for (i = 0; i < rank; ++i) {
1212
+ d = PyArray_DIM(arr, i);
1213
+ if (dims[i] >= 0) {
1214
+ if (d > 1 && d != dims[i]) {
1215
+ if (errmess != NULL) {
1216
+ strcpy(mess, errmess);
1217
+ }
1218
+ sprintf(mess + strlen(mess),
1219
+ " -- %d-th dimension must be fixed to %"
1220
+ NPY_INTP_FMT " but got %" NPY_INTP_FMT,
1221
+ i, dims[i], d);
1222
+ PyErr_SetString(PyExc_ValueError, mess);
1223
+ return 1;
1224
+ }
1225
+ if (!dims[i])
1226
+ dims[i] = 1;
1227
+ }
1228
+ else
1229
+ dims[i] = d;
1230
+ new_size *= dims[i];
1231
+ }
1232
+ if (new_size != arr_size) {
1233
+ PyErr_Format(PyExc_ValueError,
1234
+ "unexpected array size: new_size=%" NPY_INTP_FMT
1235
+ ", got array with arr_size=%" NPY_INTP_FMT "\n",
1236
+ new_size, arr_size);
1237
+ return 1;
1238
+ }
1239
+ }
1240
+ else { /* [[1,2]] -> [[1],[2]] */
1241
+ int i, j;
1242
+ npy_intp d;
1243
+ int effrank;
1244
+ npy_intp size;
1245
+ for (i = 0, effrank = 0; i < PyArray_NDIM(arr); ++i)
1246
+ if (PyArray_DIM(arr, i) > 1)
1247
+ ++effrank;
1248
+ if (dims[rank - 1] >= 0)
1249
+ if (effrank > rank) {
1250
+ PyErr_Format(PyExc_ValueError,
1251
+ "too many axes: %d (effrank=%d), "
1252
+ "expected rank=%d\n",
1253
+ PyArray_NDIM(arr), effrank, rank);
1254
+ return 1;
1255
+ }
1256
+
1257
+ for (i = 0, j = 0; i < rank; ++i) {
1258
+ while (j < PyArray_NDIM(arr) && PyArray_DIM(arr, j) < 2) ++j;
1259
+ if (j >= PyArray_NDIM(arr))
1260
+ d = 1;
1261
+ else
1262
+ d = PyArray_DIM(arr, j++);
1263
+ if (dims[i] >= 0) {
1264
+ if (d > 1 && d != dims[i]) {
1265
+ if (errmess != NULL) {
1266
+ strcpy(mess, errmess);
1267
+ }
1268
+ sprintf(mess + strlen(mess),
1269
+ " -- %d-th dimension must be fixed to %"
1270
+ NPY_INTP_FMT " but got %" NPY_INTP_FMT
1271
+ " (real index=%d)\n",
1272
+ i, dims[i], d, j-1);
1273
+ PyErr_SetString(PyExc_ValueError, mess);
1274
+ return 1;
1275
+ }
1276
+ if (!dims[i])
1277
+ dims[i] = 1;
1278
+ }
1279
+ else
1280
+ dims[i] = d;
1281
+ }
1282
+
1283
+ for (i = rank; i < PyArray_NDIM(arr);
1284
+ ++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */
1285
+ while (j < PyArray_NDIM(arr) && PyArray_DIM(arr, j) < 2) ++j;
1286
+ if (j >= PyArray_NDIM(arr))
1287
+ d = 1;
1288
+ else
1289
+ d = PyArray_DIM(arr, j++);
1290
+ dims[rank - 1] *= d;
1291
+ }
1292
+ for (i = 0, size = 1; i < rank; ++i) size *= dims[i];
1293
+ if (size != arr_size) {
1294
+ char msg[200];
1295
+ int len;
1296
+ snprintf(msg, sizeof(msg),
1297
+ "unexpected array size: size=%" NPY_INTP_FMT
1298
+ ", arr_size=%" NPY_INTP_FMT
1299
+ ", rank=%d, effrank=%d, arr.nd=%d, dims=[",
1300
+ size, arr_size, rank, effrank, PyArray_NDIM(arr));
1301
+ for (i = 0; i < rank; ++i) {
1302
+ len = strlen(msg);
1303
+ snprintf(msg + len, sizeof(msg) - len, " %" NPY_INTP_FMT,
1304
+ dims[i]);
1305
+ }
1306
+ len = strlen(msg);
1307
+ snprintf(msg + len, sizeof(msg) - len, " ], arr.dims=[");
1308
+ for (i = 0; i < PyArray_NDIM(arr); ++i) {
1309
+ len = strlen(msg);
1310
+ snprintf(msg + len, sizeof(msg) - len, " %" NPY_INTP_FMT,
1311
+ PyArray_DIM(arr, i));
1312
+ }
1313
+ len = strlen(msg);
1314
+ snprintf(msg + len, sizeof(msg) - len, " ]\n");
1315
+ PyErr_SetString(PyExc_ValueError, msg);
1316
+ return 1;
1317
+ }
1318
+ }
1319
+ #ifdef DEBUG_COPY_ND_ARRAY
1320
+ printf("check_and_fix_dimensions:end: dims=");
1321
+ dump_dims(rank, dims);
1322
+ #endif
1323
+ return 0;
1324
+ }
1325
+
1326
+ /* End of file: array_from_pyobj.c */
1327
+
1328
+ /************************* copy_ND_array *******************************/
1329
+
1330
+ extern int
1331
+ copy_ND_array(const PyArrayObject *arr, PyArrayObject *out)
1332
+ {
1333
+ F2PY_REPORT_ON_ARRAY_COPY_FROMARR;
1334
+ return PyArray_CopyInto(out, (PyArrayObject *)arr);
1335
+ }
1336
+
1337
+ /********************* Various utility functions ***********************/
1338
+
1339
+ extern int
1340
+ f2py_describe(PyObject *obj, char *buf) {
1341
+ /*
1342
+ Write the description of a Python object to buf. The caller must
1343
+ provide buffer with size sufficient to write the description.
1344
+
1345
+ Return 1 on success.
1346
+ */
1347
+ char localbuf[F2PY_MESSAGE_BUFFER_SIZE];
1348
+ if (PyBytes_Check(obj)) {
1349
+ sprintf(localbuf, "%d-%s", (npy_int)PyBytes_GET_SIZE(obj), Py_TYPE(obj)->tp_name);
1350
+ } else if (PyUnicode_Check(obj)) {
1351
+ sprintf(localbuf, "%d-%s", (npy_int)PyUnicode_GET_LENGTH(obj), Py_TYPE(obj)->tp_name);
1352
+ } else if (PyArray_CheckScalar(obj)) {
1353
+ PyArrayObject* arr = (PyArrayObject*)obj;
1354
+ sprintf(localbuf, "%c%" NPY_INTP_FMT "-%s-scalar", PyArray_DESCR(arr)->kind, PyArray_ITEMSIZE(arr), Py_TYPE(obj)->tp_name);
1355
+ } else if (PyArray_Check(obj)) {
1356
+ int i;
1357
+ PyArrayObject* arr = (PyArrayObject*)obj;
1358
+ strcpy(localbuf, "(");
1359
+ for (i=0; i<PyArray_NDIM(arr); i++) {
1360
+ if (i) {
1361
+ strcat(localbuf, " ");
1362
+ }
1363
+ sprintf(localbuf + strlen(localbuf), "%" NPY_INTP_FMT ",", PyArray_DIM(arr, i));
1364
+ }
1365
+ sprintf(localbuf + strlen(localbuf), ")-%c%" NPY_INTP_FMT "-%s", PyArray_DESCR(arr)->kind, PyArray_ITEMSIZE(arr), Py_TYPE(obj)->tp_name);
1366
+ } else if (PySequence_Check(obj)) {
1367
+ sprintf(localbuf, "%d-%s", (npy_int)PySequence_Length(obj), Py_TYPE(obj)->tp_name);
1368
+ } else {
1369
+ sprintf(localbuf, "%s instance", Py_TYPE(obj)->tp_name);
1370
+ }
1371
+ // TODO: detect the size of buf and make sure that size(buf) >= size(localbuf).
1372
+ strcpy(buf, localbuf);
1373
+ return 1;
1374
+ }
1375
+
1376
+ extern npy_intp
1377
+ f2py_size_impl(PyArrayObject* var, ...)
1378
+ {
1379
+ npy_intp sz = 0;
1380
+ npy_intp dim;
1381
+ npy_intp rank;
1382
+ va_list argp;
1383
+ va_start(argp, var);
1384
+ dim = va_arg(argp, npy_int);
1385
+ if (dim==-1)
1386
+ {
1387
+ sz = PyArray_SIZE(var);
1388
+ }
1389
+ else
1390
+ {
1391
+ rank = PyArray_NDIM(var);
1392
+ if (dim>=1 && dim<=rank)
1393
+ sz = PyArray_DIM(var, dim-1);
1394
+ else
1395
+ fprintf(stderr, "f2py_size: 2nd argument value=%" NPY_INTP_FMT
1396
+ " fails to satisfy 1<=value<=%" NPY_INTP_FMT
1397
+ ". Result will be 0.\n", dim, rank);
1398
+ }
1399
+ va_end(argp);
1400
+ return sz;
1401
+ }
1402
+
1403
+ /*********************************************/
1404
+ /* Compatibility functions for Python >= 3.0 */
1405
+ /*********************************************/
1406
+
1407
+ PyObject *
1408
+ F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *))
1409
+ {
1410
+ PyObject *ret = PyCapsule_New(ptr, NULL, dtor);
1411
+ if (ret == NULL) {
1412
+ PyErr_Clear();
1413
+ }
1414
+ return ret;
1415
+ }
1416
+
1417
+ void *
1418
+ F2PyCapsule_AsVoidPtr(PyObject *obj)
1419
+ {
1420
+ void *ret = PyCapsule_GetPointer(obj, NULL);
1421
+ if (ret == NULL) {
1422
+ PyErr_Clear();
1423
+ }
1424
+ return ret;
1425
+ }
1426
+
1427
+ int
1428
+ F2PyCapsule_Check(PyObject *ptr)
1429
+ {
1430
+ return PyCapsule_CheckExact(ptr);
1431
+ }
1432
+
1433
+ #ifdef __cplusplus
1434
+ }
1435
+ #endif
1436
+ /************************* EOF fortranobject.c *******************************/