warp-lang 1.4.2__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.

Files changed (158) hide show
  1. warp/__init__.py +4 -0
  2. warp/autograd.py +43 -8
  3. warp/bin/warp-clang.so +0 -0
  4. warp/bin/warp.so +0 -0
  5. warp/build.py +21 -2
  6. warp/build_dll.py +23 -6
  7. warp/builtins.py +1783 -2
  8. warp/codegen.py +177 -45
  9. warp/config.py +2 -2
  10. warp/context.py +321 -73
  11. warp/examples/assets/pixel.jpg +0 -0
  12. warp/examples/benchmarks/benchmark_cloth_paddle.py +86 -0
  13. warp/examples/benchmarks/benchmark_gemm.py +121 -0
  14. warp/examples/benchmarks/benchmark_interop_paddle.py +158 -0
  15. warp/examples/benchmarks/benchmark_tile.py +179 -0
  16. warp/examples/fem/example_adaptive_grid.py +37 -10
  17. warp/examples/fem/example_apic_fluid.py +3 -2
  18. warp/examples/fem/example_convection_diffusion_dg.py +4 -5
  19. warp/examples/fem/example_deformed_geometry.py +1 -1
  20. warp/examples/fem/example_diffusion_3d.py +47 -4
  21. warp/examples/fem/example_distortion_energy.py +220 -0
  22. warp/examples/fem/example_magnetostatics.py +127 -85
  23. warp/examples/fem/example_nonconforming_contact.py +5 -5
  24. warp/examples/fem/example_stokes.py +3 -1
  25. warp/examples/fem/example_streamlines.py +12 -19
  26. warp/examples/fem/utils.py +38 -15
  27. warp/examples/sim/example_cloth.py +2 -25
  28. warp/examples/sim/example_quadruped.py +2 -1
  29. warp/examples/tile/example_tile_convolution.py +58 -0
  30. warp/examples/tile/example_tile_fft.py +47 -0
  31. warp/examples/tile/example_tile_filtering.py +105 -0
  32. warp/examples/tile/example_tile_matmul.py +79 -0
  33. warp/examples/tile/example_tile_mlp.py +375 -0
  34. warp/fem/__init__.py +8 -0
  35. warp/fem/cache.py +16 -12
  36. warp/fem/dirichlet.py +1 -1
  37. warp/fem/domain.py +44 -1
  38. warp/fem/field/__init__.py +1 -2
  39. warp/fem/field/field.py +31 -19
  40. warp/fem/field/nodal_field.py +101 -49
  41. warp/fem/field/virtual.py +794 -0
  42. warp/fem/geometry/__init__.py +2 -2
  43. warp/fem/geometry/deformed_geometry.py +3 -105
  44. warp/fem/geometry/element.py +13 -0
  45. warp/fem/geometry/geometry.py +165 -5
  46. warp/fem/geometry/grid_2d.py +3 -6
  47. warp/fem/geometry/grid_3d.py +31 -28
  48. warp/fem/geometry/hexmesh.py +3 -46
  49. warp/fem/geometry/nanogrid.py +3 -2
  50. warp/fem/geometry/{quadmesh_2d.py → quadmesh.py} +280 -159
  51. warp/fem/geometry/tetmesh.py +2 -43
  52. warp/fem/geometry/{trimesh_2d.py → trimesh.py} +354 -186
  53. warp/fem/integrate.py +683 -261
  54. warp/fem/linalg.py +404 -0
  55. warp/fem/operator.py +101 -18
  56. warp/fem/polynomial.py +5 -5
  57. warp/fem/quadrature/quadrature.py +45 -21
  58. warp/fem/space/__init__.py +45 -11
  59. warp/fem/space/basis_function_space.py +451 -0
  60. warp/fem/space/basis_space.py +58 -11
  61. warp/fem/space/function_space.py +146 -5
  62. warp/fem/space/grid_2d_function_space.py +80 -66
  63. warp/fem/space/grid_3d_function_space.py +113 -68
  64. warp/fem/space/hexmesh_function_space.py +96 -108
  65. warp/fem/space/nanogrid_function_space.py +62 -110
  66. warp/fem/space/quadmesh_function_space.py +208 -0
  67. warp/fem/space/shape/__init__.py +45 -7
  68. warp/fem/space/shape/cube_shape_function.py +328 -54
  69. warp/fem/space/shape/shape_function.py +10 -1
  70. warp/fem/space/shape/square_shape_function.py +328 -60
  71. warp/fem/space/shape/tet_shape_function.py +269 -19
  72. warp/fem/space/shape/triangle_shape_function.py +238 -19
  73. warp/fem/space/tetmesh_function_space.py +69 -37
  74. warp/fem/space/topology.py +38 -0
  75. warp/fem/space/trimesh_function_space.py +179 -0
  76. warp/fem/utils.py +6 -331
  77. warp/jax_experimental.py +3 -1
  78. warp/native/array.h +15 -0
  79. warp/native/builtin.h +66 -26
  80. warp/native/bvh.h +4 -0
  81. warp/native/coloring.cpp +600 -0
  82. warp/native/cuda_util.cpp +14 -0
  83. warp/native/cuda_util.h +2 -1
  84. warp/native/fabric.h +8 -0
  85. warp/native/hashgrid.h +4 -0
  86. warp/native/marching.cu +8 -0
  87. warp/native/mat.h +14 -3
  88. warp/native/mathdx.cpp +59 -0
  89. warp/native/mesh.h +4 -0
  90. warp/native/range.h +13 -1
  91. warp/native/reduce.cpp +9 -1
  92. warp/native/reduce.cu +7 -0
  93. warp/native/runlength_encode.cpp +9 -1
  94. warp/native/runlength_encode.cu +7 -1
  95. warp/native/scan.cpp +8 -0
  96. warp/native/scan.cu +8 -0
  97. warp/native/scan.h +8 -1
  98. warp/native/sparse.cpp +8 -0
  99. warp/native/sparse.cu +8 -0
  100. warp/native/temp_buffer.h +7 -0
  101. warp/native/tile.h +1857 -0
  102. warp/native/tile_gemm.h +341 -0
  103. warp/native/tile_reduce.h +210 -0
  104. warp/native/volume_builder.cu +8 -0
  105. warp/native/volume_builder.h +8 -0
  106. warp/native/warp.cpp +10 -2
  107. warp/native/warp.cu +369 -15
  108. warp/native/warp.h +12 -2
  109. warp/optim/adam.py +39 -4
  110. warp/paddle.py +29 -12
  111. warp/render/render_opengl.py +137 -65
  112. warp/sim/graph_coloring.py +292 -0
  113. warp/sim/integrator_euler.py +4 -2
  114. warp/sim/integrator_featherstone.py +115 -44
  115. warp/sim/integrator_vbd.py +6 -0
  116. warp/sim/model.py +88 -15
  117. warp/stubs.py +569 -4
  118. warp/tape.py +12 -7
  119. warp/tests/assets/pixel.npy +0 -0
  120. warp/tests/aux_test_instancing_gc.py +18 -0
  121. warp/tests/test_array.py +39 -0
  122. warp/tests/test_codegen.py +81 -1
  123. warp/tests/test_codegen_instancing.py +30 -0
  124. warp/tests/test_collision.py +110 -0
  125. warp/tests/test_coloring.py +241 -0
  126. warp/tests/test_context.py +34 -0
  127. warp/tests/test_examples.py +18 -4
  128. warp/tests/test_fem.py +453 -113
  129. warp/tests/test_func.py +13 -0
  130. warp/tests/test_generics.py +52 -0
  131. warp/tests/test_iter.py +68 -0
  132. warp/tests/test_mat_scalar_ops.py +1 -1
  133. warp/tests/test_mesh_query_point.py +1 -1
  134. warp/tests/test_module_hashing.py +23 -0
  135. warp/tests/test_paddle.py +27 -87
  136. warp/tests/test_print.py +56 -1
  137. warp/tests/test_spatial.py +1 -1
  138. warp/tests/test_tile.py +700 -0
  139. warp/tests/test_tile_mathdx.py +144 -0
  140. warp/tests/test_tile_mlp.py +383 -0
  141. warp/tests/test_tile_reduce.py +374 -0
  142. warp/tests/test_tile_shared_memory.py +190 -0
  143. warp/tests/test_vbd.py +12 -20
  144. warp/tests/test_volume.py +43 -0
  145. warp/tests/unittest_suites.py +19 -2
  146. warp/tests/unittest_utils.py +4 -0
  147. warp/types.py +338 -72
  148. warp/utils.py +22 -1
  149. {warp_lang-1.4.2.dist-info → warp_lang-1.5.0.dist-info}/METADATA +33 -7
  150. {warp_lang-1.4.2.dist-info → warp_lang-1.5.0.dist-info}/RECORD +153 -126
  151. {warp_lang-1.4.2.dist-info → warp_lang-1.5.0.dist-info}/WHEEL +1 -1
  152. warp/fem/field/test.py +0 -180
  153. warp/fem/field/trial.py +0 -183
  154. warp/fem/space/collocated_function_space.py +0 -102
  155. warp/fem/space/quadmesh_2d_function_space.py +0 -261
  156. warp/fem/space/trimesh_2d_function_space.py +0 -153
  157. {warp_lang-1.4.2.dist-info → warp_lang-1.5.0.dist-info}/LICENSE.md +0 -0
  158. {warp_lang-1.4.2.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(count, dtype=int)
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, pos: Vec3, vel: Vec3, mass: float, radius: float = None, flags: wp.uint32 = PARTICLE_FLAG_ACTIVE
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
- return len(self.particle_q) - 1
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
- edgeinds = np.fromiter(
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
- edgeinds[:, 0],
4025
- edgeinds[:, 1],
4026
- edgeinds[:, 2],
4027
- edgeinds[:, 3],
4028
- edge_ke=[edge_ke] * len(edgeinds),
4029
- edge_kd=[edge_kd] * len(edgeinds),
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 edgeinds:
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)))
@@ -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