warp-lang 0.10.1__py3-none-win_amd64.whl → 0.11.0__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 (300) hide show
  1. warp/__init__.py +10 -4
  2. warp/__init__.pyi +1 -0
  3. warp/bin/warp-clang.dll +0 -0
  4. warp/bin/warp.dll +0 -0
  5. warp/build.py +5 -3
  6. warp/build_dll.py +29 -9
  7. warp/builtins.py +868 -507
  8. warp/codegen.py +1074 -638
  9. warp/config.py +3 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +715 -222
  12. warp/fabric.py +326 -0
  13. warp/fem/__init__.py +27 -0
  14. warp/fem/cache.py +389 -0
  15. warp/fem/dirichlet.py +181 -0
  16. warp/fem/domain.py +263 -0
  17. warp/fem/field/__init__.py +101 -0
  18. warp/fem/field/field.py +149 -0
  19. warp/fem/field/nodal_field.py +299 -0
  20. warp/fem/field/restriction.py +21 -0
  21. warp/fem/field/test.py +181 -0
  22. warp/fem/field/trial.py +183 -0
  23. warp/fem/geometry/__init__.py +19 -0
  24. warp/fem/geometry/closest_point.py +70 -0
  25. warp/fem/geometry/deformed_geometry.py +271 -0
  26. warp/fem/geometry/element.py +744 -0
  27. warp/fem/geometry/geometry.py +186 -0
  28. warp/fem/geometry/grid_2d.py +373 -0
  29. warp/fem/geometry/grid_3d.py +435 -0
  30. warp/fem/geometry/hexmesh.py +953 -0
  31. warp/fem/geometry/partition.py +376 -0
  32. warp/fem/geometry/quadmesh_2d.py +532 -0
  33. warp/fem/geometry/tetmesh.py +840 -0
  34. warp/fem/geometry/trimesh_2d.py +577 -0
  35. warp/fem/integrate.py +1616 -0
  36. warp/fem/operator.py +191 -0
  37. warp/fem/polynomial.py +213 -0
  38. warp/fem/quadrature/__init__.py +2 -0
  39. warp/fem/quadrature/pic_quadrature.py +245 -0
  40. warp/fem/quadrature/quadrature.py +294 -0
  41. warp/fem/space/__init__.py +292 -0
  42. warp/fem/space/basis_space.py +489 -0
  43. warp/fem/space/collocated_function_space.py +105 -0
  44. warp/fem/space/dof_mapper.py +236 -0
  45. warp/fem/space/function_space.py +145 -0
  46. warp/fem/space/grid_2d_function_space.py +267 -0
  47. warp/fem/space/grid_3d_function_space.py +306 -0
  48. warp/fem/space/hexmesh_function_space.py +352 -0
  49. warp/fem/space/partition.py +350 -0
  50. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  51. warp/fem/space/restriction.py +160 -0
  52. warp/fem/space/shape/__init__.py +15 -0
  53. warp/fem/space/shape/cube_shape_function.py +738 -0
  54. warp/fem/space/shape/shape_function.py +103 -0
  55. warp/fem/space/shape/square_shape_function.py +611 -0
  56. warp/fem/space/shape/tet_shape_function.py +567 -0
  57. warp/fem/space/shape/triangle_shape_function.py +429 -0
  58. warp/fem/space/tetmesh_function_space.py +292 -0
  59. warp/fem/space/topology.py +295 -0
  60. warp/fem/space/trimesh_2d_function_space.py +221 -0
  61. warp/fem/types.py +77 -0
  62. warp/fem/utils.py +495 -0
  63. warp/native/array.h +147 -44
  64. warp/native/builtin.h +122 -149
  65. warp/native/bvh.cpp +73 -325
  66. warp/native/bvh.cu +406 -23
  67. warp/native/bvh.h +34 -43
  68. warp/native/clang/clang.cpp +13 -8
  69. warp/native/crt.h +2 -0
  70. warp/native/cuda_crt.h +5 -0
  71. warp/native/cuda_util.cpp +15 -3
  72. warp/native/cuda_util.h +3 -1
  73. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  74. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  75. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  76. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  77. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  78. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  79. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  80. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  133. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  134. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  135. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  136. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  137. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  138. warp/native/cutlass_gemm.cu +5 -3
  139. warp/native/exports.h +1240 -952
  140. warp/native/fabric.h +228 -0
  141. warp/native/hashgrid.cpp +4 -4
  142. warp/native/hashgrid.h +22 -2
  143. warp/native/intersect.h +22 -7
  144. warp/native/intersect_adj.h +8 -8
  145. warp/native/intersect_tri.h +1 -1
  146. warp/native/marching.cu +157 -161
  147. warp/native/mat.h +80 -19
  148. warp/native/matnn.h +2 -2
  149. warp/native/mesh.cpp +33 -108
  150. warp/native/mesh.cu +114 -23
  151. warp/native/mesh.h +446 -46
  152. warp/native/noise.h +272 -329
  153. warp/native/quat.h +51 -8
  154. warp/native/rand.h +45 -35
  155. warp/native/range.h +6 -2
  156. warp/native/reduce.cpp +1 -1
  157. warp/native/reduce.cu +10 -12
  158. warp/native/runlength_encode.cu +6 -10
  159. warp/native/scan.cu +8 -11
  160. warp/native/sparse.cpp +4 -4
  161. warp/native/sparse.cu +164 -154
  162. warp/native/spatial.h +2 -2
  163. warp/native/temp_buffer.h +14 -30
  164. warp/native/vec.h +107 -23
  165. warp/native/volume.h +120 -0
  166. warp/native/warp.cpp +560 -30
  167. warp/native/warp.cu +431 -44
  168. warp/native/warp.h +13 -4
  169. warp/optim/__init__.py +1 -0
  170. warp/optim/linear.py +922 -0
  171. warp/optim/sgd.py +92 -0
  172. warp/render/render_opengl.py +335 -119
  173. warp/render/render_usd.py +11 -11
  174. warp/sim/__init__.py +2 -2
  175. warp/sim/articulation.py +385 -185
  176. warp/sim/collide.py +8 -0
  177. warp/sim/import_mjcf.py +297 -106
  178. warp/sim/import_urdf.py +389 -210
  179. warp/sim/import_usd.py +198 -97
  180. warp/sim/inertia.py +17 -18
  181. warp/sim/integrator_euler.py +14 -8
  182. warp/sim/integrator_xpbd.py +158 -16
  183. warp/sim/model.py +795 -291
  184. warp/sim/render.py +3 -3
  185. warp/sim/utils.py +3 -0
  186. warp/sparse.py +640 -150
  187. warp/stubs.py +606 -267
  188. warp/tape.py +61 -10
  189. warp/tests/__main__.py +3 -6
  190. warp/tests/assets/curlnoise_golden.npy +0 -0
  191. warp/tests/assets/pnoise_golden.npy +0 -0
  192. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  193. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  194. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  195. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  196. warp/tests/aux_test_unresolved_func.py +14 -0
  197. warp/tests/aux_test_unresolved_symbol.py +14 -0
  198. warp/tests/disabled_kinematics.py +239 -0
  199. warp/tests/run_coverage_serial.py +31 -0
  200. warp/tests/test_adam.py +103 -106
  201. warp/tests/test_arithmetic.py +128 -74
  202. warp/tests/test_array.py +212 -97
  203. warp/tests/test_array_reduce.py +57 -23
  204. warp/tests/test_atomic.py +64 -28
  205. warp/tests/test_bool.py +99 -0
  206. warp/tests/test_builtins_resolution.py +1292 -0
  207. warp/tests/test_bvh.py +42 -18
  208. warp/tests/test_closest_point_edge_edge.py +54 -57
  209. warp/tests/test_codegen.py +208 -130
  210. warp/tests/test_compile_consts.py +28 -20
  211. warp/tests/test_conditional.py +108 -24
  212. warp/tests/test_copy.py +10 -12
  213. warp/tests/test_ctypes.py +112 -88
  214. warp/tests/test_dense.py +21 -14
  215. warp/tests/test_devices.py +98 -0
  216. warp/tests/test_dlpack.py +75 -75
  217. warp/tests/test_examples.py +277 -0
  218. warp/tests/test_fabricarray.py +955 -0
  219. warp/tests/test_fast_math.py +15 -11
  220. warp/tests/test_fem.py +1271 -0
  221. warp/tests/test_fp16.py +53 -19
  222. warp/tests/test_func.py +187 -86
  223. warp/tests/test_generics.py +194 -49
  224. warp/tests/test_grad.py +178 -109
  225. warp/tests/test_grad_customs.py +176 -0
  226. warp/tests/test_hash_grid.py +52 -37
  227. warp/tests/test_import.py +10 -23
  228. warp/tests/test_indexedarray.py +32 -31
  229. warp/tests/test_intersect.py +18 -9
  230. warp/tests/test_large.py +141 -0
  231. warp/tests/test_launch.py +14 -41
  232. warp/tests/test_lerp.py +64 -65
  233. warp/tests/test_linear_solvers.py +154 -0
  234. warp/tests/test_lvalue.py +493 -0
  235. warp/tests/test_marching_cubes.py +12 -13
  236. warp/tests/test_mat.py +517 -2898
  237. warp/tests/test_mat_lite.py +115 -0
  238. warp/tests/test_mat_scalar_ops.py +2889 -0
  239. warp/tests/test_math.py +103 -9
  240. warp/tests/test_matmul.py +305 -69
  241. warp/tests/test_matmul_lite.py +410 -0
  242. warp/tests/test_mesh.py +71 -14
  243. warp/tests/test_mesh_query_aabb.py +41 -25
  244. warp/tests/test_mesh_query_point.py +140 -22
  245. warp/tests/test_mesh_query_ray.py +39 -22
  246. warp/tests/test_mlp.py +30 -22
  247. warp/tests/test_model.py +92 -89
  248. warp/tests/test_modules_lite.py +39 -0
  249. warp/tests/test_multigpu.py +88 -114
  250. warp/tests/test_noise.py +12 -11
  251. warp/tests/test_operators.py +16 -20
  252. warp/tests/test_options.py +11 -11
  253. warp/tests/test_pinned.py +17 -18
  254. warp/tests/test_print.py +32 -11
  255. warp/tests/test_quat.py +275 -129
  256. warp/tests/test_rand.py +18 -16
  257. warp/tests/test_reload.py +38 -34
  258. warp/tests/test_rounding.py +50 -43
  259. warp/tests/test_runlength_encode.py +168 -20
  260. warp/tests/test_smoothstep.py +9 -11
  261. warp/tests/test_snippet.py +143 -0
  262. warp/tests/test_sparse.py +261 -63
  263. warp/tests/test_spatial.py +276 -243
  264. warp/tests/test_streams.py +110 -85
  265. warp/tests/test_struct.py +268 -63
  266. warp/tests/test_tape.py +39 -21
  267. warp/tests/test_torch.py +118 -89
  268. warp/tests/test_transient_module.py +12 -13
  269. warp/tests/test_types.py +614 -0
  270. warp/tests/test_utils.py +494 -0
  271. warp/tests/test_vec.py +354 -2050
  272. warp/tests/test_vec_lite.py +73 -0
  273. warp/tests/test_vec_scalar_ops.py +2099 -0
  274. warp/tests/test_volume.py +457 -293
  275. warp/tests/test_volume_write.py +124 -134
  276. warp/tests/unittest_serial.py +35 -0
  277. warp/tests/unittest_suites.py +341 -0
  278. warp/tests/unittest_utils.py +568 -0
  279. warp/tests/unused_test_misc.py +71 -0
  280. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  281. warp/thirdparty/appdirs.py +36 -45
  282. warp/thirdparty/unittest_parallel.py +549 -0
  283. warp/torch.py +9 -6
  284. warp/types.py +1089 -366
  285. warp/utils.py +93 -387
  286. warp_lang-0.11.0.dist-info/METADATA +238 -0
  287. warp_lang-0.11.0.dist-info/RECORD +332 -0
  288. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  289. warp/tests/test_all.py +0 -219
  290. warp/tests/test_array_scan.py +0 -60
  291. warp/tests/test_base.py +0 -208
  292. warp/tests/test_unresolved_func.py +0 -7
  293. warp/tests/test_unresolved_symbol.py +0 -7
  294. warp_lang-0.10.1.dist-info/METADATA +0 -21
  295. warp_lang-0.10.1.dist-info/RECORD +0 -188
  296. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  297. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  298. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  299. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/LICENSE.md +0 -0
  300. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.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,120 @@ 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()
583
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
+
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
+ def test_mesh_query_point_codegen_adjoints_with_select(test, device):
660
+ def kernel_fn(
661
+ mesh: wp.uint64,
662
+ ):
663
+ v = wp.vec3(0.0, 0.0, 0.0)
664
+ d = 1e-6
665
+
666
+ if True:
667
+ query_1 = wp.mesh_query_point(mesh, v, d)
668
+ query_2 = wp.mesh_query_point_no_sign(mesh, v, d)
669
+ query_3 = wp.mesh_query_furthest_point_no_sign(mesh, v, d)
670
+ query_4 = wp.mesh_query_point_sign_normal(mesh, v, d)
671
+ query_5 = wp.mesh_query_point_sign_winding_number(mesh, v, d)
672
+ else:
673
+ query_1 = wp.mesh_query_point(mesh, v, d)
674
+ query_2 = wp.mesh_query_point_no_sign(mesh, v, d)
675
+ query_3 = wp.mesh_query_furthest_point_no_sign(mesh, v, d)
676
+ query_4 = wp.mesh_query_point_sign_normal(mesh, v, d)
677
+ query_5 = wp.mesh_query_point_sign_winding_number(mesh, v, d)
678
+
679
+ wp.Kernel(func=kernel_fn)
680
+
681
+
682
+ devices = get_test_devices()
683
+
684
+
685
+ class TestMeshQueryPoint(unittest.TestCase):
686
+ pass
687
+
688
+
689
+ add_function_test(TestMeshQueryPoint, "test_mesh_query_point", test_mesh_query_point, devices=devices)
690
+ add_function_test(TestMeshQueryPoint, "test_mesh_query_furthest_point", test_mesh_query_furthest_point, devices=devices)
691
+ add_function_test(TestMeshQueryPoint, "test_adj_mesh_query_point", test_adj_mesh_query_point, devices=devices)
692
+ add_function_test(
693
+ TestMeshQueryPoint,
694
+ "test_mesh_query_point_codegen_adjoints_with_select",
695
+ test_mesh_query_point_codegen_adjoints_with_select,
696
+ devices=devices,
697
+ )
698
+
699
+
700
+ if __name__ == "__main__":
701
+ wp.build.clear_kernel_cache()
584
702
  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
 
@@ -66,9 +64,18 @@ def mesh_query_ray_loss(
66
64
  l = q[0]
67
65
  loss[tid] = l
68
66
 
67
+ query = wp.mesh_query_ray(mesh, p, D, max_t)
68
+ wp.expect_eq(query.t, t)
69
+ wp.expect_eq(query.u, bary_u)
70
+ wp.expect_eq(query.v, bary_v)
71
+ wp.expect_eq(query.sign, sign)
72
+ wp.expect_eq(query.normal, normal)
73
+ wp.expect_eq(query.face, face_index)
74
+
69
75
 
76
+ @unittest.skipUnless(USD_AVAILABLE, "Requires usd-core")
70
77
  def test_mesh_query_ray_grad(test, device):
71
- from pxr import Usd, UsdGeom, Gf, Sdf
78
+ from pxr import Usd, UsdGeom
72
79
 
73
80
  # test tri
74
81
  # print("Testing Single Triangle")
@@ -210,7 +217,7 @@ def raycast_kernel(
210
217
  sign = float(0.0) # hit face sign
211
218
  n = wp.vec3() # hit face normal
212
219
  f = int(0) # hit face index
213
- max_dist = 1e6 # max raycast disance
220
+ max_dist = 1e6 # max raycast distance
214
221
 
215
222
  # ray cast against the mesh
216
223
  tid = wp.tid()
@@ -259,28 +266,38 @@ def test_mesh_query_ray_edge(test, device):
259
266
  test.assertEqual(counts.numpy()[0], n)
260
267
 
261
268
 
262
- def register(parent):
263
- devices = get_test_devices()
269
+ def test_mesh_query_codegen_adjoints_with_select(test, device):
270
+ def kernel_fn(
271
+ mesh: wp.uint64,
272
+ ):
273
+ v = wp.vec3(0.0, 0.0, 0.0)
274
+ d = 1e-6
275
+
276
+ if True:
277
+ query = wp.mesh_query_ray(mesh, v, v, d)
278
+ else:
279
+ query = wp.mesh_query_ray(mesh, v, v, d)
280
+
281
+ wp.Kernel(func=kernel_fn)
264
282
 
265
- class TestMeshQueryRay(parent):
266
- pass
267
283
 
268
- add_function_test(TestMeshQueryRay, "test_mesh_query_ray_edge", test_mesh_query_ray_edge, devices=devices)
284
+ devices = get_test_devices()
269
285
 
270
- # USD import failures should not count as a test failure
271
- try:
272
- from pxr import Usd, UsdGeom
273
286
 
274
- have_usd = True
275
- except:
276
- have_usd = False
287
+ class TestMeshQueryRay(unittest.TestCase):
288
+ pass
277
289
 
278
- if have_usd:
279
- add_function_test(TestMeshQueryRay, "test_mesh_query_ray_grad", test_mesh_query_ray_grad, devices=devices)
280
290
 
281
- return TestMeshQueryRay
291
+ add_function_test(TestMeshQueryRay, "test_mesh_query_ray_edge", test_mesh_query_ray_edge, devices=devices)
292
+ add_function_test(TestMeshQueryRay, "test_mesh_query_ray_grad", test_mesh_query_ray_grad, devices=devices)
293
+ add_function_test(
294
+ TestMeshQueryRay,
295
+ "test_mesh_query_codegen_adjoints_with_select",
296
+ test_mesh_query_codegen_adjoints_with_select,
297
+ devices=devices,
298
+ )
282
299
 
283
300
 
284
301
  if __name__ == "__main__":
285
- c = register(unittest.TestCase)
302
+ wp.build.clear_kernel_cache()
286
303
  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)