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
@@ -0,0 +1,363 @@
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
+ from warp.tests.unittest_utils import *
11
+
12
+ wp.init()
13
+
14
+
15
+ devices = get_test_devices()
16
+
17
+
18
+ class TestTypes(unittest.TestCase):
19
+ def test_constant(self):
20
+ const = wp.constant(123)
21
+ self.assertEqual(const, 123)
22
+
23
+ const = wp.constant(1.25)
24
+ self.assertEqual(const, 1.25)
25
+
26
+ const = wp.constant(True)
27
+ self.assertEqual(const, True)
28
+
29
+ const = wp.constant(wp.float16(1.25))
30
+ self.assertEqual(const.value, 1.25)
31
+
32
+ const = wp.constant(wp.int16(123))
33
+ self.assertEqual(const.value, 123)
34
+
35
+ const = wp.constant(wp.vec3i(1, 2, 3))
36
+ self.assertEqual(const, wp.vec3i(1, 2, 3))
37
+
38
+ def test_constant_error_invalid_type(self):
39
+ with self.assertRaisesRegex(
40
+ RuntimeError,
41
+ r"Invalid constant type: <class 'tuple'>$",
42
+ ):
43
+ wp.constant((1, 2, 3))
44
+
45
+ def test_vector(self):
46
+ for dtype in tuple(wp.types.scalar_types) + (int, float):
47
+
48
+ def make_scalar(x):
49
+ # Cast to the correct integer type to simulate wrapping.
50
+ if dtype in wp.types.int_types:
51
+ return dtype._type_(x).value
52
+
53
+ return x
54
+
55
+ def make_vec(*args):
56
+ if dtype in wp.types.int_types:
57
+ # Cast to the correct integer type to simulate wrapping.
58
+ return tuple(dtype._type_(x).value for x in args)
59
+
60
+ return args
61
+
62
+ vec3_cls = wp.vec(3, dtype)
63
+ vec4_cls = wp.vec(4, dtype)
64
+
65
+ v = vec4_cls(1, 2, 3, 4)
66
+ self.assertEqual(v[0], make_scalar(1))
67
+ self.assertEqual(v.x, make_scalar(1))
68
+ self.assertEqual(v.y, make_scalar(2))
69
+ self.assertEqual(v.z, make_scalar(3))
70
+ self.assertEqual(v.w, make_scalar(4))
71
+ self.assertSequenceEqual(v[0:2], make_vec(1, 2))
72
+ self.assertSequenceEqual(v, make_vec(1, 2, 3, 4))
73
+
74
+ v[0] = -1
75
+ self.assertEqual(v[0], make_scalar(-1))
76
+ self.assertEqual(v.x, make_scalar(-1))
77
+ self.assertEqual(v.y, make_scalar(2))
78
+ self.assertEqual(v.z, make_scalar(3))
79
+ self.assertEqual(v.w, make_scalar(4))
80
+ self.assertSequenceEqual(v[0:2], make_vec(-1, 2))
81
+ self.assertSequenceEqual(v, make_vec(-1, 2, 3, 4))
82
+
83
+ v[1:3] = (-2, -3)
84
+ self.assertEqual(v[0], make_scalar(-1))
85
+ self.assertEqual(v.x, make_scalar(-1))
86
+ self.assertEqual(v.y, make_scalar(-2))
87
+ self.assertEqual(v.z, make_scalar(-3))
88
+ self.assertEqual(v.w, make_scalar(4))
89
+ self.assertSequenceEqual(v[0:2], make_vec(-1, -2))
90
+ self.assertSequenceEqual(v, make_vec(-1, -2, -3, 4))
91
+
92
+ v.x = 1
93
+ self.assertEqual(v[0], make_scalar(1))
94
+ self.assertEqual(v.x, make_scalar(1))
95
+ self.assertEqual(v.y, make_scalar(-2))
96
+ self.assertEqual(v.z, make_scalar(-3))
97
+ self.assertEqual(v.w, make_scalar(4))
98
+ self.assertSequenceEqual(v[0:2], make_vec(1, -2))
99
+ self.assertSequenceEqual(v, make_vec(1, -2, -3, 4))
100
+
101
+ v = vec3_cls(2, 4, 6)
102
+ self.assertSequenceEqual(+v, make_vec(2, 4, 6))
103
+ self.assertSequenceEqual(-v, make_vec(-2, -4, -6))
104
+ self.assertSequenceEqual(v + vec3_cls(1, 1, 1), make_vec(3, 5, 7))
105
+ self.assertSequenceEqual(v - vec3_cls(1, 1, 1), make_vec(1, 3, 5))
106
+ self.assertSequenceEqual(v * dtype(2), make_vec(4, 8, 12))
107
+ self.assertSequenceEqual(dtype(2) * v, make_vec(4, 8, 12))
108
+ self.assertSequenceEqual(v / dtype(2), make_vec(1, 2, 3))
109
+ self.assertSequenceEqual(dtype(12) / v, make_vec(6, 3, 2))
110
+
111
+ self.assertTrue(v != vec3_cls(1, 2, 3))
112
+ self.assertEqual(str(v), "[{}]".format(", ".join(str(x) for x in v)))
113
+
114
+ # Check added purely for coverage reasons but is this really a desired
115
+ # behaviour? Not allowing to define new attributes using systems like
116
+ # `__slots__` could help improving memory usage.
117
+ v.foo = 123
118
+ self.assertEqual(v.foo, 123)
119
+
120
+ def test_vector_error_invalid_arg_count(self):
121
+ with self.assertRaisesRegex(
122
+ ValueError,
123
+ r"Invalid number of arguments in vector constructor, expected 3 elements, got 2$",
124
+ ):
125
+ wp.vec3(1, 2)
126
+
127
+ def test_vector_error_invalid_ptr(self):
128
+ with self.assertRaisesRegex(
129
+ RuntimeError,
130
+ r"NULL pointer exception",
131
+ ):
132
+ wp.vec3.from_ptr(0)
133
+
134
+ def test_vector_error_invalid_get_item_key(self):
135
+ v = wp.vec3(1, 2, 3)
136
+
137
+ with self.assertRaisesRegex(
138
+ KeyError,
139
+ r"Invalid key None, expected int or slice",
140
+ ):
141
+ v[None]
142
+
143
+ def test_vector_error_invalid_set_item_key(self):
144
+ v = wp.vec3(1, 2, 3)
145
+ with self.assertRaisesRegex(
146
+ KeyError,
147
+ r"Invalid key None, expected int or slice",
148
+ ):
149
+ v[None] = 0
150
+
151
+ def test_matrix(self):
152
+ for dtype in tuple(wp.types.float_types) + (float,):
153
+
154
+ def make_scalar(x):
155
+ # Cast to the correct integer type to simulate wrapping.
156
+ if dtype in wp.types.int_types:
157
+ return dtype._type_(x).value
158
+
159
+ return x
160
+
161
+ def make_vec(*args):
162
+ if dtype in wp.types.int_types:
163
+ # Cast to the correct integer type to simulate wrapping.
164
+ return tuple(dtype._type_(x).value for x in args)
165
+
166
+ return args
167
+
168
+ def make_mat(*args):
169
+ if dtype in wp.types.int_types:
170
+ # Cast to the correct integer type to simulate wrapping.
171
+ return tuple(tuple(dtype._type_(x).value for x in row) for row in args)
172
+
173
+ return args
174
+
175
+ mat22_cls = wp.mat((2, 2), dtype)
176
+ mat33_cls = wp.mat((3, 3), dtype)
177
+ vec2_cls = wp.vec(2, dtype)
178
+
179
+ m = mat33_cls(((1, 2, 3), (4, 5, 6), (7, 8, 9)))
180
+ self.assertEqual(m[0][0], make_scalar(1))
181
+ self.assertEqual(m[0][1], make_scalar(2))
182
+ self.assertEqual(m[0][2], make_scalar(3))
183
+ self.assertEqual(m[1][0], make_scalar(4))
184
+ self.assertEqual(m[1][1], make_scalar(5))
185
+ self.assertEqual(m[1][2], make_scalar(6))
186
+ self.assertEqual(m[2][0], make_scalar(7))
187
+ self.assertEqual(m[2][1], make_scalar(8))
188
+ self.assertEqual(m[2][2], make_scalar(9))
189
+ self.assertEqual(m[0, 0], make_scalar(1))
190
+ self.assertEqual(m[0, 1], make_scalar(2))
191
+ self.assertEqual(m[0, 2], make_scalar(3))
192
+ self.assertEqual(m[1, 0], make_scalar(4))
193
+ self.assertEqual(m[1, 1], make_scalar(5))
194
+ self.assertEqual(m[1, 2], make_scalar(6))
195
+ self.assertEqual(m[2, 0], make_scalar(7))
196
+ self.assertEqual(m[2, 1], make_scalar(8))
197
+ self.assertEqual(m[2, 2], make_scalar(9))
198
+ self.assertSequenceEqual(m[0], make_vec(1, 2, 3))
199
+ self.assertSequenceEqual(m[1], make_vec(4, 5, 6))
200
+ self.assertSequenceEqual(m[2], make_vec(7, 8, 9))
201
+ self.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
202
+ self.assertSequenceEqual(m[1][0:2], make_vec(4, 5))
203
+ self.assertSequenceEqual(m[2][0:3], make_vec(7, 8, 9))
204
+ # self.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
205
+ # self.assertSequenceEqual(m[1, 0:2], make_vec(4, 5))
206
+ # self.assertSequenceEqual(m[2, 0:3], make_vec(7, 8, 9))
207
+ self.assertSequenceEqual(m, make_mat((1, 2, 3), (4, 5, 6), (7, 8, 9)))
208
+
209
+ m[1, 0] = -4
210
+ self.assertEqual(m[0][0], make_scalar(1))
211
+ self.assertEqual(m[0][1], make_scalar(2))
212
+ self.assertEqual(m[0][2], make_scalar(3))
213
+ self.assertEqual(m[1][0], make_scalar(-4))
214
+ self.assertEqual(m[1][1], make_scalar(5))
215
+ self.assertEqual(m[1][2], make_scalar(6))
216
+ self.assertEqual(m[2][0], make_scalar(7))
217
+ self.assertEqual(m[2][1], make_scalar(8))
218
+ self.assertEqual(m[2][2], make_scalar(9))
219
+ self.assertEqual(m[0, 0], make_scalar(1))
220
+ self.assertEqual(m[0, 1], make_scalar(2))
221
+ self.assertEqual(m[0, 2], make_scalar(3))
222
+ self.assertEqual(m[1, 0], make_scalar(-4))
223
+ self.assertEqual(m[1, 1], make_scalar(5))
224
+ self.assertEqual(m[1, 2], make_scalar(6))
225
+ self.assertEqual(m[2, 0], make_scalar(7))
226
+ self.assertEqual(m[2, 1], make_scalar(8))
227
+ self.assertEqual(m[2, 2], make_scalar(9))
228
+ self.assertSequenceEqual(m[0], make_vec(1, 2, 3))
229
+ self.assertSequenceEqual(m[1], make_vec(-4, 5, 6))
230
+ self.assertSequenceEqual(m[2], make_vec(7, 8, 9))
231
+ self.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
232
+ self.assertSequenceEqual(m[1][0:2], make_vec(-4, 5))
233
+ self.assertSequenceEqual(m[2][0:3], make_vec(7, 8, 9))
234
+ # self.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
235
+ # self.assertSequenceEqual(m[1, 0:2], make_vec(-4, 5))
236
+ # self.assertSequenceEqual(m[2, 0:3], make_vec(7, 8, 9))
237
+ self.assertSequenceEqual(m, make_mat((1, 2, 3), (-4, 5, 6), (7, 8, 9)))
238
+
239
+ m[2] = (-7, 8, -9)
240
+ self.assertEqual(m[0][0], make_scalar(1))
241
+ self.assertEqual(m[0][1], make_scalar(2))
242
+ self.assertEqual(m[0][2], make_scalar(3))
243
+ self.assertEqual(m[1][0], make_scalar(-4))
244
+ self.assertEqual(m[1][1], make_scalar(5))
245
+ self.assertEqual(m[1][2], make_scalar(6))
246
+ self.assertEqual(m[2][0], make_scalar(-7))
247
+ self.assertEqual(m[2][1], make_scalar(8))
248
+ self.assertEqual(m[2][2], make_scalar(-9))
249
+ self.assertEqual(m[0, 0], make_scalar(1))
250
+ self.assertEqual(m[0, 1], make_scalar(2))
251
+ self.assertEqual(m[0, 2], make_scalar(3))
252
+ self.assertEqual(m[1, 0], make_scalar(-4))
253
+ self.assertEqual(m[1, 1], make_scalar(5))
254
+ self.assertEqual(m[1, 2], make_scalar(6))
255
+ self.assertEqual(m[2, 0], make_scalar(-7))
256
+ self.assertEqual(m[2, 1], make_scalar(8))
257
+ self.assertEqual(m[2, 2], make_scalar(-9))
258
+ self.assertSequenceEqual(m[0], make_vec(1, 2, 3))
259
+ self.assertSequenceEqual(m[1], make_vec(-4, 5, 6))
260
+ self.assertSequenceEqual(m[2], make_vec(-7, 8, -9))
261
+ self.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
262
+ self.assertSequenceEqual(m[1][0:2], make_vec(-4, 5))
263
+ self.assertSequenceEqual(m[2][0:3], make_vec(-7, 8, -9))
264
+ # self.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
265
+ # self.assertSequenceEqual(m[1, 0:2], make_vec(-4, 5))
266
+ # self.assertSequenceEqual(m[2, 0:3], make_vec(-7, 8, -9))
267
+ self.assertSequenceEqual(m, make_mat((1, 2, 3), (-4, 5, 6), (-7, 8, -9)))
268
+
269
+ m = mat22_cls(2, 4, 6, 8)
270
+ self.assertSequenceEqual(+m, make_mat((2, 4), (6, 8)))
271
+ self.assertSequenceEqual(-m, make_mat((-2, -4), (-6, -8)))
272
+ self.assertSequenceEqual(m + mat22_cls(1, 1, 1, 1), make_mat((3, 5), (7, 9)))
273
+ self.assertSequenceEqual(m - mat22_cls(1, 1, 1, 1), make_mat((1, 3), (5, 7)))
274
+ self.assertSequenceEqual(m * dtype(2), make_mat((4, 8), (12, 16)))
275
+ self.assertSequenceEqual(dtype(2) * m, make_mat((4, 8), (12, 16)))
276
+ self.assertSequenceEqual(m / dtype(2), make_mat((1, 2), (3, 4)))
277
+ self.assertSequenceEqual(dtype(24) / m, make_mat((12, 6), (4, 3)))
278
+
279
+ self.assertSequenceEqual(m * vec2_cls(1, 2), make_vec(10, 22))
280
+ self.assertSequenceEqual(m @ vec2_cls(1, 2), make_vec(10, 22))
281
+ self.assertSequenceEqual(vec2_cls(1, 2) * m, make_vec(14, 20))
282
+ self.assertSequenceEqual(vec2_cls(1, 2) @ m, make_vec(14, 20))
283
+
284
+ self.assertTrue(m != mat22_cls(1, 2, 3, 4))
285
+ self.assertEqual(
286
+ str(m),
287
+ "[{}]".format(",\n ".join("[{}]".format(", ".join(str(y) for y in m[x])) for x in range(m._shape_[0]))),
288
+ )
289
+
290
+ # Check added purely for coverage reasons but is this really a desired
291
+ # behaviour? Not allowing to define new attributes using systems like
292
+ # `__slots__` could help improving memory usage.
293
+ m.foo = 123
294
+ self.assertEqual(m.foo, 123)
295
+
296
+ def test_matrix_error_invalid_arg_count(self):
297
+ with self.assertRaisesRegex(
298
+ ValueError,
299
+ r"Invalid number of arguments in matrix constructor, expected 4 elements, got 3$",
300
+ ):
301
+ wp.mat22(1, 2, 3)
302
+
303
+ def test_matrix_error_invalid_row_count(self):
304
+ with self.assertRaisesRegex(
305
+ TypeError,
306
+ r"Invalid argument in matrix constructor, expected row of length 2, got \(1, 2, 3\)$",
307
+ ):
308
+ wp.mat22((1, 2, 3), (3, 4, 5))
309
+
310
+ def test_matrix_error_invalid_ptr(self):
311
+ with self.assertRaisesRegex(
312
+ RuntimeError,
313
+ r"NULL pointer exception",
314
+ ):
315
+ wp.mat22.from_ptr(0)
316
+
317
+ def test_matrix_error_invalid_set_row_index(self):
318
+ m = wp.mat22(1, 2, 3, 4)
319
+ with self.assertRaisesRegex(
320
+ IndexError,
321
+ r"Invalid row index$",
322
+ ):
323
+ m.set_row(2, (0, 0))
324
+
325
+ def test_matrix_error_invalid_get_item_key(self):
326
+ m = wp.mat22(1, 2, 3, 4)
327
+
328
+ with self.assertRaisesRegex(
329
+ KeyError,
330
+ r"Invalid key None, expected int or pair of ints",
331
+ ):
332
+ m[None]
333
+
334
+ def test_matrix_error_invalid_get_item_key_length(self):
335
+ m = wp.mat22(1, 2, 3, 4)
336
+
337
+ with self.assertRaisesRegex(
338
+ KeyError,
339
+ r"Invalid key, expected one or two indices, got 3",
340
+ ):
341
+ m[0, 1, 2]
342
+
343
+ def test_matrix_error_invalid_set_item_key(self):
344
+ m = wp.mat22(1, 2, 3, 4)
345
+ with self.assertRaisesRegex(
346
+ KeyError,
347
+ r"Invalid key None, expected int or pair of ints",
348
+ ):
349
+ m[None] = 0
350
+
351
+ def test_matrix_error_invalid_set_item_key_length(self):
352
+ m = wp.mat22(1, 2, 3, 4)
353
+
354
+ with self.assertRaisesRegex(
355
+ KeyError,
356
+ r"Invalid key, expected one or two indices, got 3",
357
+ ):
358
+ m[0, 1, 2] = (0, 0)
359
+
360
+
361
+ if __name__ == "__main__":
362
+ wp.build.clear_kernel_cache()
363
+ unittest.main(verbosity=2)