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
numpy/f2py/cfuncs.py ADDED
@@ -0,0 +1,1563 @@
1
+ """
2
+ C declarations, CPP macros, and C functions for f2py2e.
3
+ Only required declarations/macros/functions will be used.
4
+
5
+ Copyright 1999 -- 2011 Pearu Peterson all rights reserved.
6
+ Copyright 2011 -- present NumPy Developers.
7
+ Permission to use, modify, and distribute this software is given under the
8
+ terms of the NumPy License.
9
+
10
+ NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
11
+ """
12
+ import copy
13
+ import sys
14
+
15
+ from . import __version__
16
+
17
+ f2py_version = __version__.version
18
+
19
+
20
+ def errmess(s: str) -> None:
21
+ """
22
+ Write an error message to stderr.
23
+
24
+ This indirection is needed because sys.stderr might not always be available (see #26862).
25
+ """
26
+ if sys.stderr is not None:
27
+ sys.stderr.write(s)
28
+
29
+ ##################### Definitions ##################
30
+
31
+
32
+ outneeds = {'includes0': [], 'includes': [], 'typedefs': [], 'typedefs_generated': [],
33
+ 'userincludes': [],
34
+ 'cppmacros': [], 'cfuncs': [], 'callbacks': [], 'f90modhooks': [],
35
+ 'commonhooks': []}
36
+ needs = {}
37
+ includes0 = {'includes0': '/*need_includes0*/'}
38
+ includes = {'includes': '/*need_includes*/'}
39
+ userincludes = {'userincludes': '/*need_userincludes*/'}
40
+ typedefs = {'typedefs': '/*need_typedefs*/'}
41
+ typedefs_generated = {'typedefs_generated': '/*need_typedefs_generated*/'}
42
+ cppmacros = {'cppmacros': '/*need_cppmacros*/'}
43
+ cfuncs = {'cfuncs': '/*need_cfuncs*/'}
44
+ callbacks = {'callbacks': '/*need_callbacks*/'}
45
+ f90modhooks = {'f90modhooks': '/*need_f90modhooks*/',
46
+ 'initf90modhooksstatic': '/*initf90modhooksstatic*/',
47
+ 'initf90modhooksdynamic': '/*initf90modhooksdynamic*/',
48
+ }
49
+ commonhooks = {'commonhooks': '/*need_commonhooks*/',
50
+ 'initcommonhooks': '/*need_initcommonhooks*/',
51
+ }
52
+
53
+ ############ Includes ###################
54
+
55
+ includes0['math.h'] = '#include <math.h>'
56
+ includes0['string.h'] = '#include <string.h>'
57
+ includes0['setjmp.h'] = '#include <setjmp.h>'
58
+
59
+ includes['arrayobject.h'] = '''#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API
60
+ #include "arrayobject.h"'''
61
+ includes['npy_math.h'] = '#include "numpy/npy_math.h"'
62
+
63
+ includes['arrayobject.h'] = '#include "fortranobject.h"'
64
+ includes['stdarg.h'] = '#include <stdarg.h>'
65
+
66
+ ############# Type definitions ###############
67
+
68
+ typedefs['unsigned_char'] = 'typedef unsigned char unsigned_char;'
69
+ typedefs['unsigned_short'] = 'typedef unsigned short unsigned_short;'
70
+ typedefs['unsigned_long'] = 'typedef unsigned long unsigned_long;'
71
+ typedefs['signed_char'] = 'typedef signed char signed_char;'
72
+ typedefs['long_long'] = """
73
+ #if defined(NPY_OS_WIN32)
74
+ typedef __int64 long_long;
75
+ #else
76
+ typedef long long long_long;
77
+ typedef unsigned long long unsigned_long_long;
78
+ #endif
79
+ """
80
+ typedefs['unsigned_long_long'] = """
81
+ #if defined(NPY_OS_WIN32)
82
+ typedef __uint64 long_long;
83
+ #else
84
+ typedef unsigned long long unsigned_long_long;
85
+ #endif
86
+ """
87
+ typedefs['long_double'] = """
88
+ #ifndef _LONG_DOUBLE
89
+ typedef long double long_double;
90
+ #endif
91
+ """
92
+ typedefs[
93
+ 'complex_long_double'] = 'typedef struct {long double r,i;} complex_long_double;'
94
+ typedefs['complex_float'] = 'typedef struct {float r,i;} complex_float;'
95
+ typedefs['complex_double'] = 'typedef struct {double r,i;} complex_double;'
96
+ typedefs['string'] = """typedef char * string;"""
97
+ typedefs['character'] = """typedef char character;"""
98
+
99
+
100
+ ############### CPP macros ####################
101
+ cppmacros['CFUNCSMESS'] = """
102
+ #ifdef DEBUGCFUNCS
103
+ #define CFUNCSMESS(mess) fprintf(stderr,\"debug-capi:\"mess);
104
+ #define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \\
105
+ PyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\
106
+ fprintf(stderr,\"\\n\");
107
+ #else
108
+ #define CFUNCSMESS(mess)
109
+ #define CFUNCSMESSPY(mess,obj)
110
+ #endif
111
+ """
112
+ cppmacros['F_FUNC'] = """
113
+ #if defined(PREPEND_FORTRAN)
114
+ #if defined(NO_APPEND_FORTRAN)
115
+ #if defined(UPPERCASE_FORTRAN)
116
+ #define F_FUNC(f,F) _##F
117
+ #else
118
+ #define F_FUNC(f,F) _##f
119
+ #endif
120
+ #else
121
+ #if defined(UPPERCASE_FORTRAN)
122
+ #define F_FUNC(f,F) _##F##_
123
+ #else
124
+ #define F_FUNC(f,F) _##f##_
125
+ #endif
126
+ #endif
127
+ #else
128
+ #if defined(NO_APPEND_FORTRAN)
129
+ #if defined(UPPERCASE_FORTRAN)
130
+ #define F_FUNC(f,F) F
131
+ #else
132
+ #define F_FUNC(f,F) f
133
+ #endif
134
+ #else
135
+ #if defined(UPPERCASE_FORTRAN)
136
+ #define F_FUNC(f,F) F##_
137
+ #else
138
+ #define F_FUNC(f,F) f##_
139
+ #endif
140
+ #endif
141
+ #endif
142
+ #if defined(UNDERSCORE_G77)
143
+ #define F_FUNC_US(f,F) F_FUNC(f##_,F##_)
144
+ #else
145
+ #define F_FUNC_US(f,F) F_FUNC(f,F)
146
+ #endif
147
+ """
148
+ cppmacros['F_WRAPPEDFUNC'] = """
149
+ #if defined(PREPEND_FORTRAN)
150
+ #if defined(NO_APPEND_FORTRAN)
151
+ #if defined(UPPERCASE_FORTRAN)
152
+ #define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F
153
+ #else
154
+ #define F_WRAPPEDFUNC(f,F) _f2pywrap##f
155
+ #endif
156
+ #else
157
+ #if defined(UPPERCASE_FORTRAN)
158
+ #define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_
159
+ #else
160
+ #define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_
161
+ #endif
162
+ #endif
163
+ #else
164
+ #if defined(NO_APPEND_FORTRAN)
165
+ #if defined(UPPERCASE_FORTRAN)
166
+ #define F_WRAPPEDFUNC(f,F) F2PYWRAP##F
167
+ #else
168
+ #define F_WRAPPEDFUNC(f,F) f2pywrap##f
169
+ #endif
170
+ #else
171
+ #if defined(UPPERCASE_FORTRAN)
172
+ #define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_
173
+ #else
174
+ #define F_WRAPPEDFUNC(f,F) f2pywrap##f##_
175
+ #endif
176
+ #endif
177
+ #endif
178
+ #if defined(UNDERSCORE_G77)
179
+ #define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_)
180
+ #else
181
+ #define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F)
182
+ #endif
183
+ """
184
+ cppmacros['F_MODFUNC'] = """
185
+ #if defined(F90MOD2CCONV1) /*E.g. Compaq Fortran */
186
+ #if defined(NO_APPEND_FORTRAN)
187
+ #define F_MODFUNCNAME(m,f) $ ## m ## $ ## f
188
+ #else
189
+ #define F_MODFUNCNAME(m,f) $ ## m ## $ ## f ## _
190
+ #endif
191
+ #endif
192
+
193
+ #if defined(F90MOD2CCONV2) /*E.g. IBM XL Fortran, not tested though */
194
+ #if defined(NO_APPEND_FORTRAN)
195
+ #define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f
196
+ #else
197
+ #define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f ## _
198
+ #endif
199
+ #endif
200
+
201
+ #if defined(F90MOD2CCONV3) /*E.g. MIPSPro Compilers */
202
+ #if defined(NO_APPEND_FORTRAN)
203
+ #define F_MODFUNCNAME(m,f) f ## .in. ## m
204
+ #else
205
+ #define F_MODFUNCNAME(m,f) f ## .in. ## m ## _
206
+ #endif
207
+ #endif
208
+ /*
209
+ #if defined(UPPERCASE_FORTRAN)
210
+ #define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(M,F)
211
+ #else
212
+ #define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(m,f)
213
+ #endif
214
+ */
215
+
216
+ #define F_MODFUNC(m,f) (*(f2pymodstruct##m##.##f))
217
+ """
218
+ cppmacros['SWAPUNSAFE'] = """
219
+ #define SWAP(a,b) (size_t)(a) = ((size_t)(a) ^ (size_t)(b));\\
220
+ (size_t)(b) = ((size_t)(a) ^ (size_t)(b));\\
221
+ (size_t)(a) = ((size_t)(a) ^ (size_t)(b))
222
+ """
223
+ cppmacros['SWAP'] = """
224
+ #define SWAP(a,b,t) {\\
225
+ t *c;\\
226
+ c = a;\\
227
+ a = b;\\
228
+ b = c;}
229
+ """
230
+ # cppmacros['ISCONTIGUOUS']='#define ISCONTIGUOUS(m) (PyArray_FLAGS(m) &
231
+ # NPY_ARRAY_C_CONTIGUOUS)'
232
+ cppmacros['PRINTPYOBJERR'] = """
233
+ #define PRINTPYOBJERR(obj)\\
234
+ fprintf(stderr,\"#modulename#.error is related to \");\\
235
+ PyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\
236
+ fprintf(stderr,\"\\n\");
237
+ """
238
+ cppmacros['MINMAX'] = """
239
+ #ifndef max
240
+ #define max(a,b) ((a > b) ? (a) : (b))
241
+ #endif
242
+ #ifndef min
243
+ #define min(a,b) ((a < b) ? (a) : (b))
244
+ #endif
245
+ #ifndef MAX
246
+ #define MAX(a,b) ((a > b) ? (a) : (b))
247
+ #endif
248
+ #ifndef MIN
249
+ #define MIN(a,b) ((a < b) ? (a) : (b))
250
+ #endif
251
+ """
252
+ cppmacros['len..'] = """
253
+ /* See fortranobject.h for definitions. The macros here are provided for BC. */
254
+ #define rank f2py_rank
255
+ #define shape f2py_shape
256
+ #define fshape f2py_shape
257
+ #define len f2py_len
258
+ #define flen f2py_flen
259
+ #define slen f2py_slen
260
+ #define size f2py_size
261
+ """
262
+ cppmacros['pyobj_from_char1'] = r"""
263
+ #define pyobj_from_char1(v) (PyLong_FromLong(v))
264
+ """
265
+ cppmacros['pyobj_from_short1'] = r"""
266
+ #define pyobj_from_short1(v) (PyLong_FromLong(v))
267
+ """
268
+ needs['pyobj_from_int1'] = ['signed_char']
269
+ cppmacros['pyobj_from_int1'] = r"""
270
+ #define pyobj_from_int1(v) (PyLong_FromLong(v))
271
+ """
272
+ cppmacros['pyobj_from_long1'] = r"""
273
+ #define pyobj_from_long1(v) (PyLong_FromLong(v))
274
+ """
275
+ needs['pyobj_from_long_long1'] = ['long_long']
276
+ cppmacros['pyobj_from_long_long1'] = """
277
+ #ifdef HAVE_LONG_LONG
278
+ #define pyobj_from_long_long1(v) (PyLong_FromLongLong(v))
279
+ #else
280
+ #warning HAVE_LONG_LONG is not available. Redefining pyobj_from_long_long.
281
+ #define pyobj_from_long_long1(v) (PyLong_FromLong(v))
282
+ #endif
283
+ """
284
+ needs['pyobj_from_long_double1'] = ['long_double']
285
+ cppmacros['pyobj_from_long_double1'] = """
286
+ #define pyobj_from_long_double1(v) (PyFloat_FromDouble(v))"""
287
+ cppmacros['pyobj_from_double1'] = """
288
+ #define pyobj_from_double1(v) (PyFloat_FromDouble(v))"""
289
+ cppmacros['pyobj_from_float1'] = """
290
+ #define pyobj_from_float1(v) (PyFloat_FromDouble(v))"""
291
+ needs['pyobj_from_complex_long_double1'] = ['complex_long_double']
292
+ cppmacros['pyobj_from_complex_long_double1'] = """
293
+ #define pyobj_from_complex_long_double1(v) (PyComplex_FromDoubles(v.r,v.i))"""
294
+ needs['pyobj_from_complex_double1'] = ['complex_double']
295
+ cppmacros['pyobj_from_complex_double1'] = """
296
+ #define pyobj_from_complex_double1(v) (PyComplex_FromDoubles(v.r,v.i))"""
297
+ needs['pyobj_from_complex_float1'] = ['complex_float']
298
+ cppmacros['pyobj_from_complex_float1'] = """
299
+ #define pyobj_from_complex_float1(v) (PyComplex_FromDoubles(v.r,v.i))"""
300
+ needs['pyobj_from_string1'] = ['string']
301
+ cppmacros['pyobj_from_string1'] = """
302
+ #define pyobj_from_string1(v) (PyUnicode_FromString((char *)v))"""
303
+ needs['pyobj_from_string1size'] = ['string']
304
+ cppmacros['pyobj_from_string1size'] = """
305
+ #define pyobj_from_string1size(v,len) (PyUnicode_FromStringAndSize((char *)v, len))"""
306
+ needs['TRYPYARRAYTEMPLATE'] = ['PRINTPYOBJERR']
307
+ cppmacros['TRYPYARRAYTEMPLATE'] = """
308
+ /* New SciPy */
309
+ #define TRYPYARRAYTEMPLATECHAR case NPY_STRING: *(char *)(PyArray_DATA(arr))=*v; break;
310
+ #define TRYPYARRAYTEMPLATELONG case NPY_LONG: *(long *)(PyArray_DATA(arr))=*v; break;
311
+ #define TRYPYARRAYTEMPLATEOBJECT case NPY_OBJECT: PyArray_SETITEM(arr,PyArray_DATA(arr),pyobj_from_ ## ctype ## 1(*v)); break;
312
+
313
+ #define TRYPYARRAYTEMPLATE(ctype,typecode) \\
314
+ PyArrayObject *arr = NULL;\\
315
+ if (!obj) return -2;\\
316
+ if (!PyArray_Check(obj)) return -1;\\
317
+ if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\"TRYPYARRAYTEMPLATE:\");PRINTPYOBJERR(obj);return 0;}\\
318
+ if (PyArray_DESCR(arr)->type==typecode) {*(ctype *)(PyArray_DATA(arr))=*v; return 1;}\\
319
+ switch (PyArray_TYPE(arr)) {\\
320
+ case NPY_DOUBLE: *(npy_double *)(PyArray_DATA(arr))=*v; break;\\
321
+ case NPY_INT: *(npy_int *)(PyArray_DATA(arr))=*v; break;\\
322
+ case NPY_LONG: *(npy_long *)(PyArray_DATA(arr))=*v; break;\\
323
+ case NPY_FLOAT: *(npy_float *)(PyArray_DATA(arr))=*v; break;\\
324
+ case NPY_CDOUBLE: *(npy_double *)(PyArray_DATA(arr))=*v; break;\\
325
+ case NPY_CFLOAT: *(npy_float *)(PyArray_DATA(arr))=*v; break;\\
326
+ case NPY_BOOL: *(npy_bool *)(PyArray_DATA(arr))=(*v!=0); break;\\
327
+ case NPY_UBYTE: *(npy_ubyte *)(PyArray_DATA(arr))=*v; break;\\
328
+ case NPY_BYTE: *(npy_byte *)(PyArray_DATA(arr))=*v; break;\\
329
+ case NPY_SHORT: *(npy_short *)(PyArray_DATA(arr))=*v; break;\\
330
+ case NPY_USHORT: *(npy_ushort *)(PyArray_DATA(arr))=*v; break;\\
331
+ case NPY_UINT: *(npy_uint *)(PyArray_DATA(arr))=*v; break;\\
332
+ case NPY_ULONG: *(npy_ulong *)(PyArray_DATA(arr))=*v; break;\\
333
+ case NPY_LONGLONG: *(npy_longlong *)(PyArray_DATA(arr))=*v; break;\\
334
+ case NPY_ULONGLONG: *(npy_ulonglong *)(PyArray_DATA(arr))=*v; break;\\
335
+ case NPY_LONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=*v; break;\\
336
+ case NPY_CLONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=*v; break;\\
337
+ case NPY_OBJECT: PyArray_SETITEM(arr, PyArray_DATA(arr), pyobj_from_ ## ctype ## 1(*v)); break;\\
338
+ default: return -2;\\
339
+ };\\
340
+ return 1
341
+ """
342
+
343
+ needs['TRYCOMPLEXPYARRAYTEMPLATE'] = ['PRINTPYOBJERR']
344
+ cppmacros['TRYCOMPLEXPYARRAYTEMPLATE'] = """
345
+ #define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case NPY_OBJECT: PyArray_SETITEM(arr, PyArray_DATA(arr), pyobj_from_complex_ ## ctype ## 1((*v))); break;
346
+ #define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\
347
+ PyArrayObject *arr = NULL;\\
348
+ if (!obj) return -2;\\
349
+ if (!PyArray_Check(obj)) return -1;\\
350
+ if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\"TRYCOMPLEXPYARRAYTEMPLATE:\");PRINTPYOBJERR(obj);return 0;}\\
351
+ if (PyArray_DESCR(arr)->type==typecode) {\\
352
+ *(ctype *)(PyArray_DATA(arr))=(*v).r;\\
353
+ *(ctype *)(PyArray_DATA(arr)+sizeof(ctype))=(*v).i;\\
354
+ return 1;\\
355
+ }\\
356
+ switch (PyArray_TYPE(arr)) {\\
357
+ case NPY_CDOUBLE: *(npy_double *)(PyArray_DATA(arr))=(*v).r;\\
358
+ *(npy_double *)(PyArray_DATA(arr)+sizeof(npy_double))=(*v).i;\\
359
+ break;\\
360
+ case NPY_CFLOAT: *(npy_float *)(PyArray_DATA(arr))=(*v).r;\\
361
+ *(npy_float *)(PyArray_DATA(arr)+sizeof(npy_float))=(*v).i;\\
362
+ break;\\
363
+ case NPY_DOUBLE: *(npy_double *)(PyArray_DATA(arr))=(*v).r; break;\\
364
+ case NPY_LONG: *(npy_long *)(PyArray_DATA(arr))=(*v).r; break;\\
365
+ case NPY_FLOAT: *(npy_float *)(PyArray_DATA(arr))=(*v).r; break;\\
366
+ case NPY_INT: *(npy_int *)(PyArray_DATA(arr))=(*v).r; break;\\
367
+ case NPY_SHORT: *(npy_short *)(PyArray_DATA(arr))=(*v).r; break;\\
368
+ case NPY_UBYTE: *(npy_ubyte *)(PyArray_DATA(arr))=(*v).r; break;\\
369
+ case NPY_BYTE: *(npy_byte *)(PyArray_DATA(arr))=(*v).r; break;\\
370
+ case NPY_BOOL: *(npy_bool *)(PyArray_DATA(arr))=((*v).r!=0 && (*v).i!=0); break;\\
371
+ case NPY_USHORT: *(npy_ushort *)(PyArray_DATA(arr))=(*v).r; break;\\
372
+ case NPY_UINT: *(npy_uint *)(PyArray_DATA(arr))=(*v).r; break;\\
373
+ case NPY_ULONG: *(npy_ulong *)(PyArray_DATA(arr))=(*v).r; break;\\
374
+ case NPY_LONGLONG: *(npy_longlong *)(PyArray_DATA(arr))=(*v).r; break;\\
375
+ case NPY_ULONGLONG: *(npy_ulonglong *)(PyArray_DATA(arr))=(*v).r; break;\\
376
+ case NPY_LONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=(*v).r; break;\\
377
+ case NPY_CLONGDOUBLE: *(npy_longdouble *)(PyArray_DATA(arr))=(*v).r;\\
378
+ *(npy_longdouble *)(PyArray_DATA(arr)+sizeof(npy_longdouble))=(*v).i;\\
379
+ break;\\
380
+ case NPY_OBJECT: PyArray_SETITEM(arr, PyArray_DATA(arr), pyobj_from_complex_ ## ctype ## 1((*v))); break;\\
381
+ default: return -2;\\
382
+ };\\
383
+ return -1;
384
+ """
385
+ # cppmacros['NUMFROMARROBJ']="""
386
+ # define NUMFROMARROBJ(typenum,ctype) \\
387
+ # if (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\
388
+ # else arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\
389
+ # if (arr) {\\
390
+ # if (PyArray_TYPE(arr)==NPY_OBJECT) {\\
391
+ # if (!ctype ## _from_pyobj(v,(PyArray_DESCR(arr)->getitem)(PyArray_DATA(arr)),\"\"))\\
392
+ # goto capi_fail;\\
393
+ # } else {\\
394
+ # (PyArray_DESCR(arr)->cast[typenum])(PyArray_DATA(arr),1,(char*)v,1,1);\\
395
+ # }\\
396
+ # if ((PyObject *)arr != obj) { Py_DECREF(arr); }\\
397
+ # return 1;\\
398
+ # }
399
+ # """
400
+ # XXX: Note that CNUMFROMARROBJ is identical with NUMFROMARROBJ
401
+ # cppmacros['CNUMFROMARROBJ']="""
402
+ # define CNUMFROMARROBJ(typenum,ctype) \\
403
+ # if (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\
404
+ # else arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\
405
+ # if (arr) {\\
406
+ # if (PyArray_TYPE(arr)==NPY_OBJECT) {\\
407
+ # if (!ctype ## _from_pyobj(v,(PyArray_DESCR(arr)->getitem)(PyArray_DATA(arr)),\"\"))\\
408
+ # goto capi_fail;\\
409
+ # } else {\\
410
+ # (PyArray_DESCR(arr)->cast[typenum])((void *)(PyArray_DATA(arr)),1,(void *)(v),1,1);\\
411
+ # }\\
412
+ # if ((PyObject *)arr != obj) { Py_DECREF(arr); }\\
413
+ # return 1;\\
414
+ # }
415
+ # """
416
+
417
+
418
+ needs['GETSTRFROMPYTUPLE'] = ['STRINGCOPYN', 'PRINTPYOBJERR']
419
+ cppmacros['GETSTRFROMPYTUPLE'] = """
420
+ #define GETSTRFROMPYTUPLE(tuple,index,str,len) {\\
421
+ PyObject *rv_cb_str = PyTuple_GetItem((tuple),(index));\\
422
+ if (rv_cb_str == NULL)\\
423
+ goto capi_fail;\\
424
+ if (PyBytes_Check(rv_cb_str)) {\\
425
+ str[len-1]='\\0';\\
426
+ STRINGCOPYN((str),PyBytes_AS_STRING((PyBytesObject*)rv_cb_str),(len));\\
427
+ } else {\\
428
+ PRINTPYOBJERR(rv_cb_str);\\
429
+ PyErr_SetString(#modulename#_error,\"string object expected\");\\
430
+ goto capi_fail;\\
431
+ }\\
432
+ }
433
+ """
434
+ cppmacros['GETSCALARFROMPYTUPLE'] = """
435
+ #define GETSCALARFROMPYTUPLE(tuple,index,var,ctype,mess) {\\
436
+ if ((capi_tmp = PyTuple_GetItem((tuple),(index)))==NULL) goto capi_fail;\\
437
+ if (!(ctype ## _from_pyobj((var),capi_tmp,mess)))\\
438
+ goto capi_fail;\\
439
+ }
440
+ """
441
+
442
+ cppmacros['FAILNULL'] = """\
443
+ #define FAILNULL(p) do { \\
444
+ if ((p) == NULL) { \\
445
+ PyErr_SetString(PyExc_MemoryError, "NULL pointer found"); \\
446
+ goto capi_fail; \\
447
+ } \\
448
+ } while (0)
449
+ """
450
+ needs['MEMCOPY'] = ['string.h', 'FAILNULL']
451
+ cppmacros['MEMCOPY'] = """
452
+ #define MEMCOPY(to,from,n)\\
453
+ do { FAILNULL(to); FAILNULL(from); (void)memcpy(to,from,n); } while (0)
454
+ """
455
+ cppmacros['STRINGMALLOC'] = """
456
+ #define STRINGMALLOC(str,len)\\
457
+ if ((str = (string)malloc(len+1)) == NULL) {\\
458
+ PyErr_SetString(PyExc_MemoryError, \"out of memory\");\\
459
+ goto capi_fail;\\
460
+ } else {\\
461
+ (str)[len] = '\\0';\\
462
+ }
463
+ """
464
+ cppmacros['STRINGFREE'] = """
465
+ #define STRINGFREE(str) do {if (!(str == NULL)) free(str);} while (0)
466
+ """
467
+ needs['STRINGPADN'] = ['string.h']
468
+ cppmacros['STRINGPADN'] = """
469
+ /*
470
+ STRINGPADN replaces null values with padding values from the right.
471
+
472
+ `to` must have size of at least N bytes.
473
+
474
+ If the `to[N-1]` has null value, then replace it and all the
475
+ preceding, nulls with the given padding.
476
+
477
+ STRINGPADN(to, N, PADDING, NULLVALUE) is an inverse operation.
478
+ */
479
+ #define STRINGPADN(to, N, NULLVALUE, PADDING) \\
480
+ do { \\
481
+ int _m = (N); \\
482
+ char *_to = (to); \\
483
+ for (_m -= 1; _m >= 0 && _to[_m] == NULLVALUE; _m--) { \\
484
+ _to[_m] = PADDING; \\
485
+ } \\
486
+ } while (0)
487
+ """
488
+ needs['STRINGCOPYN'] = ['string.h', 'FAILNULL']
489
+ cppmacros['STRINGCOPYN'] = """
490
+ /*
491
+ STRINGCOPYN copies N bytes.
492
+
493
+ `to` and `from` buffers must have sizes of at least N bytes.
494
+ */
495
+ #define STRINGCOPYN(to,from,N) \\
496
+ do { \\
497
+ int _m = (N); \\
498
+ char *_to = (to); \\
499
+ char *_from = (from); \\
500
+ FAILNULL(_to); FAILNULL(_from); \\
501
+ (void)strncpy(_to, _from, _m); \\
502
+ } while (0)
503
+ """
504
+ needs['STRINGCOPY'] = ['string.h', 'FAILNULL']
505
+ cppmacros['STRINGCOPY'] = """
506
+ #define STRINGCOPY(to,from)\\
507
+ do { FAILNULL(to); FAILNULL(from); (void)strcpy(to,from); } while (0)
508
+ """
509
+ cppmacros['CHECKGENERIC'] = """
510
+ #define CHECKGENERIC(check,tcheck,name) \\
511
+ if (!(check)) {\\
512
+ PyErr_SetString(#modulename#_error,\"(\"tcheck\") failed for \"name);\\
513
+ /*goto capi_fail;*/\\
514
+ } else """
515
+ cppmacros['CHECKARRAY'] = """
516
+ #define CHECKARRAY(check,tcheck,name) \\
517
+ if (!(check)) {\\
518
+ PyErr_SetString(#modulename#_error,\"(\"tcheck\") failed for \"name);\\
519
+ /*goto capi_fail;*/\\
520
+ } else """
521
+ cppmacros['CHECKSTRING'] = """
522
+ #define CHECKSTRING(check,tcheck,name,show,var)\\
523
+ if (!(check)) {\\
524
+ char errstring[256];\\
525
+ sprintf(errstring, \"%s: \"show, \"(\"tcheck\") failed for \"name, slen(var), var);\\
526
+ PyErr_SetString(#modulename#_error, errstring);\\
527
+ /*goto capi_fail;*/\\
528
+ } else """
529
+ cppmacros['CHECKSCALAR'] = """
530
+ #define CHECKSCALAR(check,tcheck,name,show,var)\\
531
+ if (!(check)) {\\
532
+ char errstring[256];\\
533
+ sprintf(errstring, \"%s: \"show, \"(\"tcheck\") failed for \"name, var);\\
534
+ PyErr_SetString(#modulename#_error,errstring);\\
535
+ /*goto capi_fail;*/\\
536
+ } else """
537
+ # cppmacros['CHECKDIMS']="""
538
+ # define CHECKDIMS(dims,rank) \\
539
+ # for (int i=0;i<(rank);i++)\\
540
+ # if (dims[i]<0) {\\
541
+ # fprintf(stderr,\"Unspecified array argument requires a complete dimension specification.\\n\");\\
542
+ # goto capi_fail;\\
543
+ # }
544
+ # """
545
+ cppmacros[
546
+ 'ARRSIZE'] = '#define ARRSIZE(dims,rank) (_PyArray_multiply_list(dims,rank))'
547
+ cppmacros['OLDPYNUM'] = """
548
+ #ifdef OLDPYNUM
549
+ #error You need to install NumPy version 0.13 or higher. See https://scipy.org/install.html
550
+ #endif
551
+ """
552
+
553
+ # Defining the correct value to indicate thread-local storage in C without
554
+ # running a compile-time check (which we have no control over in generated
555
+ # code used outside of NumPy) is hard. Therefore we support overriding this
556
+ # via an external define - the f2py-using package can then use the same
557
+ # compile-time checks as we use for `NPY_TLS` when building NumPy (see
558
+ # scipy#21860 for an example of that).
559
+ #
560
+ # __STDC_NO_THREADS__ should not be coupled to the availability of _Thread_local.
561
+ # In case we get a bug report, guard it with __STDC_NO_THREADS__ after all.
562
+ #
563
+ # `thread_local` has become a keyword in C23, but don't try to use that yet
564
+ # (too new, doing so while C23 support is preliminary will likely cause more
565
+ # problems than it solves).
566
+ #
567
+ # Note: do not try to use `threads.h`, its availability is very low
568
+ # *and* threads.h isn't actually used where `F2PY_THREAD_LOCAL_DECL` is
569
+ # in the generated code. See gh-27718 for more details.
570
+ cppmacros["F2PY_THREAD_LOCAL_DECL"] = """
571
+ #ifndef F2PY_THREAD_LOCAL_DECL
572
+ #if defined(_MSC_VER)
573
+ #define F2PY_THREAD_LOCAL_DECL __declspec(thread)
574
+ #elif defined(NPY_OS_MINGW)
575
+ #define F2PY_THREAD_LOCAL_DECL __thread
576
+ #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
577
+ #define F2PY_THREAD_LOCAL_DECL _Thread_local
578
+ #elif defined(__GNUC__) \\
579
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 4)))
580
+ #define F2PY_THREAD_LOCAL_DECL __thread
581
+ #endif
582
+ #endif
583
+ """
584
+ ################# C functions ###############
585
+
586
+ cfuncs['calcarrindex'] = """
587
+ static int calcarrindex(int *i,PyArrayObject *arr) {
588
+ int k,ii = i[0];
589
+ for (k=1; k < PyArray_NDIM(arr); k++)
590
+ ii += (ii*(PyArray_DIM(arr,k) - 1)+i[k]); /* assuming contiguous arr */
591
+ return ii;
592
+ }"""
593
+ cfuncs['calcarrindextr'] = """
594
+ static int calcarrindextr(int *i,PyArrayObject *arr) {
595
+ int k,ii = i[PyArray_NDIM(arr)-1];
596
+ for (k=1; k < PyArray_NDIM(arr); k++)
597
+ ii += (ii*(PyArray_DIM(arr,PyArray_NDIM(arr)-k-1) - 1)+i[PyArray_NDIM(arr)-k-1]); /* assuming contiguous arr */
598
+ return ii;
599
+ }"""
600
+ cfuncs['forcomb'] = """
601
+ struct ForcombCache { int nd;npy_intp *d;int *i,*i_tr,tr; };
602
+ static int initforcomb(struct ForcombCache *cache, npy_intp *dims,int nd,int tr) {
603
+ int k;
604
+ if (dims==NULL) return 0;
605
+ if (nd<0) return 0;
606
+ cache->nd = nd;
607
+ cache->d = dims;
608
+ cache->tr = tr;
609
+
610
+ cache->i = (int *)malloc(sizeof(int)*nd);
611
+ if (cache->i==NULL) return 0;
612
+ cache->i_tr = (int *)malloc(sizeof(int)*nd);
613
+ if (cache->i_tr==NULL) {free(cache->i); return 0;};
614
+
615
+ for (k=1;k<nd;k++) {
616
+ cache->i[k] = cache->i_tr[nd-k-1] = 0;
617
+ }
618
+ cache->i[0] = cache->i_tr[nd-1] = -1;
619
+ return 1;
620
+ }
621
+ static int *nextforcomb(struct ForcombCache *cache) {
622
+ if (cache==NULL) return NULL;
623
+ int j,*i,*i_tr,k;
624
+ int nd=cache->nd;
625
+ if ((i=cache->i) == NULL) return NULL;
626
+ if ((i_tr=cache->i_tr) == NULL) return NULL;
627
+ if (cache->d == NULL) return NULL;
628
+ i[0]++;
629
+ if (i[0]==cache->d[0]) {
630
+ j=1;
631
+ while ((j<nd) && (i[j]==cache->d[j]-1)) j++;
632
+ if (j==nd) {
633
+ free(i);
634
+ free(i_tr);
635
+ return NULL;
636
+ }
637
+ for (k=0;k<j;k++) i[k] = i_tr[nd-k-1] = 0;
638
+ i[j]++;
639
+ i_tr[nd-j-1]++;
640
+ } else
641
+ i_tr[nd-1]++;
642
+ if (cache->tr) return i_tr;
643
+ return i;
644
+ }"""
645
+ needs['try_pyarr_from_string'] = ['STRINGCOPYN', 'PRINTPYOBJERR', 'string']
646
+ cfuncs['try_pyarr_from_string'] = """
647
+ /*
648
+ try_pyarr_from_string copies str[:len(obj)] to the data of an `ndarray`.
649
+
650
+ If obj is an `ndarray`, it is assumed to be contiguous.
651
+
652
+ If the specified len==-1, str must be null-terminated.
653
+ */
654
+ static int try_pyarr_from_string(PyObject *obj,
655
+ const string str, const int len) {
656
+ #ifdef DEBUGCFUNCS
657
+ fprintf(stderr, "try_pyarr_from_string(str='%s', len=%d, obj=%p)\\n",
658
+ (char*)str,len, obj);
659
+ #endif
660
+ if (!obj) return -2; /* Object missing */
661
+ if (obj == Py_None) return -1; /* None */
662
+ if (!PyArray_Check(obj)) goto capi_fail; /* not an ndarray */
663
+ if (PyArray_Check(obj)) {
664
+ PyArrayObject *arr = (PyArrayObject *)obj;
665
+ assert(ISCONTIGUOUS(arr));
666
+ string buf = PyArray_DATA(arr);
667
+ npy_intp n = len;
668
+ if (n == -1) {
669
+ /* Assuming null-terminated str. */
670
+ n = strlen(str);
671
+ }
672
+ if (n > PyArray_NBYTES(arr)) {
673
+ n = PyArray_NBYTES(arr);
674
+ }
675
+ STRINGCOPYN(buf, str, n);
676
+ return 1;
677
+ }
678
+ capi_fail:
679
+ PRINTPYOBJERR(obj);
680
+ PyErr_SetString(#modulename#_error, \"try_pyarr_from_string failed\");
681
+ return 0;
682
+ }
683
+ """
684
+ needs['string_from_pyobj'] = ['string', 'STRINGMALLOC', 'STRINGCOPYN']
685
+ cfuncs['string_from_pyobj'] = """
686
+ /*
687
+ Create a new string buffer `str` of at most length `len` from a
688
+ Python string-like object `obj`.
689
+
690
+ The string buffer has given size (len) or the size of inistr when len==-1.
691
+
692
+ The string buffer is padded with blanks: in Fortran, trailing blanks
693
+ are insignificant contrary to C nulls.
694
+ */
695
+ static int
696
+ string_from_pyobj(string *str, int *len, const string inistr, PyObject *obj,
697
+ const char *errmess)
698
+ {
699
+ PyObject *tmp = NULL;
700
+ string buf = NULL;
701
+ npy_intp n = -1;
702
+ #ifdef DEBUGCFUNCS
703
+ fprintf(stderr,\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\n\",
704
+ (char*)str, *len, (char *)inistr, obj);
705
+ #endif
706
+ if (obj == Py_None) {
707
+ n = strlen(inistr);
708
+ buf = inistr;
709
+ }
710
+ else if (PyArray_Check(obj)) {
711
+ PyArrayObject *arr = (PyArrayObject *)obj;
712
+ if (!ISCONTIGUOUS(arr)) {
713
+ PyErr_SetString(PyExc_ValueError,
714
+ \"array object is non-contiguous.\");
715
+ goto capi_fail;
716
+ }
717
+ n = PyArray_NBYTES(arr);
718
+ buf = PyArray_DATA(arr);
719
+ n = strnlen(buf, n);
720
+ }
721
+ else {
722
+ if (PyBytes_Check(obj)) {
723
+ tmp = obj;
724
+ Py_INCREF(tmp);
725
+ }
726
+ else if (PyUnicode_Check(obj)) {
727
+ tmp = PyUnicode_AsASCIIString(obj);
728
+ }
729
+ else {
730
+ PyObject *tmp2;
731
+ tmp2 = PyObject_Str(obj);
732
+ if (tmp2) {
733
+ tmp = PyUnicode_AsASCIIString(tmp2);
734
+ Py_DECREF(tmp2);
735
+ }
736
+ else {
737
+ tmp = NULL;
738
+ }
739
+ }
740
+ if (tmp == NULL) goto capi_fail;
741
+ n = PyBytes_GET_SIZE(tmp);
742
+ buf = PyBytes_AS_STRING(tmp);
743
+ }
744
+ if (*len == -1) {
745
+ /* TODO: change the type of `len` so that we can remove this */
746
+ if (n > NPY_MAX_INT) {
747
+ PyErr_SetString(PyExc_OverflowError,
748
+ "object too large for a 32-bit int");
749
+ goto capi_fail;
750
+ }
751
+ *len = n;
752
+ }
753
+ else if (*len < n) {
754
+ /* discard the last (len-n) bytes of input buf */
755
+ n = *len;
756
+ }
757
+ if (n < 0 || *len < 0 || buf == NULL) {
758
+ goto capi_fail;
759
+ }
760
+ STRINGMALLOC(*str, *len); // *str is allocated with size (*len + 1)
761
+ if (n < *len) {
762
+ /*
763
+ Pad fixed-width string with nulls. The caller will replace
764
+ nulls with blanks when the corresponding argument is not
765
+ intent(c).
766
+ */
767
+ memset(*str + n, '\\0', *len - n);
768
+ }
769
+ STRINGCOPYN(*str, buf, n);
770
+ Py_XDECREF(tmp);
771
+ return 1;
772
+ capi_fail:
773
+ Py_XDECREF(tmp);
774
+ {
775
+ PyObject* err = PyErr_Occurred();
776
+ if (err == NULL) {
777
+ err = #modulename#_error;
778
+ }
779
+ PyErr_SetString(err, errmess);
780
+ }
781
+ return 0;
782
+ }
783
+ """
784
+
785
+ cfuncs['character_from_pyobj'] = """
786
+ static int
787
+ character_from_pyobj(character* v, PyObject *obj, const char *errmess) {
788
+ if (PyBytes_Check(obj)) {
789
+ /* empty bytes has trailing null, so dereferencing is always safe */
790
+ *v = PyBytes_AS_STRING(obj)[0];
791
+ return 1;
792
+ } else if (PyUnicode_Check(obj)) {
793
+ PyObject* tmp = PyUnicode_AsASCIIString(obj);
794
+ if (tmp != NULL) {
795
+ *v = PyBytes_AS_STRING(tmp)[0];
796
+ Py_DECREF(tmp);
797
+ return 1;
798
+ }
799
+ } else if (PyArray_Check(obj)) {
800
+ PyArrayObject* arr = (PyArrayObject*)obj;
801
+ if (F2PY_ARRAY_IS_CHARACTER_COMPATIBLE(arr)) {
802
+ *v = PyArray_BYTES(arr)[0];
803
+ return 1;
804
+ } else if (F2PY_IS_UNICODE_ARRAY(arr)) {
805
+ // TODO: update when numpy will support 1-byte and
806
+ // 2-byte unicode dtypes
807
+ PyObject* tmp = PyUnicode_FromKindAndData(
808
+ PyUnicode_4BYTE_KIND,
809
+ PyArray_BYTES(arr),
810
+ (PyArray_NBYTES(arr)>0?1:0));
811
+ if (tmp != NULL) {
812
+ if (character_from_pyobj(v, tmp, errmess)) {
813
+ Py_DECREF(tmp);
814
+ return 1;
815
+ }
816
+ Py_DECREF(tmp);
817
+ }
818
+ }
819
+ } else if (PySequence_Check(obj)) {
820
+ PyObject* tmp = PySequence_GetItem(obj,0);
821
+ if (tmp != NULL) {
822
+ if (character_from_pyobj(v, tmp, errmess)) {
823
+ Py_DECREF(tmp);
824
+ return 1;
825
+ }
826
+ Py_DECREF(tmp);
827
+ }
828
+ }
829
+ {
830
+ /* TODO: This error (and most other) error handling needs cleaning. */
831
+ char mess[F2PY_MESSAGE_BUFFER_SIZE];
832
+ strcpy(mess, errmess);
833
+ PyObject* err = PyErr_Occurred();
834
+ if (err == NULL) {
835
+ err = PyExc_TypeError;
836
+ Py_INCREF(err);
837
+ }
838
+ else {
839
+ Py_INCREF(err);
840
+ PyErr_Clear();
841
+ }
842
+ sprintf(mess + strlen(mess),
843
+ " -- expected str|bytes|sequence-of-str-or-bytes, got ");
844
+ f2py_describe(obj, mess + strlen(mess));
845
+ PyErr_SetString(err, mess);
846
+ Py_DECREF(err);
847
+ }
848
+ return 0;
849
+ }
850
+ """
851
+
852
+ # TODO: These should be dynamically generated, too many mapped to int things,
853
+ # see note in _isocbind.py
854
+ needs['char_from_pyobj'] = ['int_from_pyobj']
855
+ cfuncs['char_from_pyobj'] = """
856
+ static int
857
+ char_from_pyobj(char* v, PyObject *obj, const char *errmess) {
858
+ int i = 0;
859
+ if (int_from_pyobj(&i, obj, errmess)) {
860
+ *v = (char)i;
861
+ return 1;
862
+ }
863
+ return 0;
864
+ }
865
+ """
866
+
867
+
868
+ needs['signed_char_from_pyobj'] = ['int_from_pyobj', 'signed_char']
869
+ cfuncs['signed_char_from_pyobj'] = """
870
+ static int
871
+ signed_char_from_pyobj(signed_char* v, PyObject *obj, const char *errmess) {
872
+ int i = 0;
873
+ if (int_from_pyobj(&i, obj, errmess)) {
874
+ *v = (signed_char)i;
875
+ return 1;
876
+ }
877
+ return 0;
878
+ }
879
+ """
880
+
881
+
882
+ needs['short_from_pyobj'] = ['int_from_pyobj']
883
+ cfuncs['short_from_pyobj'] = """
884
+ static int
885
+ short_from_pyobj(short* v, PyObject *obj, const char *errmess) {
886
+ int i = 0;
887
+ if (int_from_pyobj(&i, obj, errmess)) {
888
+ *v = (short)i;
889
+ return 1;
890
+ }
891
+ return 0;
892
+ }
893
+ """
894
+
895
+
896
+ cfuncs['int_from_pyobj'] = """
897
+ static int
898
+ int_from_pyobj(int* v, PyObject *obj, const char *errmess)
899
+ {
900
+ PyObject* tmp = NULL;
901
+
902
+ if (PyLong_Check(obj)) {
903
+ *v = Npy__PyLong_AsInt(obj);
904
+ return !(*v == -1 && PyErr_Occurred());
905
+ }
906
+
907
+ tmp = PyNumber_Long(obj);
908
+ if (tmp) {
909
+ *v = Npy__PyLong_AsInt(tmp);
910
+ Py_DECREF(tmp);
911
+ return !(*v == -1 && PyErr_Occurred());
912
+ }
913
+
914
+ if (PyComplex_Check(obj)) {
915
+ PyErr_Clear();
916
+ tmp = PyObject_GetAttrString(obj,\"real\");
917
+ }
918
+ else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) {
919
+ /*pass*/;
920
+ }
921
+ else if (PySequence_Check(obj)) {
922
+ PyErr_Clear();
923
+ tmp = PySequence_GetItem(obj, 0);
924
+ }
925
+
926
+ if (tmp) {
927
+ if (int_from_pyobj(v, tmp, errmess)) {
928
+ Py_DECREF(tmp);
929
+ return 1;
930
+ }
931
+ Py_DECREF(tmp);
932
+ }
933
+
934
+ {
935
+ PyObject* err = PyErr_Occurred();
936
+ if (err == NULL) {
937
+ err = #modulename#_error;
938
+ }
939
+ PyErr_SetString(err, errmess);
940
+ }
941
+ return 0;
942
+ }
943
+ """
944
+
945
+
946
+ cfuncs['long_from_pyobj'] = """
947
+ static int
948
+ long_from_pyobj(long* v, PyObject *obj, const char *errmess) {
949
+ PyObject* tmp = NULL;
950
+
951
+ if (PyLong_Check(obj)) {
952
+ *v = PyLong_AsLong(obj);
953
+ return !(*v == -1 && PyErr_Occurred());
954
+ }
955
+
956
+ tmp = PyNumber_Long(obj);
957
+ if (tmp) {
958
+ *v = PyLong_AsLong(tmp);
959
+ Py_DECREF(tmp);
960
+ return !(*v == -1 && PyErr_Occurred());
961
+ }
962
+
963
+ if (PyComplex_Check(obj)) {
964
+ PyErr_Clear();
965
+ tmp = PyObject_GetAttrString(obj,\"real\");
966
+ }
967
+ else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) {
968
+ /*pass*/;
969
+ }
970
+ else if (PySequence_Check(obj)) {
971
+ PyErr_Clear();
972
+ tmp = PySequence_GetItem(obj, 0);
973
+ }
974
+
975
+ if (tmp) {
976
+ if (long_from_pyobj(v, tmp, errmess)) {
977
+ Py_DECREF(tmp);
978
+ return 1;
979
+ }
980
+ Py_DECREF(tmp);
981
+ }
982
+ {
983
+ PyObject* err = PyErr_Occurred();
984
+ if (err == NULL) {
985
+ err = #modulename#_error;
986
+ }
987
+ PyErr_SetString(err, errmess);
988
+ }
989
+ return 0;
990
+ }
991
+ """
992
+
993
+
994
+ needs['long_long_from_pyobj'] = ['long_long']
995
+ cfuncs['long_long_from_pyobj'] = """
996
+ static int
997
+ long_long_from_pyobj(long_long* v, PyObject *obj, const char *errmess)
998
+ {
999
+ PyObject* tmp = NULL;
1000
+
1001
+ if (PyLong_Check(obj)) {
1002
+ *v = PyLong_AsLongLong(obj);
1003
+ return !(*v == -1 && PyErr_Occurred());
1004
+ }
1005
+
1006
+ tmp = PyNumber_Long(obj);
1007
+ if (tmp) {
1008
+ *v = PyLong_AsLongLong(tmp);
1009
+ Py_DECREF(tmp);
1010
+ return !(*v == -1 && PyErr_Occurred());
1011
+ }
1012
+
1013
+ if (PyComplex_Check(obj)) {
1014
+ PyErr_Clear();
1015
+ tmp = PyObject_GetAttrString(obj,\"real\");
1016
+ }
1017
+ else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) {
1018
+ /*pass*/;
1019
+ }
1020
+ else if (PySequence_Check(obj)) {
1021
+ PyErr_Clear();
1022
+ tmp = PySequence_GetItem(obj, 0);
1023
+ }
1024
+
1025
+ if (tmp) {
1026
+ if (long_long_from_pyobj(v, tmp, errmess)) {
1027
+ Py_DECREF(tmp);
1028
+ return 1;
1029
+ }
1030
+ Py_DECREF(tmp);
1031
+ }
1032
+ {
1033
+ PyObject* err = PyErr_Occurred();
1034
+ if (err == NULL) {
1035
+ err = #modulename#_error;
1036
+ }
1037
+ PyErr_SetString(err,errmess);
1038
+ }
1039
+ return 0;
1040
+ }
1041
+ """
1042
+
1043
+
1044
+ needs['long_double_from_pyobj'] = ['double_from_pyobj', 'long_double']
1045
+ cfuncs['long_double_from_pyobj'] = """
1046
+ static int
1047
+ long_double_from_pyobj(long_double* v, PyObject *obj, const char *errmess)
1048
+ {
1049
+ double d=0;
1050
+ if (PyArray_CheckScalar(obj)){
1051
+ if PyArray_IsScalar(obj, LongDouble) {
1052
+ PyArray_ScalarAsCtype(obj, v);
1053
+ return 1;
1054
+ }
1055
+ else if (PyArray_Check(obj)) {
1056
+ PyArrayObject *arr = (PyArrayObject *)obj;
1057
+ if (PyArray_TYPE(arr) == NPY_LONGDOUBLE) {
1058
+ (*v) = *((npy_longdouble *)PyArray_DATA(arr));
1059
+ return 1;
1060
+ }
1061
+ }
1062
+ }
1063
+ if (double_from_pyobj(&d, obj, errmess)) {
1064
+ *v = (long_double)d;
1065
+ return 1;
1066
+ }
1067
+ return 0;
1068
+ }
1069
+ """
1070
+
1071
+
1072
+ cfuncs['double_from_pyobj'] = """
1073
+ static int
1074
+ double_from_pyobj(double* v, PyObject *obj, const char *errmess)
1075
+ {
1076
+ PyObject* tmp = NULL;
1077
+ if (PyFloat_Check(obj)) {
1078
+ *v = PyFloat_AsDouble(obj);
1079
+ return !(*v == -1.0 && PyErr_Occurred());
1080
+ }
1081
+
1082
+ tmp = PyNumber_Float(obj);
1083
+ if (tmp) {
1084
+ *v = PyFloat_AsDouble(tmp);
1085
+ Py_DECREF(tmp);
1086
+ return !(*v == -1.0 && PyErr_Occurred());
1087
+ }
1088
+
1089
+ if (PyComplex_Check(obj)) {
1090
+ PyErr_Clear();
1091
+ tmp = PyObject_GetAttrString(obj,\"real\");
1092
+ }
1093
+ else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) {
1094
+ /*pass*/;
1095
+ }
1096
+ else if (PySequence_Check(obj)) {
1097
+ PyErr_Clear();
1098
+ tmp = PySequence_GetItem(obj, 0);
1099
+ }
1100
+
1101
+ if (tmp) {
1102
+ if (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}
1103
+ Py_DECREF(tmp);
1104
+ }
1105
+ {
1106
+ PyObject* err = PyErr_Occurred();
1107
+ if (err==NULL) err = #modulename#_error;
1108
+ PyErr_SetString(err,errmess);
1109
+ }
1110
+ return 0;
1111
+ }
1112
+ """
1113
+
1114
+
1115
+ needs['float_from_pyobj'] = ['double_from_pyobj']
1116
+ cfuncs['float_from_pyobj'] = """
1117
+ static int
1118
+ float_from_pyobj(float* v, PyObject *obj, const char *errmess)
1119
+ {
1120
+ double d=0.0;
1121
+ if (double_from_pyobj(&d,obj,errmess)) {
1122
+ *v = (float)d;
1123
+ return 1;
1124
+ }
1125
+ return 0;
1126
+ }
1127
+ """
1128
+
1129
+
1130
+ needs['complex_long_double_from_pyobj'] = ['complex_long_double', 'long_double',
1131
+ 'complex_double_from_pyobj', 'npy_math.h']
1132
+ cfuncs['complex_long_double_from_pyobj'] = """
1133
+ static int
1134
+ complex_long_double_from_pyobj(complex_long_double* v, PyObject *obj, const char *errmess)
1135
+ {
1136
+ complex_double cd = {0.0,0.0};
1137
+ if (PyArray_CheckScalar(obj)){
1138
+ if PyArray_IsScalar(obj, CLongDouble) {
1139
+ PyArray_ScalarAsCtype(obj, v);
1140
+ return 1;
1141
+ }
1142
+ else if (PyArray_Check(obj)) {
1143
+ PyArrayObject *arr = (PyArrayObject *)obj;
1144
+ if (PyArray_TYPE(arr)==NPY_CLONGDOUBLE) {
1145
+ (*v).r = npy_creall(*(((npy_clongdouble *)PyArray_DATA(arr))));
1146
+ (*v).i = npy_cimagl(*(((npy_clongdouble *)PyArray_DATA(arr))));
1147
+ return 1;
1148
+ }
1149
+ }
1150
+ }
1151
+ if (complex_double_from_pyobj(&cd,obj,errmess)) {
1152
+ (*v).r = (long_double)cd.r;
1153
+ (*v).i = (long_double)cd.i;
1154
+ return 1;
1155
+ }
1156
+ return 0;
1157
+ }
1158
+ """
1159
+
1160
+
1161
+ needs['complex_double_from_pyobj'] = ['complex_double', 'npy_math.h']
1162
+ cfuncs['complex_double_from_pyobj'] = """
1163
+ static int
1164
+ complex_double_from_pyobj(complex_double* v, PyObject *obj, const char *errmess) {
1165
+ Py_complex c;
1166
+ if (PyComplex_Check(obj)) {
1167
+ c = PyComplex_AsCComplex(obj);
1168
+ (*v).r = c.real;
1169
+ (*v).i = c.imag;
1170
+ return 1;
1171
+ }
1172
+ if (PyArray_IsScalar(obj, ComplexFloating)) {
1173
+ if (PyArray_IsScalar(obj, CFloat)) {
1174
+ npy_cfloat new;
1175
+ PyArray_ScalarAsCtype(obj, &new);
1176
+ (*v).r = (double)npy_crealf(new);
1177
+ (*v).i = (double)npy_cimagf(new);
1178
+ }
1179
+ else if (PyArray_IsScalar(obj, CLongDouble)) {
1180
+ npy_clongdouble new;
1181
+ PyArray_ScalarAsCtype(obj, &new);
1182
+ (*v).r = (double)npy_creall(new);
1183
+ (*v).i = (double)npy_cimagl(new);
1184
+ }
1185
+ else { /* if (PyArray_IsScalar(obj, CDouble)) */
1186
+ PyArray_ScalarAsCtype(obj, v);
1187
+ }
1188
+ return 1;
1189
+ }
1190
+ if (PyArray_CheckScalar(obj)) { /* 0-dim array or still array scalar */
1191
+ PyArrayObject *arr;
1192
+ if (PyArray_Check(obj)) {
1193
+ arr = (PyArrayObject *)PyArray_Cast((PyArrayObject *)obj, NPY_CDOUBLE);
1194
+ }
1195
+ else {
1196
+ arr = (PyArrayObject *)PyArray_FromScalar(obj, PyArray_DescrFromType(NPY_CDOUBLE));
1197
+ }
1198
+ if (arr == NULL) {
1199
+ return 0;
1200
+ }
1201
+ (*v).r = npy_creal(*(((npy_cdouble *)PyArray_DATA(arr))));
1202
+ (*v).i = npy_cimag(*(((npy_cdouble *)PyArray_DATA(arr))));
1203
+ Py_DECREF(arr);
1204
+ return 1;
1205
+ }
1206
+ /* Python does not provide PyNumber_Complex function :-( */
1207
+ (*v).i = 0.0;
1208
+ if (PyFloat_Check(obj)) {
1209
+ (*v).r = PyFloat_AsDouble(obj);
1210
+ return !((*v).r == -1.0 && PyErr_Occurred());
1211
+ }
1212
+ if (PyLong_Check(obj)) {
1213
+ (*v).r = PyLong_AsDouble(obj);
1214
+ return !((*v).r == -1.0 && PyErr_Occurred());
1215
+ }
1216
+ if (PySequence_Check(obj) && !(PyBytes_Check(obj) || PyUnicode_Check(obj))) {
1217
+ PyObject *tmp = PySequence_GetItem(obj,0);
1218
+ if (tmp) {
1219
+ if (complex_double_from_pyobj(v,tmp,errmess)) {
1220
+ Py_DECREF(tmp);
1221
+ return 1;
1222
+ }
1223
+ Py_DECREF(tmp);
1224
+ }
1225
+ }
1226
+ {
1227
+ PyObject* err = PyErr_Occurred();
1228
+ if (err==NULL)
1229
+ err = PyExc_TypeError;
1230
+ PyErr_SetString(err,errmess);
1231
+ }
1232
+ return 0;
1233
+ }
1234
+ """
1235
+
1236
+
1237
+ needs['complex_float_from_pyobj'] = [
1238
+ 'complex_float', 'complex_double_from_pyobj']
1239
+ cfuncs['complex_float_from_pyobj'] = """
1240
+ static int
1241
+ complex_float_from_pyobj(complex_float* v,PyObject *obj,const char *errmess)
1242
+ {
1243
+ complex_double cd={0.0,0.0};
1244
+ if (complex_double_from_pyobj(&cd,obj,errmess)) {
1245
+ (*v).r = (float)cd.r;
1246
+ (*v).i = (float)cd.i;
1247
+ return 1;
1248
+ }
1249
+ return 0;
1250
+ }
1251
+ """
1252
+
1253
+
1254
+ cfuncs['try_pyarr_from_character'] = """
1255
+ static int try_pyarr_from_character(PyObject* obj, character* v) {
1256
+ PyArrayObject *arr = (PyArrayObject*)obj;
1257
+ if (!obj) return -2;
1258
+ if (PyArray_Check(obj)) {
1259
+ if (F2PY_ARRAY_IS_CHARACTER_COMPATIBLE(arr)) {
1260
+ *(character *)(PyArray_DATA(arr)) = *v;
1261
+ return 1;
1262
+ }
1263
+ }
1264
+ {
1265
+ char mess[F2PY_MESSAGE_BUFFER_SIZE];
1266
+ PyObject* err = PyErr_Occurred();
1267
+ if (err == NULL) {
1268
+ err = PyExc_ValueError;
1269
+ strcpy(mess, "try_pyarr_from_character failed"
1270
+ " -- expected bytes array-scalar|array, got ");
1271
+ f2py_describe(obj, mess + strlen(mess));
1272
+ PyErr_SetString(err, mess);
1273
+ }
1274
+ }
1275
+ return 0;
1276
+ }
1277
+ """
1278
+
1279
+ needs['try_pyarr_from_char'] = ['pyobj_from_char1', 'TRYPYARRAYTEMPLATE']
1280
+ cfuncs[
1281
+ 'try_pyarr_from_char'] = 'static int try_pyarr_from_char(PyObject* obj,char* v) {\n TRYPYARRAYTEMPLATE(char,\'c\');\n}\n'
1282
+ needs['try_pyarr_from_signed_char'] = ['TRYPYARRAYTEMPLATE', 'unsigned_char']
1283
+ cfuncs[
1284
+ 'try_pyarr_from_unsigned_char'] = 'static int try_pyarr_from_unsigned_char(PyObject* obj,unsigned_char* v) {\n TRYPYARRAYTEMPLATE(unsigned_char,\'b\');\n}\n'
1285
+ needs['try_pyarr_from_signed_char'] = ['TRYPYARRAYTEMPLATE', 'signed_char']
1286
+ cfuncs[
1287
+ 'try_pyarr_from_signed_char'] = 'static int try_pyarr_from_signed_char(PyObject* obj,signed_char* v) {\n TRYPYARRAYTEMPLATE(signed_char,\'1\');\n}\n'
1288
+ needs['try_pyarr_from_short'] = ['pyobj_from_short1', 'TRYPYARRAYTEMPLATE']
1289
+ cfuncs[
1290
+ 'try_pyarr_from_short'] = 'static int try_pyarr_from_short(PyObject* obj,short* v) {\n TRYPYARRAYTEMPLATE(short,\'s\');\n}\n'
1291
+ needs['try_pyarr_from_int'] = ['pyobj_from_int1', 'TRYPYARRAYTEMPLATE']
1292
+ cfuncs[
1293
+ 'try_pyarr_from_int'] = 'static int try_pyarr_from_int(PyObject* obj,int* v) {\n TRYPYARRAYTEMPLATE(int,\'i\');\n}\n'
1294
+ needs['try_pyarr_from_long'] = ['pyobj_from_long1', 'TRYPYARRAYTEMPLATE']
1295
+ cfuncs[
1296
+ 'try_pyarr_from_long'] = 'static int try_pyarr_from_long(PyObject* obj,long* v) {\n TRYPYARRAYTEMPLATE(long,\'l\');\n}\n'
1297
+ needs['try_pyarr_from_long_long'] = [
1298
+ 'pyobj_from_long_long1', 'TRYPYARRAYTEMPLATE', 'long_long']
1299
+ cfuncs[
1300
+ 'try_pyarr_from_long_long'] = 'static int try_pyarr_from_long_long(PyObject* obj,long_long* v) {\n TRYPYARRAYTEMPLATE(long_long,\'L\');\n}\n'
1301
+ needs['try_pyarr_from_float'] = ['pyobj_from_float1', 'TRYPYARRAYTEMPLATE']
1302
+ cfuncs[
1303
+ 'try_pyarr_from_float'] = 'static int try_pyarr_from_float(PyObject* obj,float* v) {\n TRYPYARRAYTEMPLATE(float,\'f\');\n}\n'
1304
+ needs['try_pyarr_from_double'] = ['pyobj_from_double1', 'TRYPYARRAYTEMPLATE']
1305
+ cfuncs[
1306
+ 'try_pyarr_from_double'] = 'static int try_pyarr_from_double(PyObject* obj,double* v) {\n TRYPYARRAYTEMPLATE(double,\'d\');\n}\n'
1307
+ needs['try_pyarr_from_complex_float'] = [
1308
+ 'pyobj_from_complex_float1', 'TRYCOMPLEXPYARRAYTEMPLATE', 'complex_float']
1309
+ cfuncs[
1310
+ 'try_pyarr_from_complex_float'] = 'static int try_pyarr_from_complex_float(PyObject* obj,complex_float* v) {\n TRYCOMPLEXPYARRAYTEMPLATE(float,\'F\');\n}\n'
1311
+ needs['try_pyarr_from_complex_double'] = [
1312
+ 'pyobj_from_complex_double1', 'TRYCOMPLEXPYARRAYTEMPLATE', 'complex_double']
1313
+ cfuncs[
1314
+ 'try_pyarr_from_complex_double'] = 'static int try_pyarr_from_complex_double(PyObject* obj,complex_double* v) {\n TRYCOMPLEXPYARRAYTEMPLATE(double,\'D\');\n}\n'
1315
+
1316
+
1317
+ needs['create_cb_arglist'] = ['CFUNCSMESS', 'PRINTPYOBJERR', 'MINMAX']
1318
+ # create the list of arguments to be used when calling back to python
1319
+ cfuncs['create_cb_arglist'] = """
1320
+ static int
1321
+ create_cb_arglist(PyObject* fun, PyTupleObject* xa , const int maxnofargs,
1322
+ const int nofoptargs, int *nofargs, PyTupleObject **args,
1323
+ const char *errmess)
1324
+ {
1325
+ PyObject *tmp = NULL;
1326
+ PyObject *tmp_fun = NULL;
1327
+ Py_ssize_t tot, opt, ext, siz, i, di = 0;
1328
+ CFUNCSMESS(\"create_cb_arglist\\n\");
1329
+ tot=opt=ext=siz=0;
1330
+ /* Get the total number of arguments */
1331
+ if (PyFunction_Check(fun)) {
1332
+ tmp_fun = fun;
1333
+ Py_INCREF(tmp_fun);
1334
+ }
1335
+ else {
1336
+ di = 1;
1337
+ if (PyObject_HasAttrString(fun,\"im_func\")) {
1338
+ tmp_fun = PyObject_GetAttrString(fun,\"im_func\");
1339
+ }
1340
+ else if (PyObject_HasAttrString(fun,\"__call__\")) {
1341
+ tmp = PyObject_GetAttrString(fun,\"__call__\");
1342
+ if (PyObject_HasAttrString(tmp,\"im_func\"))
1343
+ tmp_fun = PyObject_GetAttrString(tmp,\"im_func\");
1344
+ else {
1345
+ tmp_fun = fun; /* built-in function */
1346
+ Py_INCREF(tmp_fun);
1347
+ tot = maxnofargs;
1348
+ if (PyCFunction_Check(fun)) {
1349
+ /* In case the function has a co_argcount (like on PyPy) */
1350
+ di = 0;
1351
+ }
1352
+ if (xa != NULL)
1353
+ tot += PyTuple_Size((PyObject *)xa);
1354
+ }
1355
+ Py_XDECREF(tmp);
1356
+ }
1357
+ else if (PyFortran_Check(fun) || PyFortran_Check1(fun)) {
1358
+ tot = maxnofargs;
1359
+ if (xa != NULL)
1360
+ tot += PyTuple_Size((PyObject *)xa);
1361
+ tmp_fun = fun;
1362
+ Py_INCREF(tmp_fun);
1363
+ }
1364
+ else if (F2PyCapsule_Check(fun)) {
1365
+ tot = maxnofargs;
1366
+ if (xa != NULL)
1367
+ ext = PyTuple_Size((PyObject *)xa);
1368
+ if(ext>0) {
1369
+ fprintf(stderr,\"extra arguments tuple cannot be used with PyCapsule call-back\\n\");
1370
+ goto capi_fail;
1371
+ }
1372
+ tmp_fun = fun;
1373
+ Py_INCREF(tmp_fun);
1374
+ }
1375
+ }
1376
+
1377
+ if (tmp_fun == NULL) {
1378
+ fprintf(stderr,
1379
+ \"Call-back argument must be function|instance|instance.__call__|f2py-function \"
1380
+ \"but got %s.\\n\",
1381
+ ((fun == NULL) ? \"NULL\" : Py_TYPE(fun)->tp_name));
1382
+ goto capi_fail;
1383
+ }
1384
+
1385
+ if (PyObject_HasAttrString(tmp_fun,\"__code__\")) {
1386
+ if (PyObject_HasAttrString(tmp = PyObject_GetAttrString(tmp_fun,\"__code__\"),\"co_argcount\")) {
1387
+ PyObject *tmp_argcount = PyObject_GetAttrString(tmp,\"co_argcount\");
1388
+ Py_DECREF(tmp);
1389
+ if (tmp_argcount == NULL) {
1390
+ goto capi_fail;
1391
+ }
1392
+ tot = PyLong_AsSsize_t(tmp_argcount) - di;
1393
+ Py_DECREF(tmp_argcount);
1394
+ }
1395
+ }
1396
+ /* Get the number of optional arguments */
1397
+ if (PyObject_HasAttrString(tmp_fun,\"__defaults__\")) {
1398
+ if (PyTuple_Check(tmp = PyObject_GetAttrString(tmp_fun,\"__defaults__\")))
1399
+ opt = PyTuple_Size(tmp);
1400
+ Py_XDECREF(tmp);
1401
+ }
1402
+ /* Get the number of extra arguments */
1403
+ if (xa != NULL)
1404
+ ext = PyTuple_Size((PyObject *)xa);
1405
+ /* Calculate the size of call-backs argument list */
1406
+ siz = MIN(maxnofargs+ext,tot);
1407
+ *nofargs = MAX(0,siz-ext);
1408
+
1409
+ #ifdef DEBUGCFUNCS
1410
+ fprintf(stderr,
1411
+ \"debug-capi:create_cb_arglist:maxnofargs(-nofoptargs),\"
1412
+ \"tot,opt,ext,siz,nofargs = %d(-%d), %zd, %zd, %zd, %zd, %d\\n\",
1413
+ maxnofargs, nofoptargs, tot, opt, ext, siz, *nofargs);
1414
+ #endif
1415
+
1416
+ if (siz < tot-opt) {
1417
+ fprintf(stderr,
1418
+ \"create_cb_arglist: Failed to build argument list \"
1419
+ \"(siz) with enough arguments (tot-opt) required by \"
1420
+ \"user-supplied function (siz,tot,opt=%zd, %zd, %zd).\\n\",
1421
+ siz, tot, opt);
1422
+ goto capi_fail;
1423
+ }
1424
+
1425
+ /* Initialize argument list */
1426
+ *args = (PyTupleObject *)PyTuple_New(siz);
1427
+ for (i=0;i<*nofargs;i++) {
1428
+ Py_INCREF(Py_None);
1429
+ PyTuple_SET_ITEM((PyObject *)(*args),i,Py_None);
1430
+ }
1431
+ if (xa != NULL)
1432
+ for (i=(*nofargs);i<siz;i++) {
1433
+ tmp = PyTuple_GetItem((PyObject *)xa,i-(*nofargs));
1434
+ Py_INCREF(tmp);
1435
+ PyTuple_SET_ITEM(*args,i,tmp);
1436
+ }
1437
+ CFUNCSMESS(\"create_cb_arglist-end\\n\");
1438
+ Py_DECREF(tmp_fun);
1439
+ return 1;
1440
+
1441
+ capi_fail:
1442
+ if (PyErr_Occurred() == NULL)
1443
+ PyErr_SetString(#modulename#_error, errmess);
1444
+ Py_XDECREF(tmp_fun);
1445
+ return 0;
1446
+ }
1447
+ """
1448
+
1449
+
1450
+ def buildcfuncs():
1451
+ from .capi_maps import c2capi_map
1452
+ for k in c2capi_map.keys():
1453
+ m = f'pyarr_from_p_{k}1'
1454
+ cppmacros[
1455
+ m] = f'#define {m}(v) (PyArray_SimpleNewFromData(0,NULL,{c2capi_map[k]},(char *)v))'
1456
+ k = 'string'
1457
+ m = f'pyarr_from_p_{k}1'
1458
+ # NPY_CHAR compatibility, NPY_STRING with itemsize 1
1459
+ cppmacros[
1460
+ m] = f'#define {m}(v,dims) (PyArray_New(&PyArray_Type, 1, dims, NPY_STRING, NULL, v, 1, NPY_ARRAY_CARRAY, NULL))'
1461
+
1462
+
1463
+ ############ Auxiliary functions for sorting needs ###################
1464
+
1465
+ def append_needs(need, flag=1):
1466
+ # This function modifies the contents of the global `outneeds` dict.
1467
+ if isinstance(need, list):
1468
+ for n in need:
1469
+ append_needs(n, flag)
1470
+ elif isinstance(need, str):
1471
+ if not need:
1472
+ return
1473
+ if need in includes0:
1474
+ n = 'includes0'
1475
+ elif need in includes:
1476
+ n = 'includes'
1477
+ elif need in typedefs:
1478
+ n = 'typedefs'
1479
+ elif need in typedefs_generated:
1480
+ n = 'typedefs_generated'
1481
+ elif need in cppmacros:
1482
+ n = 'cppmacros'
1483
+ elif need in cfuncs:
1484
+ n = 'cfuncs'
1485
+ elif need in callbacks:
1486
+ n = 'callbacks'
1487
+ elif need in f90modhooks:
1488
+ n = 'f90modhooks'
1489
+ elif need in commonhooks:
1490
+ n = 'commonhooks'
1491
+ else:
1492
+ errmess(f'append_needs: unknown need {repr(need)}\n')
1493
+ return
1494
+ if need in outneeds[n]:
1495
+ return
1496
+ if flag:
1497
+ tmp = {}
1498
+ if need in needs:
1499
+ for nn in needs[need]:
1500
+ t = append_needs(nn, 0)
1501
+ if isinstance(t, dict):
1502
+ for nnn in t.keys():
1503
+ if nnn in tmp:
1504
+ tmp[nnn] = tmp[nnn] + t[nnn]
1505
+ else:
1506
+ tmp[nnn] = t[nnn]
1507
+ for nn in tmp.keys():
1508
+ for nnn in tmp[nn]:
1509
+ if nnn not in outneeds[nn]:
1510
+ outneeds[nn] = [nnn] + outneeds[nn]
1511
+ outneeds[n].append(need)
1512
+ else:
1513
+ tmp = {}
1514
+ if need in needs:
1515
+ for nn in needs[need]:
1516
+ t = append_needs(nn, flag)
1517
+ if isinstance(t, dict):
1518
+ for nnn in t.keys():
1519
+ if nnn in tmp:
1520
+ tmp[nnn] = t[nnn] + tmp[nnn]
1521
+ else:
1522
+ tmp[nnn] = t[nnn]
1523
+ if n not in tmp:
1524
+ tmp[n] = []
1525
+ tmp[n].append(need)
1526
+ return tmp
1527
+ else:
1528
+ errmess(f'append_needs: expected list or string but got :{repr(need)}\n')
1529
+
1530
+
1531
+ def get_needs():
1532
+ # This function modifies the contents of the global `outneeds` dict.
1533
+ res = {}
1534
+ for n in outneeds.keys():
1535
+ out = []
1536
+ saveout = copy.copy(outneeds[n])
1537
+ while len(outneeds[n]) > 0:
1538
+ if outneeds[n][0] not in needs:
1539
+ out.append(outneeds[n][0])
1540
+ del outneeds[n][0]
1541
+ else:
1542
+ flag = 0
1543
+ for k in outneeds[n][1:]:
1544
+ if k in needs[outneeds[n][0]]:
1545
+ flag = 1
1546
+ break
1547
+ if flag:
1548
+ outneeds[n] = outneeds[n][1:] + [outneeds[n][0]]
1549
+ else:
1550
+ out.append(outneeds[n][0])
1551
+ del outneeds[n][0]
1552
+ if saveout and (0 not in map(lambda x, y: x == y, saveout, outneeds[n])) \
1553
+ and outneeds[n] != []:
1554
+ print(n, saveout)
1555
+ errmess(
1556
+ 'get_needs: no progress in sorting needs, probably circular dependence, skipping.\n')
1557
+ out = out + saveout
1558
+ break
1559
+ saveout = copy.copy(outneeds[n])
1560
+ if out == []:
1561
+ out = [n]
1562
+ res[n] = out
1563
+ return res