warp-lang 1.8.1__py3-none-macosx_10_13_universal2.whl → 1.9.1__py3-none-macosx_10_13_universal2.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 (141) hide show
  1. warp/__init__.py +282 -103
  2. warp/__init__.pyi +1904 -114
  3. warp/bin/libwarp-clang.dylib +0 -0
  4. warp/bin/libwarp.dylib +0 -0
  5. warp/build.py +93 -30
  6. warp/build_dll.py +331 -101
  7. warp/builtins.py +1244 -160
  8. warp/codegen.py +317 -206
  9. warp/config.py +1 -1
  10. warp/context.py +1465 -789
  11. warp/examples/core/example_marching_cubes.py +1 -0
  12. warp/examples/core/example_render_opengl.py +100 -3
  13. warp/examples/fem/example_apic_fluid.py +98 -52
  14. warp/examples/fem/example_convection_diffusion_dg.py +25 -4
  15. warp/examples/fem/example_diffusion_mgpu.py +8 -3
  16. warp/examples/fem/utils.py +68 -22
  17. warp/examples/interop/example_jax_kernel.py +2 -1
  18. warp/fabric.py +1 -1
  19. warp/fem/cache.py +27 -19
  20. warp/fem/domain.py +2 -2
  21. warp/fem/field/nodal_field.py +2 -2
  22. warp/fem/field/virtual.py +264 -166
  23. warp/fem/geometry/geometry.py +5 -5
  24. warp/fem/integrate.py +129 -51
  25. warp/fem/space/restriction.py +4 -0
  26. warp/fem/space/shape/tet_shape_function.py +3 -10
  27. warp/jax_experimental/custom_call.py +25 -2
  28. warp/jax_experimental/ffi.py +22 -1
  29. warp/jax_experimental/xla_ffi.py +16 -7
  30. warp/marching_cubes.py +708 -0
  31. warp/native/array.h +99 -4
  32. warp/native/builtin.h +86 -9
  33. warp/native/bvh.cpp +64 -28
  34. warp/native/bvh.cu +58 -58
  35. warp/native/bvh.h +2 -2
  36. warp/native/clang/clang.cpp +7 -7
  37. warp/native/coloring.cpp +8 -2
  38. warp/native/crt.cpp +2 -2
  39. warp/native/crt.h +3 -5
  40. warp/native/cuda_util.cpp +41 -10
  41. warp/native/cuda_util.h +10 -4
  42. warp/native/exports.h +1842 -1908
  43. warp/native/fabric.h +2 -1
  44. warp/native/hashgrid.cpp +37 -37
  45. warp/native/hashgrid.cu +2 -2
  46. warp/native/initializer_array.h +1 -1
  47. warp/native/intersect.h +2 -2
  48. warp/native/mat.h +1910 -116
  49. warp/native/mathdx.cpp +43 -43
  50. warp/native/mesh.cpp +24 -24
  51. warp/native/mesh.cu +26 -26
  52. warp/native/mesh.h +4 -2
  53. warp/native/nanovdb/GridHandle.h +179 -12
  54. warp/native/nanovdb/HostBuffer.h +8 -7
  55. warp/native/nanovdb/NanoVDB.h +517 -895
  56. warp/native/nanovdb/NodeManager.h +323 -0
  57. warp/native/nanovdb/PNanoVDB.h +2 -2
  58. warp/native/quat.h +331 -14
  59. warp/native/range.h +7 -1
  60. warp/native/reduce.cpp +10 -10
  61. warp/native/reduce.cu +13 -14
  62. warp/native/runlength_encode.cpp +2 -2
  63. warp/native/runlength_encode.cu +5 -5
  64. warp/native/scan.cpp +3 -3
  65. warp/native/scan.cu +4 -4
  66. warp/native/sort.cpp +10 -10
  67. warp/native/sort.cu +40 -31
  68. warp/native/sort.h +2 -0
  69. warp/native/sparse.cpp +8 -8
  70. warp/native/sparse.cu +13 -13
  71. warp/native/spatial.h +366 -17
  72. warp/native/temp_buffer.h +2 -2
  73. warp/native/tile.h +471 -82
  74. warp/native/vec.h +328 -14
  75. warp/native/volume.cpp +54 -54
  76. warp/native/volume.cu +1 -1
  77. warp/native/volume.h +2 -1
  78. warp/native/volume_builder.cu +30 -37
  79. warp/native/warp.cpp +150 -149
  80. warp/native/warp.cu +377 -216
  81. warp/native/warp.h +227 -226
  82. warp/optim/linear.py +736 -271
  83. warp/render/imgui_manager.py +289 -0
  84. warp/render/render_opengl.py +99 -18
  85. warp/render/render_usd.py +1 -0
  86. warp/sim/graph_coloring.py +2 -2
  87. warp/sparse.py +558 -175
  88. warp/tests/aux_test_module_aot.py +7 -0
  89. warp/tests/cuda/test_async.py +3 -3
  90. warp/tests/cuda/test_conditional_captures.py +101 -0
  91. warp/tests/geometry/test_hash_grid.py +38 -0
  92. warp/tests/geometry/test_marching_cubes.py +233 -12
  93. warp/tests/interop/test_jax.py +608 -28
  94. warp/tests/sim/test_coloring.py +6 -6
  95. warp/tests/test_array.py +58 -5
  96. warp/tests/test_codegen.py +4 -3
  97. warp/tests/test_context.py +8 -15
  98. warp/tests/test_enum.py +136 -0
  99. warp/tests/test_examples.py +2 -2
  100. warp/tests/test_fem.py +49 -6
  101. warp/tests/test_fixedarray.py +229 -0
  102. warp/tests/test_func.py +18 -15
  103. warp/tests/test_future_annotations.py +7 -5
  104. warp/tests/test_linear_solvers.py +30 -0
  105. warp/tests/test_map.py +15 -1
  106. warp/tests/test_mat.py +1518 -378
  107. warp/tests/test_mat_assign_copy.py +178 -0
  108. warp/tests/test_mat_constructors.py +574 -0
  109. warp/tests/test_module_aot.py +287 -0
  110. warp/tests/test_print.py +69 -0
  111. warp/tests/test_quat.py +140 -34
  112. warp/tests/test_quat_assign_copy.py +145 -0
  113. warp/tests/test_reload.py +2 -1
  114. warp/tests/test_sparse.py +71 -0
  115. warp/tests/test_spatial.py +140 -34
  116. warp/tests/test_spatial_assign_copy.py +160 -0
  117. warp/tests/test_struct.py +43 -3
  118. warp/tests/test_tuple.py +96 -0
  119. warp/tests/test_types.py +61 -20
  120. warp/tests/test_vec.py +179 -34
  121. warp/tests/test_vec_assign_copy.py +143 -0
  122. warp/tests/tile/test_tile.py +245 -18
  123. warp/tests/tile/test_tile_cholesky.py +605 -0
  124. warp/tests/tile/test_tile_load.py +169 -0
  125. warp/tests/tile/test_tile_mathdx.py +2 -558
  126. warp/tests/tile/test_tile_matmul.py +1 -1
  127. warp/tests/tile/test_tile_mlp.py +1 -1
  128. warp/tests/tile/test_tile_shared_memory.py +5 -5
  129. warp/tests/unittest_suites.py +6 -0
  130. warp/tests/walkthrough_debug.py +1 -1
  131. warp/thirdparty/unittest_parallel.py +108 -9
  132. warp/types.py +571 -267
  133. warp/utils.py +68 -86
  134. {warp_lang-1.8.1.dist-info → warp_lang-1.9.1.dist-info}/METADATA +29 -69
  135. {warp_lang-1.8.1.dist-info → warp_lang-1.9.1.dist-info}/RECORD +138 -128
  136. warp/native/marching.cpp +0 -19
  137. warp/native/marching.cu +0 -514
  138. warp/native/marching.h +0 -19
  139. {warp_lang-1.8.1.dist-info → warp_lang-1.9.1.dist-info}/WHEEL +0 -0
  140. {warp_lang-1.8.1.dist-info → warp_lang-1.9.1.dist-info}/licenses/LICENSE.md +0 -0
  141. {warp_lang-1.8.1.dist-info → warp_lang-1.9.1.dist-info}/top_level.txt +0 -0
warp/fem/cache.py CHANGED
@@ -34,7 +34,7 @@ _key_re = re.compile("[^0-9a-zA-Z_]+")
34
34
 
35
35
  def _make_key(obj, suffix: str, options: Optional[Dict[str, Any]] = None):
36
36
  # human-readable part
37
- key = _key_re.sub("", f"{obj.__name__}_{suffix}")
37
+ suffix = str(suffix)
38
38
 
39
39
  sorted_opts = sorted(options.items()) if options is not None else ()
40
40
  opts_str = "".join(
@@ -49,7 +49,7 @@ def _make_key(obj, suffix: str, options: Optional[Dict[str, Any]] = None):
49
49
  uid = hashlib.blake2b(bytes(opts_str, encoding="utf-8"), digest_size=4).hexdigest()
50
50
 
51
51
  # avoid long keys, issues on win
52
- key = f"{key[:64]}_{uid}"
52
+ key = f"{obj.__name__}_{suffix[:32]}_{uid}"
53
53
 
54
54
  return key
55
55
 
@@ -62,7 +62,10 @@ def _arg_type_name(arg_type):
62
62
  return wp.types.get_type_code(wp.types.type_to_warp(arg_type))
63
63
 
64
64
 
65
- def _make_cache_key(func, key, argspec=None):
65
+ def _make_cache_key(func, key, argspec=None, allow_overloads: bool = True):
66
+ if not allow_overloads:
67
+ return key
68
+
66
69
  if argspec is None:
67
70
  annotations = get_annotations(func)
68
71
  else:
@@ -80,6 +83,7 @@ def _register_function(
80
83
  ):
81
84
  # wp.Function will override existing func for a given key...
82
85
  # manually add back our overloads
86
+ key = _key_re.sub("", key)
83
87
  existing = module.functions.get(key)
84
88
  new_fn = wp.Function(
85
89
  func=func,
@@ -95,9 +99,9 @@ def _register_function(
95
99
  return module.functions[key]
96
100
 
97
101
 
98
- def get_func(func, suffix: str, code_transformers=None):
102
+ def get_func(func, suffix: str, code_transformers=None, allow_overloads=False):
99
103
  key = _make_key(func, suffix)
100
- cache_key = _make_cache_key(func, key)
104
+ cache_key = _make_cache_key(func, key, allow_overloads=allow_overloads)
101
105
 
102
106
  if cache_key not in _func_cache:
103
107
  module = wp.get_module(func.__module__)
@@ -111,9 +115,9 @@ def get_func(func, suffix: str, code_transformers=None):
111
115
  return _func_cache[cache_key]
112
116
 
113
117
 
114
- def dynamic_func(suffix: str, code_transformers=None):
118
+ def dynamic_func(suffix: str, code_transformers=None, allow_overloads=False):
115
119
  def wrap_func(func: Callable):
116
- return get_func(func, suffix=suffix, code_transformers=code_transformers)
120
+ return get_func(func, suffix=suffix, code_transformers=code_transformers, allow_overloads=allow_overloads)
117
121
 
118
122
  return wrap_func
119
123
 
@@ -122,46 +126,49 @@ def get_kernel(
122
126
  func,
123
127
  suffix: str,
124
128
  kernel_options: Optional[Dict[str, Any]] = None,
129
+ allow_overloads=False,
125
130
  ):
126
131
  if kernel_options is None:
127
132
  kernel_options = {}
128
133
 
129
134
  key = _make_key(func, suffix, kernel_options)
130
- cache_key = _make_cache_key(func, key)
135
+ cache_key = _make_cache_key(func, key, allow_overloads=allow_overloads)
131
136
 
132
137
  if cache_key not in _kernel_cache:
133
- module_name = f"{func.__module__}.dyn.{key}"
138
+ kernel_key = _key_re.sub("", key)
139
+ module_name = f"{func.__module__}.dyn.{kernel_key}"
134
140
  module = wp.get_module(module_name)
135
141
  module.options = dict(wp.get_module(func.__module__).options)
136
142
  module.options.update(kernel_options)
137
- _kernel_cache[cache_key] = wp.Kernel(func=func, key=key, module=module, options=kernel_options)
143
+ _kernel_cache[cache_key] = wp.Kernel(func=func, key=kernel_key, module=module, options=kernel_options)
138
144
  return _kernel_cache[cache_key]
139
145
 
140
146
 
141
- def dynamic_kernel(suffix: str, kernel_options: Optional[Dict[str, Any]] = None):
147
+ def dynamic_kernel(suffix: str, kernel_options: Optional[Dict[str, Any]] = None, allow_overloads=False):
142
148
  if kernel_options is None:
143
149
  kernel_options = {}
144
150
 
145
151
  def wrap_kernel(func: Callable):
146
- return get_kernel(func, suffix=suffix, kernel_options=kernel_options)
152
+ return get_kernel(func, suffix=suffix, kernel_options=kernel_options, allow_overloads=allow_overloads)
147
153
 
148
154
  return wrap_kernel
149
155
 
150
156
 
151
157
  def get_struct(struct: type, suffix: str):
152
158
  key = _make_key(struct, suffix)
153
- # used in codegen
154
- struct.__qualname__ = key
159
+ cache_key = key
155
160
 
156
- if key not in _struct_cache:
161
+ if cache_key not in _struct_cache:
162
+ # used in codegen
163
+ struct.__qualname__ = _key_re.sub("", key)
157
164
  module = wp.get_module(struct.__module__)
158
- _struct_cache[key] = wp.codegen.Struct(
159
- key=key,
165
+ _struct_cache[cache_key] = wp.codegen.Struct(
166
+ key=struct.__qualname__,
160
167
  cls=struct,
161
168
  module=module,
162
169
  )
163
170
 
164
- return _struct_cache[key]
171
+ return _struct_cache[cache_key]
165
172
 
166
173
 
167
174
  def dynamic_struct(suffix: str):
@@ -293,12 +300,13 @@ def get_integrand_kernel(
293
300
  options.update(kernel_options)
294
301
 
295
302
  kernel_key = _make_key(integrand.func, suffix, options=options)
296
- cache_key = _make_cache_key(integrand, kernel_key, integrand.argspec)
303
+ cache_key = _make_cache_key(integrand, kernel_key, integrand.argspec, allow_overloads=True)
297
304
 
298
305
  if cache_key not in _kernel_cache:
299
306
  if kernel_fn is None:
300
307
  return None
301
308
 
309
+ kernel_key = _key_re.sub("", kernel_key)
302
310
  module = wp.get_module(f"{integrand.module.name}.{kernel_key}")
303
311
  module.options = options
304
312
  _kernel_cache[cache_key] = wp.Kernel(
warp/fem/domain.py CHANGED
@@ -237,11 +237,11 @@ class Cells(GeometryDomain):
237
237
  filter_target = True
238
238
  pos_type = cache.cached_vec_type(self.geometry.dimension, dtype=float)
239
239
 
240
- @cache.dynamic_func(suffix=self.name)
240
+ @cache.dynamic_func(suffix=self.name, allow_overloads=True)
241
241
  def cell_partition_lookup(args: self.DomainArg, pos: pos_type, max_dist: float):
242
242
  return filtered_cell_lookup(args.geo, pos, max_dist, args.index, filter_target)
243
243
 
244
- @cache.dynamic_func(suffix=self.name)
244
+ @cache.dynamic_func(suffix=self.name, allow_overloads=True)
245
245
  def cell_partition_lookup(args: self.DomainArg, pos: pos_type):
246
246
  max_dist = 0.0
247
247
  return filtered_cell_lookup(args.geo, pos, max_dist, args.index, filter_target)
@@ -232,7 +232,7 @@ class NodalFieldBase(DiscreteField):
232
232
  @cache.dynamic_func(suffix=self.name)
233
233
  def eval_grad_outer_world_space(args: self.ElementEvalArg, s: Sample):
234
234
  grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
235
- return eval_grad_outer_ref_space(args, s, grad_transform)
235
+ return eval_grad_outer(args, s, grad_transform)
236
236
 
237
237
  return eval_grad_outer_world_space
238
238
  else:
@@ -240,7 +240,7 @@ class NodalFieldBase(DiscreteField):
240
240
  @cache.dynamic_func(suffix=self.name)
241
241
  def eval_grad_outer_ref_space(args: self.ElementEvalArg, s: Sample):
242
242
  grad_transform = 1.0
243
- return eval_grad_outer_ref_space(args, s, grad_transform)
243
+ return eval_grad_outer(args, s, grad_transform)
244
244
 
245
245
  return eval_grad_outer_ref_space
246
246