hyperdrone 0.1.0__py3-none-any.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.
Files changed (660) hide show
  1. hyperdrone/__init__.py +28 -0
  2. hyperdrone/_native/cmake/hyperdrone_jit.cmake +43 -0
  3. hyperdrone/_native/common/bindings.h +39 -0
  4. hyperdrone/_native/common/cuda_staging.h +68 -0
  5. hyperdrone/_native/common/jit_host.h +69 -0
  6. hyperdrone/_native/dynamics/CMakeLists.txt +66 -0
  7. hyperdrone/_native/dynamics/host.cpp +191 -0
  8. hyperdrone/_native/dynamics/iface.h +81 -0
  9. hyperdrone/_native/dynamics/impl.cpp +659 -0
  10. hyperdrone/_native/render/CMakeLists.txt +96 -0
  11. hyperdrone/_native/render/host.cpp +276 -0
  12. hyperdrone/_native/render/iface.h +132 -0
  13. hyperdrone/_native/render/impl.cpp +620 -0
  14. hyperdrone/_native/render/scene_bindings.cpp +279 -0
  15. hyperdrone/_vendor/rl-tools/CMakeLists.txt +159 -0
  16. hyperdrone/_vendor/rl-tools/LICENSE +21 -0
  17. hyperdrone/_vendor/rl-tools/cmake/autodetect/all.cmake +14 -0
  18. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-diff.cmake +103 -0
  19. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-hash.cmake +13 -0
  20. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier1-blas.cmake +43 -0
  21. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier2-json-hdf5-zlib.cmake +84 -0
  22. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier3-tensorboard.cmake +29 -0
  23. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier4-cuda.cmake +33 -0
  24. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier5-cli11.cmake +26 -0
  25. hyperdrone/_vendor/rl-tools/cmake/optional/assimp_fixup.cmake +16 -0
  26. hyperdrone/_vendor/rl-tools/cmake/optional/googletest.cmake +17 -0
  27. hyperdrone/_vendor/rl-tools/cmake/optional/metal.cmake +27 -0
  28. hyperdrone/_vendor/rl-tools/cmake/optional/mujoco.cmake +32 -0
  29. hyperdrone/_vendor/rl-tools/cmake/optional/optix.cmake +17 -0
  30. hyperdrone/_vendor/rl-tools/cmake/optional/raytracing_generic.cmake +4 -0
  31. hyperdrone/_vendor/rl-tools/cmake/optional/vulkan.cmake +6 -0
  32. hyperdrone/_vendor/rl-tools/cmake/scripts/embed_text.cmake +7 -0
  33. hyperdrone/_vendor/rl-tools/cmake/scripts/generate-git-snapshot.cmake +138 -0
  34. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/matrix.h +143 -0
  35. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_arm.h +33 -0
  36. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu.h +314 -0
  37. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_accelerate.h +37 -0
  38. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_blas.h +67 -0
  39. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_mkl.h +38 -0
  40. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_openblas.h +34 -0
  41. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cuda.h +289 -0
  42. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_dummy.h +20 -0
  43. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_esp32.h +29 -0
  44. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_generic.h +946 -0
  45. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_wasm32.h +13 -0
  46. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/persist_code.h +136 -0
  47. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_arm.h +1 -0
  48. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu.h +94 -0
  49. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_accelerate.h +25 -0
  50. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_blas.h +115 -0
  51. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_mkl.h +25 -0
  52. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_openblas.h +25 -0
  53. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cuda.h +703 -0
  54. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_generic.h +1334 -0
  55. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/persist_code.h +130 -0
  56. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/tensor.h +490 -0
  57. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/arm.h +91 -0
  58. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu.h +205 -0
  59. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_accelerate.h +23 -0
  60. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_blas.h +21 -0
  61. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_mkl.h +45 -0
  62. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_openblas.h +56 -0
  63. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_tensorboard.h +34 -0
  64. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cuda.h +411 -0
  65. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/devices.h +92 -0
  66. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/dummy.h +55 -0
  67. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/esp32.h +85 -0
  68. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/generic.h +0 -0
  69. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/wasm32.h +59 -0
  70. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/model.h +218 -0
  71. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/operations_generic.h +771 -0
  72. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/persist.h +278 -0
  73. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter.h +100 -0
  74. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter_persist.h +52 -0
  75. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/tensor_operations_generic.h +55 -0
  76. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_backend.h +112 -0
  77. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_interface.h +36 -0
  78. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/l2f.h +98 -0
  79. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_dyn.h +18 -0
  80. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_generic.h +268 -0
  81. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_backend.h +31 -0
  82. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_interface.h +12 -0
  83. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_backend.h +98 -0
  84. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_interface.h +50 -0
  85. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/executor.h +133 -0
  86. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/helper.h +109 -0
  87. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/operations_generic.h +219 -0
  88. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arduino.h +117 -0
  89. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arm.h +56 -0
  90. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu.h +93 -0
  91. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu_tensorboard.h +151 -0
  92. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cuda.h +65 -0
  93. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_dummy.h +45 -0
  94. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_wasm32.h +56 -0
  95. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_arm.h +98 -0
  96. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cpu.h +139 -0
  97. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cuda.h +382 -0
  98. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_dummy.h +93 -0
  99. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_esp32.h +92 -0
  100. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_generic.h +297 -0
  101. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_wasm32.h +225 -0
  102. hyperdrone/_vendor/rl-tools/include/rl_tools/mode/mode.h +75 -0
  103. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/activation_functions.h +115 -0
  104. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/capability.h +63 -0
  105. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/persist_code.h +27 -0
  106. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/layer.h +122 -0
  107. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_cuda.h +64 -0
  108. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_generic.h +184 -0
  109. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/persist.h +33 -0
  110. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/layer.h +300 -0
  111. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cpu_mkl.h +590 -0
  112. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cuda.h +739 -0
  113. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_generic.h +1185 -0
  114. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist.h +99 -0
  115. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist_code.h +170 -0
  116. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/layer.h +145 -0
  117. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/dsp.h +63 -0
  118. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/opt.h +173 -0
  119. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu.h +13 -0
  120. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_accelerate.h +66 -0
  121. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_blas.h +282 -0
  122. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_mkl.h +66 -0
  123. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_openblas.h +65 -0
  124. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cuda.h +519 -0
  125. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_dummy.h +8 -0
  126. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/dsp.h +58 -0
  127. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/opt.h +167 -0
  128. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_generic.h +421 -0
  129. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist.h +62 -0
  130. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_code.h +178 -0
  131. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_common.h +55 -0
  132. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/layer.h +188 -0
  133. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_cuda.h +356 -0
  134. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_generic.h +534 -0
  135. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/persist.h +32 -0
  136. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/layer.h +119 -0
  137. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/operations_generic.h +217 -0
  138. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/persist.h +46 -0
  139. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/layer.h +121 -0
  140. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/operations_generic.h +152 -0
  141. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist.h +44 -0
  142. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist_code.h +106 -0
  143. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_cuda.h +375 -0
  144. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_generic.h +158 -0
  145. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/layer.h +218 -0
  146. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/operations_generic.h +947 -0
  147. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist.h +75 -0
  148. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist_code.h +199 -0
  149. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/layers.h +3 -0
  150. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/layer.h +143 -0
  151. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_cuda.h +80 -0
  152. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_generic.h +214 -0
  153. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/persist.h +39 -0
  154. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu.h +1 -0
  155. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_accelerate.h +1 -0
  156. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_blas.h +1 -0
  157. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_mkl.h +3 -0
  158. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_openblas.h +1 -0
  159. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cuda.h +9 -0
  160. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_dummy.h +1 -0
  161. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_generic.h +3 -0
  162. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/layer.h +223 -0
  163. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_cuda.h +138 -0
  164. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_generic.h +428 -0
  165. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/persist.h +70 -0
  166. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/layer.h +154 -0
  167. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_cuda.h +119 -0
  168. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_generic.h +494 -0
  169. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist.h +50 -0
  170. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist_code.h +173 -0
  171. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/layer.h +116 -0
  172. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_cuda.h +156 -0
  173. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_generic.h +291 -0
  174. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist.h +83 -0
  175. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist_code.h +163 -0
  176. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/layer.h +123 -0
  177. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/operations_generic.h +268 -0
  178. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist.h +17 -0
  179. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist_code.h +164 -0
  180. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/layer.h +122 -0
  181. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_cuda.h +55 -0
  182. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_generic.h +158 -0
  183. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist.h +47 -0
  184. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist_code.h +106 -0
  185. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/layer.h +132 -0
  186. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_cuda.h +141 -0
  187. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_generic.h +228 -0
  188. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/categorical_cross_entropy/operations_generic.h +102 -0
  189. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_cuda.h +97 -0
  190. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_generic.h +101 -0
  191. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/operations_generic.h +2 -0
  192. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/nn.h +16 -0
  193. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu.h +1 -0
  194. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_accelerate.h +1 -0
  195. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_blas.h +1 -0
  196. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mkl.h +1 -0
  197. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mux.h +16 -0
  198. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_openblas.h +1 -0
  199. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cuda.h +2 -0
  200. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_dummy.h +1 -0
  201. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_generic.h +17 -0
  202. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/adam.h +120 -0
  203. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_cuda.h +90 -0
  204. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_generic.h +144 -0
  205. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist.h +39 -0
  206. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist_code.h +79 -0
  207. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_cuda.h +72 -0
  208. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_generic.h +102 -0
  209. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/persist.h +25 -0
  210. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/instance/operations_generic.h +101 -0
  211. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/lamb.h +40 -0
  212. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/operations_generic.h +61 -0
  213. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/optimizers.h +3 -0
  214. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_cuda.h +77 -0
  215. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_generic.h +134 -0
  216. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist.h +37 -0
  217. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist_code.h +71 -0
  218. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_cuda.h +40 -0
  219. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_generic.h +43 -0
  220. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/sgd.h +91 -0
  221. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_cuda.h +0 -0
  222. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_generic.h +90 -0
  223. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/parameters.h +78 -0
  224. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist.h +34 -0
  225. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist_code.h +133 -0
  226. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist.h +2 -0
  227. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist_code.h +27 -0
  228. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/network.h +174 -0
  229. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_cuda.h +10 -0
  230. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_dummy.h +8 -0
  231. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_generic.h +381 -0
  232. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist.h +56 -0
  233. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist_code.h +137 -0
  234. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/network.h +45 -0
  235. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/operations_generic.h +76 -0
  236. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist.h +43 -0
  237. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist_code.h +135 -0
  238. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/models.h +3 -0
  239. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/model.h +148 -0
  240. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/operations_generic.h +280 -0
  241. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist.h +25 -0
  242. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist_code.h +71 -0
  243. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cpu.h +0 -0
  244. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cuda.h +1 -0
  245. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_dummy.h +1 -0
  246. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_generic.h +6 -0
  247. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/model.h +276 -0
  248. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_cuda.h +165 -0
  249. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_generic.h +571 -0
  250. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist.h +80 -0
  251. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist_code.h +196 -0
  252. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist.h +1 -0
  253. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist_code.h +1 -0
  254. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/model.h +43 -0
  255. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/operations_generic.h +73 -0
  256. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/resnet/resnet.h +97 -0
  257. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/model.h +256 -0
  258. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/operations_generic.h +564 -0
  259. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist.h +99 -0
  260. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist_code.h +107 -0
  261. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/bf16.h +28 -0
  262. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/categories.h +22 -0
  263. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/persist_code.h +54 -0
  264. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/policy.h +48 -0
  265. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_1.h +18 -0
  266. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_2.h +14 -0
  267. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_3.h +14 -0
  268. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm.h +19 -0
  269. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_1.h +16 -0
  270. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_2.h +12 -0
  271. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_3.h +15 -0
  272. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu.h +19 -0
  273. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_1.h +16 -0
  274. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_2.h +12 -0
  275. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_3.h +15 -0
  276. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate.h +19 -0
  277. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_1.h +17 -0
  278. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_2.h +12 -0
  279. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_3.h +15 -0
  280. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl.h +18 -0
  281. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mux.h +148 -0
  282. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_1.h +16 -0
  283. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_2.h +12 -0
  284. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_3.h +15 -0
  285. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas.h +18 -0
  286. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_1.h +16 -0
  287. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_2.h +12 -0
  288. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_3.h +15 -0
  289. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard.h +19 -0
  290. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_1.h +18 -0
  291. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_2.h +12 -0
  292. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_3.h +12 -0
  293. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda.h +19 -0
  294. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_1.h +15 -0
  295. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_2.h +12 -0
  296. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_3.h +12 -0
  297. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy.h +19 -0
  298. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_1.h +16 -0
  299. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_2.h +12 -0
  300. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_3.h +13 -0
  301. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32.h +19 -0
  302. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_1.h +15 -0
  303. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_2.h +12 -0
  304. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_3.h +12 -0
  305. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32.h +19 -0
  306. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/hdf5.h +54 -0
  307. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/operations_cpu.h +419 -0
  308. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/io.h +55 -0
  309. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_cpu.h +58 -0
  310. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_generic.h +620 -0
  311. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_posix.h +63 -0
  312. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/tar.h +74 -0
  313. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/code.h +38 -0
  314. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_arm.h +39 -0
  315. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cpu.h +61 -0
  316. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cuda.h +164 -0
  317. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_dummy.h +72 -0
  318. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_esp32.h +45 -0
  319. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic.h +133 -0
  320. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic_array.h +64 -0
  321. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_wasm32.h +57 -0
  322. hyperdrone/_vendor/rl-tools/include/rl_tools/random/persist.h +77 -0
  323. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/README.md +149 -0
  324. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_cpu.h +768 -0
  325. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_generic.h +1173 -0
  326. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/context.h +177 -0
  327. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/device_source.h +17 -0
  328. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/operations_cpu.h +1122 -0
  329. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device.h +212 -0
  330. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device_impl.h +934 -0
  331. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/operations_cuda.h +1678 -0
  332. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/overlay_accel.h +57 -0
  333. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/context.h +220 -0
  334. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/device_source.h +40 -0
  335. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/operations_cpu.h +1967 -0
  336. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_common.h +1986 -0
  337. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_mux.h +19 -0
  338. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/renderer.h +376 -0
  339. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/procthor/operations_cpu.h +226 -0
  340. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/procthor/scene.h +25 -0
  341. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/scene.h +31 -0
  342. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene.h +107 -0
  343. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/transforms_generic.h +159 -0
  344. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/types.h +39 -0
  345. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/algorithms.h +6 -0
  346. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu.h +1 -0
  347. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu_mkl.h +1 -0
  348. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_generic.h +1 -0
  349. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/config.h +240 -0
  350. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_cuda.h +62 -0
  351. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_generic.h +245 -0
  352. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/persist.h +102 -0
  353. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/state.h +52 -0
  354. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_cuda.h +193 -0
  355. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic.h +334 -0
  356. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic_extensions.h +244 -0
  357. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/persist.h +28 -0
  358. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/ppo.h +105 -0
  359. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_gru.h +84 -0
  360. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_mlp.h +61 -0
  361. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/config.h +106 -0
  362. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/operations_generic.h +193 -0
  363. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/state.h +52 -0
  364. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu.h +9 -0
  365. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_accelerate.h +2 -0
  366. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mkl.h +2 -0
  367. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mux.h +9 -0
  368. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cuda.h +131 -0
  369. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_generic.h +580 -0
  370. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/sac.h +151 -0
  371. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_gru.h +72 -0
  372. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_mlp.h +54 -0
  373. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/config.h +107 -0
  374. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/operations_generic.h +172 -0
  375. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/state.h +46 -0
  376. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu.h +9 -0
  377. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_accelerate.h +2 -0
  378. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mkl.h +2 -0
  379. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mux.h +9 -0
  380. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cuda.h +111 -0
  381. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_generic.h +359 -0
  382. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/td3.h +141 -0
  383. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/components.h +4 -0
  384. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/off_policy_runner.h +225 -0
  385. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu.h +95 -0
  386. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_accelerate.h +21 -0
  387. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_mkl.h +21 -0
  388. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cuda.h +237 -0
  389. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic.h +498 -0
  390. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic_per_env.h +112 -0
  391. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/on_policy_runner.h +106 -0
  392. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu.h +16 -0
  393. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_accelerate.h +28 -0
  394. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_mkl.h +15 -0
  395. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cuda.h +195 -0
  396. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic.h +197 -0
  397. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_extensions.h +98 -0
  398. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_per_env.h +91 -0
  399. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/persist.h +61 -0
  400. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu.h +2 -0
  401. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_accelerate.h +1 -0
  402. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_mkl.h +1 -0
  403. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_generic.h +2 -0
  404. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_cpu.h +9 -0
  405. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_generic.h +123 -0
  406. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/persist.h +57 -0
  407. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/replay_buffer.h +93 -0
  408. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/operations_generic.h +76 -0
  409. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/persist.h +31 -0
  410. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/running_normalizer.h +33 -0
  411. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/operations_generic.h +58 -0
  412. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/operations_generic.h +28 -0
  413. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/wrapper.h +26 -0
  414. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/wrappers.h +29 -0
  415. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/acrobot.h +88 -0
  416. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_cpu.h +152 -0
  417. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_generic.h +202 -0
  418. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/car.h +119 -0
  419. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_cpu.h +110 -0
  420. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_generic.h +206 -0
  421. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_json.h +59 -0
  422. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/track.h +23 -0
  423. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/ui.h +189 -0
  424. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/environments.h +28 -0
  425. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/environment.h +87 -0
  426. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_cpu.h +212 -0
  427. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_generic.h +215 -0
  428. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/metrics.h +266 -0
  429. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/multirotor.h +1083 -0
  430. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cpu.h +2119 -0
  431. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cuda.h +38 -0
  432. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/05_state_is_nan.h +126 -0
  433. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/10_sample_initial_parameters.h +228 -0
  434. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/20_initial_state.h +189 -0
  435. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/30_sample_initial_state.h +276 -0
  436. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/35_get_desired_state.h +63 -0
  437. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/40_observe.h +625 -0
  438. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/50_state_algebra.h +57 -0
  439. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/60_dynamics.h +134 -0
  440. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/70_post_integration.h +329 -0
  441. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/80_abs_diff.h +290 -0
  442. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic.h +369 -0
  443. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_helper_generic.h +45 -0
  444. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic.h +72 -0
  445. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic_forward.h +26 -0
  446. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/default.h +202 -0
  447. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/arpl.h +112 -0
  448. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie.h +127 -0
  449. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie_openmv.h +119 -0
  450. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/flightmare.h +111 -0
  451. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/fs.h +113 -0
  452. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/mrs.h +110 -0
  453. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft.h +117 -0
  454. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft_rigid.h +118 -0
  455. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_real.h +88 -0
  456. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_sim.h +114 -0
  457. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/init/default.h +56 -0
  458. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/registry.h +90 -0
  459. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/default.h +64 -0
  460. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/reward_functions.h +1 -0
  461. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/operations_generic.h +202 -0
  462. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/squared.h +52 -0
  463. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/termination/default.h +33 -0
  464. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/lissajous.h +72 -0
  465. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/trajectory.h +78 -0
  466. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/persist_code.h +53 -0
  467. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/quaternion_helper.h +94 -0
  468. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/ui.h +180 -0
  469. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/multirotor_visual.h +135 -0
  470. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_cpu.h +244 -0
  471. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_cuda.h +180 -0
  472. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_generic.h +149 -0
  473. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/environment.h +69 -0
  474. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_cpu.h +46 -0
  475. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_generic.h +78 -0
  476. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/README.MD +5 -0
  477. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ant.h +77 -0
  478. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/model.h +415 -0
  479. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/operations_cpu.h +160 -0
  480. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ui.h +141 -0
  481. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/mujoco.h +1 -0
  482. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/bottleneck.h +113 -0
  483. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_cpu.h +289 -0
  484. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_generic.h +495 -0
  485. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/environments.h +16 -0
  486. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/observation.h +37 -0
  487. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_cpu.h +2 -0
  488. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_generic.h +33 -0
  489. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_cpu.h +146 -0
  490. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_generic.h +262 -0
  491. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/pendulum.h +197 -0
  492. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui.h +97 -0
  493. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui_xeus.h +124 -0
  494. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_cpu.h +426 -0
  495. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_generic.h +424 -0
  496. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/reacher.h +137 -0
  497. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/loop.h +15 -0
  498. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/config.h +28 -0
  499. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/operations_cpu.h +233 -0
  500. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/persist.h +30 -0
  501. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/state.h +21 -0
  502. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/config.h +25 -0
  503. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/operations_generic.h +47 -0
  504. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/persist.h +20 -0
  505. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/state.h +17 -0
  506. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/config.h +47 -0
  507. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/operations_generic.h +106 -0
  508. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/persist.h +40 -0
  509. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/state.h +36 -0
  510. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/config.h +22 -0
  511. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/operations_cpu.h +44 -0
  512. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/persist.h +20 -0
  513. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/state.h +26 -0
  514. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/config.h +37 -0
  515. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/operations_cpu.h +113 -0
  516. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/persist.h +20 -0
  517. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/state.h +24 -0
  518. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/config.h +43 -0
  519. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/operations_cpu.h +190 -0
  520. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/persist.h +30 -0
  521. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/state.h +37 -0
  522. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/steps.h +4 -0
  523. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/config.h +27 -0
  524. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/operations_cpu.h +52 -0
  525. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/persist.h +20 -0
  526. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/state.h +25 -0
  527. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/operations_generic.h +3 -0
  528. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/rl.h +5 -0
  529. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/evaluation.h +106 -0
  530. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_cpu.h +48 -0
  531. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_generic.h +275 -0
  532. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation.h +269 -0
  533. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation_analysis.h +85 -0
  534. hyperdrone/_vendor/rl-tools/include/rl_tools/rl_tools.h +37 -0
  535. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/client.h +50 -0
  536. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_boost.h +92 -0
  537. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_cpu.h +174 -0
  538. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_websocket.h +208 -0
  539. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/server.h +448 -0
  540. hyperdrone/_vendor/rl-tools/include/rl_tools/universe.h +4 -0
  541. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/declarations_cpu.h +13 -0
  542. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_arm.h +25 -0
  543. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cpu.h +21 -0
  544. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cuda.h +25 -0
  545. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_dummy.h +18 -0
  546. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_esp32.h +20 -0
  547. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_generic.h +19 -0
  548. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_wasm32.h +18 -0
  549. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_cpu.h +16 -0
  550. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_generic.h +14 -0
  551. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/extrack.h +129 -0
  552. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/operations_cpu.h +588 -0
  553. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/integrators.h +105 -0
  554. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/memcpy.h +16 -0
  555. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/operations_generic.h +48 -0
  556. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/tuple.h +149 -0
  557. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/typing.h +118 -0
  558. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/vector_operations.h +174 -0
  559. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_cuda.h +53 -0
  560. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_generic.h +93 -0
  561. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/string/operations_generic.h +201 -0
  562. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/zlib/operations_cpu.h +45 -0
  563. hyperdrone/_vendor/rl-tools/include/rl_tools/version.h +28 -0
  564. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/CMakeLists.txt +15 -0
  565. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/CMakeLists.txt +9 -0
  566. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/CMakeLists.txt +17 -0
  567. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/freestanding_check.cpp +113 -0
  568. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/CMakeLists.txt +31 -0
  569. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/device.metal +815 -0
  570. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/metal_cpp_impl.cpp +6 -0
  571. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/CMakeLists.txt +51 -0
  572. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/device.cu +1 -0
  573. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/overlay_accel.cu +275 -0
  574. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/CMakeLists.txt +37 -0
  575. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device.comp +865 -0
  576. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device_spirv.cpp +34 -0
  577. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/CMakeLists.txt +205 -0
  578. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/README.md +281 -0
  579. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark.cpp +175 -0
  580. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark_dynamic.cpp +494 -0
  581. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix.cpp +1629 -0
  582. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.cu +523 -0
  583. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.h +37 -0
  584. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/CMakeLists.txt +164 -0
  585. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/antialiasing.cpp +213 -0
  586. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone.cpp +367 -0
  587. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone_device.cu +385 -0
  588. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/environment.h +85 -0
  589. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/operations_cpu.h +270 -0
  590. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/example.cpp +276 -0
  591. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/fixed_pose.cpp +218 -0
  592. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/interactive.cpp +866 -0
  593. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/make_drone_glb.py +172 -0
  594. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/motion_blur.cpp +232 -0
  595. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace.cpp +1833 -0
  596. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace_motion_blur.cpp +646 -0
  597. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/CMakeLists.txt +147 -0
  598. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/README.md +15 -0
  599. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/job.sbatch +28 -0
  600. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model.h +260 -0
  601. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_config.h +24 -0
  602. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_forward_cuda.h +397 -0
  603. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_operations.h +418 -0
  604. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_persist.h +45 -0
  605. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_student.h +70 -0
  606. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.cpp +221 -0
  607. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.h +68 -0
  608. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.build-check/inference_ios.o +0 -0
  609. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.build-check/libinference_ios.a +0 -0
  610. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.gitignore +4 -0
  611. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/CMakeLists.txt +4 -0
  612. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info.plist +24 -0
  613. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info_ios.plist +36 -0
  614. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/CameraManager.swift +120 -0
  615. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/ContentView.swift +703 -0
  616. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/DatasetRecorder.swift +285 -0
  617. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/YawPredictorApp.swift +25 -0
  618. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/YawPredictor.entitlements +8 -0
  619. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build.sh +66 -0
  620. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build_ios.sh +133 -0
  621. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/generate.sh +6 -0
  622. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/h5_to_tar.cpp +82 -0
  623. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.cpp +166 -0
  624. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.h +26 -0
  625. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/project.yml +30 -0
  626. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/test_tar_vs_hdf5.cpp +173 -0
  627. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_cuda.cu +699 -0
  628. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_dataset_overlay.cpp +475 -0
  629. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_distill_cuda.cu +995 -0
  630. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_eval.cu +456 -0
  631. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_real_world_eval.cpp +660 -0
  632. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_viewer.cu +445 -0
  633. hyperdrone/cuda/__init__.py +78 -0
  634. hyperdrone/dynamics/__init__.py +22 -0
  635. hyperdrone/dynamics/_component.py +40 -0
  636. hyperdrone/dynamics/_config.py +47 -0
  637. hyperdrone/dynamics/_sim.py +201 -0
  638. hyperdrone/env/__init__.py +15 -0
  639. hyperdrone/env/_sampling.py +67 -0
  640. hyperdrone/env/_world.py +60 -0
  641. hyperdrone/examples/__init__.py +11 -0
  642. hyperdrone/examples/benchmark.py +236 -0
  643. hyperdrone/examples/benchmark_minimal.py +66 -0
  644. hyperdrone/examples/data.py +42 -0
  645. hyperdrone/examples/drone_flythrough.py +142 -0
  646. hyperdrone/examples/render_procthor.py +41 -0
  647. hyperdrone/jit/__init__.py +111 -0
  648. hyperdrone/jit/_build.py +94 -0
  649. hyperdrone/jit/_lock.py +23 -0
  650. hyperdrone/jit/_patches.py +95 -0
  651. hyperdrone/jit/_toolchain.py +13 -0
  652. hyperdrone/jit/_workspace.py +70 -0
  653. hyperdrone/render/__init__.py +48 -0
  654. hyperdrone/render/_component.py +35 -0
  655. hyperdrone/render/_config.py +90 -0
  656. hyperdrone/render/_renderer.py +306 -0
  657. hyperdrone/render/_scene.py +34 -0
  658. hyperdrone-0.1.0.dist-info/METADATA +15 -0
  659. hyperdrone-0.1.0.dist-info/RECORD +660 -0
  660. hyperdrone-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,1185 @@
1
+ #include "../../../version.h"
2
+ #if (defined(RL_TOOLS_DISABLE_INCLUDE_GUARDS) || !defined(RL_TOOLS_NN_LAYERS_CONV2D_OPERATIONS_GENERIC_H)) && (RL_TOOLS_USE_THIS_VERSION == 1)
3
+ #pragma once
4
+ #define RL_TOOLS_NN_LAYERS_CONV2D_OPERATIONS_GENERIC_H
5
+
6
+ #include "../../../containers/tensor/tensor.h"
7
+ #include "../../../nn/parameters/operations_generic.h"
8
+
9
+ #include "layer.h"
10
+ #ifndef RL_TOOLS_FUNCTION_PLACEMENT
11
+ #define RL_TOOLS_FUNCTION_PLACEMENT
12
+ #endif
13
+
14
+ RL_TOOLS_NAMESPACE_WRAPPER_START
15
+ namespace rl_tools{
16
+ // ======================== NormForward malloc / free / copy / zero_gradient / update / _reset_optimizer_state ========================
17
+ // NONE
18
+ template<typename DEVICE, typename SPEC>
19
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC>&) {}
20
+ template<typename DEVICE, typename SPEC>
21
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC>&) {}
22
+ template<typename SD, typename TD, typename SPEC1, typename SPEC2>
23
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SD&, TD&, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC1>&, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC2>&) {}
24
+ template<typename DEVICE, typename SPEC>
25
+ RL_TOOLS_FUNCTION_PLACEMENT void zero_gradient(DEVICE&, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC>&) {}
26
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
27
+ RL_TOOLS_FUNCTION_PLACEMENT void update(DEVICE&, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC>&, OPTIMIZER&) {}
28
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
29
+ RL_TOOLS_FUNCTION_PLACEMENT void _reset_optimizer_state(DEVICE&, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC>&, OPTIMIZER&) {}
30
+ template<typename DEVICE, typename SPEC1, typename SPEC2>
31
+ RL_TOOLS_FUNCTION_PLACEMENT typename SPEC1::TYPE_POLICY::DEFAULT abs_diff(DEVICE&, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC1>&, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC2>&) { return 0; }
32
+ template<typename DEVICE, typename SPEC, typename MODE>
33
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE&, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::NONE, SPEC>&, const Mode<MODE>&) { return false; }
34
+
35
+ // BATCH_NORM
36
+ template<typename DEVICE, typename SPEC>
37
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& norm) {
38
+ malloc(device, norm.gamma);
39
+ malloc(device, norm.beta);
40
+ malloc(device, norm.running_mean);
41
+ malloc(device, norm.running_var);
42
+ }
43
+ template<typename DEVICE, typename SPEC>
44
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& norm) {
45
+ free(device, norm.gamma);
46
+ free(device, norm.beta);
47
+ free(device, norm.running_mean);
48
+ free(device, norm.running_var);
49
+ }
50
+ template<typename SD, typename TD, typename SPEC1, typename SPEC2>
51
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SD& sd, TD& td, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC1>& src, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC2>& dst) {
52
+ copy(sd, td, src.gamma, dst.gamma);
53
+ copy(sd, td, src.beta, dst.beta);
54
+ copy(sd, td, src.running_mean, dst.running_mean);
55
+ copy(sd, td, src.running_var, dst.running_var);
56
+ }
57
+ template<typename DEVICE, typename SPEC>
58
+ RL_TOOLS_FUNCTION_PLACEMENT void zero_gradient(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& norm) {
59
+ zero_gradient(device, norm.gamma);
60
+ zero_gradient(device, norm.beta);
61
+ }
62
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
63
+ RL_TOOLS_FUNCTION_PLACEMENT void update(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& norm, OPTIMIZER& optimizer) {
64
+ update(device, norm.gamma, optimizer);
65
+ update(device, norm.beta, optimizer);
66
+ }
67
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
68
+ RL_TOOLS_FUNCTION_PLACEMENT void _reset_optimizer_state(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& norm, OPTIMIZER& optimizer) {
69
+ _reset_optimizer_state(device, norm.gamma, optimizer);
70
+ _reset_optimizer_state(device, norm.beta, optimizer);
71
+ }
72
+ template<typename DEVICE, typename SPEC1, typename SPEC2>
73
+ RL_TOOLS_FUNCTION_PLACEMENT typename SPEC1::TYPE_POLICY::DEFAULT abs_diff(DEVICE& device, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC1>& a, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC2>& b) {
74
+ using T = typename SPEC1::TYPE_POLICY::DEFAULT;
75
+ T acc = 0;
76
+ acc += abs_diff(device, a.gamma, b.gamma);
77
+ acc += abs_diff(device, a.beta, b.beta);
78
+ acc += abs_diff(device, a.running_mean, b.running_mean);
79
+ acc += abs_diff(device, a.running_var, b.running_var);
80
+ return acc;
81
+ }
82
+ template<typename DEVICE, typename SPEC, typename MODE>
83
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE& device, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& norm, const Mode<MODE>& mode) {
84
+ return is_nan(device, norm.gamma, mode) || is_nan(device, norm.beta, mode) || is_nan(device, norm.running_mean, mode) || is_nan(device, norm.running_var, mode);
85
+ }
86
+
87
+ // LAYER_NORM
88
+ template<typename DEVICE, typename SPEC>
89
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& norm) {
90
+ malloc(device, norm.gamma);
91
+ malloc(device, norm.beta);
92
+ }
93
+ template<typename DEVICE, typename SPEC>
94
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& norm) {
95
+ free(device, norm.gamma);
96
+ free(device, norm.beta);
97
+ }
98
+ template<typename SD, typename TD, typename SPEC1, typename SPEC2>
99
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SD& sd, TD& td, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC1>& src, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC2>& dst) {
100
+ copy(sd, td, src.gamma, dst.gamma);
101
+ copy(sd, td, src.beta, dst.beta);
102
+ }
103
+ template<typename DEVICE, typename SPEC>
104
+ RL_TOOLS_FUNCTION_PLACEMENT void zero_gradient(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& norm) {
105
+ zero_gradient(device, norm.gamma);
106
+ zero_gradient(device, norm.beta);
107
+ }
108
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
109
+ RL_TOOLS_FUNCTION_PLACEMENT void update(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& norm, OPTIMIZER& optimizer) {
110
+ update(device, norm.gamma, optimizer);
111
+ update(device, norm.beta, optimizer);
112
+ }
113
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
114
+ RL_TOOLS_FUNCTION_PLACEMENT void _reset_optimizer_state(DEVICE& device, nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& norm, OPTIMIZER& optimizer) {
115
+ _reset_optimizer_state(device, norm.gamma, optimizer);
116
+ _reset_optimizer_state(device, norm.beta, optimizer);
117
+ }
118
+ template<typename DEVICE, typename SPEC1, typename SPEC2>
119
+ RL_TOOLS_FUNCTION_PLACEMENT typename SPEC1::TYPE_POLICY::DEFAULT abs_diff(DEVICE& device, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC1>& a, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC2>& b) {
120
+ using T = typename SPEC1::TYPE_POLICY::DEFAULT;
121
+ T acc = 0;
122
+ acc += abs_diff(device, a.gamma, b.gamma);
123
+ acc += abs_diff(device, a.beta, b.beta);
124
+ return acc;
125
+ }
126
+ template<typename DEVICE, typename SPEC, typename MODE>
127
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE& device, const nn::layers::conv2d::NormForward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& norm, const Mode<MODE>& mode) {
128
+ return is_nan(device, norm.gamma, mode) || is_nan(device, norm.beta, mode);
129
+ }
130
+
131
+ // ======================== NormBackward malloc / free / copy ========================
132
+ // NONE
133
+ template<typename DEVICE, typename SPEC>
134
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE&, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::NONE, SPEC>&) {}
135
+ template<typename DEVICE, typename SPEC>
136
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE&, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::NONE, SPEC>&) {}
137
+ template<typename SD, typename TD, typename SPEC1, typename SPEC2>
138
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SD&, TD&, const nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::NONE, SPEC1>&, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::NONE, SPEC2>&) {}
139
+ // BATCH_NORM
140
+ template<typename DEVICE, typename SPEC>
141
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& cache) {
142
+ malloc(device, cache.mean);
143
+ malloc(device, cache.inv_std);
144
+ }
145
+ template<typename DEVICE, typename SPEC>
146
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC>& cache) {
147
+ free(device, cache.mean);
148
+ free(device, cache.inv_std);
149
+ }
150
+ template<typename SD, typename TD, typename SPEC1, typename SPEC2>
151
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SD& sd, TD& td, const nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC1>& src, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::BATCH_NORM, SPEC2>& dst) {
152
+ copy(sd, td, src.mean, dst.mean);
153
+ copy(sd, td, src.inv_std, dst.inv_std);
154
+ }
155
+ // LAYER_NORM
156
+ template<typename DEVICE, typename SPEC>
157
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& cache) {
158
+ malloc(device, cache.mean);
159
+ malloc(device, cache.inv_std);
160
+ }
161
+ template<typename DEVICE, typename SPEC>
162
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC>& cache) {
163
+ free(device, cache.mean);
164
+ free(device, cache.inv_std);
165
+ }
166
+ template<typename SD, typename TD, typename SPEC1, typename SPEC2>
167
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SD& sd, TD& td, const nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC1>& src, nn::layers::conv2d::NormBackward<nn::layers::conv2d::Normalization::LAYER_NORM, SPEC2>& dst) {
168
+ copy(sd, td, src.mean, dst.mean);
169
+ copy(sd, td, src.inv_std, dst.inv_std);
170
+ }
171
+
172
+ // ======================== Layer malloc / free ========================
173
+ template<typename DEVICE, typename SPEC>
174
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::LayerForward<SPEC>& layer) {
175
+ malloc(device, layer.weights);
176
+ malloc(device, layer.biases);
177
+ malloc(device, layer.norm);
178
+ }
179
+ template<typename DEVICE, typename SPEC>
180
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::LayerForward<SPEC>& layer) {
181
+ free(device, layer.weights);
182
+ free(device, layer.biases);
183
+ free(device, layer.norm);
184
+ }
185
+ template<typename DEVICE, typename SPEC>
186
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::LayerBackward<SPEC>& layer) {
187
+ malloc(device, (nn::layers::conv2d::LayerForward<SPEC>&) layer);
188
+ malloc(device, layer.pre_activations);
189
+ malloc(device, layer.norm_cache);
190
+ }
191
+ template<typename DEVICE, typename SPEC>
192
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::LayerBackward<SPEC>& layer) {
193
+ free(device, (nn::layers::conv2d::LayerForward<SPEC>&) layer);
194
+ free(device, layer.pre_activations);
195
+ free(device, layer.norm_cache);
196
+ }
197
+ template<typename DEVICE, typename SPEC>
198
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::LayerGradient<SPEC>& layer) {
199
+ malloc(device, (nn::layers::conv2d::LayerBackward<SPEC>&) layer);
200
+ malloc(device, layer.output);
201
+ }
202
+ template<typename DEVICE, typename SPEC>
203
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::LayerGradient<SPEC>& layer) {
204
+ free(device, (nn::layers::conv2d::LayerBackward<SPEC>&) layer);
205
+ free(device, layer.output);
206
+ }
207
+ template<typename DEVICE>
208
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::State& state) { }
209
+ template <typename SOURCE_DEVICE, typename TARGET_DEVICE>
210
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SOURCE_DEVICE& source_device, TARGET_DEVICE& target_device, nn::layers::conv2d::State& source, nn::layers::conv2d::State& target){}
211
+ template<typename SPEC, typename DEVICE, typename RNG, typename MODE>
212
+ RL_TOOLS_FUNCTION_PLACEMENT void reset(DEVICE& device, const nn::layers::conv2d::LayerForward<SPEC>& layer, nn::layers::conv2d::State& state, RNG&, Mode<MODE> mode = Mode<mode::Default<>>{}) { }
213
+ template<typename DEVICE>
214
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::State& state) { }
215
+ template<typename DEVICE, typename SPEC>
216
+ RL_TOOLS_FUNCTION_PLACEMENT void malloc(DEVICE& device, nn::layers::conv2d::Buffer<SPEC>& buffer) {
217
+ malloc(device, buffer.d_weights_acc);
218
+ malloc(device, buffer.d_biases_acc);
219
+ malloc(device, buffer.d_input_acc);
220
+ malloc(device, buffer.d_gamma_acc);
221
+ malloc(device, buffer.d_beta_acc);
222
+ }
223
+ template<typename DEVICE, typename SPEC>
224
+ RL_TOOLS_FUNCTION_PLACEMENT void free(DEVICE& device, nn::layers::conv2d::Buffer<SPEC>& buffer) {
225
+ free(device, buffer.d_weights_acc);
226
+ free(device, buffer.d_biases_acc);
227
+ free(device, buffer.d_input_acc);
228
+ free(device, buffer.d_gamma_acc);
229
+ free(device, buffer.d_beta_acc);
230
+ }
231
+
232
+ // ======================== init_weights ========================
233
+ template<typename DEVICE, typename SPEC, typename INITIALIZER_SPEC, typename RNG>
234
+ RL_TOOLS_FUNCTION_PLACEMENT void init_weights(DEVICE& device, nn::layers::conv2d::LayerForward<SPEC>& layer, const nn::layers::conv2d::KaimingUniform<INITIALIZER_SPEC>& initializer, RNG& rng){
235
+ using T = typename SPEC::TYPE_POLICY::DEFAULT;
236
+ using TI = typename SPEC::TI;
237
+ T gain;
238
+ if constexpr(INITIALIZER_SPEC::INIT_LEGACY){
239
+ T negative_slope = math::sqrt(device.math, (T)5);
240
+ gain = math::sqrt(device.math, (T)2.0 / (1 + negative_slope * negative_slope));
241
+ }
242
+ else{
243
+ gain = math::sqrt(device.math, (T)2.0) * INITIALIZER_SPEC::SCALE;
244
+ }
245
+ // fan_in for Conv2d = INPUT_CHANNELS * KERNEL_HEIGHT * KERNEL_WIDTH
246
+ T fan = (T)(SPEC::INPUT_CHANNELS * SPEC::KERNEL_HEIGHT * SPEC::KERNEL_WIDTH);
247
+ T std = gain / math::sqrt(device.math, fan);
248
+ T weight_bound = math::sqrt(device.math, (T)3.0) * std;
249
+ T bias_bound = 1/math::sqrt(device.math, fan);
250
+ using PARAMETER_TYPE = typename decltype(layer.weights.parameters)::SPEC::T;
251
+ for(TI oc = 0; oc < SPEC::OUTPUT_CHANNELS; oc++) {
252
+ if constexpr(INITIALIZER_SPEC::INIT_LEGACY) {
253
+ set(device, layer.biases.parameters, (PARAMETER_TYPE)random::uniform_real_distribution(device.random, -bias_bound, bias_bound, rng), oc);
254
+ }
255
+ else{
256
+ set(device, layer.biases.parameters, (PARAMETER_TYPE)0, oc);
257
+ }
258
+ for(TI kh = 0; kh < SPEC::KERNEL_HEIGHT; kh++) {
259
+ for(TI kw = 0; kw < SPEC::KERNEL_WIDTH; kw++) {
260
+ for(TI ic = 0; ic < SPEC::INPUT_CHANNELS; ic++) {
261
+ set(device, layer.weights.parameters, (PARAMETER_TYPE)random::uniform_real_distribution(device.random, -weight_bound, weight_bound, rng), oc, kh, kw, ic);
262
+ }
263
+ }
264
+ }
265
+ }
266
+ // Initialize normalization parameters
267
+ if constexpr(SPEC::NORMALIZATION != nn::layers::conv2d::Normalization::NONE) {
268
+ using NORM_PARAM_TYPE = typename decltype(layer.norm.gamma.parameters)::SPEC::T;
269
+ for(TI oc = 0; oc < SPEC::OUTPUT_CHANNELS; oc++) {
270
+ set(device, layer.norm.gamma.parameters, (NORM_PARAM_TYPE)1, oc);
271
+ set(device, layer.norm.beta.parameters, (NORM_PARAM_TYPE)0, oc);
272
+ }
273
+ if constexpr(SPEC::NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) {
274
+ using NORM_STAT_TYPE = typename decltype(layer.norm.running_mean)::SPEC::T;
275
+ for(TI oc = 0; oc < SPEC::OUTPUT_CHANNELS; oc++) {
276
+ set(device, layer.norm.running_mean, (NORM_STAT_TYPE)0, oc);
277
+ set(device, layer.norm.running_var, (NORM_STAT_TYPE)1, oc);
278
+ }
279
+ }
280
+ }
281
+ }
282
+ template<typename DEVICE, typename SPEC, typename RNG>
283
+ RL_TOOLS_FUNCTION_PLACEMENT void init_weights(DEVICE& device, nn::layers::conv2d::LayerForward<SPEC>& layer, RNG& rng) {
284
+ init_weights(device, layer, typename SPEC::INITIALIZER{}, rng);
285
+ }
286
+
287
+ // ======================== evaluate (LayerForward, no storage) ========================
288
+ #ifndef RL_TOOLS_NN_DISABLE_GENERIC_FORWARD_BACKWARD
289
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename OUTPUT_SPEC, typename BUFFER_SPEC, typename RNG, typename MODE = mode::Default<>>
290
+ RL_TOOLS_FUNCTION_PLACEMENT void evaluate(DEVICE& device, const nn::layers::conv2d::LayerForward<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, Tensor<OUTPUT_SPEC>& output, nn::layers::conv2d::Buffer<BUFFER_SPEC>&, RNG& rng, const Mode<MODE>& mode = Mode<mode::Default<>>{}) {
291
+ static_assert(nn::layers::conv2d::check_input_output<LAYER_SPEC, INPUT_SPEC, OUTPUT_SPEC>);
292
+ using TI = typename DEVICE::index_t;
293
+ using T = typename OUTPUT_SPEC::T;
294
+ using ACCUMULATOR_TYPE = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Accumulator>;
295
+ constexpr TI BATCH_SIZE = product(typename INPUT_SPEC::SHAPE{}) / (LAYER_SPEC::INPUT_HEIGHT * LAYER_SPEC::INPUT_WIDTH * LAYER_SPEC::INPUT_CHANNELS);
296
+ constexpr auto NORMALIZATION = LAYER_SPEC::NORMALIZATION;
297
+ // Reshape to 4D: [INTERNAL_BATCH_SIZE, H, W, C]
298
+ using INTERNAL_INPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::INPUT_HEIGHT, LAYER_SPEC::INPUT_WIDTH, LAYER_SPEC::INPUT_CHANNELS>;
299
+ using INTERNAL_OUTPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::OUTPUT_HEIGHT, LAYER_SPEC::OUTPUT_WIDTH, LAYER_SPEC::OUTPUT_CHANNELS>;
300
+ auto input_4d = view_memory<INTERNAL_INPUT_SHAPE>(device, input);
301
+ auto output_4d = view_memory<INTERNAL_OUTPUT_SHAPE>(device, output);
302
+
303
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::NONE) {
304
+ // Fused conv + activation
305
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
306
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
307
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
308
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
309
+ ACCUMULATOR_TYPE acc = (ACCUMULATOR_TYPE)get(device, layer.biases.parameters, oc);
310
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
311
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
312
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
313
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
314
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
315
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
316
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
317
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
318
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
319
+ acc += (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic);
320
+ }
321
+ }
322
+ }
323
+ }
324
+ set(device, output_4d, (T)activation<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(acc), bi, oh, ow, oc);
325
+ }
326
+ }
327
+ }
328
+ }
329
+ } else {
330
+ // Phase 1: Compute conv output -> store temporarily in output
331
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
332
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
333
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
334
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
335
+ ACCUMULATOR_TYPE acc = (ACCUMULATOR_TYPE)get(device, layer.biases.parameters, oc);
336
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
337
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
338
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
339
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
340
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
341
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
342
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
343
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
344
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
345
+ acc += (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic);
346
+ }
347
+ }
348
+ }
349
+ }
350
+ set(device, output_4d, (T)acc, bi, oh, ow, oc);
351
+ }
352
+ }
353
+ }
354
+ }
355
+
356
+ const T eps = (T)LAYER_SPEC::NORM_EPSILON;
357
+
358
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) {
359
+ // Evaluate mode for BN: use running statistics
360
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
361
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
362
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
363
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
364
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, output_4d, bi, oh, ow, oc);
365
+ ACCUMULATOR_TYPE inv_std = (ACCUMULATOR_TYPE)1 / math::sqrt(device.math, (ACCUMULATOR_TYPE)get(device, layer.norm.running_var, oc) + (ACCUMULATOR_TYPE)eps);
366
+ ACCUMULATOR_TYPE z_hat = (conv_out - (ACCUMULATOR_TYPE)get(device, layer.norm.running_mean, oc)) * inv_std;
367
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
368
+ set(device, output_4d, (T)activation<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out), bi, oh, ow, oc);
369
+ }
370
+ }
371
+ }
372
+ }
373
+ } else { // LAYER_NORM
374
+ // Compute per-sample statistics on the fly
375
+ constexpr TI N_LN = LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH * LAYER_SPEC::OUTPUT_CHANNELS;
376
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
377
+ // Compute mean
378
+ ACCUMULATOR_TYPE mean_val = 0;
379
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
380
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
381
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
382
+ mean_val += (ACCUMULATOR_TYPE)get(device, output_4d, bi, oh, ow, oc);
383
+ }
384
+ }
385
+ }
386
+ mean_val /= (ACCUMULATOR_TYPE)N_LN;
387
+ // Compute variance
388
+ ACCUMULATOR_TYPE var_val = 0;
389
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
390
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
391
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
392
+ ACCUMULATOR_TYPE diff = (ACCUMULATOR_TYPE)get(device, output_4d, bi, oh, ow, oc) - mean_val;
393
+ var_val += diff * diff;
394
+ }
395
+ }
396
+ }
397
+ var_val /= (ACCUMULATOR_TYPE)N_LN;
398
+ ACCUMULATOR_TYPE inv_std = (ACCUMULATOR_TYPE)1 / math::sqrt(device.math, var_val + (ACCUMULATOR_TYPE)eps);
399
+ // Normalize + activate
400
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
401
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
402
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
403
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, output_4d, bi, oh, ow, oc);
404
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std;
405
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
406
+ set(device, output_4d, (T)activation<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out), bi, oh, ow, oc);
407
+ }
408
+ }
409
+ }
410
+ }
411
+ }
412
+ }
413
+ }
414
+
415
+ // ======================== evaluate_step (stateless, delegates to evaluate) ========================
416
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename OUTPUT_SPEC, typename BUFFER_SPEC, typename RNG, typename MODE = mode::Default<>>
417
+ RL_TOOLS_FUNCTION_PLACEMENT void evaluate_step(DEVICE& device, const nn::layers::conv2d::LayerForward<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, nn::layers::conv2d::State& state, Tensor<OUTPUT_SPEC>& output, nn::layers::conv2d::Buffer<BUFFER_SPEC>& buffer, RNG& rng, const Mode<MODE>& mode = Mode<mode::Default<>>{}){
418
+ evaluate(device, layer, input, output, buffer, rng, mode);
419
+ }
420
+
421
+ // ======================== forward (LayerBackward, stores pre_activations and caches stats) ========================
422
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename OUTPUT_SPEC, typename BUFFER_SPEC, typename RNG, typename MODE = mode::Default<>>
423
+ RL_TOOLS_FUNCTION_PLACEMENT void forward(DEVICE& device, nn::layers::conv2d::LayerBackward<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, Tensor<OUTPUT_SPEC>& output, nn::layers::conv2d::Buffer<BUFFER_SPEC>& buffer, RNG& rng, const Mode<MODE>& mode = Mode<mode::Default<>>{}){
424
+ static_assert(nn::layers::conv2d::check_input_output<LAYER_SPEC, INPUT_SPEC, OUTPUT_SPEC>);
425
+ using TI = typename DEVICE::index_t;
426
+ using T = typename OUTPUT_SPEC::T;
427
+ using ACCUMULATOR_TYPE = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Accumulator>;
428
+ constexpr TI BATCH_SIZE = LAYER_SPEC::INTERNAL_BATCH_SIZE;
429
+ constexpr auto NORMALIZATION = LAYER_SPEC::NORMALIZATION;
430
+
431
+ using INTERNAL_INPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::INPUT_HEIGHT, LAYER_SPEC::INPUT_WIDTH, LAYER_SPEC::INPUT_CHANNELS>;
432
+ using INTERNAL_OUTPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::OUTPUT_HEIGHT, LAYER_SPEC::OUTPUT_WIDTH, LAYER_SPEC::OUTPUT_CHANNELS>;
433
+ auto input_4d = view_memory<INTERNAL_INPUT_SHAPE>(device, input);
434
+ auto output_4d = view_memory<INTERNAL_OUTPUT_SHAPE>(device, output);
435
+
436
+ // Phase 1: Compute conv output -> store in pre_activations
437
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
438
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
439
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
440
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
441
+ ACCUMULATOR_TYPE acc = (ACCUMULATOR_TYPE)get(device, layer.biases.parameters, oc);
442
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
443
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
444
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
445
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
446
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
447
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
448
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
449
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
450
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
451
+ acc += (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic);
452
+ }
453
+ }
454
+ }
455
+ }
456
+ set(device, layer.pre_activations, (T)acc, bi, oh, ow, oc);
457
+ }
458
+ }
459
+ }
460
+ }
461
+
462
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::NONE) {
463
+ // Apply activation directly
464
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
465
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
466
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
467
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
468
+ T pre_act = get(device, layer.pre_activations, bi, oh, ow, oc);
469
+ set(device, output_4d, activation<typename DEVICE::SPEC::MATH, T, LAYER_SPEC::ACTIVATION_FUNCTION>(pre_act), bi, oh, ow, oc);
470
+ }
471
+ }
472
+ }
473
+ }
474
+ } else if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) {
475
+ const T eps = (T)LAYER_SPEC::NORM_EPSILON;
476
+ if constexpr(mode::is<MODE, mode::Evaluation>) {
477
+ // Evaluation mode: use running statistics (like PyTorch model.eval())
478
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
479
+ T mean_val = get(device, layer.norm.running_mean, oc);
480
+ ACCUMULATOR_TYPE var_val = (ACCUMULATOR_TYPE)get(device, layer.norm.running_var, oc);
481
+ T inv_std = (T)((ACCUMULATOR_TYPE)1 / math::sqrt(device.math, var_val + (ACCUMULATOR_TYPE)eps));
482
+ set(device, layer.norm_cache.mean, mean_val, oc);
483
+ set(device, layer.norm_cache.inv_std, inv_std, oc);
484
+ }
485
+ } else {
486
+ // Training mode: compute batch statistics
487
+ const T momentum = (T)LAYER_SPEC::BN_MOMENTUM;
488
+ constexpr TI N_BN = BATCH_SIZE * LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH;
489
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
490
+ ACCUMULATOR_TYPE mean_val = 0;
491
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
492
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
493
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
494
+ mean_val += (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
495
+ }
496
+ }
497
+ }
498
+ mean_val /= (ACCUMULATOR_TYPE)N_BN;
499
+ ACCUMULATOR_TYPE var_val = 0;
500
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
501
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
502
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
503
+ ACCUMULATOR_TYPE diff = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc) - mean_val;
504
+ var_val += diff * diff;
505
+ }
506
+ }
507
+ }
508
+ var_val /= (ACCUMULATOR_TYPE)N_BN;
509
+ T inv_std = (T)((ACCUMULATOR_TYPE)1 / math::sqrt(device.math, var_val + (ACCUMULATOR_TYPE)eps));
510
+ set(device, layer.norm_cache.mean, (T)mean_val, oc);
511
+ set(device, layer.norm_cache.inv_std, inv_std, oc);
512
+ // Update running statistics (EMA)
513
+ using NORM_STAT_TYPE = typename decltype(layer.norm.running_mean)::SPEC::T;
514
+ NORM_STAT_TYPE running_mean = get(device, layer.norm.running_mean, oc);
515
+ NORM_STAT_TYPE running_var = get(device, layer.norm.running_var, oc);
516
+ set(device, layer.norm.running_mean, (NORM_STAT_TYPE)((ACCUMULATOR_TYPE)((ACCUMULATOR_TYPE)1 - (ACCUMULATOR_TYPE)momentum) * (ACCUMULATOR_TYPE)running_mean + (ACCUMULATOR_TYPE)momentum * mean_val), oc);
517
+ set(device, layer.norm.running_var, (NORM_STAT_TYPE)((ACCUMULATOR_TYPE)((ACCUMULATOR_TYPE)1 - (ACCUMULATOR_TYPE)momentum) * (ACCUMULATOR_TYPE)running_var + (ACCUMULATOR_TYPE)momentum * var_val), oc);
518
+ }
519
+ }
520
+
521
+ // Phase 3: Normalize + activate -> output (same for both modes, uses cached stats)
522
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
523
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
524
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
525
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
526
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
527
+ ACCUMULATOR_TYPE z_hat = (conv_out - (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc)) * (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc);
528
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
529
+ set(device, output_4d, (T)activation<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out), bi, oh, ow, oc);
530
+ }
531
+ }
532
+ }
533
+ }
534
+ } else { // LAYER_NORM
535
+ const T eps = (T)LAYER_SPEC::NORM_EPSILON;
536
+ constexpr TI N_LN = LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH * LAYER_SPEC::OUTPUT_CHANNELS;
537
+
538
+ // Phase 2: Compute per-sample statistics
539
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
540
+ ACCUMULATOR_TYPE mean_val = 0;
541
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
542
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
543
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
544
+ mean_val += (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
545
+ }
546
+ }
547
+ }
548
+ mean_val /= (ACCUMULATOR_TYPE)N_LN;
549
+
550
+ ACCUMULATOR_TYPE var_val = 0;
551
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
552
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
553
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
554
+ ACCUMULATOR_TYPE diff = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc) - mean_val;
555
+ var_val += diff * diff;
556
+ }
557
+ }
558
+ }
559
+ var_val /= (ACCUMULATOR_TYPE)N_LN;
560
+ T inv_std = (T)((ACCUMULATOR_TYPE)1 / math::sqrt(device.math, var_val + (ACCUMULATOR_TYPE)eps));
561
+
562
+ set(device, layer.norm_cache.mean, (T)mean_val, bi);
563
+ set(device, layer.norm_cache.inv_std, inv_std, bi);
564
+ }
565
+
566
+ // Phase 3: Normalize + activate -> output
567
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
568
+ ACCUMULATOR_TYPE mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi);
569
+ ACCUMULATOR_TYPE inv_std = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi);
570
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
571
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
572
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
573
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
574
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std;
575
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
576
+ set(device, output_4d, (T)activation<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out), bi, oh, ow, oc);
577
+ }
578
+ }
579
+ }
580
+ }
581
+ }
582
+ }
583
+ #endif
584
+
585
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename BUFFER_SPEC, typename RNG, typename MODE = mode::Default<>>
586
+ RL_TOOLS_FUNCTION_PLACEMENT void forward(DEVICE& device, nn::layers::conv2d::LayerGradient<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, nn::layers::conv2d::Buffer<BUFFER_SPEC>& buffer, RNG& rng, const Mode<MODE>& mode = Mode<mode::Default<>>{}) {
587
+ forward(device, static_cast<nn::layers::conv2d::LayerBackward<LAYER_SPEC>&>(layer), input, layer.output, buffer, rng, mode);
588
+ }
589
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename OUTPUT_SPEC, typename BUFFER_SPEC, typename RNG, typename MODE = mode::Default<>>
590
+ RL_TOOLS_FUNCTION_PLACEMENT void forward(DEVICE& device, nn::layers::conv2d::LayerGradient<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, Tensor<OUTPUT_SPEC>& output, nn::layers::conv2d::Buffer<BUFFER_SPEC>& buffer, RNG& rng, const Mode<MODE>& mode = Mode<mode::Default<>>{}) {
591
+ static_assert(nn::layers::conv2d::check_input_output<LAYER_SPEC, INPUT_SPEC, OUTPUT_SPEC>);
592
+ forward(device, layer, input, buffer, rng, mode);
593
+ copy(device, device, layer.output, output);
594
+ }
595
+
596
+ // ======================== Normalization backward helper ========================
597
+ // Computes d_conv_out from d_output given cached forward stats.
598
+ // Also optionally accumulates d_gamma and d_beta.
599
+ // Returns nothing; caller uses d_conv_out inline in phase 2.
600
+ // This is integrated directly into the backward functions below.
601
+
602
+ // ======================== backward_input ========================
603
+ #ifndef RL_TOOLS_NN_DISABLE_GENERIC_FORWARD_BACKWARD
604
+ template<typename DEVICE, typename LAYER_SPEC, typename D_OUTPUT_SPEC, typename D_INPUT_SPEC, typename BUFFER_SPEC, typename MODE = mode::Default<>>
605
+ RL_TOOLS_FUNCTION_PLACEMENT void backward_input(DEVICE& device, const nn::layers::conv2d::LayerBackward<LAYER_SPEC>& layer, const Tensor<D_OUTPUT_SPEC>& d_output, Tensor<D_INPUT_SPEC>& d_input, nn::layers::conv2d::Buffer<BUFFER_SPEC>&, const Mode<MODE>& mode = Mode<mode::Default<>>{}){
606
+ using TI = typename DEVICE::index_t;
607
+ using T = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Gradient>;
608
+ using ACCUMULATOR_TYPE = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Accumulator>;
609
+ constexpr TI BATCH_SIZE = LAYER_SPEC::INTERNAL_BATCH_SIZE;
610
+ constexpr auto NORMALIZATION = LAYER_SPEC::NORMALIZATION;
611
+
612
+ using INTERNAL_D_INPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::INPUT_HEIGHT, LAYER_SPEC::INPUT_WIDTH, LAYER_SPEC::INPUT_CHANNELS>;
613
+ using INTERNAL_D_OUTPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::OUTPUT_HEIGHT, LAYER_SPEC::OUTPUT_WIDTH, LAYER_SPEC::OUTPUT_CHANNELS>;
614
+ auto d_input_4d = view_memory<INTERNAL_D_INPUT_SHAPE>(device, d_input);
615
+ auto d_output_4d = view_memory<INTERNAL_D_OUTPUT_SHAPE>(device, d_output);
616
+
617
+ set_all(device, d_input_4d, (T)0);
618
+
619
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::NONE) {
620
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
621
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
622
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
623
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
624
+ ACCUMULATOR_TYPE d_pre_act = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>((ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc)) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
625
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
626
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
627
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
628
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
629
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
630
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
631
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
632
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
633
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
634
+ increment(device, d_input_4d, (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * d_pre_act, bi, ih, iw, ic);
635
+ }
636
+ }
637
+ }
638
+ }
639
+ }
640
+ }
641
+ }
642
+ }
643
+ } else {
644
+ // Normalization backward
645
+ constexpr bool IS_EVAL = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) && mode::is<MODE, mode::Evaluation>;
646
+ if constexpr(IS_EVAL) {
647
+ // Evaluation mode: statistics are fixed, simple backward
648
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
649
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
650
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
651
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
652
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
653
+ ACCUMULATOR_TYPE mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc);
654
+ ACCUMULATOR_TYPE inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc);
655
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
656
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
657
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
658
+ ACCUMULATOR_TYPE d_conv_out = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * inv_std_val;
659
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
660
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
661
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
662
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
663
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
664
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
665
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
666
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
667
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
668
+ increment(device, d_input_4d, (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * d_conv_out, bi, ih, iw, ic);
669
+ }
670
+ }
671
+ }
672
+ }
673
+ }
674
+ }
675
+ }
676
+ }
677
+ } else {
678
+ // Training mode: two-phase normalization backward
679
+ constexpr TI NORM_DIM = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) ? LAYER_SPEC::OUTPUT_CHANNELS : BATCH_SIZE;
680
+ constexpr TI N = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) ?
681
+ (BATCH_SIZE * LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH) :
682
+ (LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH * LAYER_SPEC::OUTPUT_CHANNELS);
683
+ ACCUMULATOR_TYPE sum_dz_hat[NORM_DIM];
684
+ ACCUMULATOR_TYPE sum_dz_hat_z_hat[NORM_DIM];
685
+ for(TI i = 0; i < NORM_DIM; i++){ sum_dz_hat[i] = 0; sum_dz_hat_z_hat[i] = 0; }
686
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
687
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
688
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
689
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
690
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
691
+ TI stat_idx; ACCUMULATOR_TYPE mean_val, inv_std_val;
692
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) {
693
+ stat_idx = oc; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc);
694
+ } else {
695
+ stat_idx = bi; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi);
696
+ }
697
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
698
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
699
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
700
+ ACCUMULATOR_TYPE d_z_hat_val = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc);
701
+ sum_dz_hat[stat_idx] += d_z_hat_val;
702
+ sum_dz_hat_z_hat[stat_idx] += d_z_hat_val * z_hat;
703
+ }
704
+ }
705
+ }
706
+ }
707
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
708
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
709
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
710
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
711
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
712
+ TI stat_idx; ACCUMULATOR_TYPE mean_val, inv_std_val;
713
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) {
714
+ stat_idx = oc; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc);
715
+ } else {
716
+ stat_idx = bi; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi);
717
+ }
718
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
719
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
720
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
721
+ ACCUMULATOR_TYPE d_z_hat_val = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc);
722
+ T d_conv_out = (T)(inv_std_val * ((ACCUMULATOR_TYPE)1 / (ACCUMULATOR_TYPE)N) * ((ACCUMULATOR_TYPE)N * d_z_hat_val - sum_dz_hat[stat_idx] - z_hat * sum_dz_hat_z_hat[stat_idx]));
723
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
724
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
725
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
726
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
727
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
728
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
729
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
730
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
731
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
732
+ increment(device, d_input_4d, (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * (ACCUMULATOR_TYPE)d_conv_out, bi, ih, iw, ic);
733
+ }
734
+ }
735
+ }
736
+ }
737
+ }
738
+ }
739
+ }
740
+ }
741
+ }
742
+ }
743
+ }
744
+
745
+ // ======================== backward (gradient accumulation only) ========================
746
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename D_OUTPUT_SPEC, typename BUFFER_SPEC, typename MODE = mode::Default<>>
747
+ RL_TOOLS_FUNCTION_PLACEMENT void backward(DEVICE& device, nn::layers::conv2d::LayerGradient<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, Tensor<D_OUTPUT_SPEC>& d_output, nn::layers::conv2d::Buffer<BUFFER_SPEC>& buffer, const Mode<MODE>& mode = Mode<mode::Default<>>{}) {
748
+ using TI = typename DEVICE::index_t;
749
+ using T = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Gradient>;
750
+ using ACCUMULATOR_TYPE = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Accumulator>;
751
+ constexpr TI BATCH_SIZE = LAYER_SPEC::INTERNAL_BATCH_SIZE;
752
+ constexpr auto NORMALIZATION = LAYER_SPEC::NORMALIZATION;
753
+
754
+ using INTERNAL_INPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::INPUT_HEIGHT, LAYER_SPEC::INPUT_WIDTH, LAYER_SPEC::INPUT_CHANNELS>;
755
+ using INTERNAL_D_OUTPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::OUTPUT_HEIGHT, LAYER_SPEC::OUTPUT_WIDTH, LAYER_SPEC::OUTPUT_CHANNELS>;
756
+ auto input_4d = view_memory<INTERNAL_INPUT_SHAPE>(device, input);
757
+ auto d_output_4d = view_memory<INTERNAL_D_OUTPUT_SHAPE>(device, d_output);
758
+
759
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) set(device, buffer.d_biases_acc, (ACCUMULATOR_TYPE)get(device, layer.biases.gradient, oc), oc);
760
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++) for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++) for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++)
761
+ set(device, buffer.d_weights_acc, (ACCUMULATOR_TYPE)get(device, layer.weights.gradient, oc, kh, kw, ic), oc, kh, kw, ic);
762
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::NONE) {
763
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
764
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
765
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
766
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
767
+ ACCUMULATOR_TYPE d_pre_act = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>((ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc)) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
768
+ increment(device, buffer.d_biases_acc, d_pre_act, oc);
769
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
770
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
771
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
772
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
773
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
774
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
775
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
776
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
777
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
778
+ increment(device, buffer.d_weights_acc, d_pre_act * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic), oc, kh, kw, ic);
779
+ }
780
+ }
781
+ }
782
+ }
783
+ }
784
+ }
785
+ }
786
+ }
787
+ } else {
788
+ constexpr bool IS_EVAL = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) && mode::is<MODE, mode::Evaluation>;
789
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
790
+ set(device, buffer.d_gamma_acc, (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.gradient, oc), oc);
791
+ set(device, buffer.d_beta_acc, (ACCUMULATOR_TYPE)get(device, layer.norm.beta.gradient, oc), oc);
792
+ }
793
+ if constexpr(IS_EVAL) {
794
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
795
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
796
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
797
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
798
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
799
+ ACCUMULATOR_TYPE mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc);
800
+ ACCUMULATOR_TYPE inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc);
801
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
802
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
803
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
804
+ increment(device, buffer.d_gamma_acc, d_norm_out * z_hat, oc);
805
+ increment(device, buffer.d_beta_acc, d_norm_out, oc);
806
+ ACCUMULATOR_TYPE d_conv_out = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * inv_std_val;
807
+ increment(device, buffer.d_biases_acc, d_conv_out, oc);
808
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
809
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
810
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
811
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
812
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
813
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
814
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
815
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
816
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
817
+ increment(device, buffer.d_weights_acc, d_conv_out * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic), oc, kh, kw, ic);
818
+ }
819
+ }
820
+ }
821
+ }
822
+ }
823
+ }
824
+ }
825
+ }
826
+ } else {
827
+ // Training mode: two-phase normalization backward
828
+ constexpr TI NORM_DIM = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) ? LAYER_SPEC::OUTPUT_CHANNELS : BATCH_SIZE;
829
+ constexpr TI N = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) ?
830
+ (BATCH_SIZE * LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH) :
831
+ (LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH * LAYER_SPEC::OUTPUT_CHANNELS);
832
+ ACCUMULATOR_TYPE sum_dz_hat[NORM_DIM]; ACCUMULATOR_TYPE sum_dz_hat_z_hat[NORM_DIM];
833
+ for(TI i = 0; i < NORM_DIM; i++){ sum_dz_hat[i] = 0; sum_dz_hat_z_hat[i] = 0; }
834
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
835
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
836
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
837
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
838
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
839
+ TI stat_idx; ACCUMULATOR_TYPE mean_val, inv_std_val;
840
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) { stat_idx = oc; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc); }
841
+ else { stat_idx = bi; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi); }
842
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
843
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
844
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
845
+ ACCUMULATOR_TYPE d_z_hat_val = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc);
846
+ increment(device, buffer.d_gamma_acc, d_norm_out * z_hat, oc);
847
+ increment(device, buffer.d_beta_acc, d_norm_out, oc);
848
+ sum_dz_hat[stat_idx] += d_z_hat_val; sum_dz_hat_z_hat[stat_idx] += d_z_hat_val * z_hat;
849
+ }
850
+ }
851
+ }
852
+ }
853
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
854
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
855
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
856
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
857
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
858
+ TI stat_idx; ACCUMULATOR_TYPE mean_val, inv_std_val;
859
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) { stat_idx = oc; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc); }
860
+ else { stat_idx = bi; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi); }
861
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
862
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
863
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
864
+ ACCUMULATOR_TYPE d_z_hat_val = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc);
865
+ ACCUMULATOR_TYPE d_conv_out = inv_std_val * ((ACCUMULATOR_TYPE)1 / (ACCUMULATOR_TYPE)N) * ((ACCUMULATOR_TYPE)N * d_z_hat_val - sum_dz_hat[stat_idx] - z_hat * sum_dz_hat_z_hat[stat_idx]);
866
+ increment(device, buffer.d_biases_acc, d_conv_out, oc);
867
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
868
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
869
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
870
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
871
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
872
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
873
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
874
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
875
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
876
+ increment(device, buffer.d_weights_acc, d_conv_out * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic), oc, kh, kw, ic);
877
+ }
878
+ }
879
+ }
880
+ }
881
+ }
882
+ }
883
+ }
884
+ }
885
+ }
886
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
887
+ set(device, layer.norm.gamma.gradient, (T)get(device, buffer.d_gamma_acc, oc), oc);
888
+ set(device, layer.norm.beta.gradient, (T)get(device, buffer.d_beta_acc, oc), oc);
889
+ }
890
+ }
891
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) set(device, layer.biases.gradient, (T)get(device, buffer.d_biases_acc, oc), oc);
892
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++) for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++) for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++)
893
+ set(device, layer.weights.gradient, (T)get(device, buffer.d_weights_acc, oc, kh, kw, ic), oc, kh, kw, ic);
894
+ }
895
+
896
+ // ======================== backward_full (d_input + gradient accumulation) ========================
897
+ template<typename DEVICE, typename LAYER_SPEC, typename INPUT_SPEC, typename D_OUTPUT_SPEC, typename D_INPUT_SPEC, typename BUFFER_SPEC, typename MODE = mode::Default<>>
898
+ RL_TOOLS_FUNCTION_PLACEMENT void backward_full(DEVICE& device, nn::layers::conv2d::LayerGradient<LAYER_SPEC>& layer, const Tensor<INPUT_SPEC>& input, Tensor<D_OUTPUT_SPEC>& d_output, Tensor<D_INPUT_SPEC>& d_input, nn::layers::conv2d::Buffer<BUFFER_SPEC>& buffer, const Mode<MODE>& mode = Mode<mode::Default<>>{}) {
899
+ using TI = typename DEVICE::index_t;
900
+ using T = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Gradient>;
901
+ using ACCUMULATOR_TYPE = typename LAYER_SPEC::TYPE_POLICY::template GET<numeric_types::categories::Accumulator>;
902
+ constexpr TI BATCH_SIZE = LAYER_SPEC::INTERNAL_BATCH_SIZE;
903
+ constexpr auto NORMALIZATION = LAYER_SPEC::NORMALIZATION;
904
+
905
+ using INTERNAL_INPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::INPUT_HEIGHT, LAYER_SPEC::INPUT_WIDTH, LAYER_SPEC::INPUT_CHANNELS>;
906
+ using INTERNAL_D_INPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::INPUT_HEIGHT, LAYER_SPEC::INPUT_WIDTH, LAYER_SPEC::INPUT_CHANNELS>;
907
+ using INTERNAL_D_OUTPUT_SHAPE = tensor::Shape<TI, BATCH_SIZE, LAYER_SPEC::OUTPUT_HEIGHT, LAYER_SPEC::OUTPUT_WIDTH, LAYER_SPEC::OUTPUT_CHANNELS>;
908
+ auto input_4d = view_memory<INTERNAL_INPUT_SHAPE>(device, input);
909
+ auto d_input_4d = view_memory<INTERNAL_D_INPUT_SHAPE>(device, d_input);
910
+ auto d_output_4d = view_memory<INTERNAL_D_OUTPUT_SHAPE>(device, d_output);
911
+
912
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) set(device, buffer.d_biases_acc, (ACCUMULATOR_TYPE)get(device, layer.biases.gradient, oc), oc);
913
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++) for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++) for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++)
914
+ set(device, buffer.d_weights_acc, (ACCUMULATOR_TYPE)get(device, layer.weights.gradient, oc, kh, kw, ic), oc, kh, kw, ic);
915
+ set_all(device, buffer.d_input_acc, (ACCUMULATOR_TYPE)0);
916
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::NONE) {
917
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
918
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
919
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
920
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
921
+ ACCUMULATOR_TYPE d_pre_act = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>((ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc)) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
922
+ increment(device, buffer.d_biases_acc, d_pre_act, oc);
923
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
924
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
925
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
926
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
927
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
928
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
929
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
930
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
931
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
932
+ increment(device, buffer.d_input_acc, (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * d_pre_act, bi, ih, iw, ic);
933
+ increment(device, buffer.d_weights_acc, d_pre_act * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic), oc, kh, kw, ic);
934
+ }
935
+ }
936
+ }
937
+ }
938
+ }
939
+ }
940
+ }
941
+ }
942
+ } else {
943
+ constexpr bool IS_EVAL = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) && mode::is<MODE, mode::Evaluation>;
944
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
945
+ set(device, buffer.d_gamma_acc, (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.gradient, oc), oc);
946
+ set(device, buffer.d_beta_acc, (ACCUMULATOR_TYPE)get(device, layer.norm.beta.gradient, oc), oc);
947
+ }
948
+ if constexpr(IS_EVAL) {
949
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
950
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
951
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
952
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
953
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
954
+ ACCUMULATOR_TYPE mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc);
955
+ ACCUMULATOR_TYPE inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc);
956
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
957
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
958
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
959
+ increment(device, buffer.d_gamma_acc, d_norm_out * z_hat, oc);
960
+ increment(device, buffer.d_beta_acc, d_norm_out, oc);
961
+ ACCUMULATOR_TYPE d_conv_out = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * inv_std_val;
962
+ increment(device, buffer.d_biases_acc, d_conv_out, oc);
963
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
964
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
965
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
966
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
967
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
968
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
969
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
970
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
971
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
972
+ increment(device, buffer.d_input_acc, (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * d_conv_out, bi, ih, iw, ic);
973
+ increment(device, buffer.d_weights_acc, d_conv_out * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic), oc, kh, kw, ic);
974
+ }
975
+ }
976
+ }
977
+ }
978
+ }
979
+ }
980
+ }
981
+ }
982
+ } else {
983
+ // Training mode: two-phase normalization backward
984
+ constexpr TI NORM_DIM = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) ? LAYER_SPEC::OUTPUT_CHANNELS : BATCH_SIZE;
985
+ constexpr TI N = (NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) ?
986
+ (BATCH_SIZE * LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH) :
987
+ (LAYER_SPEC::OUTPUT_HEIGHT * LAYER_SPEC::OUTPUT_WIDTH * LAYER_SPEC::OUTPUT_CHANNELS);
988
+ ACCUMULATOR_TYPE sum_dz_hat[NORM_DIM]; ACCUMULATOR_TYPE sum_dz_hat_z_hat[NORM_DIM];
989
+ for(TI i = 0; i < NORM_DIM; i++){ sum_dz_hat[i] = 0; sum_dz_hat_z_hat[i] = 0; }
990
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
991
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
992
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
993
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
994
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
995
+ TI stat_idx; ACCUMULATOR_TYPE mean_val, inv_std_val;
996
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) { stat_idx = oc; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc); }
997
+ else { stat_idx = bi; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi); }
998
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
999
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
1000
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
1001
+ ACCUMULATOR_TYPE d_z_hat_val = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc);
1002
+ increment(device, buffer.d_gamma_acc, d_norm_out * z_hat, oc);
1003
+ increment(device, buffer.d_beta_acc, d_norm_out, oc);
1004
+ sum_dz_hat[stat_idx] += d_z_hat_val; sum_dz_hat_z_hat[stat_idx] += d_z_hat_val * z_hat;
1005
+ }
1006
+ }
1007
+ }
1008
+ }
1009
+ for(TI bi = 0; bi < BATCH_SIZE; bi++){
1010
+ for(TI oh = 0; oh < LAYER_SPEC::OUTPUT_HEIGHT; oh++){
1011
+ for(TI ow = 0; ow < LAYER_SPEC::OUTPUT_WIDTH; ow++){
1012
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
1013
+ ACCUMULATOR_TYPE conv_out = (ACCUMULATOR_TYPE)get(device, layer.pre_activations, bi, oh, ow, oc);
1014
+ TI stat_idx; ACCUMULATOR_TYPE mean_val, inv_std_val;
1015
+ if constexpr(NORMALIZATION == nn::layers::conv2d::Normalization::BATCH_NORM) { stat_idx = oc; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, oc); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, oc); }
1016
+ else { stat_idx = bi; mean_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.mean, bi); inv_std_val = (ACCUMULATOR_TYPE)get(device, layer.norm_cache.inv_std, bi); }
1017
+ ACCUMULATOR_TYPE z_hat = (conv_out - mean_val) * inv_std_val;
1018
+ ACCUMULATOR_TYPE norm_out = (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc) * z_hat + (ACCUMULATOR_TYPE)get(device, layer.norm.beta.parameters, oc);
1019
+ ACCUMULATOR_TYPE d_norm_out = d_activation_d_x<typename DEVICE::SPEC::MATH, ACCUMULATOR_TYPE, LAYER_SPEC::ACTIVATION_FUNCTION>(norm_out) * (ACCUMULATOR_TYPE)get(device, d_output_4d, bi, oh, ow, oc);
1020
+ ACCUMULATOR_TYPE d_z_hat_val = d_norm_out * (ACCUMULATOR_TYPE)get(device, layer.norm.gamma.parameters, oc);
1021
+ ACCUMULATOR_TYPE d_conv_out = inv_std_val * ((ACCUMULATOR_TYPE)1 / (ACCUMULATOR_TYPE)N) * ((ACCUMULATOR_TYPE)N * d_z_hat_val - sum_dz_hat[stat_idx] - z_hat * sum_dz_hat_z_hat[stat_idx]);
1022
+ increment(device, buffer.d_biases_acc, d_conv_out, oc);
1023
+ for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++){
1024
+ for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++){
1025
+ TI ih_padded = oh * LAYER_SPEC::STRIDE_H + kh;
1026
+ TI iw_padded = ow * LAYER_SPEC::STRIDE_W + kw;
1027
+ if(ih_padded >= LAYER_SPEC::PADDING_H && ih_padded < LAYER_SPEC::INPUT_HEIGHT + LAYER_SPEC::PADDING_H &&
1028
+ iw_padded >= LAYER_SPEC::PADDING_W && iw_padded < LAYER_SPEC::INPUT_WIDTH + LAYER_SPEC::PADDING_W){
1029
+ TI ih = ih_padded - LAYER_SPEC::PADDING_H;
1030
+ TI iw = iw_padded - LAYER_SPEC::PADDING_W;
1031
+ for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++){
1032
+ increment(device, buffer.d_input_acc, (ACCUMULATOR_TYPE)get(device, layer.weights.parameters, oc, kh, kw, ic) * d_conv_out, bi, ih, iw, ic);
1033
+ increment(device, buffer.d_weights_acc, d_conv_out * (ACCUMULATOR_TYPE)get(device, input_4d, bi, ih, iw, ic), oc, kh, kw, ic);
1034
+ }
1035
+ }
1036
+ }
1037
+ }
1038
+ }
1039
+ }
1040
+ }
1041
+ }
1042
+ }
1043
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++){
1044
+ set(device, layer.norm.gamma.gradient, (T)get(device, buffer.d_gamma_acc, oc), oc);
1045
+ set(device, layer.norm.beta.gradient, (T)get(device, buffer.d_beta_acc, oc), oc);
1046
+ }
1047
+ }
1048
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) set(device, layer.biases.gradient, (T)get(device, buffer.d_biases_acc, oc), oc);
1049
+ for(TI oc = 0; oc < LAYER_SPEC::OUTPUT_CHANNELS; oc++) for(TI kh = 0; kh < LAYER_SPEC::KERNEL_HEIGHT; kh++) for(TI kw = 0; kw < LAYER_SPEC::KERNEL_WIDTH; kw++) for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++)
1050
+ set(device, layer.weights.gradient, (T)get(device, buffer.d_weights_acc, oc, kh, kw, ic), oc, kh, kw, ic);
1051
+ for(TI bi = 0; bi < BATCH_SIZE; bi++) for(TI ih = 0; ih < LAYER_SPEC::INPUT_HEIGHT; ih++) for(TI iw = 0; iw < LAYER_SPEC::INPUT_WIDTH; iw++) for(TI ic = 0; ic < LAYER_SPEC::INPUT_CHANNELS; ic++)
1052
+ set(device, d_input_4d, (T)get(device, buffer.d_input_acc, bi, ih, iw, ic), bi, ih, iw, ic);
1053
+ }
1054
+ #endif
1055
+
1056
+ // ======================== zero_gradient / update / _reset_optimizer_state ========================
1057
+ template<typename DEVICE, typename SPEC>
1058
+ RL_TOOLS_FUNCTION_PLACEMENT void zero_gradient(DEVICE& device, nn::layers::conv2d::LayerGradient<SPEC>& layer) {
1059
+ zero_gradient(device, layer.weights);
1060
+ zero_gradient(device, layer.biases);
1061
+ zero_gradient(device, layer.norm);
1062
+ }
1063
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
1064
+ RL_TOOLS_FUNCTION_PLACEMENT void update(DEVICE& device, nn::layers::conv2d::LayerGradient<SPEC>& layer, OPTIMIZER& optimizer){
1065
+ update(device, layer.weights, optimizer);
1066
+ update(device, layer.biases, optimizer);
1067
+ update(device, layer.norm, optimizer);
1068
+ }
1069
+ template<typename DEVICE, typename SPEC, typename OPTIMIZER>
1070
+ RL_TOOLS_FUNCTION_PLACEMENT void _reset_optimizer_state(DEVICE& device, nn::layers::conv2d::LayerGradient<SPEC>& layer, OPTIMIZER& optimizer) {
1071
+ _reset_optimizer_state(device, layer.weights, optimizer);
1072
+ _reset_optimizer_state(device, layer.biases, optimizer);
1073
+ _reset_optimizer_state(device, layer.norm, optimizer);
1074
+ }
1075
+
1076
+ // ======================== copy ========================
1077
+ template<typename SOURCE_DEVICE, typename TARGET_DEVICE, typename SOURCE_SPEC, typename TARGET_SPEC>
1078
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SOURCE_DEVICE& source_device, TARGET_DEVICE& target_device, const nn::layers::conv2d::LayerForward<SOURCE_SPEC>& source, nn::layers::conv2d::LayerForward<TARGET_SPEC>& target){
1079
+ static_assert(nn::layers::conv2d::check_spec_memory<SOURCE_SPEC, TARGET_SPEC>);
1080
+ copy(source_device, target_device, source.weights, target.weights);
1081
+ copy(source_device, target_device, source.biases, target.biases);
1082
+ copy(source_device, target_device, source.norm, target.norm);
1083
+ }
1084
+ template<typename SOURCE_DEVICE, typename TARGET_DEVICE, typename SOURCE_SPEC, typename TARGET_SPEC>
1085
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SOURCE_DEVICE& source_device, TARGET_DEVICE& target_device, const nn::layers::conv2d::LayerBackward<SOURCE_SPEC>& source, nn::layers::conv2d::LayerBackward<TARGET_SPEC>& target){
1086
+ static_assert(nn::layers::conv2d::check_spec_memory<SOURCE_SPEC, TARGET_SPEC>);
1087
+ copy(source_device, target_device, static_cast<const nn::layers::conv2d::LayerForward<SOURCE_SPEC>&>(source), static_cast<nn::layers::conv2d::LayerForward<TARGET_SPEC>&>(target));
1088
+ copy(source_device, target_device, source.pre_activations, target.pre_activations);
1089
+ copy(source_device, target_device, source.norm_cache, target.norm_cache);
1090
+ }
1091
+ template<typename SOURCE_DEVICE, typename TARGET_DEVICE, typename SOURCE_SPEC, typename TARGET_SPEC>
1092
+ RL_TOOLS_FUNCTION_PLACEMENT void copy(SOURCE_DEVICE& source_device, TARGET_DEVICE& target_device, const nn::layers::conv2d::LayerGradient<SOURCE_SPEC>& source, nn::layers::conv2d::LayerGradient<TARGET_SPEC>& target){
1093
+ static_assert(nn::layers::conv2d::check_spec_memory<SOURCE_SPEC, TARGET_SPEC>);
1094
+ copy(source_device, target_device, static_cast<const nn::layers::conv2d::LayerBackward<SOURCE_SPEC>&>(source), static_cast<nn::layers::conv2d::LayerBackward<TARGET_SPEC>&>(target));
1095
+ copy(source_device, target_device, source.output, target.output);
1096
+ }
1097
+
1098
+ // ======================== abs_diff ========================
1099
+ template <typename DEVICE, typename SPEC_1, typename SPEC_2>
1100
+ RL_TOOLS_FUNCTION_PLACEMENT typename SPEC_1::TYPE_POLICY::DEFAULT abs_diff(DEVICE& device, const rl_tools::nn::layers::conv2d::LayerForward<SPEC_1>& l1, const rl_tools::nn::layers::conv2d::LayerForward<SPEC_2>& l2) {
1101
+ static_assert(nn::layers::conv2d::check_spec_memory<SPEC_1, SPEC_2>);
1102
+ using T = typename SPEC_1::TYPE_POLICY::DEFAULT;
1103
+ T acc = 0;
1104
+ acc += abs_diff(device, l1.weights, l2.weights);
1105
+ acc += abs_diff(device, l1.biases, l2.biases);
1106
+ acc += abs_diff(device, l1.norm, l2.norm);
1107
+ return acc;
1108
+ }
1109
+ template <typename DEVICE, typename SPEC_1, typename SPEC_2>
1110
+ RL_TOOLS_FUNCTION_PLACEMENT typename SPEC_1::TYPE_POLICY::DEFAULT abs_diff(DEVICE& device, const rl_tools::nn::layers::conv2d::LayerBackward<SPEC_1>& l1, const rl_tools::nn::layers::conv2d::LayerBackward<SPEC_2>& l2) {
1111
+ static_assert(nn::layers::conv2d::check_spec_memory<SPEC_1, SPEC_2>);
1112
+ using T = typename SPEC_1::TYPE_POLICY::DEFAULT;
1113
+ T acc = abs_diff(device, static_cast<const rl_tools::nn::layers::conv2d::LayerForward<SPEC_1>&>(l1), static_cast<const rl_tools::nn::layers::conv2d::LayerForward<SPEC_2>&>(l2));
1114
+ acc += abs_diff(device, l1.pre_activations, l2.pre_activations);
1115
+ return acc;
1116
+ }
1117
+ template <typename DEVICE, typename SPEC_1, typename SPEC_2>
1118
+ RL_TOOLS_FUNCTION_PLACEMENT typename SPEC_1::TYPE_POLICY::DEFAULT abs_diff(DEVICE& device, const rl_tools::nn::layers::conv2d::LayerGradient<SPEC_1>& l1, const rl_tools::nn::layers::conv2d::LayerGradient<SPEC_2>& l2) {
1119
+ static_assert(nn::layers::conv2d::check_spec_memory<SPEC_1, SPEC_2>);
1120
+ using T = typename SPEC_1::TYPE_POLICY::DEFAULT;
1121
+ T acc = abs_diff(device, static_cast<const rl_tools::nn::layers::conv2d::LayerBackward<SPEC_1>&>(l1), static_cast<const rl_tools::nn::layers::conv2d::LayerBackward<SPEC_2>&>(l2));
1122
+ acc += abs_diff(device, l1.output, l2.output);
1123
+ return acc;
1124
+ }
1125
+ template <typename DEVICE>
1126
+ RL_TOOLS_FUNCTION_PLACEMENT auto abs_diff(DEVICE& device, const rl_tools::nn::layers::conv2d::State& s1, const rl_tools::nn::layers::conv2d::State& s2) {
1127
+ return 0;
1128
+ }
1129
+
1130
+ // ======================== reset_forward_state ========================
1131
+ template <typename DEVICE, typename SPEC>
1132
+ RL_TOOLS_FUNCTION_PLACEMENT void reset_forward_state(DEVICE& device, rl_tools::nn::layers::conv2d::LayerBackward<SPEC>& l) {
1133
+ set_all(device, l.pre_activations, 0);
1134
+ }
1135
+ template <typename DEVICE, typename SPEC>
1136
+ RL_TOOLS_FUNCTION_PLACEMENT void reset_forward_state(DEVICE& device, rl_tools::nn::layers::conv2d::LayerGradient<SPEC>& l) {
1137
+ reset_forward_state(device, static_cast<rl_tools::nn::layers::conv2d::LayerBackward<SPEC>&>(l));
1138
+ set_all(device, l.output, 0);
1139
+ }
1140
+
1141
+ // ======================== is_nan ========================
1142
+ template <typename DEVICE, typename SPEC, typename MODE = mode::Default<>>
1143
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE& device, const rl_tools::nn::layers::conv2d::LayerForward<SPEC>& l, const Mode<MODE>& mode = Mode<mode::Default<>>{}){
1144
+ return is_nan(device, l.weights, mode) || is_nan(device, l.biases, mode) || is_nan(device, l.norm, mode);
1145
+ }
1146
+ template <typename DEVICE, typename SPEC, typename MODE = mode::Default<>>
1147
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE& device, const rl_tools::nn::layers::conv2d::LayerBackward<SPEC>& l, const Mode<MODE>& mode = Mode<mode::Default<>>{}) {
1148
+ bool upstream_nan = is_nan(device, static_cast<const rl_tools::nn::layers::conv2d::LayerForward<SPEC>&>(l), mode);
1149
+ if(mode::is<MODE, nn::parameters::mode::ParametersOnly>){
1150
+ return upstream_nan;
1151
+ }
1152
+ return upstream_nan || is_nan(device, l.pre_activations, mode);
1153
+ }
1154
+ template <typename DEVICE, typename SPEC, typename MODE = mode::Default<>>
1155
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE& device, const rl_tools::nn::layers::conv2d::LayerGradient<SPEC>& l, const Mode<MODE>& mode = Mode<mode::Default<>>{}){
1156
+ bool upstream_nan = is_nan(device, static_cast<const rl_tools::nn::layers::conv2d::LayerBackward<SPEC>&>(l), mode);
1157
+ if constexpr(mode::is<MODE, nn::parameters::mode::ParametersOnly>){
1158
+ return upstream_nan;
1159
+ }
1160
+ return upstream_nan || is_nan(device, l.output, mode);
1161
+ }
1162
+ template<typename DEVICE, typename MODE = mode::Default<>>
1163
+ RL_TOOLS_FUNCTION_PLACEMENT bool is_nan(DEVICE& device, nn::layers::conv2d::State& state, const Mode<MODE>& mode = Mode<mode::Default<>>{}){
1164
+ return false;
1165
+ }
1166
+
1167
+ // ======================== output ========================
1168
+ template<typename DEVICE, typename SPEC>
1169
+ RL_TOOLS_FUNCTION_PLACEMENT auto output(DEVICE& device, nn::layers::conv2d::LayerGradient<SPEC>& l){
1170
+ return view_memory<typename SPEC::OUTPUT_SHAPE>(device, l.output);
1171
+ }
1172
+
1173
+ // ======================== gradient_norm ========================
1174
+ template<typename DEVICE, typename SPEC>
1175
+ RL_TOOLS_FUNCTION_PLACEMENT auto gradient_norm(DEVICE& device, const nn::layers::conv2d::LayerGradient<SPEC>& layer) {
1176
+ auto acc = gradient_norm(device, layer.weights) + gradient_norm(device, layer.biases);
1177
+ if constexpr(SPEC::NORMALIZATION != nn::layers::conv2d::Normalization::NONE) {
1178
+ acc += gradient_norm(device, layer.norm.gamma) + gradient_norm(device, layer.norm.beta);
1179
+ }
1180
+ return acc;
1181
+ }
1182
+ }
1183
+ RL_TOOLS_NAMESPACE_WRAPPER_END
1184
+
1185
+ #endif