warp-lang 1.4.1__py3-none-manylinux2014_aarch64.whl → 1.5.0__py3-none-manylinux2014_aarch64.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 +4 -0
- warp/autograd.py +43 -8
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +21 -2
- warp/build_dll.py +23 -6
- warp/builtins.py +1920 -111
- warp/codegen.py +186 -62
- warp/config.py +2 -2
- warp/context.py +322 -73
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/benchmarks/benchmark_cloth_paddle.py +86 -0
- warp/examples/benchmarks/benchmark_gemm.py +121 -0
- warp/examples/benchmarks/benchmark_interop_paddle.py +158 -0
- warp/examples/benchmarks/benchmark_tile.py +179 -0
- warp/examples/core/example_dem.py +2 -1
- warp/examples/core/example_mesh_intersect.py +3 -3
- warp/examples/fem/example_adaptive_grid.py +37 -10
- warp/examples/fem/example_apic_fluid.py +3 -2
- warp/examples/fem/example_convection_diffusion_dg.py +4 -5
- warp/examples/fem/example_deformed_geometry.py +1 -1
- warp/examples/fem/example_diffusion_3d.py +47 -4
- warp/examples/fem/example_distortion_energy.py +220 -0
- warp/examples/fem/example_magnetostatics.py +127 -85
- warp/examples/fem/example_nonconforming_contact.py +5 -5
- warp/examples/fem/example_stokes.py +3 -1
- warp/examples/fem/example_streamlines.py +12 -19
- warp/examples/fem/utils.py +38 -15
- warp/examples/optim/example_walker.py +2 -2
- warp/examples/sim/example_cloth.py +2 -25
- warp/examples/sim/example_jacobian_ik.py +6 -2
- warp/examples/sim/example_quadruped.py +2 -1
- warp/examples/tile/example_tile_convolution.py +58 -0
- warp/examples/tile/example_tile_fft.py +47 -0
- warp/examples/tile/example_tile_filtering.py +105 -0
- warp/examples/tile/example_tile_matmul.py +79 -0
- warp/examples/tile/example_tile_mlp.py +375 -0
- warp/fem/__init__.py +8 -0
- warp/fem/cache.py +16 -12
- warp/fem/dirichlet.py +1 -1
- warp/fem/domain.py +44 -1
- warp/fem/field/__init__.py +1 -2
- warp/fem/field/field.py +31 -19
- warp/fem/field/nodal_field.py +101 -49
- warp/fem/field/virtual.py +794 -0
- warp/fem/geometry/__init__.py +2 -2
- warp/fem/geometry/deformed_geometry.py +3 -105
- warp/fem/geometry/element.py +13 -0
- warp/fem/geometry/geometry.py +165 -5
- warp/fem/geometry/grid_2d.py +3 -6
- warp/fem/geometry/grid_3d.py +31 -28
- warp/fem/geometry/hexmesh.py +3 -46
- warp/fem/geometry/nanogrid.py +3 -2
- warp/fem/geometry/{quadmesh_2d.py → quadmesh.py} +280 -159
- warp/fem/geometry/tetmesh.py +2 -43
- warp/fem/geometry/{trimesh_2d.py → trimesh.py} +354 -186
- warp/fem/integrate.py +683 -261
- warp/fem/linalg.py +404 -0
- warp/fem/operator.py +101 -18
- warp/fem/polynomial.py +5 -5
- warp/fem/quadrature/quadrature.py +45 -21
- warp/fem/space/__init__.py +45 -11
- warp/fem/space/basis_function_space.py +451 -0
- warp/fem/space/basis_space.py +58 -11
- warp/fem/space/function_space.py +146 -5
- warp/fem/space/grid_2d_function_space.py +80 -66
- warp/fem/space/grid_3d_function_space.py +113 -68
- warp/fem/space/hexmesh_function_space.py +96 -108
- warp/fem/space/nanogrid_function_space.py +62 -110
- warp/fem/space/quadmesh_function_space.py +208 -0
- warp/fem/space/shape/__init__.py +45 -7
- warp/fem/space/shape/cube_shape_function.py +328 -54
- warp/fem/space/shape/shape_function.py +10 -1
- warp/fem/space/shape/square_shape_function.py +328 -60
- warp/fem/space/shape/tet_shape_function.py +269 -19
- warp/fem/space/shape/triangle_shape_function.py +238 -19
- warp/fem/space/tetmesh_function_space.py +69 -37
- warp/fem/space/topology.py +38 -0
- warp/fem/space/trimesh_function_space.py +179 -0
- warp/fem/utils.py +6 -331
- warp/jax_experimental.py +3 -1
- warp/native/array.h +55 -40
- warp/native/builtin.h +124 -43
- warp/native/bvh.h +4 -0
- warp/native/coloring.cpp +600 -0
- warp/native/cuda_util.cpp +14 -0
- warp/native/cuda_util.h +2 -1
- warp/native/fabric.h +8 -0
- warp/native/hashgrid.h +4 -0
- warp/native/marching.cu +8 -0
- warp/native/mat.h +14 -3
- warp/native/mathdx.cpp +59 -0
- warp/native/mesh.h +4 -0
- warp/native/range.h +13 -1
- warp/native/reduce.cpp +9 -1
- warp/native/reduce.cu +7 -0
- warp/native/runlength_encode.cpp +9 -1
- warp/native/runlength_encode.cu +7 -1
- warp/native/scan.cpp +8 -0
- warp/native/scan.cu +8 -0
- warp/native/scan.h +8 -1
- warp/native/sparse.cpp +8 -0
- warp/native/sparse.cu +8 -0
- warp/native/temp_buffer.h +7 -0
- warp/native/tile.h +1857 -0
- warp/native/tile_gemm.h +341 -0
- warp/native/tile_reduce.h +210 -0
- warp/native/volume_builder.cu +8 -0
- warp/native/volume_builder.h +8 -0
- warp/native/warp.cpp +10 -2
- warp/native/warp.cu +369 -15
- warp/native/warp.h +12 -2
- warp/optim/adam.py +39 -4
- warp/paddle.py +29 -12
- warp/render/render_opengl.py +137 -65
- warp/sim/graph_coloring.py +292 -0
- warp/sim/integrator_euler.py +4 -2
- warp/sim/integrator_featherstone.py +115 -44
- warp/sim/integrator_vbd.py +6 -0
- warp/sim/model.py +90 -17
- warp/stubs.py +651 -85
- warp/tape.py +12 -7
- warp/tests/assets/pixel.npy +0 -0
- warp/tests/aux_test_instancing_gc.py +18 -0
- warp/tests/test_array.py +207 -48
- warp/tests/test_closest_point_edge_edge.py +8 -8
- warp/tests/test_codegen.py +120 -1
- warp/tests/test_codegen_instancing.py +30 -0
- warp/tests/test_collision.py +110 -0
- warp/tests/test_coloring.py +241 -0
- warp/tests/test_context.py +34 -0
- warp/tests/test_examples.py +18 -4
- warp/tests/test_fabricarray.py +33 -0
- warp/tests/test_fem.py +453 -113
- warp/tests/test_func.py +48 -1
- warp/tests/test_generics.py +52 -0
- warp/tests/test_iter.py +68 -0
- warp/tests/test_mat_scalar_ops.py +1 -1
- warp/tests/test_mesh_query_point.py +5 -4
- warp/tests/test_module_hashing.py +23 -0
- warp/tests/test_paddle.py +27 -87
- warp/tests/test_print.py +191 -1
- warp/tests/test_spatial.py +1 -1
- warp/tests/test_tile.py +700 -0
- warp/tests/test_tile_mathdx.py +144 -0
- warp/tests/test_tile_mlp.py +383 -0
- warp/tests/test_tile_reduce.py +374 -0
- warp/tests/test_tile_shared_memory.py +190 -0
- warp/tests/test_vbd.py +12 -20
- warp/tests/test_volume.py +43 -0
- warp/tests/unittest_suites.py +23 -2
- warp/tests/unittest_utils.py +4 -0
- warp/types.py +339 -73
- warp/utils.py +22 -1
- {warp_lang-1.4.1.dist-info → warp_lang-1.5.0.dist-info}/METADATA +33 -7
- {warp_lang-1.4.1.dist-info → warp_lang-1.5.0.dist-info}/RECORD +159 -132
- {warp_lang-1.4.1.dist-info → warp_lang-1.5.0.dist-info}/WHEEL +1 -1
- warp/fem/field/test.py +0 -180
- warp/fem/field/trial.py +0 -183
- warp/fem/space/collocated_function_space.py +0 -102
- warp/fem/space/quadmesh_2d_function_space.py +0 -261
- warp/fem/space/trimesh_2d_function_space.py +0 -153
- {warp_lang-1.4.1.dist-info → warp_lang-1.5.0.dist-info}/LICENSE.md +0 -0
- {warp_lang-1.4.1.dist-info → warp_lang-1.5.0.dist-info}/top_level.txt +0 -0
warp/sim/model.py
CHANGED
|
@@ -15,6 +15,7 @@ import numpy as np
|
|
|
15
15
|
|
|
16
16
|
import warp as wp
|
|
17
17
|
|
|
18
|
+
from .graph_coloring import ColoringAlgorithm, color_trimesh, combine_independent_particle_coloring
|
|
18
19
|
from .inertia import (
|
|
19
20
|
compute_box_inertia,
|
|
20
21
|
compute_capsule_inertia,
|
|
@@ -891,7 +892,7 @@ class Model:
|
|
|
891
892
|
target.soft_contact_body_pos = wp.zeros(count, dtype=wp.vec3, requires_grad=requires_grad)
|
|
892
893
|
target.soft_contact_body_vel = wp.zeros(count, dtype=wp.vec3, requires_grad=requires_grad)
|
|
893
894
|
target.soft_contact_normal = wp.zeros(count, dtype=wp.vec3, requires_grad=requires_grad)
|
|
894
|
-
target.soft_contact_tids = wp.zeros(
|
|
895
|
+
target.soft_contact_tids = wp.zeros(self.particle_count * (self.shape_count - 1), dtype=int)
|
|
895
896
|
|
|
896
897
|
def allocate_soft_contacts(self, count, requires_grad=False):
|
|
897
898
|
self._allocate_soft_contacts(self, count, requires_grad)
|
|
@@ -1134,6 +1135,8 @@ class ModelBuilder:
|
|
|
1134
1135
|
self.particle_radius = []
|
|
1135
1136
|
self.particle_flags = []
|
|
1136
1137
|
self.particle_max_velocity = 1e5
|
|
1138
|
+
# list of np.array
|
|
1139
|
+
self.particle_coloring = []
|
|
1137
1140
|
|
|
1138
1141
|
# shapes (each shape has an entry in these arrays)
|
|
1139
1142
|
# transform from shape to body
|
|
@@ -1372,6 +1375,11 @@ class ModelBuilder:
|
|
|
1372
1375
|
if builder.tet_count:
|
|
1373
1376
|
self.tet_indices.extend((np.array(builder.tet_indices, dtype=np.int32) + start_particle_idx).tolist())
|
|
1374
1377
|
|
|
1378
|
+
builder_coloring_translated = [group + start_particle_idx for group in builder.particle_coloring]
|
|
1379
|
+
self.particle_coloring = combine_independent_particle_coloring(
|
|
1380
|
+
self.particle_coloring, builder_coloring_translated
|
|
1381
|
+
)
|
|
1382
|
+
|
|
1375
1383
|
start_body_idx = self.body_count
|
|
1376
1384
|
start_shape_idx = self.shape_count
|
|
1377
1385
|
for s, b in enumerate(builder.shape_body):
|
|
@@ -3421,7 +3429,12 @@ class ModelBuilder:
|
|
|
3421
3429
|
|
|
3422
3430
|
# particles
|
|
3423
3431
|
def add_particle(
|
|
3424
|
-
self,
|
|
3432
|
+
self,
|
|
3433
|
+
pos: Vec3,
|
|
3434
|
+
vel: Vec3,
|
|
3435
|
+
mass: float,
|
|
3436
|
+
radius: float = None,
|
|
3437
|
+
flags: wp.uint32 = PARTICLE_FLAG_ACTIVE,
|
|
3425
3438
|
) -> int:
|
|
3426
3439
|
"""Adds a single particle to the model
|
|
3427
3440
|
|
|
@@ -3446,7 +3459,9 @@ class ModelBuilder:
|
|
|
3446
3459
|
self.particle_radius.append(radius)
|
|
3447
3460
|
self.particle_flags.append(flags)
|
|
3448
3461
|
|
|
3449
|
-
|
|
3462
|
+
particle_id = self.particle_count - 1
|
|
3463
|
+
|
|
3464
|
+
return particle_id
|
|
3450
3465
|
|
|
3451
3466
|
def add_spring(self, i: int, j, ke: float, kd: float, control: float):
|
|
3452
3467
|
"""Adds a spring between two particles in the system
|
|
@@ -3826,6 +3841,7 @@ class ModelBuilder:
|
|
|
3826
3841
|
add_springs: bool = False,
|
|
3827
3842
|
spring_ke: float = default_spring_ke,
|
|
3828
3843
|
spring_kd: float = default_spring_kd,
|
|
3844
|
+
particle_radius: float = default_particle_radius,
|
|
3829
3845
|
):
|
|
3830
3846
|
"""Helper to create a regular planar cloth grid
|
|
3831
3847
|
|
|
@@ -3846,7 +3862,6 @@ class ModelBuilder:
|
|
|
3846
3862
|
fix_right: Make the right-most edge of particles kinematic
|
|
3847
3863
|
fix_top: Make the top-most edge of particles kinematic
|
|
3848
3864
|
fix_bottom: Make the bottom-most edge of particles kinematic
|
|
3849
|
-
|
|
3850
3865
|
"""
|
|
3851
3866
|
|
|
3852
3867
|
def grid_index(x, y, dim_x):
|
|
@@ -3876,7 +3891,7 @@ class ModelBuilder:
|
|
|
3876
3891
|
m = 0.0
|
|
3877
3892
|
particle_flag = wp.uint32(int(particle_flag) & ~int(PARTICLE_FLAG_ACTIVE))
|
|
3878
3893
|
|
|
3879
|
-
self.add_particle(p, vel, m, flags=particle_flag)
|
|
3894
|
+
self.add_particle(p, vel, m, flags=particle_flag, radius=particle_radius)
|
|
3880
3895
|
|
|
3881
3896
|
if x > 0 and y > 0:
|
|
3882
3897
|
if reverse_winding:
|
|
@@ -3960,6 +3975,7 @@ class ModelBuilder:
|
|
|
3960
3975
|
add_springs: bool = False,
|
|
3961
3976
|
spring_ke: float = default_spring_ke,
|
|
3962
3977
|
spring_kd: float = default_spring_kd,
|
|
3978
|
+
particle_radius: float = default_particle_radius,
|
|
3963
3979
|
):
|
|
3964
3980
|
"""Helper to create a cloth model from a regular triangle mesh
|
|
3965
3981
|
|
|
@@ -3975,7 +3991,7 @@ class ModelBuilder:
|
|
|
3975
3991
|
density: The density per-area of the mesh
|
|
3976
3992
|
edge_callback: A user callback when an edge is created
|
|
3977
3993
|
face_callback: A user callback when a face is created
|
|
3978
|
-
|
|
3994
|
+
particle_radius: The particle_radius which controls particle based collisions.
|
|
3979
3995
|
Note:
|
|
3980
3996
|
|
|
3981
3997
|
The mesh should be two manifold.
|
|
@@ -3989,7 +4005,7 @@ class ModelBuilder:
|
|
|
3989
4005
|
for v in vertices:
|
|
3990
4006
|
p = wp.quat_rotate(rot, v * scale) + pos
|
|
3991
4007
|
|
|
3992
|
-
self.add_particle(p, vel, 0.0)
|
|
4008
|
+
self.add_particle(p, vel, 0.0, radius=particle_radius)
|
|
3993
4009
|
|
|
3994
4010
|
# triangles
|
|
3995
4011
|
inds = start_vertex + np.array(indices)
|
|
@@ -4016,22 +4032,22 @@ class ModelBuilder:
|
|
|
4016
4032
|
|
|
4017
4033
|
adj = wp.utils.MeshAdjacency(self.tri_indices[start_tri:end_tri], end_tri - start_tri)
|
|
4018
4034
|
|
|
4019
|
-
|
|
4035
|
+
edge_indices = np.fromiter(
|
|
4020
4036
|
(x for e in adj.edges.values() for x in (e.o0, e.o1, e.v0, e.v1)),
|
|
4021
4037
|
int,
|
|
4022
4038
|
).reshape(-1, 4)
|
|
4023
4039
|
self.add_edges(
|
|
4024
|
-
|
|
4025
|
-
|
|
4026
|
-
|
|
4027
|
-
|
|
4028
|
-
edge_ke=[edge_ke] * len(
|
|
4029
|
-
edge_kd=[edge_kd] * len(
|
|
4040
|
+
edge_indices[:, 0],
|
|
4041
|
+
edge_indices[:, 1],
|
|
4042
|
+
edge_indices[:, 2],
|
|
4043
|
+
edge_indices[:, 3],
|
|
4044
|
+
edge_ke=[edge_ke] * len(edge_indices),
|
|
4045
|
+
edge_kd=[edge_kd] * len(edge_indices),
|
|
4030
4046
|
)
|
|
4031
4047
|
|
|
4032
4048
|
if add_springs:
|
|
4033
4049
|
spring_indices = set()
|
|
4034
|
-
for i, j, k, l in
|
|
4050
|
+
for i, j, k, l in edge_indices:
|
|
4035
4051
|
spring_indices.add((min(i, j), max(i, j)))
|
|
4036
4052
|
spring_indices.add((min(i, k), max(i, k)))
|
|
4037
4053
|
spring_indices.add((min(i, l), max(i, l)))
|
|
@@ -4060,7 +4076,7 @@ class ModelBuilder:
|
|
|
4060
4076
|
radius_mean: float = default_particle_radius,
|
|
4061
4077
|
radius_std: float = 0.0,
|
|
4062
4078
|
):
|
|
4063
|
-
rng = np.random.default_rng()
|
|
4079
|
+
rng = np.random.default_rng(42)
|
|
4064
4080
|
for z in range(dim_z):
|
|
4065
4081
|
for y in range(dim_y):
|
|
4066
4082
|
for x in range(dim_x):
|
|
@@ -4070,7 +4086,7 @@ class ModelBuilder:
|
|
|
4070
4086
|
p = wp.quat_rotate(rot, v) + pos + wp.vec3(rng.random(3) * jitter)
|
|
4071
4087
|
|
|
4072
4088
|
if radius_std > 0.0:
|
|
4073
|
-
r = radius_mean +
|
|
4089
|
+
r = radius_mean + rng.standard_normal() * radius_std
|
|
4074
4090
|
else:
|
|
4075
4091
|
r = radius_mean
|
|
4076
4092
|
self.add_particle(p, vel, m, r)
|
|
@@ -4356,6 +4372,61 @@ class ModelBuilder:
|
|
|
4356
4372
|
for i in range(self.shape_count - 1):
|
|
4357
4373
|
self.shape_collision_filter_pairs.add((i, ground_id))
|
|
4358
4374
|
|
|
4375
|
+
def set_coloring(self, particle_coloring):
|
|
4376
|
+
"""
|
|
4377
|
+
Set coloring information with user-provided coloring.
|
|
4378
|
+
|
|
4379
|
+
Args:
|
|
4380
|
+
particle_coloring: A list of list or `np.array` with `dtype`=`int`. The length of the list is the number of colors
|
|
4381
|
+
and each list or `np.array` contains the indices of vertices with this color.
|
|
4382
|
+
"""
|
|
4383
|
+
particle_coloring = [
|
|
4384
|
+
color_group if isinstance(color_group, np.ndarray) else np.array(color_group)
|
|
4385
|
+
for color_group in particle_coloring
|
|
4386
|
+
]
|
|
4387
|
+
self.particle_coloring = particle_coloring
|
|
4388
|
+
|
|
4389
|
+
def color(
|
|
4390
|
+
self,
|
|
4391
|
+
include_bending=False,
|
|
4392
|
+
balance_colors=True,
|
|
4393
|
+
target_max_min_color_ratio=1.1,
|
|
4394
|
+
coloring_algorithm=ColoringAlgorithm.MCS,
|
|
4395
|
+
):
|
|
4396
|
+
"""
|
|
4397
|
+
Run coloring algorithm to generate coloring information.
|
|
4398
|
+
|
|
4399
|
+
Args:
|
|
4400
|
+
include_bending_energy: Whether to consider bending energy for trimeshes in the coloring process. If set to `True`, the generated
|
|
4401
|
+
graph will contain all the edges connecting o1 and o2; otherwise, the graph will be equivalent to the trimesh.
|
|
4402
|
+
balance_colors: Whether to apply the color balancing algorithm to balance the size of each color
|
|
4403
|
+
target_max_min_color_ratio: the color balancing algorithm will stop when the ratio between the largest color and
|
|
4404
|
+
the smallest color reaches this value
|
|
4405
|
+
algorithm: Value should an enum type of ColoringAlgorithm, otherwise it will raise an error. ColoringAlgorithm.mcs means using the MCS coloring algorithm,
|
|
4406
|
+
while ColoringAlgorithm.ordered_greedy means using the degree-ordered greedy algorithm. The MCS algorithm typically generates 30% to 50% fewer colors
|
|
4407
|
+
compared to the ordered greedy algorithm, while maintaining the same linear complexity. Although MCS has a constant overhead that makes it about twice
|
|
4408
|
+
as slow as the greedy algorithm, it produces significantly better coloring results. We recommend using MCS, especially if coloring is only part of the
|
|
4409
|
+
preprocessing stage.e.
|
|
4410
|
+
|
|
4411
|
+
Note:
|
|
4412
|
+
|
|
4413
|
+
References to the coloring algorithm:
|
|
4414
|
+
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.
|
|
4415
|
+
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.
|
|
4416
|
+
|
|
4417
|
+
"""
|
|
4418
|
+
# ignore bending energy if it is too small
|
|
4419
|
+
edge_indices = np.array(self.edge_indices)
|
|
4420
|
+
|
|
4421
|
+
self.particle_coloring = color_trimesh(
|
|
4422
|
+
len(self.particle_q),
|
|
4423
|
+
edge_indices,
|
|
4424
|
+
include_bending,
|
|
4425
|
+
algorithm=coloring_algorithm,
|
|
4426
|
+
balance_colors=balance_colors,
|
|
4427
|
+
target_max_min_color_ratio=target_max_min_color_ratio,
|
|
4428
|
+
)
|
|
4429
|
+
|
|
4359
4430
|
def finalize(self, device=None, requires_grad=False) -> Model:
|
|
4360
4431
|
"""Convert this builder object to a concrete model for simulation.
|
|
4361
4432
|
|
|
@@ -4407,6 +4478,8 @@ class ModelBuilder:
|
|
|
4407
4478
|
m.particle_max_radius = np.max(self.particle_radius) if len(self.particle_radius) > 0 else 0.0
|
|
4408
4479
|
m.particle_max_velocity = self.particle_max_velocity
|
|
4409
4480
|
|
|
4481
|
+
m.particle_coloring = [wp.array(group, dtype=int) for group in self.particle_coloring]
|
|
4482
|
+
|
|
4410
4483
|
# hash-grid for particle interactions
|
|
4411
4484
|
m.particle_grid = wp.HashGrid(128, 128, 128)
|
|
4412
4485
|
|