warp-lang 1.9.0__py3-none-win_amd64.whl → 1.10.0rc2__py3-none-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.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/__init__.py +301 -287
- warp/__init__.pyi +2220 -313
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1497 -226
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -471
- warp/codegen.py +6 -4246
- warp/constants.py +6 -39
- warp/context.py +12 -7851
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +3 -2
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -342
- warp/jax_experimental/ffi.py +17 -853
- warp/jax_experimental/xla_ffi.py +5 -596
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +316 -39
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sort.cu +22 -13
- warp/native/sort.h +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +837 -70
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -53
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +60 -32
- warp/native/warp.cu +313 -201
- warp/native/warp.h +14 -11
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3616
- warp/render/render_usd.py +6 -918
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_hash_grid.py +38 -0
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +1382 -79
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +529 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +34 -15
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +60 -14
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +49 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_tuple.py +96 -0
- warp/tests/test_types.py +82 -9
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +239 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5750
- warp/utils.py +10 -1659
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +47 -103
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.0.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.0.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/examples/fem/utils.py
CHANGED
|
@@ -535,7 +535,7 @@ def _compute_schur_inverse_diagonal(
|
|
|
535
535
|
S = B * Ai * wp.transpose(B)
|
|
536
536
|
schur += S
|
|
537
537
|
|
|
538
|
-
P_diag[row] = fem.
|
|
538
|
+
P_diag[row] = fem.linalg.inverse_qr(schur)
|
|
539
539
|
|
|
540
540
|
|
|
541
541
|
def invert_diagonal_bsr_matrix(A: BsrMatrix):
|
|
@@ -556,7 +556,7 @@ def invert_diagonal_bsr_matrix(A: BsrMatrix):
|
|
|
556
556
|
@wp.kernel(enable_backward=False)
|
|
557
557
|
def _block_diagonal_invert(values: wp.array(dtype=Any)):
|
|
558
558
|
i = wp.tid()
|
|
559
|
-
values[i] = fem.
|
|
559
|
+
values[i] = fem.linalg.inverse_qr(values[i])
|
|
560
560
|
|
|
561
561
|
|
|
562
562
|
#
|
|
@@ -26,7 +26,7 @@ import jax
|
|
|
26
26
|
import jax.numpy as jnp
|
|
27
27
|
|
|
28
28
|
import warp as wp
|
|
29
|
-
from warp.jax_experimental
|
|
29
|
+
from warp.jax_experimental import jax_kernel
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
@wp.kernel
|
|
@@ -45,7 +45,8 @@ def sincos_kernel(angle: wp.array(dtype=float), sin_out: wp.array(dtype=float),
|
|
|
45
45
|
@wp.kernel
|
|
46
46
|
def diagonal_kernel(output: wp.array(dtype=wp.mat33)):
|
|
47
47
|
tid = wp.tid()
|
|
48
|
-
|
|
48
|
+
d = float(tid + 1)
|
|
49
|
+
output[tid] = wp.mat33(d, 0.0, 0.0, 0.0, d * 2.0, 0.0, 0.0, 0.0, d * 3.0)
|
|
49
50
|
|
|
50
51
|
|
|
51
52
|
@wp.kernel
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
#############################################################################
|
|
17
|
+
# Example Tile Monte Carlo Geometry Processing
|
|
18
|
+
#
|
|
19
|
+
# Shows how to use the built-in wp.Mesh data structure and
|
|
20
|
+
# wp.mesh_eval_position() function to implement a tile-based, grid-free
|
|
21
|
+
# Laplace solver using a Monte Carlo approach.
|
|
22
|
+
#
|
|
23
|
+
# References:
|
|
24
|
+
# Rohan Sawhney and Keenan Crane. Monte Carlo Geometry Processing:
|
|
25
|
+
# A Grid-Free Approach to PDE-Based Methods on Volumetric Domains.
|
|
26
|
+
# ACM Trans. Graph., Vol. 38, No. 4, Article 1. Published July 2020
|
|
27
|
+
#
|
|
28
|
+
##############################################################################
|
|
29
|
+
|
|
30
|
+
import os
|
|
31
|
+
|
|
32
|
+
import numpy as np
|
|
33
|
+
from pxr import Usd, UsdGeom
|
|
34
|
+
|
|
35
|
+
import warp as wp
|
|
36
|
+
import warp.examples
|
|
37
|
+
|
|
38
|
+
TILE_SIZE = wp.constant(64) # number of samples for random walk
|
|
39
|
+
STEPS = wp.constant(8)
|
|
40
|
+
SEED = wp.constant(42)
|
|
41
|
+
TOL = wp.constant(0.001)
|
|
42
|
+
|
|
43
|
+
wp.config.enable_backward = False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@wp.func
|
|
47
|
+
def update_radius(p: wp.vec3):
|
|
48
|
+
"""new radius is the distance to the closest point on the mesh"""
|
|
49
|
+
radius = 0.0
|
|
50
|
+
query = wp.mesh_query_point(MESH_ID, p, 1e6)
|
|
51
|
+
|
|
52
|
+
if query.result:
|
|
53
|
+
q = wp.mesh_eval_position(MESH_ID, query.face, query.u, query.v)
|
|
54
|
+
radius = -wp.length(q - p) * query.sign
|
|
55
|
+
|
|
56
|
+
return radius
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@wp.func
|
|
60
|
+
def get_boundary_value(p: wp.vec3):
|
|
61
|
+
"""analytic boundary condition on the surface of the mesh"""
|
|
62
|
+
return wp.abs(wp.sin(5.0 * wp.length(p)))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@wp.func
|
|
66
|
+
def walk(p: wp.vec3, rand_offset: int):
|
|
67
|
+
"""random walk on spheres"""
|
|
68
|
+
rng = wp.rand_init(SEED, rand_offset)
|
|
69
|
+
for _ in range(0, STEPS):
|
|
70
|
+
r = update_radius(p)
|
|
71
|
+
if r < 0.0: # outside the mesh
|
|
72
|
+
return 0.0
|
|
73
|
+
elif r < TOL: # within the epsilon boundary
|
|
74
|
+
return get_boundary_value(p)
|
|
75
|
+
pr = wp.sample_unit_sphere_surface(rng) * r
|
|
76
|
+
p += pr
|
|
77
|
+
return get_boundary_value(p) # closest choice if epsilon boundary not reached
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@wp.kernel
|
|
81
|
+
def sphere_walk(delta_z: float, samples: wp.array2d(dtype=wp.vec3), solutions: wp.array2d(dtype=float)):
|
|
82
|
+
i, j = wp.tid()
|
|
83
|
+
|
|
84
|
+
sample_origin = samples[i, j] + wp.vec3(0.0, 0.0, delta_z)
|
|
85
|
+
|
|
86
|
+
rand_samples = wp.tile_full(TILE_SIZE, value=sample_origin, dtype=wp.vec3)
|
|
87
|
+
|
|
88
|
+
# every random sample gets a unique offset for rng
|
|
89
|
+
rand_offsets = wp.tile_arange(TILE_SIZE, dtype=int)
|
|
90
|
+
rand_offsets += wp.tile_full(TILE_SIZE, value=(i * TILE_SIZE + j) * TILE_SIZE, dtype=int)
|
|
91
|
+
|
|
92
|
+
# mcgp
|
|
93
|
+
walk_results = wp.tile_map(walk, rand_samples, rand_offsets)
|
|
94
|
+
|
|
95
|
+
# solution is an average of all walks originating from this position
|
|
96
|
+
walk_sum = wp.tile_sum(walk_results)
|
|
97
|
+
result = walk_sum * (1.0 / wp.float32(TILE_SIZE))
|
|
98
|
+
|
|
99
|
+
wp.tile_store(solutions[i], result, offset=(j,))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class Example:
|
|
103
|
+
def __init__(self, height=256, slices=60):
|
|
104
|
+
usd_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"))
|
|
105
|
+
usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath("/root/bunny"))
|
|
106
|
+
|
|
107
|
+
self.mesh = wp.Mesh(
|
|
108
|
+
points=wp.array(usd_geom.GetPointsAttr().Get(), dtype=wp.vec3),
|
|
109
|
+
indices=wp.array(usd_geom.GetFaceVertexIndicesAttr().Get(), dtype=int),
|
|
110
|
+
bvh_leaf_size=1,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# z-slice scanning grid
|
|
114
|
+
self.height = height
|
|
115
|
+
self.width = self.height
|
|
116
|
+
|
|
117
|
+
x = np.linspace(-1.15, 0.85, self.width)
|
|
118
|
+
y = np.linspace(-0.2, 1.8, self.height)
|
|
119
|
+
xv, yv = np.meshgrid(x, y, indexing="ij")
|
|
120
|
+
zv = np.zeros_like(xv)
|
|
121
|
+
grid = np.stack((xv, yv, zv), axis=-1)
|
|
122
|
+
|
|
123
|
+
self.grid = wp.array(grid, dtype=wp.vec3)
|
|
124
|
+
self.pixels = wp.zeros((self.height, self.width), dtype=float)
|
|
125
|
+
|
|
126
|
+
self.slices = slices
|
|
127
|
+
self.z = np.linspace(-0.6, 0.8, self.slices)
|
|
128
|
+
|
|
129
|
+
# storage for animation
|
|
130
|
+
self.images = np.zeros((self.slices, self.height, self.width))
|
|
131
|
+
|
|
132
|
+
def render(self, slice):
|
|
133
|
+
wp.launch_tiled(
|
|
134
|
+
sphere_walk,
|
|
135
|
+
dim=[self.height, self.width],
|
|
136
|
+
inputs=[self.z[slice], self.grid],
|
|
137
|
+
outputs=[self.pixels],
|
|
138
|
+
block_dim=TILE_SIZE,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
self.images[slice] = self.pixels.numpy()
|
|
142
|
+
print(f"slice: {slice}")
|
|
143
|
+
|
|
144
|
+
def get_animation(self):
|
|
145
|
+
fig, ax = plt.subplots()
|
|
146
|
+
plt.axis("off")
|
|
147
|
+
plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
|
|
148
|
+
plt.margins(0, 0)
|
|
149
|
+
|
|
150
|
+
slices = []
|
|
151
|
+
for i in range(self.slices):
|
|
152
|
+
slice = ax.imshow(np.flip(self.images[i, :, :].T), animated=True)
|
|
153
|
+
slices.append([slice])
|
|
154
|
+
|
|
155
|
+
ani = animation.ArtistAnimation(fig, slices, interval=60, blit=True, repeat_delay=1000)
|
|
156
|
+
return ani
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
if __name__ == "__main__":
|
|
160
|
+
import argparse
|
|
161
|
+
|
|
162
|
+
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
163
|
+
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
164
|
+
parser.add_argument("--height", type=int, default=256, help="Height of rendered image in pixels.")
|
|
165
|
+
parser.add_argument("--slices", type=int, default=60, help="Number of planar z-slices to scan.")
|
|
166
|
+
parser.add_argument(
|
|
167
|
+
"--headless",
|
|
168
|
+
action="store_true",
|
|
169
|
+
help="Run in headless mode, suppressing the opening of any graphical windows.",
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
args = parser.parse_known_args()[0]
|
|
173
|
+
|
|
174
|
+
with wp.ScopedDevice(args.device):
|
|
175
|
+
example = Example(height=args.height, slices=args.slices)
|
|
176
|
+
|
|
177
|
+
# todo: permit runtime constants to be passed to tile map functions
|
|
178
|
+
MESH_ID = wp.constant(wp.uint64(example.mesh.id))
|
|
179
|
+
|
|
180
|
+
for i in range(args.slices):
|
|
181
|
+
example.render(i)
|
|
182
|
+
|
|
183
|
+
if not args.headless:
|
|
184
|
+
import matplotlib.animation as animation
|
|
185
|
+
import matplotlib.pyplot as plt
|
|
186
|
+
|
|
187
|
+
print("Creating the animation")
|
|
188
|
+
anim = example.get_animation()
|
|
189
|
+
anim_filename = "example_tile_mcgp_animation.gif"
|
|
190
|
+
anim.save(anim_filename, dpi=300, writer=animation.PillowWriter(fps=5))
|
|
191
|
+
print(f"Saved the animation at `{anim_filename}`")
|
warp/fabric.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c)
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -13,343 +13,12 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
import math
|
|
18
|
-
from typing import Any
|
|
16
|
+
# TODO: Remove after cleaning up the public API.
|
|
19
17
|
|
|
20
|
-
import
|
|
21
|
-
from warp.types import *
|
|
18
|
+
from warp._src import fabric as _fabric
|
|
22
19
|
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
("index_start", ctypes.c_size_t),
|
|
27
|
-
("index_end", ctypes.c_size_t),
|
|
28
|
-
("ptr", ctypes.c_void_p),
|
|
29
|
-
("lengths", ctypes.c_void_p),
|
|
30
|
-
)
|
|
21
|
+
def __getattr__(name):
|
|
22
|
+
from warp._src.utils import get_deprecated_api
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
self.index_start = index_start
|
|
34
|
-
self.index_end = index_end
|
|
35
|
-
self.ptr = ctypes.c_void_p(ptr)
|
|
36
|
-
self.lengths = ctypes.c_void_p(lengths)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class fabricarray_t(ctypes.Structure):
|
|
40
|
-
_fields_ = (
|
|
41
|
-
("buckets", ctypes.c_void_p), # array of fabricbucket_t on the correct device
|
|
42
|
-
("nbuckets", ctypes.c_size_t),
|
|
43
|
-
("size", ctypes.c_size_t),
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
def __init__(self, buckets=None, nbuckets=0, size=0):
|
|
47
|
-
self.buckets = ctypes.c_void_p(buckets)
|
|
48
|
-
self.nbuckets = nbuckets
|
|
49
|
-
self.size = size
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class indexedfabricarray_t(ctypes.Structure):
|
|
53
|
-
_fields_ = (
|
|
54
|
-
("fa", fabricarray_t),
|
|
55
|
-
("indices", ctypes.c_void_p),
|
|
56
|
-
("size", ctypes.c_size_t),
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
def __init__(self, fa=None, indices=None):
|
|
60
|
-
if fa is None:
|
|
61
|
-
self.fa = fabricarray_t()
|
|
62
|
-
else:
|
|
63
|
-
self.fa = fa.__ctype__()
|
|
64
|
-
|
|
65
|
-
if indices is None:
|
|
66
|
-
self.indices = ctypes.c_void_p(None)
|
|
67
|
-
self.size = 0
|
|
68
|
-
else:
|
|
69
|
-
self.indices = ctypes.c_void_p(indices.ptr)
|
|
70
|
-
self.size = indices.size
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def fabric_to_warp_dtype(type_info, attrib_name):
|
|
74
|
-
if not type_info[0]:
|
|
75
|
-
raise RuntimeError(f"Attribute '{attrib_name}' cannot be used in Warp")
|
|
76
|
-
|
|
77
|
-
base_type_dict = {
|
|
78
|
-
"b": warp.bool, # boolean
|
|
79
|
-
"i1": warp.int8,
|
|
80
|
-
"i2": warp.int16,
|
|
81
|
-
"i4": warp.int32,
|
|
82
|
-
"i8": warp.int64,
|
|
83
|
-
"u1": warp.uint8,
|
|
84
|
-
"u2": warp.uint16,
|
|
85
|
-
"u4": warp.uint32,
|
|
86
|
-
"u8": warp.uint64,
|
|
87
|
-
"f2": warp.float16,
|
|
88
|
-
"f4": warp.float32,
|
|
89
|
-
"f8": warp.float64,
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
base_dtype = base_type_dict.get(type_info[1])
|
|
93
|
-
if base_dtype is None:
|
|
94
|
-
raise RuntimeError(f"Attribute '{attrib_name}' base data type '{type_info[1]}' is not supported in Warp")
|
|
95
|
-
|
|
96
|
-
elem_count = type_info[2]
|
|
97
|
-
role = type_info[4]
|
|
98
|
-
|
|
99
|
-
if role in ("text", "path"):
|
|
100
|
-
raise RuntimeError(f"Attribute '{attrib_name}' role '{role}' is not supported in Warp")
|
|
101
|
-
|
|
102
|
-
if elem_count > 1:
|
|
103
|
-
# vector or matrix type
|
|
104
|
-
if role == "quat" and elem_count == 4:
|
|
105
|
-
return quaternion(base_dtype)
|
|
106
|
-
elif role in ("matrix", "transform", "frame"):
|
|
107
|
-
# only square matrices are currently supported
|
|
108
|
-
mat_size = int(math.sqrt(elem_count))
|
|
109
|
-
assert mat_size * mat_size == elem_count
|
|
110
|
-
return matrix((mat_size, mat_size), base_dtype)
|
|
111
|
-
else:
|
|
112
|
-
return vector(elem_count, base_dtype)
|
|
113
|
-
else:
|
|
114
|
-
# scalar type
|
|
115
|
-
return base_dtype
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
class fabricarray(noncontiguous_array_base[T]):
|
|
119
|
-
# member attributes available during code-gen (e.g.: d = arr.shape[0])
|
|
120
|
-
# (initialized when needed)
|
|
121
|
-
_vars = None
|
|
122
|
-
|
|
123
|
-
def __new__(cls, *args, **kwargs):
|
|
124
|
-
instance = super().__new__(cls)
|
|
125
|
-
instance.deleter = None
|
|
126
|
-
return instance
|
|
127
|
-
|
|
128
|
-
def __init__(self, data=None, attrib=None, dtype=Any, ndim=None):
|
|
129
|
-
super().__init__(ARRAY_TYPE_FABRIC)
|
|
130
|
-
|
|
131
|
-
if data is not None:
|
|
132
|
-
from .context import runtime
|
|
133
|
-
|
|
134
|
-
# ensure the attribute name was also specified
|
|
135
|
-
if not isinstance(attrib, str):
|
|
136
|
-
raise ValueError(f"Invalid attribute name: {attrib}")
|
|
137
|
-
|
|
138
|
-
# get the fabric interface dictionary
|
|
139
|
-
if isinstance(data, dict):
|
|
140
|
-
iface = data
|
|
141
|
-
elif hasattr(data, "__fabric_arrays_interface__"):
|
|
142
|
-
iface = data.__fabric_arrays_interface__
|
|
143
|
-
else:
|
|
144
|
-
raise ValueError(
|
|
145
|
-
"Invalid data argument for fabricarray: expected dict or object with __fabric_arrays_interface__"
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
version = iface.get("version")
|
|
149
|
-
if version != 1:
|
|
150
|
-
raise ValueError(f"Unsupported Fabric interface version: {version}")
|
|
151
|
-
|
|
152
|
-
device = iface.get("device")
|
|
153
|
-
if not isinstance(device, str):
|
|
154
|
-
raise ValueError(f"Invalid Fabric interface device: {device}")
|
|
155
|
-
|
|
156
|
-
self.device = runtime.get_device(device)
|
|
157
|
-
|
|
158
|
-
attribs = iface.get("attribs")
|
|
159
|
-
if not isinstance(attribs, dict):
|
|
160
|
-
raise ValueError("Failed to get Fabric interface attributes")
|
|
161
|
-
|
|
162
|
-
# look up attribute info by name
|
|
163
|
-
attrib_info = attribs.get(attrib)
|
|
164
|
-
if not isinstance(attrib_info, dict):
|
|
165
|
-
raise ValueError(f"Failed to get attribute '{attrib}'")
|
|
166
|
-
|
|
167
|
-
type_info = attrib_info["type"]
|
|
168
|
-
assert len(type_info) == 5
|
|
169
|
-
|
|
170
|
-
self.dtype = fabric_to_warp_dtype(type_info, attrib)
|
|
171
|
-
|
|
172
|
-
self.access = attrib_info["access"]
|
|
173
|
-
|
|
174
|
-
pointers = attrib_info["pointers"]
|
|
175
|
-
counts = attrib_info["counts"]
|
|
176
|
-
|
|
177
|
-
if not (hasattr(pointers, "__len__") and hasattr(counts, "__len__") and len(pointers) == len(counts)):
|
|
178
|
-
raise RuntimeError("Attribute pointers and counts must be lists of the same size")
|
|
179
|
-
|
|
180
|
-
# check whether it's an array
|
|
181
|
-
array_depth = type_info[3]
|
|
182
|
-
if array_depth == 0:
|
|
183
|
-
self.ndim = 1
|
|
184
|
-
array_lengths = None
|
|
185
|
-
elif array_depth == 1:
|
|
186
|
-
self.ndim = 2
|
|
187
|
-
array_lengths = attrib_info["array_lengths"]
|
|
188
|
-
if not hasattr(array_lengths, "__len__") or len(array_lengths) != len(pointers):
|
|
189
|
-
raise RuntimeError(
|
|
190
|
-
"Attribute `array_lengths` must be a list of the same size as `pointers` and `counts`"
|
|
191
|
-
)
|
|
192
|
-
else:
|
|
193
|
-
raise ValueError(f"Invalid attribute array depth: {array_depth}")
|
|
194
|
-
|
|
195
|
-
num_buckets = len(pointers)
|
|
196
|
-
size = 0
|
|
197
|
-
buckets = (fabricbucket_t * num_buckets)()
|
|
198
|
-
|
|
199
|
-
if num_buckets > 0:
|
|
200
|
-
for i in range(num_buckets):
|
|
201
|
-
buckets[i].index_start = size
|
|
202
|
-
buckets[i].index_end = size + counts[i]
|
|
203
|
-
buckets[i].ptr = pointers[i]
|
|
204
|
-
if array_lengths:
|
|
205
|
-
buckets[i].lengths = array_lengths[i]
|
|
206
|
-
size += counts[i]
|
|
207
|
-
|
|
208
|
-
if self.device.is_cuda:
|
|
209
|
-
# copy bucket info to device
|
|
210
|
-
buckets_size = ctypes.sizeof(buckets)
|
|
211
|
-
allocator = self.device.get_allocator()
|
|
212
|
-
buckets_ptr = allocator.alloc(buckets_size)
|
|
213
|
-
cuda_stream = self.device.stream.cuda_stream
|
|
214
|
-
runtime.core.wp_memcpy_h2d(
|
|
215
|
-
self.device.context, buckets_ptr, ctypes.addressof(buckets), buckets_size, cuda_stream
|
|
216
|
-
)
|
|
217
|
-
self.deleter = allocator.deleter
|
|
218
|
-
else:
|
|
219
|
-
buckets_ptr = ctypes.addressof(buckets)
|
|
220
|
-
else:
|
|
221
|
-
buckets_ptr = None
|
|
222
|
-
|
|
223
|
-
self.buckets = buckets
|
|
224
|
-
self.size = size
|
|
225
|
-
self.shape = (size,)
|
|
226
|
-
|
|
227
|
-
self.ctype = fabricarray_t(buckets_ptr, num_buckets, size)
|
|
228
|
-
|
|
229
|
-
else:
|
|
230
|
-
# empty array or type annotation
|
|
231
|
-
self.dtype = dtype
|
|
232
|
-
self.ndim = ndim or 1
|
|
233
|
-
self.device = None
|
|
234
|
-
self.access = None
|
|
235
|
-
self.buckets = None
|
|
236
|
-
self.size = 0
|
|
237
|
-
self.shape = (0,)
|
|
238
|
-
self.ctype = fabricarray_t()
|
|
239
|
-
|
|
240
|
-
def __del__(self):
|
|
241
|
-
# release the bucket info if needed
|
|
242
|
-
if self.deleter is None:
|
|
243
|
-
return
|
|
244
|
-
|
|
245
|
-
buckets_size = ctypes.sizeof(self.buckets)
|
|
246
|
-
with self.device.context_guard:
|
|
247
|
-
self.deleter(self.ctype.buckets, buckets_size)
|
|
248
|
-
|
|
249
|
-
def __ctype__(self):
|
|
250
|
-
return self.ctype
|
|
251
|
-
|
|
252
|
-
def __len__(self):
|
|
253
|
-
return self.size
|
|
254
|
-
|
|
255
|
-
def __str__(self):
|
|
256
|
-
if self.device is None:
|
|
257
|
-
# type annotation
|
|
258
|
-
return f"fabricarray{self.dtype}"
|
|
259
|
-
else:
|
|
260
|
-
return str(self.numpy())
|
|
261
|
-
|
|
262
|
-
def __getitem__(self, key):
|
|
263
|
-
if isinstance(key, array):
|
|
264
|
-
return indexedfabricarray(fa=self, indices=key)
|
|
265
|
-
else:
|
|
266
|
-
raise ValueError(f"Fabric arrays only support indexing using index arrays, got key of type {type(key)}")
|
|
267
|
-
|
|
268
|
-
@property
|
|
269
|
-
def vars(self):
|
|
270
|
-
# member attributes available during code-gen (e.g.: d = arr.shape[0])
|
|
271
|
-
# Note: we use a shared dict for all fabricarray instances
|
|
272
|
-
if fabricarray._vars is None:
|
|
273
|
-
fabricarray._vars = {"size": warp.codegen.Var("size", uint64)}
|
|
274
|
-
return fabricarray._vars
|
|
275
|
-
|
|
276
|
-
def fill_(self, value):
|
|
277
|
-
# TODO?
|
|
278
|
-
# filling Fabric arrays of arrays is not supported, because they are jagged arrays of arbitrary lengths
|
|
279
|
-
if self.ndim > 1:
|
|
280
|
-
raise RuntimeError("Filling Fabric arrays of arrays is not supported")
|
|
281
|
-
|
|
282
|
-
super().fill_(value)
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
# special case for fabric array of arrays
|
|
286
|
-
# equivalent to calling fabricarray(..., ndim=2)
|
|
287
|
-
def fabricarrayarray(**kwargs):
|
|
288
|
-
kwargs["ndim"] = 2
|
|
289
|
-
return fabricarray(**kwargs)
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
class indexedfabricarray(noncontiguous_array_base[T]):
|
|
293
|
-
# member attributes available during code-gen (e.g.: d = arr.shape[0])
|
|
294
|
-
# (initialized when needed)
|
|
295
|
-
_vars = None
|
|
296
|
-
|
|
297
|
-
def __init__(self, fa=None, indices=None, dtype=None, ndim=None):
|
|
298
|
-
super().__init__(ARRAY_TYPE_FABRIC_INDEXED)
|
|
299
|
-
|
|
300
|
-
if fa is not None:
|
|
301
|
-
check_index_array(indices, fa.device)
|
|
302
|
-
self.fa = fa
|
|
303
|
-
self.indices = indices
|
|
304
|
-
self.dtype = fa.dtype
|
|
305
|
-
self.ndim = fa.ndim
|
|
306
|
-
self.device = fa.device
|
|
307
|
-
self.size = indices.size
|
|
308
|
-
self.shape = (indices.size,)
|
|
309
|
-
self.ctype = indexedfabricarray_t(fa, indices)
|
|
310
|
-
else:
|
|
311
|
-
# allow empty indexedarrays in type annotations
|
|
312
|
-
self.fa = None
|
|
313
|
-
self.indices = None
|
|
314
|
-
self.dtype = dtype
|
|
315
|
-
self.ndim = ndim or 1
|
|
316
|
-
self.device = None
|
|
317
|
-
self.size = 0
|
|
318
|
-
self.shape = (0,)
|
|
319
|
-
self.ctype = indexedfabricarray_t()
|
|
320
|
-
|
|
321
|
-
def __ctype__(self):
|
|
322
|
-
return self.ctype
|
|
323
|
-
|
|
324
|
-
def __len__(self):
|
|
325
|
-
return self.size
|
|
326
|
-
|
|
327
|
-
def __str__(self):
|
|
328
|
-
if self.device is None:
|
|
329
|
-
# type annotation
|
|
330
|
-
return f"indexedfabricarray{self.dtype}"
|
|
331
|
-
else:
|
|
332
|
-
return str(self.numpy())
|
|
333
|
-
|
|
334
|
-
@property
|
|
335
|
-
def vars(self):
|
|
336
|
-
# member attributes available during code-gen (e.g.: d = arr.shape[0])
|
|
337
|
-
# Note: we use a shared dict for all indexedfabricarray instances
|
|
338
|
-
if indexedfabricarray._vars is None:
|
|
339
|
-
indexedfabricarray._vars = {"size": warp.codegen.Var("size", uint64)}
|
|
340
|
-
return indexedfabricarray._vars
|
|
341
|
-
|
|
342
|
-
def fill_(self, value):
|
|
343
|
-
# TODO?
|
|
344
|
-
# filling Fabric arrays of arrays is not supported, because they are jagged arrays of arbitrary lengths
|
|
345
|
-
if self.ndim > 1:
|
|
346
|
-
raise RuntimeError("Filling indexed Fabric arrays of arrays is not supported")
|
|
347
|
-
|
|
348
|
-
super().fill_(value)
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
# special case for indexed fabric array of arrays
|
|
352
|
-
# equivalent to calling fabricarray(..., ndim=2)
|
|
353
|
-
def indexedfabricarrayarray(**kwargs):
|
|
354
|
-
kwargs["ndim"] = 2
|
|
355
|
-
return indexedfabricarray(**kwargs)
|
|
24
|
+
return get_deprecated_api(_fabric, "wp", name)
|