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/sim/graph_coloring.py
DELETED
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2024 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
|
-
from enum import Enum
|
|
17
|
-
|
|
18
|
-
import numpy as np
|
|
19
|
-
|
|
20
|
-
import warp as wp
|
|
21
|
-
import warp.utils
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class ColoringAlgorithm(Enum):
|
|
25
|
-
MCS = 0
|
|
26
|
-
GREEDY = 1
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@wp.kernel
|
|
30
|
-
def construct_trimesh_graph_edges_kernel(
|
|
31
|
-
trimesh_edge_indices: wp.array(dtype=int, ndim=2),
|
|
32
|
-
add_bending: bool,
|
|
33
|
-
graph_edge_indices: wp.array(dtype=int, ndim=2),
|
|
34
|
-
graph_num_edges: wp.array(dtype=int),
|
|
35
|
-
):
|
|
36
|
-
num_diagonal_edges = wp.int32(0)
|
|
37
|
-
num_non_diagonal_edges = trimesh_edge_indices.shape[0]
|
|
38
|
-
for e_idx in range(trimesh_edge_indices.shape[0]):
|
|
39
|
-
v1 = trimesh_edge_indices[e_idx, 2]
|
|
40
|
-
v2 = trimesh_edge_indices[e_idx, 3]
|
|
41
|
-
|
|
42
|
-
graph_edge_indices[e_idx, 0] = v1
|
|
43
|
-
graph_edge_indices[e_idx, 1] = v2
|
|
44
|
-
|
|
45
|
-
o1 = trimesh_edge_indices[e_idx, 0]
|
|
46
|
-
o2 = trimesh_edge_indices[e_idx, 1]
|
|
47
|
-
|
|
48
|
-
if o1 != -1 and o2 != -1 and add_bending:
|
|
49
|
-
graph_edge_indices[num_non_diagonal_edges + num_diagonal_edges, 0] = o1
|
|
50
|
-
graph_edge_indices[num_non_diagonal_edges + num_diagonal_edges, 1] = o2
|
|
51
|
-
|
|
52
|
-
num_diagonal_edges = num_diagonal_edges + 1
|
|
53
|
-
|
|
54
|
-
graph_num_edges[0] = num_diagonal_edges + num_non_diagonal_edges
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@wp.kernel
|
|
58
|
-
def validate_graph_coloring(edge_indices: wp.array(dtype=int, ndim=2), colors: wp.array(dtype=int)):
|
|
59
|
-
edge_idx = wp.tid()
|
|
60
|
-
e_v_1 = edge_indices[edge_idx, 0]
|
|
61
|
-
e_v_2 = edge_indices[edge_idx, 1]
|
|
62
|
-
|
|
63
|
-
wp.expect_neq(colors[e_v_1], colors[e_v_2])
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@wp.kernel
|
|
67
|
-
def count_color_group_size(
|
|
68
|
-
colors: wp.array(dtype=int),
|
|
69
|
-
group_sizes: wp.array(dtype=int),
|
|
70
|
-
):
|
|
71
|
-
for particle_idx in range(colors.shape[0]):
|
|
72
|
-
particle_color = colors[particle_idx]
|
|
73
|
-
group_sizes[particle_color] = group_sizes[particle_color] + 1
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
@wp.kernel
|
|
77
|
-
def fill_color_groups(
|
|
78
|
-
colors: wp.array(dtype=int),
|
|
79
|
-
group_fill_count: wp.array(dtype=int),
|
|
80
|
-
group_offsets: wp.array(dtype=int),
|
|
81
|
-
# flattened color groups
|
|
82
|
-
color_groups_flatten: wp.array(dtype=int),
|
|
83
|
-
):
|
|
84
|
-
for particle_idx in range(colors.shape[0]):
|
|
85
|
-
particle_color = colors[particle_idx]
|
|
86
|
-
group_offset = group_offsets[particle_color]
|
|
87
|
-
group_idx = group_fill_count[particle_color]
|
|
88
|
-
color_groups_flatten[group_idx + group_offset] = wp.int32(particle_idx)
|
|
89
|
-
|
|
90
|
-
group_fill_count[particle_color] = group_idx + 1
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def convert_to_color_groups(num_colors, particle_colors, return_wp_array=False, device="cpu"):
|
|
94
|
-
group_sizes = wp.zeros(shape=(num_colors,), dtype=int, device="cpu")
|
|
95
|
-
wp.launch(kernel=count_color_group_size, inputs=[particle_colors, group_sizes], device="cpu", dim=1)
|
|
96
|
-
|
|
97
|
-
group_sizes_np = group_sizes.numpy()
|
|
98
|
-
group_offsets_np = np.concatenate([np.array([0]), np.cumsum(group_sizes_np)])
|
|
99
|
-
group_offsets = wp.array(group_offsets_np, dtype=int, device="cpu")
|
|
100
|
-
|
|
101
|
-
group_fill_count = wp.zeros(shape=(num_colors,), dtype=int, device="cpu")
|
|
102
|
-
color_groups_flatten = wp.empty(shape=(group_sizes_np.sum(),), dtype=int, device="cpu")
|
|
103
|
-
wp.launch(
|
|
104
|
-
kernel=fill_color_groups,
|
|
105
|
-
inputs=[particle_colors, group_fill_count, group_offsets, color_groups_flatten],
|
|
106
|
-
device="cpu",
|
|
107
|
-
dim=1,
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
color_groups_flatten_np = color_groups_flatten.numpy()
|
|
111
|
-
|
|
112
|
-
color_groups = []
|
|
113
|
-
if return_wp_array:
|
|
114
|
-
for color_idx in range(num_colors):
|
|
115
|
-
color_groups.append(
|
|
116
|
-
wp.array(
|
|
117
|
-
color_groups_flatten_np[group_offsets_np[color_idx] : group_offsets_np[color_idx + 1]],
|
|
118
|
-
dtype=int,
|
|
119
|
-
device=device,
|
|
120
|
-
)
|
|
121
|
-
)
|
|
122
|
-
else:
|
|
123
|
-
for color_idx in range(num_colors):
|
|
124
|
-
color_groups.append(color_groups_flatten_np[group_offsets_np[color_idx] : group_offsets_np[color_idx + 1]])
|
|
125
|
-
|
|
126
|
-
return color_groups
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def construct_trimesh_graph_edges(trimesh_edge_indices, return_wp_array=False):
|
|
130
|
-
if isinstance(trimesh_edge_indices, np.ndarray):
|
|
131
|
-
trimesh_edge_indices = wp.array(trimesh_edge_indices, dtype=int, device="cpu")
|
|
132
|
-
|
|
133
|
-
# preallocate maximum amount of memory, which is model.edge_count * 2
|
|
134
|
-
graph_edge_indices = wp.empty(shape=(trimesh_edge_indices.shape[0] * 2, 2), dtype=int, device="cpu")
|
|
135
|
-
graph_num_edges = wp.zeros(shape=(1,), dtype=int, device="cpu")
|
|
136
|
-
|
|
137
|
-
wp.launch(
|
|
138
|
-
kernel=construct_trimesh_graph_edges_kernel,
|
|
139
|
-
inputs=[
|
|
140
|
-
trimesh_edge_indices.to("cpu"),
|
|
141
|
-
True,
|
|
142
|
-
],
|
|
143
|
-
outputs=[graph_edge_indices, graph_num_edges],
|
|
144
|
-
dim=1,
|
|
145
|
-
device="cpu",
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
num_edges = graph_num_edges.numpy()[0]
|
|
149
|
-
graph_edge_indices_true_size = graph_edge_indices.numpy()[:num_edges, :]
|
|
150
|
-
|
|
151
|
-
if return_wp_array:
|
|
152
|
-
graph_edge_indices_true_size = wp.array(graph_edge_indices_true_size, dtype=int, device="cpu")
|
|
153
|
-
|
|
154
|
-
return graph_edge_indices_true_size
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def color_trimesh(
|
|
158
|
-
num_nodes,
|
|
159
|
-
trimesh_edge_indices,
|
|
160
|
-
include_bending_energy,
|
|
161
|
-
balance_colors=True,
|
|
162
|
-
target_max_min_color_ratio=1.1,
|
|
163
|
-
algorithm: ColoringAlgorithm = ColoringAlgorithm.MCS,
|
|
164
|
-
):
|
|
165
|
-
"""
|
|
166
|
-
A function that generates vertex coloring for a trimesh, which is represented by the number of vertices and edges of the mesh.
|
|
167
|
-
It will convert the trimesh to a graph and then apply coloring.
|
|
168
|
-
It returns a list of `np.array` with `dtype`=`int`. The length of the list is the number of colors
|
|
169
|
-
and each `np.array` contains the indices of vertices with this color.
|
|
170
|
-
|
|
171
|
-
Args:
|
|
172
|
-
num_nodes: The number of the nodes in the graph
|
|
173
|
-
trimesh_edge_indices: A `wp.array` with of shape (number_edges, 4), each row is (o1, o2, v1, v2), see `sim.Model`'s definition of `edge_indices`.
|
|
174
|
-
include_bending_energy: whether to consider bending energy in the coloring process. If set to `True`, the generated
|
|
175
|
-
graph will contain all the edges connecting o1 and o2; otherwise, the graph will be equivalent to the trimesh.
|
|
176
|
-
balance_colors: the parameter passed to `color_graph`, see `color_graph`'s document
|
|
177
|
-
target_max_min_color_ratio: the parameter passed to `color_graph`, see `color_graph`'s document
|
|
178
|
-
algorithm: the parameter passed to `color_graph`, see `color_graph`'s document
|
|
179
|
-
|
|
180
|
-
"""
|
|
181
|
-
if num_nodes == 0:
|
|
182
|
-
return []
|
|
183
|
-
|
|
184
|
-
if trimesh_edge_indices.shape[0] == 0:
|
|
185
|
-
# no edge, all the particle can have same color
|
|
186
|
-
return [np.arange(0, num_nodes, dtype=int)]
|
|
187
|
-
|
|
188
|
-
if include_bending_energy:
|
|
189
|
-
graph_edge_indices = construct_trimesh_graph_edges(trimesh_edge_indices, return_wp_array=True)
|
|
190
|
-
else:
|
|
191
|
-
graph_edge_indices = wp.array(trimesh_edge_indices[:, 2:], dtype=int, device="cpu")
|
|
192
|
-
|
|
193
|
-
color_groups = color_graph(num_nodes, graph_edge_indices, balance_colors, target_max_min_color_ratio, algorithm)
|
|
194
|
-
return color_groups
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def color_graph(
|
|
198
|
-
num_nodes,
|
|
199
|
-
graph_edge_indices,
|
|
200
|
-
balance_colors=True,
|
|
201
|
-
target_max_min_color_ratio=1.1,
|
|
202
|
-
algorithm: ColoringAlgorithm = ColoringAlgorithm.MCS,
|
|
203
|
-
):
|
|
204
|
-
"""
|
|
205
|
-
A function that generates coloring for a graph, which is represented by the number of nodes and an array of edges.
|
|
206
|
-
It returns a list of `np.array` with `dtype`=`int`. The length of the list is the number of colors
|
|
207
|
-
and each `np.array` contains the indices of vertices with this color.
|
|
208
|
-
|
|
209
|
-
Args:
|
|
210
|
-
num_nodes: The number of the nodes in the graph
|
|
211
|
-
graph_edge_indices: A `wp.array` with of shape (number_edges, 2)
|
|
212
|
-
balance_colors: Whether to apply the color balancing algorithm to balance the size of each color
|
|
213
|
-
target_max_min_color_ratio: the color balancing algorithm will stop when the ratio between the largest color and
|
|
214
|
-
the smallest color reaches this value
|
|
215
|
-
algorithm: Value should an enum type of ColoringAlgorithm, otherwise it will raise an error. ColoringAlgorithm.mcs means using the MCS coloring algorithm,
|
|
216
|
-
while ColoringAlgorithm.ordered_greedy means using the degree-ordered greedy algorithm. The MCS algorithm typically generates 30% to 50% fewer colors
|
|
217
|
-
compared to the ordered greedy algorithm, while maintaining the same linear complexity. Although MCS has a constant overhead that makes it about twice
|
|
218
|
-
as slow as the greedy algorithm, it produces significantly better coloring results. We recommend using MCS, especially if coloring is only part of the
|
|
219
|
-
preprocessing stage.e.
|
|
220
|
-
|
|
221
|
-
Note:
|
|
222
|
-
|
|
223
|
-
References to the coloring algorithm:
|
|
224
|
-
MCS: Pereira, F. M. Q., & Palsberg, J. (2005, November). Register allocation via coloring of chordal graphs. In Asian Symposium on Programming Languages and Systems (pp. 315-329). Berlin, Heidelberg: Springer Berlin Heidelberg.
|
|
225
|
-
Ordered Greedy: Ton-That, Q. M., Kry, P. G., & Andrews, S. (2023). Parallel block Neo-Hookean XPBD using graph clustering. Computers & Graphics, 110, 1-10.
|
|
226
|
-
"""
|
|
227
|
-
if num_nodes == 0:
|
|
228
|
-
return []
|
|
229
|
-
|
|
230
|
-
particle_colors = wp.empty(shape=(num_nodes), dtype=wp.int32, device="cpu")
|
|
231
|
-
|
|
232
|
-
if graph_edge_indices.ndim != 2:
|
|
233
|
-
raise ValueError(
|
|
234
|
-
f"graph_edge_indices must be a 2 dimensional array! The provided one is {graph_edge_indices.ndim} dimensional."
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
num_colors = wp.context.runtime.core.wp_graph_coloring(
|
|
238
|
-
num_nodes,
|
|
239
|
-
graph_edge_indices.__ctype__(),
|
|
240
|
-
algorithm.value,
|
|
241
|
-
particle_colors.__ctype__(),
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
if balance_colors:
|
|
245
|
-
max_min_ratio = wp.context.runtime.core.wp_balance_coloring(
|
|
246
|
-
num_nodes,
|
|
247
|
-
graph_edge_indices.__ctype__(),
|
|
248
|
-
num_colors,
|
|
249
|
-
target_max_min_color_ratio,
|
|
250
|
-
particle_colors.__ctype__(),
|
|
251
|
-
)
|
|
252
|
-
|
|
253
|
-
if max_min_ratio > target_max_min_color_ratio:
|
|
254
|
-
wp.utils.warn(
|
|
255
|
-
f"The graph is not optimizable anymore, terminated with a max/min ratio: {max_min_ratio} without reaching the target ratio: {target_max_min_color_ratio}"
|
|
256
|
-
)
|
|
257
|
-
|
|
258
|
-
color_groups = convert_to_color_groups(num_colors, particle_colors, return_wp_array=False)
|
|
259
|
-
|
|
260
|
-
return color_groups
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
def combine_independent_particle_coloring(color_groups_1, color_groups_2):
|
|
264
|
-
"""
|
|
265
|
-
A function that combines 2 independent coloring groups. Note that color_groups_1 and color_groups_2 must be from 2 independent
|
|
266
|
-
graphs so that there is no connection between them. This algorithm will sort color_groups_1 in ascending order and
|
|
267
|
-
sort color_groups_2 in descending order, and combine each group with the same index, this way we are always combining
|
|
268
|
-
the smaller group with the larger group.
|
|
269
|
-
|
|
270
|
-
Args:
|
|
271
|
-
color_groups_1: A list of `np.array` with `dtype`=`int`. The length of the list is the number of colors
|
|
272
|
-
and each `np.array` contains the indices of vertices with this color.
|
|
273
|
-
color_groups_2: A list of `np.array` with `dtype`=`int`. The length of the list is the number of colors
|
|
274
|
-
and each `np.array` contains the indices of vertices with this color.
|
|
275
|
-
|
|
276
|
-
"""
|
|
277
|
-
if len(color_groups_1) == 0:
|
|
278
|
-
return color_groups_2
|
|
279
|
-
if len(color_groups_2) == 0:
|
|
280
|
-
return color_groups_1
|
|
281
|
-
|
|
282
|
-
num_colors_after_combining = max(len(color_groups_1), len(color_groups_2))
|
|
283
|
-
color_groups_combined = []
|
|
284
|
-
|
|
285
|
-
# this made sure that the leftover groups are always the largest
|
|
286
|
-
if len(color_groups_1) < len(color_groups_2):
|
|
287
|
-
color_groups_1, color_groups_2 = color_groups_2, color_groups_1
|
|
288
|
-
|
|
289
|
-
# sort group 1 in ascending order
|
|
290
|
-
color_groups_1_sorted = sorted(color_groups_1, key=lambda group: len(group))
|
|
291
|
-
# sort group 1 in descending order
|
|
292
|
-
color_groups_2_sorted = sorted(color_groups_2, key=lambda group: -len(group))
|
|
293
|
-
# so that we are combining the smaller group with the larger group
|
|
294
|
-
# which will balance the load of each group
|
|
295
|
-
|
|
296
|
-
for i in range(num_colors_after_combining):
|
|
297
|
-
group_1 = color_groups_1_sorted[i] if i < len(color_groups_1) else None
|
|
298
|
-
group_2 = color_groups_2_sorted[i] if i < len(color_groups_2) else None
|
|
299
|
-
|
|
300
|
-
if group_1 is not None and group_2 is not None:
|
|
301
|
-
color_groups_combined.append(np.concatenate([group_1, group_2]))
|
|
302
|
-
elif group_1 is not None:
|
|
303
|
-
color_groups_combined.append(group_1)
|
|
304
|
-
else:
|
|
305
|
-
color_groups_combined.append(group_2)
|
|
306
|
-
|
|
307
|
-
return color_groups_combined
|