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.
- netgen/NgOCC.py +7 -0
- netgen/__init__.py +114 -0
- netgen/__init__.pyi +22 -0
- netgen/__main__.py +53 -0
- netgen/cmake/NetgenConfig.cmake +79 -0
- netgen/cmake/netgen-targets-release.cmake +69 -0
- netgen/cmake/netgen-targets.cmake +146 -0
- netgen/config/__init__.py +1 -0
- netgen/config/__init__.pyi +52 -0
- netgen/config/__main__.py +4 -0
- netgen/config/config.py +68 -0
- netgen/config/config.pyi +54 -0
- netgen/csg.py +25 -0
- netgen/geom2d.py +178 -0
- netgen/gui.py +82 -0
- netgen/include/core/archive.hpp +1256 -0
- netgen/include/core/array.hpp +1760 -0
- netgen/include/core/autodiff.hpp +1131 -0
- netgen/include/core/autodiffdiff.hpp +733 -0
- netgen/include/core/bitarray.hpp +240 -0
- netgen/include/core/concurrentqueue.h +3619 -0
- netgen/include/core/exception.hpp +145 -0
- netgen/include/core/flags.hpp +199 -0
- netgen/include/core/hashtable.hpp +1281 -0
- netgen/include/core/localheap.hpp +318 -0
- netgen/include/core/logging.hpp +117 -0
- netgen/include/core/memtracer.hpp +221 -0
- netgen/include/core/mpi4py_pycapi.h +245 -0
- netgen/include/core/mpi_wrapper.hpp +643 -0
- netgen/include/core/ng_mpi.hpp +94 -0
- netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
- netgen/include/core/ng_mpi_native.hpp +25 -0
- netgen/include/core/ngcore.hpp +32 -0
- netgen/include/core/ngcore_api.hpp +152 -0
- netgen/include/core/ngstream.hpp +115 -0
- netgen/include/core/paje_trace.hpp +279 -0
- netgen/include/core/profiler.hpp +382 -0
- netgen/include/core/python_ngcore.hpp +457 -0
- netgen/include/core/ranges.hpp +109 -0
- netgen/include/core/register_archive.hpp +100 -0
- netgen/include/core/signal.hpp +82 -0
- netgen/include/core/simd.hpp +160 -0
- netgen/include/core/simd_arm64.hpp +407 -0
- netgen/include/core/simd_avx.hpp +394 -0
- netgen/include/core/simd_avx512.hpp +285 -0
- netgen/include/core/simd_generic.hpp +1053 -0
- netgen/include/core/simd_math.hpp +178 -0
- netgen/include/core/simd_sse.hpp +289 -0
- netgen/include/core/statushandler.hpp +37 -0
- netgen/include/core/symboltable.hpp +153 -0
- netgen/include/core/table.hpp +810 -0
- netgen/include/core/taskmanager.hpp +1161 -0
- netgen/include/core/type_traits.hpp +65 -0
- netgen/include/core/utils.hpp +385 -0
- netgen/include/core/version.hpp +102 -0
- netgen/include/core/xbool.hpp +47 -0
- netgen/include/csg/algprim.hpp +563 -0
- netgen/include/csg/brick.hpp +150 -0
- netgen/include/csg/csg.hpp +43 -0
- netgen/include/csg/csgeom.hpp +389 -0
- netgen/include/csg/csgparser.hpp +101 -0
- netgen/include/csg/curve2d.hpp +67 -0
- netgen/include/csg/edgeflw.hpp +112 -0
- netgen/include/csg/explicitcurve2d.hpp +113 -0
- netgen/include/csg/extrusion.hpp +185 -0
- netgen/include/csg/gencyl.hpp +70 -0
- netgen/include/csg/geoml.hpp +16 -0
- netgen/include/csg/identify.hpp +213 -0
- netgen/include/csg/manifold.hpp +29 -0
- netgen/include/csg/meshsurf.hpp +46 -0
- netgen/include/csg/polyhedra.hpp +121 -0
- netgen/include/csg/revolution.hpp +180 -0
- netgen/include/csg/singularref.hpp +84 -0
- netgen/include/csg/solid.hpp +295 -0
- netgen/include/csg/specpoin.hpp +194 -0
- netgen/include/csg/spline3d.hpp +99 -0
- netgen/include/csg/splinesurface.hpp +85 -0
- netgen/include/csg/surface.hpp +394 -0
- netgen/include/csg/triapprox.hpp +63 -0
- netgen/include/csg/vscsg.hpp +34 -0
- netgen/include/general/autodiff.hpp +356 -0
- netgen/include/general/autoptr.hpp +39 -0
- netgen/include/general/gzstream.h +121 -0
- netgen/include/general/hashtabl.hpp +1692 -0
- netgen/include/general/myadt.hpp +48 -0
- netgen/include/general/mystring.hpp +226 -0
- netgen/include/general/netgenout.hpp +205 -0
- netgen/include/general/ngarray.hpp +797 -0
- netgen/include/general/ngbitarray.hpp +149 -0
- netgen/include/general/ngpython.hpp +74 -0
- netgen/include/general/optmem.hpp +44 -0
- netgen/include/general/parthreads.hpp +138 -0
- netgen/include/general/seti.hpp +50 -0
- netgen/include/general/sort.hpp +47 -0
- netgen/include/general/spbita2d.hpp +59 -0
- netgen/include/general/stack.hpp +114 -0
- netgen/include/general/table.hpp +280 -0
- netgen/include/general/template.hpp +509 -0
- netgen/include/geom2d/csg2d.hpp +750 -0
- netgen/include/geom2d/geometry2d.hpp +280 -0
- netgen/include/geom2d/spline2d.hpp +234 -0
- netgen/include/geom2d/vsgeom2d.hpp +28 -0
- netgen/include/gprim/adtree.hpp +1392 -0
- netgen/include/gprim/geom2d.hpp +858 -0
- netgen/include/gprim/geom3d.hpp +749 -0
- netgen/include/gprim/geomfuncs.hpp +212 -0
- netgen/include/gprim/geomobjects.hpp +544 -0
- netgen/include/gprim/geomops.hpp +404 -0
- netgen/include/gprim/geomtest3d.hpp +101 -0
- netgen/include/gprim/gprim.hpp +33 -0
- netgen/include/gprim/spline.hpp +778 -0
- netgen/include/gprim/splinegeometry.hpp +73 -0
- netgen/include/gprim/transform3d.hpp +216 -0
- netgen/include/include/acisgeom.hpp +3 -0
- netgen/include/include/csg.hpp +1 -0
- netgen/include/include/geometry2d.hpp +1 -0
- netgen/include/include/gprim.hpp +1 -0
- netgen/include/include/incopengl.hpp +62 -0
- netgen/include/include/inctcl.hpp +13 -0
- netgen/include/include/incvis.hpp +6 -0
- netgen/include/include/linalg.hpp +1 -0
- netgen/include/include/meshing.hpp +1 -0
- netgen/include/include/myadt.hpp +1 -0
- netgen/include/include/mydefs.hpp +70 -0
- netgen/include/include/mystdlib.h +59 -0
- netgen/include/include/netgen_config.hpp +27 -0
- netgen/include/include/netgen_version.hpp +9 -0
- netgen/include/include/nginterface_v2_impl.hpp +395 -0
- netgen/include/include/ngsimd.hpp +1 -0
- netgen/include/include/occgeom.hpp +1 -0
- netgen/include/include/opti.hpp +1 -0
- netgen/include/include/parallel.hpp +1 -0
- netgen/include/include/stlgeom.hpp +1 -0
- netgen/include/include/visual.hpp +1 -0
- netgen/include/interface/rw_medit.hpp +11 -0
- netgen/include/interface/writeuser.hpp +80 -0
- netgen/include/linalg/densemat.hpp +414 -0
- netgen/include/linalg/linalg.hpp +29 -0
- netgen/include/linalg/opti.hpp +142 -0
- netgen/include/linalg/polynomial.hpp +47 -0
- netgen/include/linalg/vector.hpp +217 -0
- netgen/include/meshing/adfront2.hpp +274 -0
- netgen/include/meshing/adfront3.hpp +332 -0
- netgen/include/meshing/basegeom.hpp +370 -0
- netgen/include/meshing/bcfunctions.hpp +53 -0
- netgen/include/meshing/bisect.hpp +72 -0
- netgen/include/meshing/boundarylayer.hpp +113 -0
- netgen/include/meshing/classifyhpel.hpp +1984 -0
- netgen/include/meshing/clusters.hpp +46 -0
- netgen/include/meshing/curvedelems.hpp +274 -0
- netgen/include/meshing/delaunay2d.hpp +73 -0
- netgen/include/meshing/fieldlines.hpp +103 -0
- netgen/include/meshing/findip.hpp +198 -0
- netgen/include/meshing/findip2.hpp +103 -0
- netgen/include/meshing/geomsearch.hpp +69 -0
- netgen/include/meshing/global.hpp +54 -0
- netgen/include/meshing/hpref_hex.hpp +330 -0
- netgen/include/meshing/hpref_prism.hpp +3405 -0
- netgen/include/meshing/hpref_pyramid.hpp +154 -0
- netgen/include/meshing/hpref_quad.hpp +2082 -0
- netgen/include/meshing/hpref_segm.hpp +122 -0
- netgen/include/meshing/hpref_tet.hpp +4230 -0
- netgen/include/meshing/hpref_trig.hpp +848 -0
- netgen/include/meshing/hprefinement.hpp +366 -0
- netgen/include/meshing/improve2.hpp +178 -0
- netgen/include/meshing/improve3.hpp +151 -0
- netgen/include/meshing/localh.hpp +223 -0
- netgen/include/meshing/meshclass.hpp +1076 -0
- netgen/include/meshing/meshfunc.hpp +47 -0
- netgen/include/meshing/meshing.hpp +63 -0
- netgen/include/meshing/meshing2.hpp +163 -0
- netgen/include/meshing/meshing3.hpp +123 -0
- netgen/include/meshing/meshtool.hpp +90 -0
- netgen/include/meshing/meshtype.hpp +1930 -0
- netgen/include/meshing/msghandler.hpp +62 -0
- netgen/include/meshing/paralleltop.hpp +172 -0
- netgen/include/meshing/python_mesh.hpp +206 -0
- netgen/include/meshing/ruler2.hpp +172 -0
- netgen/include/meshing/ruler3.hpp +211 -0
- netgen/include/meshing/soldata.hpp +141 -0
- netgen/include/meshing/specials.hpp +17 -0
- netgen/include/meshing/surfacegeom.hpp +73 -0
- netgen/include/meshing/topology.hpp +1003 -0
- netgen/include/meshing/validate.hpp +21 -0
- netgen/include/meshing/visual_interface.hpp +71 -0
- netgen/include/mydefs.hpp +70 -0
- netgen/include/nginterface.h +474 -0
- netgen/include/nginterface_v2.hpp +406 -0
- netgen/include/nglib.h +697 -0
- netgen/include/nglib_occ.h +50 -0
- netgen/include/occ/occ_edge.hpp +47 -0
- netgen/include/occ/occ_face.hpp +52 -0
- netgen/include/occ/occ_solid.hpp +23 -0
- netgen/include/occ/occ_utils.hpp +376 -0
- netgen/include/occ/occ_vertex.hpp +30 -0
- netgen/include/occ/occgeom.hpp +659 -0
- netgen/include/occ/occmeshsurf.hpp +168 -0
- netgen/include/occ/vsocc.hpp +33 -0
- netgen/include/pybind11/LICENSE +29 -0
- netgen/include/pybind11/attr.h +722 -0
- netgen/include/pybind11/buffer_info.h +208 -0
- netgen/include/pybind11/cast.h +2361 -0
- netgen/include/pybind11/chrono.h +228 -0
- netgen/include/pybind11/common.h +2 -0
- netgen/include/pybind11/complex.h +74 -0
- netgen/include/pybind11/conduit/README.txt +15 -0
- netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
- netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
- netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
- netgen/include/pybind11/critical_section.h +56 -0
- netgen/include/pybind11/detail/class.h +823 -0
- netgen/include/pybind11/detail/common.h +1348 -0
- netgen/include/pybind11/detail/cpp_conduit.h +75 -0
- netgen/include/pybind11/detail/descr.h +226 -0
- netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
- netgen/include/pybind11/detail/exception_translation.h +71 -0
- netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
- netgen/include/pybind11/detail/init.h +538 -0
- netgen/include/pybind11/detail/internals.h +799 -0
- netgen/include/pybind11/detail/native_enum_data.h +209 -0
- netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
- netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
- netgen/include/pybind11/detail/type_caster_base.h +1591 -0
- netgen/include/pybind11/detail/typeid.h +65 -0
- netgen/include/pybind11/detail/using_smart_holder.h +22 -0
- netgen/include/pybind11/detail/value_and_holder.h +90 -0
- netgen/include/pybind11/eigen/common.h +9 -0
- netgen/include/pybind11/eigen/matrix.h +723 -0
- netgen/include/pybind11/eigen/tensor.h +521 -0
- netgen/include/pybind11/eigen.h +12 -0
- netgen/include/pybind11/embed.h +320 -0
- netgen/include/pybind11/eval.h +161 -0
- netgen/include/pybind11/functional.h +147 -0
- netgen/include/pybind11/gil.h +199 -0
- netgen/include/pybind11/gil_safe_call_once.h +102 -0
- netgen/include/pybind11/gil_simple.h +37 -0
- netgen/include/pybind11/iostream.h +265 -0
- netgen/include/pybind11/native_enum.h +67 -0
- netgen/include/pybind11/numpy.h +2312 -0
- netgen/include/pybind11/operators.h +202 -0
- netgen/include/pybind11/options.h +92 -0
- netgen/include/pybind11/pybind11.h +3645 -0
- netgen/include/pybind11/pytypes.h +2680 -0
- netgen/include/pybind11/stl/filesystem.h +114 -0
- netgen/include/pybind11/stl.h +666 -0
- netgen/include/pybind11/stl_bind.h +858 -0
- netgen/include/pybind11/subinterpreter.h +299 -0
- netgen/include/pybind11/trampoline_self_life_support.h +65 -0
- netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
- netgen/include/pybind11/typing.h +298 -0
- netgen/include/pybind11/warnings.h +75 -0
- netgen/include/stlgeom/meshstlsurface.hpp +67 -0
- netgen/include/stlgeom/stlgeom.hpp +491 -0
- netgen/include/stlgeom/stlline.hpp +193 -0
- netgen/include/stlgeom/stltool.hpp +331 -0
- netgen/include/stlgeom/stltopology.hpp +419 -0
- netgen/include/stlgeom/vsstl.hpp +58 -0
- netgen/include/visualization/meshdoc.hpp +42 -0
- netgen/include/visualization/mvdraw.hpp +325 -0
- netgen/include/visualization/vispar.hpp +128 -0
- netgen/include/visualization/visual.hpp +28 -0
- netgen/include/visualization/visual_api.hpp +10 -0
- netgen/include/visualization/vssolution.hpp +399 -0
- netgen/lib/libnggui.lib +0 -0
- netgen/lib/ngcore.lib +0 -0
- netgen/lib/nglib.lib +0 -0
- netgen/lib/togl.lib +0 -0
- netgen/libnggui.dll +0 -0
- netgen/libngguipy.lib +0 -0
- netgen/libngguipy.pyd +0 -0
- netgen/libngpy/_NgOCC.pyi +1545 -0
- netgen/libngpy/__init__.pyi +7 -0
- netgen/libngpy/_csg.pyi +259 -0
- netgen/libngpy/_geom2d.pyi +323 -0
- netgen/libngpy/_meshing.pyi +1111 -0
- netgen/libngpy/_stl.pyi +131 -0
- netgen/libngpy.lib +0 -0
- netgen/libngpy.pyd +0 -0
- netgen/meshing.py +65 -0
- netgen/ngcore.dll +0 -0
- netgen/nglib.dll +0 -0
- netgen/occ.py +52 -0
- netgen/read_gmsh.py +259 -0
- netgen/read_meshio.py +22 -0
- netgen/stl.py +2 -0
- netgen/togl.dll +0 -0
- netgen/version.py +2 -0
- netgen/webgui.py +529 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
- netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
- netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
- pyngcore/__init__.py +1 -0
- 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
|