warp-lang 1.0.0b2__py3-none-manylinux2014_x86_64.whl → 1.0.0b6__py3-none-manylinux2014_x86_64.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.
- docs/conf.py +17 -5
- examples/env/env_ant.py +1 -1
- examples/env/env_cartpole.py +1 -1
- examples/env/env_humanoid.py +1 -1
- examples/env/env_usd.py +4 -1
- examples/env/environment.py +8 -9
- examples/example_dem.py +34 -33
- examples/example_diffray.py +364 -337
- examples/example_fluid.py +32 -23
- examples/example_jacobian_ik.py +97 -93
- examples/example_marching_cubes.py +6 -16
- examples/example_mesh.py +6 -16
- examples/example_mesh_intersect.py +16 -14
- examples/example_nvdb.py +14 -16
- examples/example_raycast.py +14 -13
- examples/example_raymarch.py +16 -23
- examples/example_render_opengl.py +19 -10
- examples/example_sim_cartpole.py +82 -78
- examples/example_sim_cloth.py +45 -48
- examples/example_sim_fk_grad.py +51 -44
- examples/example_sim_fk_grad_torch.py +47 -40
- examples/example_sim_grad_bounce.py +108 -133
- examples/example_sim_grad_cloth.py +99 -113
- examples/example_sim_granular.py +5 -6
- examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
- examples/example_sim_neo_hookean.py +51 -55
- examples/example_sim_particle_chain.py +4 -4
- examples/example_sim_quadruped.py +126 -81
- examples/example_sim_rigid_chain.py +54 -61
- examples/example_sim_rigid_contact.py +66 -70
- examples/example_sim_rigid_fem.py +3 -3
- examples/example_sim_rigid_force.py +1 -1
- examples/example_sim_rigid_gyroscopic.py +3 -4
- examples/example_sim_rigid_kinematics.py +28 -39
- examples/example_sim_trajopt.py +112 -110
- examples/example_sph.py +9 -8
- examples/example_wave.py +7 -7
- examples/fem/bsr_utils.py +30 -17
- examples/fem/example_apic_fluid.py +85 -69
- examples/fem/example_convection_diffusion.py +97 -93
- examples/fem/example_convection_diffusion_dg.py +142 -149
- examples/fem/example_convection_diffusion_dg0.py +141 -136
- examples/fem/example_deformed_geometry.py +146 -0
- examples/fem/example_diffusion.py +115 -84
- examples/fem/example_diffusion_3d.py +116 -86
- examples/fem/example_diffusion_mgpu.py +102 -79
- examples/fem/example_mixed_elasticity.py +139 -100
- examples/fem/example_navier_stokes.py +175 -162
- examples/fem/example_stokes.py +143 -111
- examples/fem/example_stokes_transfer.py +186 -157
- examples/fem/mesh_utils.py +59 -97
- examples/fem/plot_utils.py +138 -17
- tools/ci/publishing/build_nodes_info.py +54 -0
- warp/__init__.py +4 -3
- warp/__init__.pyi +1 -0
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +5 -3
- warp/build_dll.py +29 -9
- warp/builtins.py +836 -492
- warp/codegen.py +864 -553
- warp/config.py +3 -1
- warp/context.py +389 -172
- warp/fem/__init__.py +24 -6
- warp/fem/cache.py +318 -25
- warp/fem/dirichlet.py +7 -3
- warp/fem/domain.py +14 -0
- warp/fem/field/__init__.py +30 -38
- warp/fem/field/field.py +149 -0
- warp/fem/field/nodal_field.py +244 -138
- warp/fem/field/restriction.py +8 -6
- warp/fem/field/test.py +127 -59
- warp/fem/field/trial.py +117 -60
- warp/fem/geometry/__init__.py +5 -1
- warp/fem/geometry/deformed_geometry.py +271 -0
- warp/fem/geometry/element.py +24 -1
- warp/fem/geometry/geometry.py +86 -14
- warp/fem/geometry/grid_2d.py +112 -54
- warp/fem/geometry/grid_3d.py +134 -65
- warp/fem/geometry/hexmesh.py +953 -0
- warp/fem/geometry/partition.py +85 -33
- warp/fem/geometry/quadmesh_2d.py +532 -0
- warp/fem/geometry/tetmesh.py +451 -115
- warp/fem/geometry/trimesh_2d.py +197 -92
- warp/fem/integrate.py +534 -268
- warp/fem/operator.py +58 -31
- warp/fem/polynomial.py +11 -0
- warp/fem/quadrature/__init__.py +1 -1
- warp/fem/quadrature/pic_quadrature.py +150 -58
- warp/fem/quadrature/quadrature.py +209 -57
- warp/fem/space/__init__.py +230 -53
- warp/fem/space/basis_space.py +489 -0
- warp/fem/space/collocated_function_space.py +105 -0
- warp/fem/space/dof_mapper.py +49 -2
- warp/fem/space/function_space.py +90 -39
- warp/fem/space/grid_2d_function_space.py +149 -496
- warp/fem/space/grid_3d_function_space.py +173 -538
- warp/fem/space/hexmesh_function_space.py +352 -0
- warp/fem/space/partition.py +129 -76
- warp/fem/space/quadmesh_2d_function_space.py +369 -0
- warp/fem/space/restriction.py +46 -34
- warp/fem/space/shape/__init__.py +15 -0
- warp/fem/space/shape/cube_shape_function.py +738 -0
- warp/fem/space/shape/shape_function.py +103 -0
- warp/fem/space/shape/square_shape_function.py +611 -0
- warp/fem/space/shape/tet_shape_function.py +567 -0
- warp/fem/space/shape/triangle_shape_function.py +429 -0
- warp/fem/space/tetmesh_function_space.py +132 -1039
- warp/fem/space/topology.py +295 -0
- warp/fem/space/trimesh_2d_function_space.py +104 -742
- warp/fem/types.py +13 -11
- warp/fem/utils.py +335 -60
- warp/native/array.h +120 -34
- warp/native/builtin.h +101 -72
- warp/native/bvh.cpp +73 -325
- warp/native/bvh.cu +406 -23
- warp/native/bvh.h +22 -40
- warp/native/clang/clang.cpp +1 -0
- warp/native/crt.h +2 -0
- warp/native/cuda_util.cpp +8 -3
- warp/native/cuda_util.h +1 -0
- warp/native/exports.h +1522 -1243
- warp/native/intersect.h +19 -4
- warp/native/intersect_adj.h +8 -8
- warp/native/mat.h +76 -17
- warp/native/mesh.cpp +33 -108
- warp/native/mesh.cu +114 -18
- warp/native/mesh.h +395 -40
- warp/native/noise.h +272 -329
- warp/native/quat.h +51 -8
- warp/native/rand.h +44 -34
- warp/native/reduce.cpp +1 -1
- warp/native/sparse.cpp +4 -4
- warp/native/sparse.cu +163 -155
- warp/native/spatial.h +2 -2
- warp/native/temp_buffer.h +18 -14
- warp/native/vec.h +103 -21
- warp/native/warp.cpp +2 -1
- warp/native/warp.cu +28 -3
- warp/native/warp.h +4 -3
- warp/render/render_opengl.py +261 -109
- warp/sim/__init__.py +1 -2
- warp/sim/articulation.py +385 -185
- warp/sim/import_mjcf.py +59 -48
- warp/sim/import_urdf.py +15 -15
- warp/sim/import_usd.py +174 -102
- warp/sim/inertia.py +17 -18
- warp/sim/integrator_xpbd.py +4 -3
- warp/sim/model.py +330 -250
- warp/sim/render.py +1 -1
- warp/sparse.py +625 -152
- warp/stubs.py +341 -309
- warp/tape.py +9 -6
- warp/tests/__main__.py +3 -6
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
- warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
- warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
- warp/tests/aux_test_unresolved_func.py +14 -0
- warp/tests/aux_test_unresolved_symbol.py +14 -0
- warp/tests/disabled_kinematics.py +239 -0
- warp/tests/run_coverage_serial.py +31 -0
- warp/tests/test_adam.py +103 -106
- warp/tests/test_arithmetic.py +94 -74
- warp/tests/test_array.py +82 -101
- warp/tests/test_array_reduce.py +57 -23
- warp/tests/test_atomic.py +64 -28
- warp/tests/test_bool.py +22 -12
- warp/tests/test_builtins_resolution.py +1292 -0
- warp/tests/test_bvh.py +18 -18
- warp/tests/test_closest_point_edge_edge.py +54 -57
- warp/tests/test_codegen.py +165 -134
- warp/tests/test_compile_consts.py +28 -20
- warp/tests/test_conditional.py +108 -24
- warp/tests/test_copy.py +10 -12
- warp/tests/test_ctypes.py +112 -88
- warp/tests/test_dense.py +21 -14
- warp/tests/test_devices.py +98 -0
- warp/tests/test_dlpack.py +75 -75
- warp/tests/test_examples.py +237 -0
- warp/tests/test_fabricarray.py +22 -24
- warp/tests/test_fast_math.py +15 -11
- warp/tests/test_fem.py +1034 -124
- warp/tests/test_fp16.py +23 -16
- warp/tests/test_func.py +187 -86
- warp/tests/test_generics.py +194 -49
- warp/tests/test_grad.py +123 -181
- warp/tests/test_grad_customs.py +176 -0
- warp/tests/test_hash_grid.py +35 -34
- warp/tests/test_import.py +10 -23
- warp/tests/test_indexedarray.py +24 -25
- warp/tests/test_intersect.py +18 -9
- warp/tests/test_large.py +141 -0
- warp/tests/test_launch.py +14 -41
- warp/tests/test_lerp.py +64 -65
- warp/tests/test_lvalue.py +493 -0
- warp/tests/test_marching_cubes.py +12 -13
- warp/tests/test_mat.py +517 -2898
- warp/tests/test_mat_lite.py +115 -0
- warp/tests/test_mat_scalar_ops.py +2889 -0
- warp/tests/test_math.py +103 -9
- warp/tests/test_matmul.py +304 -69
- warp/tests/test_matmul_lite.py +410 -0
- warp/tests/test_mesh.py +60 -22
- warp/tests/test_mesh_query_aabb.py +21 -25
- warp/tests/test_mesh_query_point.py +111 -22
- warp/tests/test_mesh_query_ray.py +12 -24
- warp/tests/test_mlp.py +30 -22
- warp/tests/test_model.py +92 -89
- warp/tests/test_modules_lite.py +39 -0
- warp/tests/test_multigpu.py +88 -114
- warp/tests/test_noise.py +12 -11
- warp/tests/test_operators.py +16 -20
- warp/tests/test_options.py +11 -11
- warp/tests/test_pinned.py +17 -18
- warp/tests/test_print.py +32 -11
- warp/tests/test_quat.py +275 -129
- warp/tests/test_rand.py +18 -16
- warp/tests/test_reload.py +38 -34
- warp/tests/test_rounding.py +50 -43
- warp/tests/test_runlength_encode.py +168 -20
- warp/tests/test_smoothstep.py +9 -11
- warp/tests/test_snippet.py +143 -0
- warp/tests/test_sparse.py +261 -63
- warp/tests/test_spatial.py +276 -243
- warp/tests/test_streams.py +110 -85
- warp/tests/test_struct.py +268 -63
- warp/tests/test_tape.py +39 -21
- warp/tests/test_torch.py +90 -86
- warp/tests/test_transient_module.py +10 -12
- warp/tests/test_types.py +363 -0
- warp/tests/test_utils.py +451 -0
- warp/tests/test_vec.py +354 -2050
- warp/tests/test_vec_lite.py +73 -0
- warp/tests/test_vec_scalar_ops.py +2099 -0
- warp/tests/test_volume.py +418 -376
- warp/tests/test_volume_write.py +124 -134
- warp/tests/unittest_serial.py +35 -0
- warp/tests/unittest_suites.py +291 -0
- warp/tests/unittest_utils.py +342 -0
- warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
- warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
- warp/thirdparty/appdirs.py +36 -45
- warp/thirdparty/unittest_parallel.py +589 -0
- warp/types.py +622 -211
- warp/utils.py +54 -393
- warp_lang-1.0.0b6.dist-info/METADATA +238 -0
- warp_lang-1.0.0b6.dist-info/RECORD +409 -0
- {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
- examples/example_cache_management.py +0 -40
- examples/example_multigpu.py +0 -54
- examples/example_struct.py +0 -65
- examples/fem/example_stokes_transfer_3d.py +0 -210
- warp/fem/field/discrete_field.py +0 -80
- warp/fem/space/nodal_function_space.py +0 -233
- warp/tests/test_all.py +0 -223
- warp/tests/test_array_scan.py +0 -60
- warp/tests/test_base.py +0 -208
- warp/tests/test_unresolved_func.py +0 -7
- warp/tests/test_unresolved_symbol.py +0 -7
- warp_lang-1.0.0b2.dist-info/METADATA +0 -26
- warp_lang-1.0.0b2.dist-info/RECORD +0 -378
- /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
- /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
- /warp/tests/{test_square.py → aux_test_square.py} +0 -0
- {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
- {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
|
|
13
|
-
from warp.tests.test_base import *
|
|
11
|
+
import numpy as np
|
|
14
12
|
|
|
15
|
-
|
|
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 +
|
|
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
|
-
|
|
561
|
-
|
|
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
|
-
|
|
564
|
-
pass
|
|
590
|
+
p = query_points[tid]
|
|
565
591
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
592
|
+
face = int(0)
|
|
593
|
+
bary_u = float(0.0)
|
|
594
|
+
bary_v = float(0.0)
|
|
569
595
|
|
|
570
|
-
|
|
571
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
582
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
275
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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(
|
|
46
|
-
bias = wp.array(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
216
|
-
bias = wp.array(
|
|
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(
|
|
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(
|
|
229
|
-
bias = wp.array(
|
|
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(
|
|
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
|
-
|
|
255
|
-
|
|
263
|
+
devices = get_test_devices()
|
|
264
|
+
|
|
256
265
|
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
]
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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)
|