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,457 @@
1
+ #ifndef NETGEN_CORE_PYTHON_NGCORE_HPP
2
+ #define NETGEN_CORE_PYTHON_NGCORE_HPP
3
+
4
+ #include "ngcore_api.hpp" // for operator new
5
+ #include <pybind11/pybind11.h>
6
+ #include <pybind11/operators.h>
7
+ #include <pybind11/numpy.h>
8
+ #include <pybind11/stl.h>
9
+ #include <pybind11/stl/filesystem.h>
10
+
11
+ #include "array.hpp"
12
+ #include "table.hpp"
13
+ #include "archive.hpp"
14
+ #include "flags.hpp"
15
+ #include "ngcore_api.hpp"
16
+ #include "ng_mpi.hpp"
17
+
18
+ namespace py = pybind11;
19
+
20
+ namespace ngcore
21
+ {
22
+ #ifdef PARALLEL
23
+ NGCORE_API extern bool (*NG_MPI_CommFromMPI4Py)(py::handle, NG_MPI_Comm &);
24
+ NGCORE_API extern py::handle (*NG_MPI_CommToMPI4Py)(NG_MPI_Comm);
25
+ #endif // PARALLEL
26
+
27
+ namespace detail
28
+ {
29
+ template<typename T>
30
+ struct HasPyFormat
31
+ {
32
+ private:
33
+ template<typename T2>
34
+ static auto check(T2*) -> std::enable_if_t<std::is_same_v<decltype(std::declval<py::format_descriptor<T2>>().format()), std::string>, std::true_type>;
35
+ static auto check(...) -> std::false_type;
36
+ public:
37
+ static constexpr bool value = decltype(check((T*) nullptr))::value;
38
+ };
39
+ } // namespace detail
40
+
41
+ #ifdef PARALLEL
42
+ struct mpi4py_comm {
43
+ mpi4py_comm() = default;
44
+ mpi4py_comm(NG_MPI_Comm value) : value(value) {}
45
+ operator NG_MPI_Comm () { return value; }
46
+
47
+ NG_MPI_Comm value;
48
+ };
49
+ #endif // PARALLEL
50
+ } // namespace ngcore
51
+
52
+
53
+ ////////////////////////////////////////////////////////////////////////////////
54
+ // automatic conversion of python list to Array<>
55
+ namespace pybind11 {
56
+ namespace detail {
57
+
58
+ #ifdef PARALLEL
59
+ template <> struct type_caster<ngcore::mpi4py_comm> {
60
+ public:
61
+ PYBIND11_TYPE_CASTER(ngcore::mpi4py_comm, _("mpi4py_comm"));
62
+
63
+ // Python -> C++
64
+ bool load(handle src, bool) {
65
+ return ngcore::NG_MPI_CommFromMPI4Py(src, value.value);
66
+ }
67
+
68
+ // C++ -> Python
69
+ static handle cast(ngcore::mpi4py_comm src,
70
+ return_value_policy /* policy */,
71
+ handle /* parent */)
72
+ {
73
+ // Create an mpi4py handle
74
+ return ngcore::NG_MPI_CommToMPI4Py(src.value);
75
+ }
76
+ };
77
+ #endif // PARALLEL
78
+
79
+ template <typename Type, typename Value> struct ngcore_list_caster {
80
+ using value_conv = make_caster<Value>;
81
+
82
+ bool load(handle src, bool convert) {
83
+ if (!isinstance<sequence>(src) || isinstance<str>(src))
84
+ return false;
85
+ auto s = reinterpret_borrow<sequence>(src);
86
+ value.SetSize(s.size());
87
+ value.SetSize0();
88
+ for (auto it : s) {
89
+ value_conv conv;
90
+ if (!conv.load(it, convert))
91
+ return false;
92
+ value.Append(cast_op<Value &&>(std::move(conv)));
93
+ }
94
+ return true;
95
+ }
96
+
97
+ public:
98
+ template <typename T>
99
+ static handle cast(T &&src, return_value_policy policy, handle parent) {
100
+ if (!std::is_lvalue_reference<T>::value)
101
+ policy = return_value_policy_override<Value>::policy(policy);
102
+ list l(src.Size());
103
+ size_t index = 0;
104
+ for (auto &&value : src) {
105
+ auto value_ = reinterpret_steal<object>(value_conv::cast(forward_like<T>(value), policy, parent));
106
+ if (!value_)
107
+ return handle();
108
+ PyList_SET_ITEM(l.ptr(), (ssize_t) index++, value_.release().ptr()); // steals a reference
109
+ }
110
+ return l.release();
111
+ }
112
+
113
+ PYBIND11_TYPE_CASTER(Type, _("Array[") + value_conv::name + _("]"));
114
+ };
115
+
116
+
117
+ template <typename Type> struct type_caster<ngcore::Array<Type>, enable_if_t<!ngcore::detail::HasPyFormat<Type>::value>>
118
+ : ngcore_list_caster<ngcore::Array<Type>, Type> { };
119
+
120
+
121
+ /*
122
+ template <typename Type> struct type_caster<std::shared_ptr<ngcore::Table<Type>>>
123
+ {
124
+ template <typename T>
125
+ static handle cast(T &&src, return_value_policy policy, handle parent)
126
+ {
127
+ std::cout << "handle called with type src = " << typeid(src).name() << std::endl;
128
+
129
+ return handle(); // what so ever
130
+ }
131
+
132
+ PYBIND11_TYPE_CASTER(Type, _("Table[") + make_caster<Type>::name + _("]"));
133
+ };
134
+ */
135
+
136
+
137
+
138
+ } // namespace detail
139
+ } // namespace pybind11
140
+ ////////////////////////////////////////////////////////////////////////////////
141
+
142
+ namespace ngcore
143
+ {
144
+ NGCORE_API extern bool ngcore_have_numpy;
145
+ NGCORE_API extern bool parallel_pickling;
146
+
147
+ // Python class name type traits
148
+ template <typename T>
149
+ struct PyNameTraits {
150
+ static const std::string & GetName()
151
+ {
152
+ static const std::string name = typeid(T).name();
153
+ return name;
154
+ }
155
+ };
156
+
157
+ template <typename T>
158
+ std::string GetPyName(const char *prefix = 0) {
159
+ std::string s;
160
+ if(prefix) s = std::string(prefix);
161
+ s+= PyNameTraits<T>::GetName();
162
+ return s;
163
+ }
164
+
165
+ template<>
166
+ struct PyNameTraits<int> {
167
+ static std::string GetName() { return "I"; }
168
+ };
169
+
170
+ template<>
171
+ struct PyNameTraits<unsigned> {
172
+ static std::string GetName() { return "U"; }
173
+ };
174
+
175
+ template<>
176
+ struct PyNameTraits<float> {
177
+ static std::string GetName() { return "F"; }
178
+ };
179
+
180
+ template<>
181
+ struct PyNameTraits<double> {
182
+ static std::string GetName() { return "D"; }
183
+ };
184
+
185
+ template<>
186
+ struct PyNameTraits<size_t> {
187
+ static std::string GetName() { return "S"; }
188
+ };
189
+
190
+ template<typename T>
191
+ struct PyNameTraits<std::shared_ptr<T>> {
192
+ static std::string GetName()
193
+ { return std::string("sp_")+GetPyName<T>(); }
194
+ };
195
+
196
+ template<typename ARCHIVE>
197
+ class NGCORE_API_EXPORT PyArchive : public ARCHIVE
198
+ {
199
+ private:
200
+ pybind11::list lst;
201
+ size_t index = 0;
202
+ std::map<std::string, VersionInfo> version_needed;
203
+ protected:
204
+ using ARCHIVE::stream;
205
+ using ARCHIVE::version_map;
206
+ public:
207
+ PyArchive(const pybind11::object& alst = pybind11::none()) :
208
+ ARCHIVE(std::make_shared<std::stringstream>()),
209
+ lst(alst.is_none() ? pybind11::list() : pybind11::cast<pybind11::list>(alst))
210
+ {
211
+ ARCHIVE::shallow_to_python = true;
212
+ if(Input())
213
+ {
214
+ stream = std::make_shared<std::stringstream>
215
+ (pybind11::cast<pybind11::bytes>(lst[pybind11::len(lst)-1]));
216
+ *this & version_needed;
217
+ for(auto& libversion : version_needed)
218
+ if(libversion.second > GetLibraryVersion(libversion.first))
219
+ throw Exception("Error in unpickling data:\nLibrary " + libversion.first +
220
+ " must be at least " + libversion.second.to_string());
221
+ stream = std::make_shared<std::stringstream>
222
+ (pybind11::cast<pybind11::bytes>(lst[pybind11::len(lst)-2]));
223
+ *this & version_map;
224
+ stream = std::make_shared<std::stringstream>
225
+ (pybind11::cast<pybind11::bytes>(lst[pybind11::len(lst)-3]));
226
+ }
227
+ }
228
+
229
+ void NeedsVersion(const std::string& library, const std::string& version) override
230
+ {
231
+ if(Output())
232
+ {
233
+ version_needed[library] = version_needed[library] > version ? version_needed[library] : version;
234
+ }
235
+ }
236
+
237
+ using ARCHIVE::Output;
238
+ using ARCHIVE::Input;
239
+ using ARCHIVE::FlushBuffer;
240
+ using ARCHIVE::operator&;
241
+ using ARCHIVE::operator<<;
242
+ using ARCHIVE::GetVersion;
243
+ void ShallowOutPython(const pybind11::object& val) override { lst.append(val); }
244
+ void ShallowInPython(pybind11::object& val) override { val = lst[index++]; }
245
+
246
+ pybind11::list WriteOut()
247
+ {
248
+ auto version_runtime = GetLibraryVersions();
249
+ FlushBuffer();
250
+ lst.append(pybind11::bytes(std::static_pointer_cast<std::stringstream>(stream)->str()));
251
+ stream = std::make_shared<std::stringstream>();
252
+ *this & version_runtime;
253
+ FlushBuffer();
254
+ lst.append(pybind11::bytes(std::static_pointer_cast<std::stringstream>(stream)->str()));
255
+ stream = std::make_shared<std::stringstream>();
256
+ *this & version_needed;
257
+ FlushBuffer();
258
+ lst.append(pybind11::bytes(std::static_pointer_cast<std::stringstream>(stream)->str()));
259
+ return lst;
260
+ }
261
+ };
262
+
263
+ template<typename T, typename T_ARCHIVE_OUT=BinaryOutArchive, typename T_ARCHIVE_IN=BinaryInArchive>
264
+ auto NGSPickle()
265
+ {
266
+ return pybind11::pickle([](T* self)
267
+ {
268
+ PyArchive<T_ARCHIVE_OUT> ar;
269
+ ar.SetParallel(parallel_pickling);
270
+ ar & self;
271
+ auto output = pybind11::make_tuple(ar.WriteOut());
272
+ return output;
273
+ },
274
+ [](const pybind11::tuple & state)
275
+ {
276
+ T* val = nullptr;
277
+ PyArchive<T_ARCHIVE_IN> ar(state[0]);
278
+ ar & val;
279
+ return val;
280
+ });
281
+ }
282
+
283
+ template<typename T>
284
+ Array<T> makeCArray(const py::object& obj)
285
+ {
286
+ Array<T> arr;
287
+ if(py::isinstance<py::list>(obj))
288
+ for(auto& val : py::cast<py::list>(obj))
289
+ arr.Append(py::cast<T>(val));
290
+ else if(py::isinstance<py::tuple>(obj))
291
+ for(auto& val : py::cast<py::tuple>(obj))
292
+ arr.Append(py::cast<T>(val));
293
+ else
294
+ throw py::type_error("Cannot convert Python object to C Array");
295
+ return arr;
296
+ }
297
+
298
+ template <typename T>
299
+ // py::object makePyTuple (FlatArray<T> ar)
300
+ py::object makePyTuple (const BaseArrayObject<T> & ar)
301
+ {
302
+ py::tuple res(ar.Size());
303
+ for (auto i : Range(ar))
304
+ res[i] = py::cast(ar[i]);
305
+ return res;
306
+ }
307
+
308
+ template <typename T, typename TIND=typename FlatArray<T>::index_type>
309
+ void ExportArray (py::module &m)
310
+ {
311
+ using TFlat = FlatArray<T, TIND>;
312
+ using TArray = Array<T, TIND>;
313
+ std::string suffix = GetPyName<T>() + "_" +
314
+ GetPyName<TIND>();
315
+ std::string fname = std::string("FlatArray_") + suffix;
316
+ auto flatarray_class = py::class_<TFlat>(m, fname.c_str(),
317
+ py::buffer_protocol())
318
+ .def ("__len__", [] ( TFlat &self ) { return self.Size(); } )
319
+ .def ("__getitem__",
320
+ [](TFlat & self, TIND i) -> T&
321
+ {
322
+ // static constexpr int base = IndexBASE<TIND>();
323
+ auto reli = i - IndexBASE<TIND>();
324
+ if (reli < 0 || reli >= self.Size())
325
+ throw py::index_error();
326
+ return self[i];
327
+ },
328
+ py::return_value_policy::reference)
329
+ .def ("__setitem__",
330
+ [](TFlat & self, TIND i, T val) -> T&
331
+ {
332
+ // static constexpr int base = IndexBASE<TIND>();
333
+ auto reli = i - IndexBASE<TIND>();
334
+ if (reli < 0 || reli >= self.Size())
335
+ throw py::index_error();
336
+ self[i] = val;
337
+ return self[i];
338
+ },
339
+ py::return_value_policy::reference)
340
+
341
+ .def ("__setitem__",
342
+ [](TFlat & self, py::slice slice, T val)
343
+ {
344
+ size_t start, stop, step, slicelength;
345
+ if (!slice.compute(self.Size(), &start, &stop, &step, &slicelength))
346
+ throw py::error_already_set();
347
+ static constexpr int base = IndexBASE<TIND>();
348
+ if (start < base || start+(slicelength-1)*step >= self.Size()+base)
349
+ throw py::index_error();
350
+ for (size_t i = 0; i < slicelength; i++, start+=step)
351
+ self[start] = val;
352
+ })
353
+
354
+ .def("__iter__", [] ( TFlat & self) {
355
+ return py::make_iterator (self.begin(),self.end());
356
+ }, py::keep_alive<0,1>()) // keep array alive while iterator is used
357
+
358
+ .def("__str__", [](TFlat& self)
359
+ {
360
+ return ToString(self);
361
+ })
362
+ ;
363
+
364
+ if constexpr (detail::HasPyFormat<T>::value)
365
+ {
366
+ if(ngcore_have_numpy && !py::detail::npy_format_descriptor<T>::dtype().is_none())
367
+ {
368
+ flatarray_class
369
+ .def_buffer([](TFlat& self)
370
+ {
371
+ return py::buffer_info(
372
+ self.Addr(0),
373
+ sizeof(T),
374
+ py::format_descriptor<T>::format(),
375
+ 1,
376
+ { self.Size() },
377
+ { sizeof(T) * (self.Addr(1) - self.Addr(0)) });
378
+ })
379
+ .def("NumPy", [](py::object self)
380
+ {
381
+ return py::module::import("numpy")
382
+ .attr("frombuffer")(self, py::detail::npy_format_descriptor<T>::dtype());
383
+ })
384
+ ;
385
+ }
386
+ }
387
+
388
+ std::string aname = std::string("Array_") + suffix;
389
+ auto arr = py::class_<TArray, TFlat> (m, aname.c_str())
390
+ .def(py::init([] (size_t n) { return new TArray(n); }),py::arg("n"), "Makes array of given length")
391
+ .def(py::init([] (std::vector<T> const & x)
392
+ {
393
+ size_t s = x.size();
394
+ TArray tmp(s);
395
+ for (size_t i : Range(tmp))
396
+ tmp[TIND(i)] = x[i];
397
+ return tmp;
398
+ }), py::arg("vec"), "Makes array with given list of elements")
399
+ ;
400
+ if constexpr(is_archivable<TArray>)
401
+ arr.def(NGSPickle<TArray>());
402
+ py::implicitly_convertible<std::vector<T>, TArray>();
403
+ }
404
+
405
+ template <typename T>
406
+ void ExportTable (py::module &m)
407
+ {
408
+ py::class_<ngcore::Table<T>, std::shared_ptr<ngcore::Table<T>>> (m, ("Table_"+GetPyName<T>()).c_str())
409
+ .def(py::init([] (py::list blocks)
410
+ {
411
+ size_t size = py::len(blocks);
412
+ Array<int> cnt(size);
413
+ size_t i = 0;
414
+ for (auto block : blocks)
415
+ cnt[i++] = py::len(block);
416
+
417
+ i = 0;
418
+ Table<T> blocktable(cnt);
419
+ for (auto block : blocks)
420
+ {
421
+ auto row = blocktable[i++];
422
+ size_t j = 0;
423
+ for (auto val : block)
424
+ row[j++] = val.cast<T>();
425
+ }
426
+ // cout << "blocktable = " << *blocktable << endl;
427
+ return blocktable;
428
+
429
+ }), py::arg("blocks"), "a list of lists")
430
+
431
+ .def ("__len__", [] (Table<T> &self ) { return self.Size(); } )
432
+ .def ("__getitem__",
433
+ [](Table<T> & self, size_t i) -> FlatArray<T>
434
+ {
435
+ if (i >= self.Size())
436
+ throw py::index_error();
437
+ return self[i];
438
+ })
439
+ .def("__str__", [](Table<T> & self)
440
+ {
441
+ return ToString(self);
442
+ })
443
+ ;
444
+ }
445
+
446
+
447
+ void NGCORE_API SetFlag(Flags &flags, std::string s, py::object value);
448
+ // Parse python kwargs to flags
449
+ Flags NGCORE_API CreateFlagsFromKwArgs(const py::kwargs& kwargs, py::object pyclass = py::none(),
450
+ py::list info = py::list());
451
+ // Create python dict from kwargs
452
+ py::dict NGCORE_API CreateDictFromFlags(const Flags& flags);
453
+
454
+
455
+ } // namespace ngcore
456
+
457
+ #endif // NETGEN_CORE_PYTHON_NGCORE_HPP
@@ -0,0 +1,109 @@
1
+ #ifndef NETGEN_CORE_RANGES_HPP
2
+ #define NETGEN_CORE_RANGES_HPP
3
+
4
+ #include <iterator>
5
+
6
+ namespace ngcore
7
+ {
8
+ template<typename Iterator>
9
+ class AdapterRange
10
+ {
11
+ Iterator _begin,_end;
12
+ public:
13
+ AdapterRange(Iterator abegin, Iterator aend) : _begin(abegin), _end(aend) { ; }
14
+ Iterator begin() const { return _begin; }
15
+ Iterator end() const { return _end; }
16
+ };
17
+
18
+ template<typename FUNC>
19
+ class FilterAdapter
20
+ {
21
+ FUNC f;
22
+ public:
23
+ FilterAdapter(FUNC af) : f(af) { ; }
24
+ FUNC GetFunction() const { return f; }
25
+ };
26
+
27
+ template<typename FUNC, typename Iterator>
28
+ class FilterIterator
29
+ {
30
+ Iterator iter;
31
+ Iterator end;
32
+ FUNC f;
33
+ public:
34
+ FilterIterator(FUNC af, Iterator aiter, Iterator aend)
35
+ : iter(aiter), end(aend), f(af)
36
+ {
37
+ while(iter!=end && !f(*iter))
38
+ ++iter;
39
+ }
40
+ inline FilterIterator& operator ++()
41
+ {
42
+ ++iter;
43
+ while(iter!=end && !f(*iter))
44
+ ++iter;
45
+ return *this;
46
+ }
47
+
48
+ inline bool operator !=(FilterIterator other)
49
+ {
50
+ return iter != other.iter;
51
+ }
52
+
53
+ inline bool operator ==(FilterIterator other)
54
+ {
55
+ return iter == other.iter;
56
+ }
57
+
58
+ inline decltype(auto) operator *() const
59
+ {
60
+ return *iter;
61
+ }
62
+ };
63
+
64
+ template<typename FUNC>
65
+ FilterAdapter<FUNC> filter(FUNC f) { return {f}; }
66
+
67
+ template<typename Range, typename FUNC>
68
+ auto operator |(Range&& range, FilterAdapter<FUNC> adapter)
69
+ -> AdapterRange<FilterIterator<FUNC,decltype(std::begin(range))>>
70
+ {
71
+ return {{adapter.GetFunction(),std::begin(range),std::end(range)},
72
+ {adapter.GetFunction(), std::end(range), std::end(range)}};
73
+ }
74
+
75
+ template<typename FUNC, typename Iterator>
76
+ class TransformIterator
77
+ {
78
+ FUNC f;
79
+ Iterator iter;
80
+ public:
81
+ TransformIterator(FUNC af, Iterator aiter) : f(af), iter(aiter) { ; }
82
+
83
+ TransformIterator& operator++() { ++iter; }
84
+ bool operator !=(TransformIterator other) { return iter != other.iter; }
85
+ decltype(auto) operator *() const { return f(*iter); }
86
+ };
87
+
88
+ template<typename FUNC>
89
+ class TransformAdapter
90
+ {
91
+ FUNC f;
92
+ public:
93
+ TransformAdapter(FUNC af) : f(af) { ; }
94
+ FUNC GetFunction() const { return f; }
95
+ };
96
+
97
+ template<typename FUNC>
98
+ TransformAdapter<FUNC> transform(FUNC f) { return {f}; }
99
+
100
+ template<typename Range, typename FUNC>
101
+ auto operator |(Range&& range, TransformAdapter<FUNC> adapter)
102
+ -> AdapterRange<TransformIterator<FUNC,decltype(std::begin(range))>>
103
+ {
104
+ return {{adapter.GetFunction(), std::begin(range)},
105
+ {adapter.GetFunction(),std::end(range)}};
106
+ }
107
+ } // namespace ngcore
108
+
109
+ #endif // NETGEN_CORE_RANGES_HPP
@@ -0,0 +1,100 @@
1
+ #ifndef NETGEN_REGISTER_ARCHIVE_HPP
2
+ #define NETGEN_REGISTER_ARCHIVE_HPP
3
+
4
+ #ifdef NETGEN_PYTHON
5
+ #include <memory>
6
+ #include <pybind11/pybind11.h>
7
+ #include <pybind11/cast.h>
8
+ #endif // NETGEN_PYTHON
9
+ #include <tuple>
10
+
11
+ #include "archive.hpp"
12
+
13
+ namespace ngcore {
14
+ // *************** Archiving functionality **************
15
+
16
+ #ifdef NETGEN_PYTHON
17
+ template<typename T>
18
+ Archive& Archive :: Shallow(T& val)
19
+ {
20
+ static_assert(detail::is_any_pointer<T>, "ShallowArchive must be given pointer type!");
21
+ if(shallow_to_python)
22
+ {
23
+ if(is_output)
24
+ ShallowOutPython(pybind11::cast(val));
25
+ else
26
+ {
27
+ pybind11::object obj;
28
+ ShallowInPython(obj);
29
+ val = pybind11::cast<T>(obj);
30
+ }
31
+ }
32
+ else
33
+ *this & val;
34
+ return *this;
35
+ }
36
+
37
+ /*
38
+ // now using has_shared_from_this2 in archive.hpp
39
+ template <typename T>
40
+ struct has_shared_from_this
41
+ {
42
+ template <typename C> static std::true_type check( decltype( sizeof(&C::shared_from_this )) ) { return std::true_type(); }
43
+ template <typename> static std::false_type check(...) { return std::false_type(); }
44
+ typedef decltype( check<T>(sizeof(char)) ) type;
45
+ static constexpr type value = type();
46
+ };
47
+ */
48
+ #endif // NETGEN_PYTHON
49
+
50
+
51
+ template<typename T, typename Bases=std::tuple<>>
52
+ class RegisterClassForArchive
53
+ {
54
+ public:
55
+ RegisterClassForArchive()
56
+ {
57
+ static_assert(std::is_base_of<Bases, T>::value ||
58
+ detail::is_base_of_tuple<T, Bases>,
59
+ "Second argument must be base class or tuple of base classes of T");
60
+ detail::ClassArchiveInfo info {};
61
+ info.creator = [](const std::type_info& ti, Archive& ar) -> void*
62
+ {
63
+ detail::TCargs<T> args;
64
+ ar &args;
65
+ auto nT = detail::constructIfPossible<T>(std::move(args));
66
+ return typeid(T) == ti ? nT
67
+ : Archive::Caster<T, Bases>::tryUpcast(ti, nT);
68
+ };
69
+ info.upcaster = [](const std::type_info& ti, void* p) -> void*
70
+ { return typeid(T) == ti ? p : Archive::Caster<T, Bases>::tryUpcast(ti, static_cast<T*>(p)); };
71
+ info.downcaster = [](const std::type_info& ti, void* p) -> void*
72
+ { return typeid(T) == ti ? p : Archive::Caster<T, Bases>::tryDowncast(ti, p); };
73
+ info.cargs_archiver = [](Archive &ar, void* p) {
74
+ if constexpr(detail::has_GetCArgs_v<T>)
75
+ ar << static_cast<T*>(p)->GetCArgs();
76
+ };
77
+ #ifdef NETGEN_PYTHON
78
+ info.anyToPyCaster = [](const std::any &a) {
79
+ if constexpr(has_shared_from_this2<T>::value) {
80
+ std::shared_ptr<T> val = std::any_cast<std::shared_ptr<T>>(a);
81
+ return pybind11::cast(val);
82
+ } else {
83
+ const T* val = std::any_cast<T>(&a);
84
+ return pybind11::cast(val);
85
+ }
86
+ };
87
+ info.pyToAnyCaster = [](pybind11::object &obj)
88
+ {
89
+ if constexpr(has_shared_from_this2<T>::value || !std::is_copy_constructible<T>::value)
90
+ return std::any { obj.cast<std::shared_ptr<T>>() };
91
+ else
92
+ return std::any { obj.cast<T>() };
93
+ };
94
+
95
+ #endif // NETGEN_PYTHON
96
+ Archive::SetArchiveRegister(std::string(Demangle(typeid(T).name())),info);
97
+ }
98
+ };
99
+ } // namespace ngcore
100
+ #endif // NETGEN_REGISTER_ARCHIVE_HPP