netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.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 (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
@@ -0,0 +1,521 @@
1
+ /*
2
+ pybind11/eigen/tensor.h: Transparent conversion for Eigen tensors
3
+
4
+ All rights reserved. Use of this source code is governed by a
5
+ BSD-style license that can be found in the LICENSE file.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <pybind11/numpy.h>
11
+
12
+ #include "common.h"
13
+
14
+ #if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
15
+ static_assert(__GNUC__ > 5, "Eigen Tensor support in pybind11 requires GCC > 5.0");
16
+ #endif
17
+
18
+ // Disable warnings for Eigen
19
+ PYBIND11_WARNING_PUSH
20
+ PYBIND11_WARNING_DISABLE_MSVC(4554)
21
+ PYBIND11_WARNING_DISABLE_MSVC(4127)
22
+ #if defined(__MINGW32__)
23
+ PYBIND11_WARNING_DISABLE_GCC("-Wmaybe-uninitialized")
24
+ #endif
25
+
26
+ #include <unsupported/Eigen/CXX11/Tensor>
27
+
28
+ PYBIND11_WARNING_POP
29
+
30
+ static_assert(EIGEN_VERSION_AT_LEAST(3, 3, 0),
31
+ "Eigen Tensor support in pybind11 requires Eigen >= 3.3.0");
32
+
33
+ PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
34
+
35
+ PYBIND11_WARNING_DISABLE_MSVC(4127)
36
+
37
+ PYBIND11_NAMESPACE_BEGIN(detail)
38
+
39
+ inline bool is_tensor_aligned(const void *data) {
40
+ return (reinterpret_cast<std::size_t>(data) % EIGEN_DEFAULT_ALIGN_BYTES) == 0;
41
+ }
42
+
43
+ template <typename T>
44
+ constexpr int compute_array_flag_from_tensor() {
45
+ static_assert((static_cast<int>(T::Layout) == static_cast<int>(Eigen::RowMajor))
46
+ || (static_cast<int>(T::Layout) == static_cast<int>(Eigen::ColMajor)),
47
+ "Layout must be row or column major");
48
+ return (static_cast<int>(T::Layout) == static_cast<int>(Eigen::RowMajor)) ? array::c_style
49
+ : array::f_style;
50
+ }
51
+
52
+ template <typename T>
53
+ struct eigen_tensor_helper {};
54
+
55
+ template <typename Scalar_, int NumIndices_, int Options_, typename IndexType>
56
+ struct eigen_tensor_helper<Eigen::Tensor<Scalar_, NumIndices_, Options_, IndexType>> {
57
+ using Type = Eigen::Tensor<Scalar_, NumIndices_, Options_, IndexType>;
58
+ using ValidType = void;
59
+
60
+ static Eigen::DSizes<typename Type::Index, Type::NumIndices> get_shape(const Type &f) {
61
+ return f.dimensions();
62
+ }
63
+
64
+ static constexpr bool
65
+ is_correct_shape(const Eigen::DSizes<typename Type::Index, Type::NumIndices> & /*shape*/) {
66
+ return true;
67
+ }
68
+
69
+ template <typename T>
70
+ struct helper {};
71
+
72
+ template <size_t... Is>
73
+ struct helper<index_sequence<Is...>> {
74
+ static constexpr auto value = ::pybind11::detail::concat(const_name(((void) Is, "?"))...);
75
+ };
76
+
77
+ static constexpr auto dimensions_descriptor
78
+ = helper<decltype(make_index_sequence<Type::NumIndices>())>::value;
79
+
80
+ template <typename... Args>
81
+ static Type *alloc(Args &&...args) {
82
+ return new Type(std::forward<Args>(args)...);
83
+ }
84
+
85
+ static void free(Type *tensor) { delete tensor; }
86
+ };
87
+
88
+ template <typename Scalar_, typename std::ptrdiff_t... Indices, int Options_, typename IndexType>
89
+ struct eigen_tensor_helper<
90
+ Eigen::TensorFixedSize<Scalar_, Eigen::Sizes<Indices...>, Options_, IndexType>> {
91
+ using Type = Eigen::TensorFixedSize<Scalar_, Eigen::Sizes<Indices...>, Options_, IndexType>;
92
+ using ValidType = void;
93
+
94
+ static constexpr Eigen::DSizes<typename Type::Index, Type::NumIndices>
95
+ get_shape(const Type & /*f*/) {
96
+ return get_shape();
97
+ }
98
+
99
+ static constexpr Eigen::DSizes<typename Type::Index, Type::NumIndices> get_shape() {
100
+ return Eigen::DSizes<typename Type::Index, Type::NumIndices>(Indices...);
101
+ }
102
+
103
+ static bool
104
+ is_correct_shape(const Eigen::DSizes<typename Type::Index, Type::NumIndices> &shape) {
105
+ return get_shape() == shape;
106
+ }
107
+
108
+ static constexpr auto dimensions_descriptor
109
+ = ::pybind11::detail::concat(const_name<Indices>()...);
110
+
111
+ template <typename... Args>
112
+ static Type *alloc(Args &&...args) {
113
+ Eigen::aligned_allocator<Type> allocator;
114
+ return ::new (allocator.allocate(1)) Type(std::forward<Args>(args)...);
115
+ }
116
+
117
+ static void free(Type *tensor) {
118
+ Eigen::aligned_allocator<Type> allocator;
119
+ tensor->~Type();
120
+ allocator.deallocate(tensor, 1);
121
+ }
122
+ };
123
+
124
+ template <typename Type, bool ShowDetails, bool NeedsWriteable = false>
125
+ struct get_tensor_descriptor {
126
+ static constexpr auto details
127
+ = const_name<NeedsWriteable>(", \"flags.writeable\"", "") + const_name
128
+ < static_cast<int>(Type::Layout)
129
+ == static_cast<int>(Eigen::RowMajor)
130
+ > (", \"flags.c_contiguous\"", ", \"flags.f_contiguous\"");
131
+ static constexpr auto value
132
+ = const_name("typing.Annotated[")
133
+ + io_name("numpy.typing.ArrayLike, ", "numpy.typing.NDArray[")
134
+ + npy_format_descriptor<typename Type::Scalar>::name + io_name("", "]")
135
+ + const_name(", \"[") + eigen_tensor_helper<remove_cv_t<Type>>::dimensions_descriptor
136
+ + const_name("]\"") + const_name<ShowDetails>(details, const_name("")) + const_name("]");
137
+ };
138
+
139
+ // When EIGEN_AVOID_STL_ARRAY is defined, Eigen::DSizes<T, 0> does not have the begin() member
140
+ // function. Falling back to a simple loop works around this issue.
141
+ //
142
+ // We need to disable the type-limits warning for the inner loop when size = 0.
143
+
144
+ PYBIND11_WARNING_PUSH
145
+ PYBIND11_WARNING_DISABLE_GCC("-Wtype-limits")
146
+
147
+ template <typename T, int size>
148
+ std::vector<T> convert_dsizes_to_vector(const Eigen::DSizes<T, size> &arr) {
149
+ std::vector<T> result(size);
150
+
151
+ for (size_t i = 0; i < size; i++) {
152
+ result[i] = arr[i];
153
+ }
154
+
155
+ return result;
156
+ }
157
+
158
+ template <typename T, int size>
159
+ Eigen::DSizes<T, size> get_shape_for_array(const array &arr) {
160
+ Eigen::DSizes<T, size> result;
161
+ const T *shape = arr.shape();
162
+ for (size_t i = 0; i < size; i++) {
163
+ result[i] = shape[i];
164
+ }
165
+
166
+ return result;
167
+ }
168
+
169
+ PYBIND11_WARNING_POP
170
+
171
+ template <typename Type>
172
+ struct type_caster<Type, typename eigen_tensor_helper<Type>::ValidType> {
173
+ static_assert(!std::is_pointer<typename Type::Scalar>::value,
174
+ PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
175
+ using Helper = eigen_tensor_helper<Type>;
176
+ static constexpr auto temp_name = get_tensor_descriptor<Type, false>::value;
177
+ PYBIND11_TYPE_CASTER(Type, temp_name);
178
+
179
+ bool load(handle src, bool convert) {
180
+ if (!convert) {
181
+ if (!isinstance<array>(src)) {
182
+ return false;
183
+ }
184
+ array temp = array::ensure(src);
185
+ if (!temp) {
186
+ return false;
187
+ }
188
+
189
+ if (!temp.dtype().is(dtype::of<typename Type::Scalar>())) {
190
+ return false;
191
+ }
192
+ }
193
+
194
+ array_t<typename Type::Scalar, compute_array_flag_from_tensor<Type>()> arr(
195
+ reinterpret_borrow<object>(src));
196
+
197
+ if (arr.ndim() != Type::NumIndices) {
198
+ return false;
199
+ }
200
+ auto shape = get_shape_for_array<typename Type::Index, Type::NumIndices>(arr);
201
+
202
+ if (!Helper::is_correct_shape(shape)) {
203
+ return false;
204
+ }
205
+
206
+ #if EIGEN_VERSION_AT_LEAST(3, 4, 0)
207
+ auto data_pointer = arr.data();
208
+ #else
209
+ // Handle Eigen bug
210
+ auto data_pointer = const_cast<typename Type::Scalar *>(arr.data());
211
+ #endif
212
+
213
+ if (is_tensor_aligned(arr.data())) {
214
+ value = Eigen::TensorMap<const Type, Eigen::Aligned>(data_pointer, shape);
215
+ } else {
216
+ value = Eigen::TensorMap<const Type>(data_pointer, shape);
217
+ }
218
+
219
+ return true;
220
+ }
221
+
222
+ static handle cast(Type &&src, return_value_policy policy, handle parent) {
223
+ if (policy == return_value_policy::reference
224
+ || policy == return_value_policy::reference_internal) {
225
+ pybind11_fail("Cannot use a reference return value policy for an rvalue");
226
+ }
227
+ return cast_impl(&src, return_value_policy::move, parent);
228
+ }
229
+
230
+ static handle cast(const Type &&src, return_value_policy policy, handle parent) {
231
+ if (policy == return_value_policy::reference
232
+ || policy == return_value_policy::reference_internal) {
233
+ pybind11_fail("Cannot use a reference return value policy for an rvalue");
234
+ }
235
+ return cast_impl(&src, return_value_policy::move, parent);
236
+ }
237
+
238
+ static handle cast(Type &src, return_value_policy policy, handle parent) {
239
+ if (policy == return_value_policy::automatic
240
+ || policy == return_value_policy::automatic_reference) {
241
+ policy = return_value_policy::copy;
242
+ }
243
+ return cast_impl(&src, policy, parent);
244
+ }
245
+
246
+ static handle cast(const Type &src, return_value_policy policy, handle parent) {
247
+ if (policy == return_value_policy::automatic
248
+ || policy == return_value_policy::automatic_reference) {
249
+ policy = return_value_policy::copy;
250
+ }
251
+ return cast(&src, policy, parent);
252
+ }
253
+
254
+ static handle cast(Type *src, return_value_policy policy, handle parent) {
255
+ if (policy == return_value_policy::automatic) {
256
+ policy = return_value_policy::take_ownership;
257
+ } else if (policy == return_value_policy::automatic_reference) {
258
+ policy = return_value_policy::reference;
259
+ }
260
+ return cast_impl(src, policy, parent);
261
+ }
262
+
263
+ static handle cast(const Type *src, return_value_policy policy, handle parent) {
264
+ if (policy == return_value_policy::automatic) {
265
+ policy = return_value_policy::take_ownership;
266
+ } else if (policy == return_value_policy::automatic_reference) {
267
+ policy = return_value_policy::reference;
268
+ }
269
+ return cast_impl(src, policy, parent);
270
+ }
271
+
272
+ template <typename C>
273
+ static handle cast_impl(C *src, return_value_policy policy, handle parent) {
274
+ object parent_object;
275
+ bool writeable = false;
276
+ switch (policy) {
277
+ case return_value_policy::move:
278
+ if (std::is_const<C>::value) {
279
+ pybind11_fail("Cannot move from a constant reference");
280
+ }
281
+
282
+ src = Helper::alloc(std::move(*src));
283
+
284
+ parent_object
285
+ = capsule(src, [](void *ptr) { Helper::free(reinterpret_cast<Type *>(ptr)); });
286
+ writeable = true;
287
+ break;
288
+
289
+ case return_value_policy::take_ownership:
290
+ if (std::is_const<C>::value) {
291
+ // This cast is ugly, and might be UB in some cases, but we don't have an
292
+ // alternative here as we must free that memory
293
+ Helper::free(const_cast<Type *>(src));
294
+ pybind11_fail("Cannot take ownership of a const reference");
295
+ }
296
+
297
+ parent_object
298
+ = capsule(src, [](void *ptr) { Helper::free(reinterpret_cast<Type *>(ptr)); });
299
+ writeable = true;
300
+ break;
301
+
302
+ case return_value_policy::copy:
303
+ writeable = true;
304
+ break;
305
+
306
+ case return_value_policy::reference:
307
+ parent_object = none();
308
+ writeable = !std::is_const<C>::value;
309
+ break;
310
+
311
+ case return_value_policy::reference_internal:
312
+ // Default should do the right thing
313
+ if (!parent) {
314
+ pybind11_fail("Cannot use reference internal when there is no parent");
315
+ }
316
+ parent_object = reinterpret_borrow<object>(parent);
317
+ writeable = !std::is_const<C>::value;
318
+ break;
319
+
320
+ default:
321
+ pybind11_fail("pybind11 bug in eigen.h, please file a bug report");
322
+ }
323
+
324
+ auto result = array_t<typename Type::Scalar, compute_array_flag_from_tensor<Type>()>(
325
+ convert_dsizes_to_vector(Helper::get_shape(*src)), src->data(), parent_object);
326
+
327
+ if (!writeable) {
328
+ array_proxy(result.ptr())->flags &= ~detail::npy_api::NPY_ARRAY_WRITEABLE_;
329
+ }
330
+
331
+ return result.release();
332
+ }
333
+ };
334
+
335
+ template <typename StoragePointerType,
336
+ bool needs_writeable,
337
+ enable_if_t<!needs_writeable, bool> = true>
338
+ StoragePointerType get_array_data_for_type(array &arr) {
339
+ #if EIGEN_VERSION_AT_LEAST(3, 4, 0)
340
+ return reinterpret_cast<StoragePointerType>(arr.data());
341
+ #else
342
+ // Handle Eigen bug
343
+ return reinterpret_cast<StoragePointerType>(const_cast<void *>(arr.data()));
344
+ #endif
345
+ }
346
+
347
+ template <typename StoragePointerType,
348
+ bool needs_writeable,
349
+ enable_if_t<needs_writeable, bool> = true>
350
+ StoragePointerType get_array_data_for_type(array &arr) {
351
+ return reinterpret_cast<StoragePointerType>(arr.mutable_data());
352
+ }
353
+
354
+ template <typename T, typename = void>
355
+ struct get_storage_pointer_type;
356
+
357
+ template <typename MapType>
358
+ struct get_storage_pointer_type<MapType, void_t<typename MapType::StoragePointerType>> {
359
+ using SPT = typename MapType::StoragePointerType;
360
+ };
361
+
362
+ template <typename MapType>
363
+ struct get_storage_pointer_type<MapType, void_t<typename MapType::PointerArgType>> {
364
+ using SPT = typename MapType::PointerArgType;
365
+ };
366
+
367
+ template <typename Type, int Options>
368
+ struct type_caster<Eigen::TensorMap<Type, Options>,
369
+ typename eigen_tensor_helper<remove_cv_t<Type>>::ValidType> {
370
+ static_assert(!std::is_pointer<typename Type::Scalar>::value,
371
+ PYBIND11_EIGEN_MESSAGE_POINTER_TYPES_ARE_NOT_SUPPORTED);
372
+ using MapType = Eigen::TensorMap<Type, Options>;
373
+ using Helper = eigen_tensor_helper<remove_cv_t<Type>>;
374
+
375
+ bool load(handle src, bool /*convert*/) {
376
+ // Note that we have a lot more checks here as we want to make sure to avoid copies
377
+ if (!isinstance<array>(src)) {
378
+ return false;
379
+ }
380
+ auto arr = reinterpret_borrow<array>(src);
381
+ if ((arr.flags() & compute_array_flag_from_tensor<Type>()) == 0) {
382
+ return false;
383
+ }
384
+
385
+ if (!arr.dtype().is(dtype::of<typename Type::Scalar>())) {
386
+ return false;
387
+ }
388
+
389
+ if (arr.ndim() != Type::NumIndices) {
390
+ return false;
391
+ }
392
+
393
+ constexpr bool is_aligned = (Options & Eigen::Aligned) != 0;
394
+
395
+ if (is_aligned && !is_tensor_aligned(arr.data())) {
396
+ return false;
397
+ }
398
+
399
+ auto shape = get_shape_for_array<typename Type::Index, Type::NumIndices>(arr);
400
+
401
+ if (!Helper::is_correct_shape(shape)) {
402
+ return false;
403
+ }
404
+
405
+ if (needs_writeable && !arr.writeable()) {
406
+ return false;
407
+ }
408
+
409
+ auto result = get_array_data_for_type<typename get_storage_pointer_type<MapType>::SPT,
410
+ needs_writeable>(arr);
411
+
412
+ value.reset(new MapType(std::move(result), std::move(shape)));
413
+
414
+ return true;
415
+ }
416
+
417
+ static handle cast(MapType &&src, return_value_policy policy, handle parent) {
418
+ return cast_impl(&src, policy, parent);
419
+ }
420
+
421
+ static handle cast(const MapType &&src, return_value_policy policy, handle parent) {
422
+ return cast_impl(&src, policy, parent);
423
+ }
424
+
425
+ static handle cast(MapType &src, return_value_policy policy, handle parent) {
426
+ if (policy == return_value_policy::automatic
427
+ || policy == return_value_policy::automatic_reference) {
428
+ policy = return_value_policy::copy;
429
+ }
430
+ return cast_impl(&src, policy, parent);
431
+ }
432
+
433
+ static handle cast(const MapType &src, return_value_policy policy, handle parent) {
434
+ if (policy == return_value_policy::automatic
435
+ || policy == return_value_policy::automatic_reference) {
436
+ policy = return_value_policy::copy;
437
+ }
438
+ return cast(&src, policy, parent);
439
+ }
440
+
441
+ static handle cast(MapType *src, return_value_policy policy, handle parent) {
442
+ if (policy == return_value_policy::automatic) {
443
+ policy = return_value_policy::take_ownership;
444
+ } else if (policy == return_value_policy::automatic_reference) {
445
+ policy = return_value_policy::reference;
446
+ }
447
+ return cast_impl(src, policy, parent);
448
+ }
449
+
450
+ static handle cast(const MapType *src, return_value_policy policy, handle parent) {
451
+ if (policy == return_value_policy::automatic) {
452
+ policy = return_value_policy::take_ownership;
453
+ } else if (policy == return_value_policy::automatic_reference) {
454
+ policy = return_value_policy::reference;
455
+ }
456
+ return cast_impl(src, policy, parent);
457
+ }
458
+
459
+ template <typename C>
460
+ static handle cast_impl(C *src, return_value_policy policy, handle parent) {
461
+ object parent_object;
462
+ constexpr bool writeable = !std::is_const<C>::value;
463
+ switch (policy) {
464
+ case return_value_policy::reference:
465
+ parent_object = none();
466
+ break;
467
+
468
+ case return_value_policy::reference_internal:
469
+ // Default should do the right thing
470
+ if (!parent) {
471
+ pybind11_fail("Cannot use reference internal when there is no parent");
472
+ }
473
+ parent_object = reinterpret_borrow<object>(parent);
474
+ break;
475
+
476
+ default:
477
+ // move, take_ownership don't make any sense for a ref/map:
478
+ pybind11_fail("Invalid return_value_policy for Eigen Map type, must be either "
479
+ "reference or reference_internal");
480
+ }
481
+
482
+ auto result = array_t<typename Type::Scalar, compute_array_flag_from_tensor<Type>()>(
483
+ convert_dsizes_to_vector(Helper::get_shape(*src)),
484
+ src->data(),
485
+ std::move(parent_object));
486
+
487
+ if (!writeable) {
488
+ array_proxy(result.ptr())->flags &= ~detail::npy_api::NPY_ARRAY_WRITEABLE_;
489
+ }
490
+
491
+ return result.release();
492
+ }
493
+
494
+ #if EIGEN_VERSION_AT_LEAST(3, 4, 0)
495
+
496
+ static constexpr bool needs_writeable = !std::is_const<typename std::remove_pointer<
497
+ typename get_storage_pointer_type<MapType>::SPT>::type>::value;
498
+ #else
499
+ // Handle Eigen bug
500
+ static constexpr bool needs_writeable = !std::is_const<Type>::value;
501
+ #endif
502
+
503
+ protected:
504
+ // TODO: Move to std::optional once std::optional has more support
505
+ std::unique_ptr<MapType> value;
506
+
507
+ public:
508
+ // return_descr forces the use of NDArray instead of ArrayLike since refs can only reference
509
+ // arrays
510
+ static constexpr auto name
511
+ = return_descr(get_tensor_descriptor<Type, true, needs_writeable>::value);
512
+ explicit operator MapType *() { return value.get(); }
513
+ explicit operator MapType &() { return *value; }
514
+ explicit operator MapType &&() && { return std::move(*value); }
515
+
516
+ template <typename T_>
517
+ using cast_op_type = ::pybind11::detail::movable_cast_op_type<T_>;
518
+ };
519
+
520
+ PYBIND11_NAMESPACE_END(detail)
521
+ PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE)
@@ -0,0 +1,12 @@
1
+ /*
2
+ pybind11/eigen.h: Transparent conversion for dense and sparse Eigen matrices
3
+
4
+ Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
5
+
6
+ All rights reserved. Use of this source code is governed by a
7
+ BSD-style license that can be found in the LICENSE file.
8
+ */
9
+
10
+ #pragma once
11
+
12
+ #include "eigen/matrix.h"