warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__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.

Files changed (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
@@ -5,14 +5,13 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
9
- import numpy as np
10
8
  import math
9
+ import unittest
11
10
 
12
- import warp as wp
13
- from warp.tests.test_base import *
11
+ import numpy as np
14
12
 
15
- np.random.seed(42)
13
+ import warp as wp
14
+ from warp.tests.unittest_utils import *
16
15
 
17
16
  wp.init()
18
17
 
@@ -44,6 +43,12 @@ def sample_mesh_query(
44
43
  query_faces[tid] = face_index
45
44
  query_dist[tid] = wp.length(cp - p)
46
45
 
46
+ query = wp.mesh_query_point(mesh, p, max_dist)
47
+ wp.expect_eq(query.sign, sign)
48
+ wp.expect_eq(query.face, face_index)
49
+ wp.expect_eq(query.u, face_u)
50
+ wp.expect_eq(query.v, face_v)
51
+
47
52
 
48
53
  @wp.kernel
49
54
  def sample_mesh_query_no_sign(
@@ -69,6 +74,11 @@ def sample_mesh_query_no_sign(
69
74
  query_faces[tid] = face_index
70
75
  query_dist[tid] = wp.length(cp - p)
71
76
 
77
+ query = wp.mesh_query_point_no_sign(mesh, p, max_dist)
78
+ wp.expect_eq(query.face, face_index)
79
+ wp.expect_eq(query.u, face_u)
80
+ wp.expect_eq(query.v, face_v)
81
+
72
82
 
73
83
  @wp.kernel
74
84
  def sample_mesh_query_sign_normal(
@@ -97,6 +107,12 @@ def sample_mesh_query_sign_normal(
97
107
  query_faces[tid] = face_index
98
108
  query_dist[tid] = wp.length(cp - p)
99
109
 
110
+ query = wp.mesh_query_point_sign_normal(mesh, p, max_dist)
111
+ wp.expect_eq(query.sign, sign)
112
+ wp.expect_eq(query.face, face_index)
113
+ wp.expect_eq(query.u, face_u)
114
+ wp.expect_eq(query.v, face_v)
115
+
100
116
 
101
117
  @wp.kernel
102
118
  def sample_mesh_query_sign_winding_number(
@@ -125,6 +141,12 @@ def sample_mesh_query_sign_winding_number(
125
141
  query_faces[tid] = face_index
126
142
  query_dist[tid] = wp.length(cp - p)
127
143
 
144
+ query = wp.mesh_query_point_sign_winding_number(mesh, p, max_dist)
145
+ wp.expect_eq(query.sign, sign)
146
+ wp.expect_eq(query.face, face_index)
147
+ wp.expect_eq(query.u, face_u)
148
+ wp.expect_eq(query.v, face_v)
149
+
128
150
 
129
151
  @wp.func
130
152
  def triangle_closest_point(a: wp.vec3, b: wp.vec3, c: wp.vec3, p: wp.vec3):
@@ -237,9 +259,11 @@ def sample_mesh_brute(
237
259
 
238
260
  # constructs a grid of evenly spaced particles
239
261
  def particle_grid(dim_x, dim_y, dim_z, lower, radius, jitter):
262
+ rng = np.random.default_rng(123)
263
+
240
264
  points = np.meshgrid(np.linspace(0, dim_x, dim_x), np.linspace(0, dim_y, dim_y), np.linspace(0, dim_z, dim_z))
241
265
  points_t = np.array((points[0], points[1], points[2])).T * radius * 2.0 + np.array(lower)
242
- points_t = points_t + np.random.rand(*points_t.shape) * radius * jitter
266
+ points_t = points_t + rng.random(points_t.shape) * radius * jitter
243
267
 
244
268
  return points_t.reshape((-1, 3))
245
269
 
@@ -263,6 +287,7 @@ def triangulate(face_counts, face_indices):
263
287
  return tri_indices
264
288
 
265
289
 
290
+ @unittest.skipUnless(USD_AVAILABLE, "Requires usd-core")
266
291
  def test_mesh_query_point(test, device):
267
292
  from pxr import Usd, UsdGeom
268
293
 
@@ -478,6 +503,7 @@ def mesh_query_point_loss(
478
503
  loss[tid] = dist
479
504
 
480
505
 
506
+ @unittest.skipUnless(USD_AVAILABLE, "Requires usd-core")
481
507
  def test_adj_mesh_query_point(test, device):
482
508
  from pxr import Usd, UsdGeom
483
509
 
@@ -557,28 +583,91 @@ def test_adj_mesh_query_point(test, device):
557
583
  test.assertTrue(error < tolerance, f"error is {error} which is >= {tolerance}")
558
584
 
559
585
 
560
- def register(parent):
561
- devices = get_test_devices()
586
+ @wp.kernel
587
+ def sample_furthest_points(mesh: wp.uint64, query_points: wp.array(dtype=wp.vec3), query_result: wp.array(dtype=float)):
588
+ tid = wp.tid()
562
589
 
563
- class TestMeshQuery(parent):
564
- pass
590
+ p = query_points[tid]
565
591
 
566
- # USD import failures should not count as a test failure
567
- try:
568
- from pxr import Usd, UsdGeom
592
+ face = int(0)
593
+ bary_u = float(0.0)
594
+ bary_v = float(0.0)
569
595
 
570
- have_usd = True
571
- except:
572
- have_usd = False
596
+ if wp.mesh_query_furthest_point_no_sign(mesh, p, 0.0, face, bary_u, bary_v):
597
+ closest = wp.mesh_eval_position(mesh, face, bary_u, bary_v)
573
598
 
574
- if have_usd:
575
- add_function_test(TestMeshQuery, "test_mesh_query_point", test_mesh_query_point, devices=devices)
576
- add_function_test(TestMeshQuery, "test_adj_mesh_query_point", test_adj_mesh_query_point, devices=devices)
599
+ query_result[tid] = wp.length_sq(p - closest)
577
600
 
578
- return TestMeshQuery
601
+ query = wp.mesh_query_furthest_point_no_sign(mesh, p, 0.0)
602
+ wp.expect_eq(query.face, face)
603
+ wp.expect_eq(query.u, bary_u)
604
+ wp.expect_eq(query.v, bary_v)
579
605
 
580
606
 
581
- if __name__ == "__main__":
582
- c = register(unittest.TestCase)
607
+ @wp.kernel
608
+ def sample_furthest_points_brute(
609
+ mesh_points: wp.array(dtype=wp.vec3), query_points: wp.array(dtype=wp.vec3), query_result: wp.array(dtype=float)
610
+ ):
611
+ tid = wp.tid()
612
+
613
+ p = query_points[tid]
614
+ max_dist_sq = float(0.0)
615
+
616
+ for i in range(mesh_points.shape[0]):
617
+ dist_sq = wp.length_sq(p - mesh_points[i])
618
+
619
+ if dist_sq > max_dist_sq:
620
+ max_dist_sq = dist_sq
621
+
622
+ query_result[tid] = max_dist_sq
623
+
583
624
 
625
+ @unittest.skipUnless(USD_AVAILABLE, "Requires usd-core")
626
+ def test_mesh_query_furthest_point(test, device):
627
+ from pxr import Usd, UsdGeom
628
+
629
+ mesh = Usd.Stage.Open(os.path.abspath(os.path.join(os.path.dirname(__file__), "assets/spiky.usd")))
630
+ mesh_geom = UsdGeom.Mesh(mesh.GetPrimAtPath("/Cube/Cube"))
631
+
632
+ mesh_counts = mesh_geom.GetFaceVertexCountsAttr().Get()
633
+ mesh_indices = mesh_geom.GetFaceVertexIndicesAttr().Get()
634
+
635
+ tri_indices = triangulate(mesh_counts, mesh_indices)
636
+
637
+ mesh_points = wp.array(np.array(mesh_geom.GetPointsAttr().Get()), dtype=wp.vec3, device=device)
638
+ mesh_indices = wp.array(np.array(tri_indices), dtype=int, device=device)
639
+
640
+ # create mesh
641
+ mesh = wp.Mesh(points=mesh_points, indices=mesh_indices)
642
+
643
+ p = particle_grid(32, 32, 32, np.array([-1.1, -1.1, -1.1]), 0.05, 0.0)
644
+
645
+ query_count = len(p)
646
+ query_points = wp.array(p, dtype=wp.vec3, device=device)
647
+
648
+ dist_query = wp.zeros(query_count, dtype=float, device=device)
649
+ dist_brute = wp.zeros(query_count, dtype=float, device=device)
650
+
651
+ wp.launch(sample_furthest_points, dim=query_count, inputs=[mesh.id, query_points, dist_query], device=device)
652
+ wp.launch(
653
+ sample_furthest_points_brute, dim=query_count, inputs=[mesh_points, query_points, dist_brute], device=device
654
+ )
655
+
656
+ assert_np_equal(dist_query.numpy(), dist_brute.numpy(), tol=1.0e-3)
657
+
658
+
659
+ devices = get_test_devices()
660
+
661
+
662
+ class TestMeshQueryPoint(unittest.TestCase):
663
+ pass
664
+
665
+
666
+ add_function_test(TestMeshQueryPoint, "test_mesh_query_point", test_mesh_query_point, devices=devices)
667
+ add_function_test(TestMeshQueryPoint, "test_mesh_query_furthest_point", test_mesh_query_furthest_point, devices=devices)
668
+ add_function_test(TestMeshQueryPoint, "test_adj_mesh_query_point", test_adj_mesh_query_point, devices=devices)
669
+
670
+
671
+ if __name__ == "__main__":
672
+ wp.build.clear_kernel_cache()
584
673
  unittest.main(verbosity=2)
@@ -5,14 +5,12 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
8
+ import unittest
9
+
9
10
  import numpy as np
10
- import math
11
11
 
12
12
  import warp as wp
13
- from warp.tests.test_base import *
14
-
15
- np.random.seed(42)
13
+ from warp.tests.unittest_utils import *
16
14
 
17
15
  wp.init()
18
16
 
@@ -67,8 +65,9 @@ def mesh_query_ray_loss(
67
65
  loss[tid] = l
68
66
 
69
67
 
68
+ @unittest.skipUnless(USD_AVAILABLE, "Requires usd-core")
70
69
  def test_mesh_query_ray_grad(test, device):
71
- from pxr import Usd, UsdGeom, Gf, Sdf
70
+ from pxr import Usd, UsdGeom
72
71
 
73
72
  # test tri
74
73
  # print("Testing Single Triangle")
@@ -210,7 +209,7 @@ def raycast_kernel(
210
209
  sign = float(0.0) # hit face sign
211
210
  n = wp.vec3() # hit face normal
212
211
  f = int(0) # hit face index
213
- max_dist = 1e6 # max raycast disance
212
+ max_dist = 1e6 # max raycast distance
214
213
 
215
214
  # ray cast against the mesh
216
215
  tid = wp.tid()
@@ -259,28 +258,17 @@ def test_mesh_query_ray_edge(test, device):
259
258
  test.assertEqual(counts.numpy()[0], n)
260
259
 
261
260
 
262
- def register(parent):
263
- devices = get_test_devices()
264
-
265
- class TestMeshQueryRay(parent):
266
- pass
267
-
268
- add_function_test(TestMeshQueryRay, "test_mesh_query_ray_edge", test_mesh_query_ray_edge, devices=devices)
261
+ devices = get_test_devices()
269
262
 
270
- # USD import failures should not count as a test failure
271
- try:
272
- from pxr import Usd, UsdGeom
273
263
 
274
- have_usd = True
275
- except:
276
- have_usd = False
264
+ class TestMeshQueryRay(unittest.TestCase):
265
+ pass
277
266
 
278
- if have_usd:
279
- add_function_test(TestMeshQueryRay, "test_mesh_query_ray_grad", test_mesh_query_ray_grad, devices=devices)
280
267
 
281
- return TestMeshQueryRay
268
+ add_function_test(TestMeshQueryRay, "test_mesh_query_ray_edge", test_mesh_query_ray_edge, devices=devices)
269
+ add_function_test(TestMeshQueryRay, "test_mesh_query_ray_grad", test_mesh_query_ray_grad, devices=devices)
282
270
 
283
271
 
284
272
  if __name__ == "__main__":
285
- c = register(unittest.TestCase)
273
+ wp.build.clear_kernel_cache()
286
274
  unittest.main(verbosity=2)
warp/tests/test_mlp.py CHANGED
@@ -5,9 +5,12 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
+ import unittest
9
+
8
10
  import numpy as np
11
+
9
12
  import warp as wp
10
- from warp.tests.test_base import *
13
+ from warp.tests.unittest_utils import *
11
14
 
12
15
  wp.init()
13
16
 
@@ -35,17 +38,17 @@ def loss_kernel(x: wp.array2d(dtype=float), loss: wp.array(dtype=float)):
35
38
 
36
39
 
37
40
  def test_mlp(test, device):
38
- np.random.seed(0)
41
+ rng = np.random.default_rng(123)
39
42
 
40
43
  m = 10
41
44
  n = 200
42
45
 
43
46
  batches = 20000
44
47
 
45
- weights = wp.array(np.random.rand(m, n) * 0.5 - 0.5, dtype=float, device=device)
46
- bias = wp.array(np.random.rand(m) * 0.5 - 0.5, dtype=float, device=device)
48
+ weights = wp.array(rng.random(size=(m, n)) * 0.5 - 0.5, dtype=float, device=device)
49
+ bias = wp.array(rng.random(size=m) * 0.5 - 0.5, dtype=float, device=device)
47
50
 
48
- x = wp.array(np.random.rand(n, batches), dtype=float, device=device)
51
+ x = wp.array(rng.random(size=(n, batches)), dtype=float, device=device)
49
52
  y = wp.zeros(shape=(m, batches), device=device)
50
53
 
51
54
  with wp.ScopedTimer("warp", active=False):
@@ -86,13 +89,15 @@ def create_mlp(m, n):
86
89
  def create_golden():
87
90
  import torch
88
91
 
92
+ rng = np.random.default_rng(123)
93
+
89
94
  input_size = 32
90
95
  hidden_size = 16
91
96
  batch_size = 64
92
97
 
93
98
  network = create_mlp(input_size, hidden_size)
94
99
 
95
- x = torch.Tensor(np.random.rand(batch_size, input_size))
100
+ x = torch.Tensor(rng.random(size=(batch_size, input_size)))
96
101
  x.requires_grad = True
97
102
 
98
103
  y = network.forward(x)
@@ -169,6 +174,8 @@ def test_mlp_grad(test, device):
169
174
  def profile_mlp_torch(device):
170
175
  import torch
171
176
 
177
+ rng = np.random.default_rng(123)
178
+
172
179
  m = 128
173
180
  n = 64
174
181
 
@@ -179,7 +186,7 @@ def profile_mlp_torch(device):
179
186
 
180
187
  network = create_mlp(m, n)
181
188
 
182
- x = torch.Tensor(np.random.rand(b, m))
189
+ x = torch.Tensor(rng.random(size=(b, m)))
183
190
 
184
191
  with wp.ScopedTimer("torch_forward" + str(b)):
185
192
  y = network.forward(x)
@@ -190,7 +197,7 @@ def profile_mlp_torch(device):
190
197
 
191
198
  network = create_mlp(m, n)
192
199
 
193
- x = torch.Tensor(np.random.rand(b, m))
200
+ x = torch.Tensor(rng.random(size=(b, m)))
194
201
  y = network.forward(x)
195
202
 
196
203
  loss = torch.norm(y)
@@ -204,6 +211,8 @@ def profile_mlp_torch(device):
204
211
 
205
212
 
206
213
  def profile_mlp_warp(device):
214
+ rng = np.random.default_rng(123)
215
+
207
216
  m = 128
208
217
  n = 64
209
218
 
@@ -212,10 +221,10 @@ def profile_mlp_warp(device):
212
221
  for i in range(steps):
213
222
  b = 2**i
214
223
 
215
- weights = wp.array(np.random.rand(m, n) * 0.5 - 0.5, dtype=float, device=device)
216
- bias = wp.array(np.random.rand(m) * 0.5 - 0.5, dtype=float, device=device)
224
+ weights = wp.array(rng.random(size=(m, n)) * 0.5 - 0.5, dtype=float, device=device)
225
+ bias = wp.array(rng.random(size=m) * 0.5 - 0.5, dtype=float, device=device)
217
226
 
218
- x = wp.array(np.random.rand(n, b), dtype=float, device=device)
227
+ x = wp.array(rng.random(size=(n, b)), dtype=float, device=device)
219
228
  y = wp.zeros(shape=(m, b), device=device)
220
229
 
221
230
  with wp.ScopedTimer("warp-forward" + str(b)):
@@ -225,10 +234,10 @@ def profile_mlp_warp(device):
225
234
  for i in range(steps):
226
235
  b = 2**i
227
236
 
228
- weights = wp.array(np.random.rand(m, n) * 0.5 - 0.5, dtype=float, device=device, requires_grad=True)
229
- bias = wp.array(np.random.rand(m) * 0.5 - 0.5, dtype=float, device=device, requires_grad=True)
237
+ weights = wp.array(rng.random(size=(m, n)) * 0.5 - 0.5, dtype=float, device=device, requires_grad=True)
238
+ bias = wp.array(rng.random(size=m) * 0.5 - 0.5, dtype=float, device=device, requires_grad=True)
230
239
 
231
- x = wp.array(np.random.rand(n, b), dtype=float, device=device, requires_grad=True)
240
+ x = wp.array(rng.random(size=(n, b)), dtype=float, device=device, requires_grad=True)
232
241
  y = wp.zeros(shape=(m, b), device=device, requires_grad=True)
233
242
 
234
243
  loss = wp.zeros(1, dtype=float, device=device)
@@ -251,18 +260,17 @@ def profile_mlp_warp(device):
251
260
  # profile_mlp_torch("cuda")
252
261
 
253
262
 
254
- def register(parent):
255
- devices = get_test_devices()
263
+ devices = get_test_devices()
264
+
256
265
 
257
- class TestMLP(parent):
258
- pass
266
+ class TestMLP(unittest.TestCase):
267
+ pass
259
268
 
260
- add_function_test(TestMLP, "test_mlp", test_mlp, devices=devices)
261
- add_function_test(TestMLP, "test_mlp_grad", test_mlp_grad, devices=devices)
262
269
 
263
- return TestMLP
270
+ add_function_test(TestMLP, "test_mlp", test_mlp, devices=devices)
271
+ add_function_test(TestMLP, "test_mlp_grad", test_mlp_grad, devices=devices)
264
272
 
265
273
 
266
274
  if __name__ == "__main__":
267
- c = register(unittest.TestCase)
275
+ wp.build.clear_kernel_cache()
268
276
  unittest.main(verbosity=2, failfast=False)
warp/tests/test_model.py CHANGED
@@ -5,103 +5,106 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- import warp as wp
9
- from warp.tests.test_base import *
10
- from warp.sim import ModelBuilder
8
+ import unittest
11
9
 
12
10
  import numpy as np
13
11
 
12
+ import warp as wp
13
+ from warp.sim import ModelBuilder
14
+ from warp.tests.unittest_utils import *
15
+
14
16
  wp.init()
15
17
 
16
18
 
17
- def register(parent):
18
- class TestModel(parent):
19
- def test_add_triangles(self):
20
- pts = np.array(
21
- [
22
- [-0.00585869, 0.34189449, -1.17415233],
23
- [-1.894547, 0.1788074, 0.9251329],
24
- [-1.26141048, 0.16140787, 0.08823282],
25
- [-0.08609255, -0.82722546, 0.65995427],
26
- [0.78827592, -1.77375711, -0.55582718],
27
- ]
28
- )
29
- tris = np.array([[0, 3, 4], [0, 2, 3], [2, 1, 3], [1, 4, 3]])
30
-
31
- builder1 = ModelBuilder()
32
- builder2 = ModelBuilder()
33
- for pt in pts:
34
- builder1.add_particle(pt, [0.0, 0.0, 0.0], 1.0)
35
- builder2.add_particle(pt, [0.0, 0.0, 0.0], 1.0)
36
-
37
- # test add_triangle(s) with default arguments:
38
- areas = builder2.add_triangles(tris[:, 0], tris[:, 1], tris[:, 2])
39
- for i, t in enumerate(tris):
40
- area = builder1.add_triangle(t[0], t[1], t[2])
41
- self.assertAlmostEqual(area, areas[i], places=6)
42
-
43
- # test add_triangle(s) with non default arguments:
44
- tri_ke = np.random.randn(pts.shape[0])
45
- tri_ka = np.random.randn(pts.shape[0])
46
- tri_kd = np.random.randn(pts.shape[0])
47
- tri_drag = np.random.randn(pts.shape[0])
48
- tri_lift = np.random.randn(pts.shape[0])
49
- for i, t in enumerate(tris):
50
- builder1.add_triangle(
51
- t[0],
52
- t[1],
53
- t[2],
54
- tri_ke[i],
55
- tri_ka[i],
56
- tri_kd[i],
57
- tri_drag[i],
58
- tri_lift[i],
59
- )
60
- builder2.add_triangles(tris[:, 0], tris[:, 1], tris[:, 2], tri_ke, tri_ka, tri_kd, tri_drag, tri_lift)
61
-
62
- assert_np_equal(np.array(builder1.tri_indices), np.array(builder2.tri_indices))
63
- assert_np_equal(np.array(builder1.tri_poses), np.array(builder2.tri_poses), tol=1.0e-6)
64
- assert_np_equal(np.array(builder1.tri_activations), np.array(builder2.tri_activations))
65
- assert_np_equal(np.array(builder1.tri_materials), np.array(builder2.tri_materials))
66
-
67
- def test_add_edges(self):
68
- pts = np.array(
69
- [
70
- [-0.00585869, 0.34189449, -1.17415233],
71
- [-1.894547, 0.1788074, 0.9251329],
72
- [-1.26141048, 0.16140787, 0.08823282],
73
- [-0.08609255, -0.82722546, 0.65995427],
74
- [0.78827592, -1.77375711, -0.55582718],
75
- ]
19
+ class TestModel(unittest.TestCase):
20
+ def test_add_triangles(self):
21
+ rng = np.random.default_rng(123)
22
+
23
+ pts = np.array(
24
+ [
25
+ [-0.00585869, 0.34189449, -1.17415233],
26
+ [-1.894547, 0.1788074, 0.9251329],
27
+ [-1.26141048, 0.16140787, 0.08823282],
28
+ [-0.08609255, -0.82722546, 0.65995427],
29
+ [0.78827592, -1.77375711, -0.55582718],
30
+ ]
31
+ )
32
+ tris = np.array([[0, 3, 4], [0, 2, 3], [2, 1, 3], [1, 4, 3]])
33
+
34
+ builder1 = ModelBuilder()
35
+ builder2 = ModelBuilder()
36
+ for pt in pts:
37
+ builder1.add_particle(wp.vec3(pt), wp.vec3(), 1.0)
38
+ builder2.add_particle(wp.vec3(pt), wp.vec3(), 1.0)
39
+
40
+ # test add_triangle(s) with default arguments:
41
+ areas = builder2.add_triangles(tris[:, 0], tris[:, 1], tris[:, 2])
42
+ for i, t in enumerate(tris):
43
+ area = builder1.add_triangle(t[0], t[1], t[2])
44
+ self.assertAlmostEqual(area, areas[i], places=6)
45
+
46
+ # test add_triangle(s) with non default arguments:
47
+ tri_ke = rng.standard_normal(size=pts.shape[0])
48
+ tri_ka = rng.standard_normal(size=pts.shape[0])
49
+ tri_kd = rng.standard_normal(size=pts.shape[0])
50
+ tri_drag = rng.standard_normal(size=pts.shape[0])
51
+ tri_lift = rng.standard_normal(size=pts.shape[0])
52
+ for i, t in enumerate(tris):
53
+ builder1.add_triangle(
54
+ t[0],
55
+ t[1],
56
+ t[2],
57
+ tri_ke[i],
58
+ tri_ka[i],
59
+ tri_kd[i],
60
+ tri_drag[i],
61
+ tri_lift[i],
76
62
  )
77
- edges = np.array([[0, 4, 3, 1], [3, 2, 4, 1]])
78
-
79
- builder1 = ModelBuilder()
80
- builder2 = ModelBuilder()
81
- for pt in pts:
82
- builder1.add_particle(pt, [0.0, 0.0, 0.0], 1.0)
83
- builder2.add_particle(pt, [0.0, 0.0, 0.0], 1.0)
84
-
85
- # test defaults:
86
- for i in range(2):
87
- builder1.add_edge(edges[i, 0], edges[i, 1], edges[i, 2], edges[i, 3])
88
- builder2.add_edges(edges[:, 0], edges[:, 1], edges[:, 2], edges[:, 3])
89
-
90
- # test non defaults:
91
- rest = np.random.randn(2)
92
- edge_ke = np.random.randn(2)
93
- edge_kd = np.random.randn(2)
94
- for i in range(2):
95
- builder1.add_edge(edges[i, 0], edges[i, 1], edges[i, 2], edges[i, 3], rest[i], edge_ke[i], edge_kd[i])
96
- builder2.add_edges(edges[:, 0], edges[:, 1], edges[:, 2], edges[:, 3], rest, edge_ke, edge_kd)
97
-
98
- assert_np_equal(np.array(builder1.edge_indices), np.array(builder2.edge_indices))
99
- assert_np_equal(np.array(builder1.edge_rest_angle), np.array(builder2.edge_rest_angle), tol=1.0e-4)
100
- assert_np_equal(np.array(builder1.edge_bending_properties), np.array(builder2.edge_bending_properties))
101
-
102
- return TestModel
63
+ builder2.add_triangles(tris[:, 0], tris[:, 1], tris[:, 2], tri_ke, tri_ka, tri_kd, tri_drag, tri_lift)
64
+
65
+ assert_np_equal(np.array(builder1.tri_indices), np.array(builder2.tri_indices))
66
+ assert_np_equal(np.array(builder1.tri_poses), np.array(builder2.tri_poses), tol=1.0e-6)
67
+ assert_np_equal(np.array(builder1.tri_activations), np.array(builder2.tri_activations))
68
+ assert_np_equal(np.array(builder1.tri_materials), np.array(builder2.tri_materials))
69
+
70
+ def test_add_edges(self):
71
+ rng = np.random.default_rng(123)
72
+
73
+ pts = np.array(
74
+ [
75
+ [-0.00585869, 0.34189449, -1.17415233],
76
+ [-1.894547, 0.1788074, 0.9251329],
77
+ [-1.26141048, 0.16140787, 0.08823282],
78
+ [-0.08609255, -0.82722546, 0.65995427],
79
+ [0.78827592, -1.77375711, -0.55582718],
80
+ ]
81
+ )
82
+ edges = np.array([[0, 4, 3, 1], [3, 2, 4, 1]])
83
+
84
+ builder1 = ModelBuilder()
85
+ builder2 = ModelBuilder()
86
+ for pt in pts:
87
+ builder1.add_particle(wp.vec3(pt), wp.vec3(), 1.0)
88
+ builder2.add_particle(wp.vec3(pt), wp.vec3(), 1.0)
89
+
90
+ # test defaults:
91
+ for i in range(2):
92
+ builder1.add_edge(edges[i, 0], edges[i, 1], edges[i, 2], edges[i, 3])
93
+ builder2.add_edges(edges[:, 0], edges[:, 1], edges[:, 2], edges[:, 3])
94
+
95
+ # test non defaults:
96
+ rest = rng.standard_normal(size=2)
97
+ edge_ke = rng.standard_normal(size=2)
98
+ edge_kd = rng.standard_normal(size=2)
99
+ for i in range(2):
100
+ builder1.add_edge(edges[i, 0], edges[i, 1], edges[i, 2], edges[i, 3], rest[i], edge_ke[i], edge_kd[i])
101
+ builder2.add_edges(edges[:, 0], edges[:, 1], edges[:, 2], edges[:, 3], rest, edge_ke, edge_kd)
102
+
103
+ assert_np_equal(np.array(builder1.edge_indices), np.array(builder2.edge_indices))
104
+ assert_np_equal(np.array(builder1.edge_rest_angle), np.array(builder2.edge_rest_angle), tol=1.0e-4)
105
+ assert_np_equal(np.array(builder1.edge_bending_properties), np.array(builder2.edge_bending_properties))
103
106
 
104
107
 
105
108
  if __name__ == "__main__":
106
- c = register(unittest.TestCase)
109
+ wp.build.clear_kernel_cache()
107
110
  unittest.main(verbosity=2)
@@ -0,0 +1,39 @@
1
+ # Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ import unittest
9
+
10
+ import warp as wp
11
+ from warp.tests.unittest_utils import *
12
+
13
+ wp.init()
14
+
15
+
16
+ devices = get_test_devices()
17
+
18
+
19
+ class TestModuleLite(unittest.TestCase):
20
+ def test_module_lite_load(self):
21
+ # Load current module
22
+ wp.load_module()
23
+
24
+ # Load named module
25
+ wp.load_module(wp.config)
26
+
27
+ # Load named module (string)
28
+ wp.load_module(wp.config, recursive=True)
29
+
30
+ def test_module_lite_options(self):
31
+ wp.set_module_options({"max_unroll": 8})
32
+ module_options = wp.get_module_options()
33
+ self.assertIsInstance(module_options, dict)
34
+ self.assertEqual(module_options["max_unroll"], 8)
35
+
36
+
37
+ if __name__ == "__main__":
38
+ wp.build.clear_kernel_cache()
39
+ unittest.main(verbosity=2)