returnn 1.20250123.234142__tar.gz → 1.20250125.618__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of returnn might be problematic. Click here for more details.

Files changed (474) hide show
  1. {returnn-1.20250123.234142/returnn.egg-info → returnn-1.20250125.618}/PKG-INFO +1 -1
  2. returnn-1.20250125.618/_setup_info_generated.py +2 -0
  3. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/__init__.py +1 -0
  4. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/dims.py +58 -5
  5. returnn-1.20250125.618/returnn/frontend/nested.py +311 -0
  6. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/frontend/_backend.py +8 -2
  7. {returnn-1.20250123.234142 → returnn-1.20250125.618/returnn.egg-info}/PKG-INFO +1 -1
  8. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn.egg-info/SOURCES.txt +1 -0
  9. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_array.py +139 -0
  10. returnn-1.20250123.234142/_setup_info_generated.py +0 -2
  11. {returnn-1.20250123.234142 → returnn-1.20250125.618}/.editorconfig +0 -0
  12. {returnn-1.20250123.234142 → returnn-1.20250125.618}/.gitignore +0 -0
  13. {returnn-1.20250123.234142 → returnn-1.20250125.618}/.gitmodules +0 -0
  14. {returnn-1.20250123.234142 → returnn-1.20250125.618}/.kateconfig +0 -0
  15. {returnn-1.20250123.234142 → returnn-1.20250125.618}/CHANGELOG.md +0 -0
  16. {returnn-1.20250123.234142 → returnn-1.20250125.618}/CODEOWNERS +0 -0
  17. {returnn-1.20250123.234142 → returnn-1.20250125.618}/CONTRIBUTING.md +0 -0
  18. {returnn-1.20250123.234142 → returnn-1.20250125.618}/LICENSE +0 -0
  19. {returnn-1.20250123.234142 → returnn-1.20250125.618}/MANIFEST.in +0 -0
  20. {returnn-1.20250123.234142 → returnn-1.20250125.618}/README.rst +0 -0
  21. {returnn-1.20250123.234142 → returnn-1.20250125.618}/__init__.py +0 -0
  22. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/12AX.cluster_map +0 -0
  23. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/_setup_returnn_env.py +0 -0
  24. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-fwd.config +0 -0
  25. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-horovod-mpi.py +0 -0
  26. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-horovod-mpi.py.sh +0 -0
  27. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-horovod-mpi.sh +0 -0
  28. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-hyper-param-tuning.config +0 -0
  29. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-iter-dataset.py +0 -0
  30. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-list-devices.py +0 -0
  31. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-lua-torch-layer.config +0 -0
  32. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-pretrain.config +0 -0
  33. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-record-and-push-to-webserver.py +0 -0
  34. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-returnn-as-framework.py +0 -0
  35. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-rf-pt-benchmark.py +0 -0
  36. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-rf.config +0 -0
  37. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-rhn-enwik8.config +0 -0
  38. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-sprint-interface.py +0 -0
  39. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-att-copy.config +0 -0
  40. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-attention.config +0 -0
  41. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-chunking-blstm.12ax.config +0 -0
  42. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-contribrnn-lstm.12ax.config +0 -0
  43. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-enc-dec.config +0 -0
  44. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-hard-att-copy.config +0 -0
  45. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-lstm-benchmark.py +0 -0
  46. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-maxgradnorm-lstm.12ax.config +0 -0
  47. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-native-lstm-lowmem.12ax.config +0 -0
  48. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-native-lstm.12ax.config +0 -0
  49. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-native-lstm2.12ax.config +0 -0
  50. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-native-lstm2.12ax.tuned.config +0 -0
  51. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-neural-transducer.12ax.config +0 -0
  52. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-rec-explicit-lstm.config +0 -0
  53. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-rec-explicit-rnn.config +0 -0
  54. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-rec-self-att.config +0 -0
  55. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-search-compiled-graph.py +0 -0
  56. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-tf-vanilla-lstm.12ax.config +0 -0
  57. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-timit-lstm-ctc.config +0 -0
  58. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-torch.config +0 -0
  59. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo-upd-mult-model.lstm.12ax.config +0 -0
  60. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/demo.sh +0 -0
  61. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/IAM_lines/a01-000u-00.png +0 -0
  62. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/IAM_lines/a01-007-04.png +0 -0
  63. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/IAM_lines/a01-007-06.png +0 -0
  64. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/README.txt +0 -0
  65. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/chars.txt +0 -0
  66. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/config_demo +0 -0
  67. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/config_fwd +0 -0
  68. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/config_real +0 -0
  69. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/create_IAM_dataset.py +0 -0
  70. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/decode.py +0 -0
  71. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/features/raw/demo.h5 +0 -0
  72. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/go.sh +0 -0
  73. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/lines.txt +0 -0
  74. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/split/eval.txt +0 -0
  75. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/split/train.txt +0 -0
  76. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/IAM/split/valid.txt +0 -0
  77. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/README.md +0 -0
  78. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial/create_test_h5.py +0 -0
  79. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial/forwardconfig +0 -0
  80. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial/go.sh +0 -0
  81. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial/trainconfig +0 -0
  82. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial_rgb/create_test_h5.py +0 -0
  83. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial_rgb/forwardconfig +0 -0
  84. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial_rgb/go.sh +0 -0
  85. {returnn-1.20250123.234142 → returnn-1.20250125.618}/demos/mdlstm/artificial_rgb/trainconfig +0 -0
  86. {returnn-1.20250123.234142 → returnn-1.20250125.618}/pyproject.toml +0 -0
  87. {returnn-1.20250123.234142 → returnn-1.20250125.618}/requirements.txt +0 -0
  88. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/__init__.py +0 -0
  89. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/__main__.py +0 -0
  90. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/__old_mod_loader__.py +0 -0
  91. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/__setup__.py +0 -0
  92. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/config.py +0 -0
  93. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/__init__.py +0 -0
  94. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/audio.py +0 -0
  95. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/basic.py +0 -0
  96. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/bundle_file.py +0 -0
  97. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/cached.py +0 -0
  98. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/cached2.py +0 -0
  99. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/distrib_files.py +0 -0
  100. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/generating.py +0 -0
  101. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/hdf.py +0 -0
  102. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/lm.py +0 -0
  103. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/map.py +0 -0
  104. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/meta.py +0 -0
  105. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/multi_proc.py +0 -0
  106. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/normalization_data.py +0 -0
  107. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/numpy_dump.py +0 -0
  108. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/postprocessing.py +0 -0
  109. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/raw_wav.py +0 -0
  110. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/sprint.py +0 -0
  111. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/stereo.py +0 -0
  112. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/text_dict.py +0 -0
  113. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/util/__init__.py +0 -0
  114. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/util/feature_extraction.py +0 -0
  115. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/util/strings.py +0 -0
  116. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/datasets/util/vocabulary.py +0 -0
  117. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/engine/__init__.py +0 -0
  118. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/engine/base.py +0 -0
  119. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/engine/batch.py +0 -0
  120. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/__init__.py +0 -0
  121. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/__main__.py +0 -0
  122. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/.git +0 -0
  123. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/.gitignore +0 -0
  124. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/LICENSE +0 -0
  125. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/README.md +0 -0
  126. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/aligner.gif +0 -0
  127. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/check.png +0 -0
  128. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/core.cu +0 -0
  129. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/core.h +0 -0
  130. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/core_cpu.cpp +0 -0
  131. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/LICENSE +0 -0
  132. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/MANIFEST.in +0 -0
  133. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/README.md +0 -0
  134. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/binding.cpp +0 -0
  135. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/core.cu +0 -0
  136. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/core.h +0 -0
  137. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/requirements.txt +0 -0
  138. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/setup.py +0 -0
  139. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/warp_rna/__init__.py +0 -0
  140. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/pytorch_binding/warp_rna/test.py +0 -0
  141. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/ref_rna.py +0 -0
  142. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/setup.py +0 -0
  143. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/src/warp_rna_op.cc +0 -0
  144. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/src/warp_rna_op_kernel_tmpl.h +0 -0
  145. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/tensorflow_binding/warp_rna/__init__.py +0 -0
  146. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/WarpRna/warp-rna/test.cpp +0 -0
  147. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/__init__.py +0 -0
  148. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/README.md +0 -0
  149. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/__init__.py +0 -0
  150. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/edit.py +0 -0
  151. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/reroute.py +0 -0
  152. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/select.py +0 -0
  153. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/subgraph.py +0 -0
  154. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/transform.py +0 -0
  155. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/extern/graph_editor/util.py +0 -0
  156. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/forward_iface.py +0 -0
  157. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_backend.py +0 -0
  158. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_cache.py +0 -0
  159. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/__init__.py +0 -0
  160. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/backend.cpp +0 -0
  161. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/backend.hpp +0 -0
  162. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/module.cpp +0 -0
  163. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/module.hpp +0 -0
  164. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/py_utils.hpp +0 -0
  165. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/tensor_ops.cpp +0 -0
  166. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_native/tensor_ops.hpp +0 -0
  167. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_numpy_backend.py +0 -0
  168. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_random_journal.py +0 -0
  169. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/_utils.py +0 -0
  170. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/array_.py +0 -0
  171. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/attention.py +0 -0
  172. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/audio/__init__.py +0 -0
  173. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/audio/mel.py +0 -0
  174. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/audio/specaugment.py +0 -0
  175. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/backend.py +0 -0
  176. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/build_from_dict.py +0 -0
  177. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/cond.py +0 -0
  178. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/const.py +0 -0
  179. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/container.py +0 -0
  180. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/control_flow_ctx.py +0 -0
  181. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/conv.py +0 -0
  182. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/conversions/__init__.py +0 -0
  183. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/conversions/espnet_e_branchformer.py +0 -0
  184. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/conversions/hf_llama.py +0 -0
  185. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/conversions/torch_nn.py +0 -0
  186. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/decoder/__init__.py +0 -0
  187. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/decoder/transformer.py +0 -0
  188. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/device.py +0 -0
  189. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/dropout.py +0 -0
  190. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/dtype.py +0 -0
  191. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/encoder/__init__.py +0 -0
  192. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/encoder/base.py +0 -0
  193. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/encoder/conformer.py +0 -0
  194. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/encoder/conformer_v2.py +0 -0
  195. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/encoder/e_branchformer.py +0 -0
  196. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/encoder/transformer.py +0 -0
  197. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/gradient.py +0 -0
  198. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/graph.py +0 -0
  199. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/hooks.py +0 -0
  200. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/init.py +0 -0
  201. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/label_smoothing.py +0 -0
  202. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/linear.py +0 -0
  203. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/loop.py +0 -0
  204. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/loss.py +0 -0
  205. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/math_.py +0 -0
  206. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/matmul.py +0 -0
  207. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/module.py +0 -0
  208. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/normalization.py +0 -0
  209. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/parameter.py +0 -0
  210. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/parametrizations.py +0 -0
  211. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/parametrize.py +0 -0
  212. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/piecewise_linear.py +0 -0
  213. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/rand.py +0 -0
  214. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/rec.py +0 -0
  215. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/reduce.py +0 -0
  216. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/run_ctx.py +0 -0
  217. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/signal.py +0 -0
  218. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/state.py +0 -0
  219. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/stepwise_scheduler.py +0 -0
  220. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/tensor_array.py +0 -0
  221. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/frontend/types.py +0 -0
  222. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/import_/__init__.py +0 -0
  223. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/import_/common.py +0 -0
  224. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/import_/git.py +0 -0
  225. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/import_/import_.py +0 -0
  226. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/learning_rate_control.py +0 -0
  227. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/log.py +0 -0
  228. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/native_op.cpp +0 -0
  229. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/native_op.py +0 -0
  230. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/pretrain.py +0 -0
  231. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/sprint/__init__.py +0 -0
  232. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/sprint/cache.py +0 -0
  233. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/sprint/control.py +0 -0
  234. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/sprint/error_signals.py +0 -0
  235. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/sprint/extern_interface.py +0 -0
  236. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/sprint/interface.py +0 -0
  237. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/README.md +0 -0
  238. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/__init__.py +0 -0
  239. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/_dim_extra.py +0 -0
  240. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/_tensor_extra.py +0 -0
  241. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/_tensor_mixin_base.py +0 -0
  242. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/_tensor_op_overloads.py +0 -0
  243. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/control_flow_ctx.py +0 -0
  244. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/dim.py +0 -0
  245. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/marked_dim.py +0 -0
  246. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/tensor.py +0 -0
  247. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/tensor_dict.py +0 -0
  248. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tensor/utils.py +0 -0
  249. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/__init__.py +0 -0
  250. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/compat.py +0 -0
  251. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/data_pipeline.py +0 -0
  252. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/distributed.py +0 -0
  253. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/engine.py +0 -0
  254. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/README.md +0 -0
  255. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/__init__.py +0 -0
  256. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/_backend.py +0 -0
  257. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/_utils.py +0 -0
  258. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/cond.py +0 -0
  259. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/config_entry_points.py +0 -0
  260. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/debug_eager_mode.py +0 -0
  261. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/dims.py +0 -0
  262. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/layer.py +0 -0
  263. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/loop.py +0 -0
  264. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/make_layer.py +0 -0
  265. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/masked_computation.py +0 -0
  266. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/parameter_assign.py +0 -0
  267. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_layers/prev_tensor_ref.py +0 -0
  268. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_low_level/__init__.py +0 -0
  269. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/frontend_low_level/_backend.py +0 -0
  270. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/horovod.py +0 -0
  271. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/hyper_param_tuning.py +0 -0
  272. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/__init__.py +0 -0
  273. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/base.py +0 -0
  274. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/basic.py +0 -0
  275. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/rec.py +0 -0
  276. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/segmental_model.py +0 -0
  277. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/signal_processing.py +0 -0
  278. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/layers/variable.py +0 -0
  279. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/native_op.py +0 -0
  280. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/network.py +0 -0
  281. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/sprint.py +0 -0
  282. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/updater.py +0 -0
  283. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/util/__init__.py +0 -0
  284. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/util/basic.py +0 -0
  285. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/util/data.py +0 -0
  286. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/util/gradient_checkpoint.py +0 -0
  287. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/util/ken_lm.py +0 -0
  288. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/tf/util/open_fst.py +0 -0
  289. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/README.md +0 -0
  290. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/__init__.py +0 -0
  291. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/data/__init__.py +0 -0
  292. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/data/extern_data.py +0 -0
  293. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/data/pipeline.py +0 -0
  294. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/data/queued_data_iter.py +0 -0
  295. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/data/returnn_dataset_wrapper.py +0 -0
  296. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/data/tensor_utils.py +0 -0
  297. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/distributed.py +0 -0
  298. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/engine.py +0 -0
  299. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/frontend/__init__.py +0 -0
  300. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/frontend/_rand.py +0 -0
  301. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/frontend/bridge.py +0 -0
  302. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/frontend/raw_ops.py +0 -0
  303. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/optim/README.md +0 -0
  304. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/optim/__init__.py +0 -0
  305. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/optim/lion.py +0 -0
  306. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/updater.py +0 -0
  307. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/README.md +0 -0
  308. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/__init__.py +0 -0
  309. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/array_.py +0 -0
  310. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/debug_inf_nan.py +0 -0
  311. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/diagnose_gpu.py +0 -0
  312. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/exception_helper.py +0 -0
  313. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/gradient_checkpoint.py +0 -0
  314. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/module.py +0 -0
  315. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/torch/util/scaled_gradient.py +0 -0
  316. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/__init__.py +0 -0
  317. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/basic.py +0 -0
  318. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/better_exchook.py +0 -0
  319. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/bpe.py +0 -0
  320. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/debug.py +0 -0
  321. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/debug_helpers.py +0 -0
  322. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/file_cache.py +0 -0
  323. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/fsa.py +0 -0
  324. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/literal_py_to_pickle.py +0 -0
  325. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/lru_cache.py +0 -0
  326. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/math.py +0 -0
  327. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/multi_proc_non_daemonic_spawn.py +0 -0
  328. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/native_code_compiler.py +0 -0
  329. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/pprint.py +0 -0
  330. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/py-to-pickle.cpp +0 -0
  331. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/py_ext_mod_compiler.py +0 -0
  332. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/result_with_reason.py +0 -0
  333. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/sig_proc.py +0 -0
  334. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/task_system.py +0 -0
  335. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/train_proc_manager.py +0 -0
  336. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn/util/watch_memory.py +0 -0
  337. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn.egg-info/dependency_links.txt +0 -0
  338. {returnn-1.20250123.234142 → returnn-1.20250125.618}/returnn.egg-info/top_level.txt +0 -0
  339. {returnn-1.20250123.234142 → returnn-1.20250125.618}/rnn.py +0 -0
  340. {returnn-1.20250123.234142 → returnn-1.20250125.618}/setup.cfg +0 -0
  341. {returnn-1.20250123.234142 → returnn-1.20250125.618}/setup.py +0 -0
  342. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/DummySprintExec.py +0 -0
  343. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm-inspection-profile.xml +0 -0
  344. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/.gitignore +0 -0
  345. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/.name +0 -0
  346. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/codeStyleSettings.xml +0 -0
  347. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/codeStyles/Project.xml +0 -0
  348. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/codeStyles/codeStyleConfig.xml +0 -0
  349. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/inspectionProfiles/Project_Default.xml +0 -0
  350. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/inspectionProfiles/profiles_settings.xml +0 -0
  351. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/misc.xml +0 -0
  352. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/modules.xml +0 -0
  353. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/returnn.iml +0 -0
  354. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/PyCharm.idea/scopes/scope_settings.xml +0 -0
  355. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/_set_num_threads1.py +0 -0
  356. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/_setup_returnn_env.py +0 -0
  357. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/_setup_test_env.py +0 -0
  358. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/bpe-unicode-demo.codes +0 -0
  359. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/bpe-unicode-demo.vocab +0 -0
  360. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/lexicon_opt.fst +0 -0
  361. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/lexicon_opt.isyms +0 -0
  362. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/lexicon_opt.jpg +0 -0
  363. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/lexicon_opt.osyms +0 -0
  364. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/lint_common.py +0 -0
  365. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/pycharm-inspect.py +0 -0
  366. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/pylint.py +0 -0
  367. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/returnn-as-framework.py +0 -0
  368. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/rf_utils.py +0 -0
  369. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/spelling.dic +0 -0
  370. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_Config.py +0 -0
  371. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_Dataset.py +0 -0
  372. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_Fsa.py +0 -0
  373. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_GeneratingDataset.py +0 -0
  374. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_HDFDataset.py +0 -0
  375. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_LearningRateControl.py +0 -0
  376. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_Log.py +0 -0
  377. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_MultiProcDataset.py +0 -0
  378. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_Pretrain.py +0 -0
  379. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_ResNet.py +0 -0
  380. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_SprintDataset.py +0 -0
  381. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_SprintInterface.py +0 -0
  382. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFEngine.py +0 -0
  383. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFNativeOp.py +0 -0
  384. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFNetworkLayer.py +0 -0
  385. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFNetworkRecLayer.py +0 -0
  386. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFNetworkSigProcLayer.py +0 -0
  387. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFUpdater.py +0 -0
  388. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TFUtil.py +0 -0
  389. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TF_determinism.py +0 -0
  390. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TaskSystem.py +0 -0
  391. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TaskSystem_SharedMem.py +0 -0
  392. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_TranslationDataset.py +0 -0
  393. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_Util.py +0 -0
  394. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_demos.py +0 -0
  395. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_fork_exec.py +0 -0
  396. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_hdf_dump.py +0 -0
  397. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_attention.py +0 -0
  398. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_base.py +0 -0
  399. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_cond.py +0 -0
  400. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_const.py +0 -0
  401. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_container.py +0 -0
  402. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_conv.py +0 -0
  403. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_decoder_transformer.py +0 -0
  404. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_encoder_conformer.py +0 -0
  405. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_gradient.py +0 -0
  406. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_label_smoothing.py +0 -0
  407. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_loop.py +0 -0
  408. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_math.py +0 -0
  409. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_normalization.py +0 -0
  410. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_piecewise_linear.py +0 -0
  411. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_rec.py +0 -0
  412. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_reduce.py +0 -0
  413. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_rf_signal.py +0 -0
  414. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_tensor.py +0 -0
  415. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_threading.py +0 -0
  416. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_tools.py +0 -0
  417. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_torch_dataset.py +0 -0
  418. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_torch_engine.py +0 -0
  419. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_torch_frontend.py +0 -0
  420. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_torch_internal_frontend.py +0 -0
  421. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/test_torch_util.py +0 -0
  422. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tests/torch_utils.py +0 -0
  423. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/_setup_returnn_env.py +0 -0
  424. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/analyze-dataset-batches.py +0 -0
  425. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/bliss-collect-seq-lens.py +0 -0
  426. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/bliss-dump-text.py +0 -0
  427. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/bliss-get-segment-names.py +0 -0
  428. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/bliss-to-ogg-zip.py +0 -0
  429. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/bpe-create-lexicon.py +0 -0
  430. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/calculate-word-error-rate.py +0 -0
  431. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/cleanup-old-models.py +0 -0
  432. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/collect-orth-symbols.py +0 -0
  433. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/collect-words.py +0 -0
  434. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/compile_native_op.py +0 -0
  435. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/compile_tf_graph.py +0 -0
  436. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/debug-dump-search-scores.py +0 -0
  437. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/debug-plot-search-scores.py +0 -0
  438. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/dump-dataset-raw-strings.py +0 -0
  439. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/dump-dataset.py +0 -0
  440. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/dump-forward-stats.py +0 -0
  441. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/dump-forward.py +0 -0
  442. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/dump-network-json.py +0 -0
  443. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/dump-pickle.py +0 -0
  444. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/extract_state_tying_from_dataset.py +0 -0
  445. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/get-attention-weights.py +0 -0
  446. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/get-best-model-epoch.py +0 -0
  447. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/hdf_dump.py +0 -0
  448. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/hdf_dump_translation_dataset.py +0 -0
  449. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/import-blocks-mt-model.py +0 -0
  450. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/import-t2t-mt-model.py +0 -0
  451. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/.gitignore +0 -0
  452. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/Makefile +0 -0
  453. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/README.md +0 -0
  454. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/README.md +0 -0
  455. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/libs_list +0 -0
  456. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/network.040/i600_m600_m600.sgd_b16_lr0_cl2.newbobabs.config +0 -0
  457. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/network.040/i600_m600_m600.sgd_b16_lr0_cl2.newbobabs.keep_over_epoch.lstm2.config +0 -0
  458. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/rescore_lattice.sh +0 -0
  459. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/state_vars_list +0 -0
  460. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/example/tensor_names_list +0 -0
  461. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/file.h +0 -0
  462. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/htklatticerescorer.cc +0 -0
  463. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/htklatticerescorer.h +0 -0
  464. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/main.cc +0 -0
  465. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/rescorer.h +0 -0
  466. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/vocabulary.cc +0 -0
  467. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/lattice_rescorer/vocabulary.h +0 -0
  468. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/tf_avg_checkpoints.py +0 -0
  469. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/tf_inspect_checkpoint.py +0 -0
  470. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/tf_inspect_summary_log.py +0 -0
  471. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/torch_avg_checkpoints.py +0 -0
  472. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/torch_export_to_onnx.py +0 -0
  473. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/torch_inspect_checkpoint.py +0 -0
  474. {returnn-1.20250123.234142 → returnn-1.20250125.618}/tools/torch_inspect_checkpoint_and_opt.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: returnn
3
- Version: 1.20250123.234142
3
+ Version: 1.20250125.618
4
4
  Summary: The RWTH extensible training framework for universal recurrent neural networks
5
5
  Home-page: https://github.com/rwth-i6/returnn/
6
6
  Author: Albert Zeyer
@@ -0,0 +1,2 @@
1
+ version = '1.20250125.000618'
2
+ long_version = '1.20250125.000618+git.b01684e'
@@ -56,3 +56,4 @@ from .types import *
56
56
  from . import audio
57
57
  from . import hooks
58
58
  from . import init
59
+ from . import nested
@@ -15,6 +15,7 @@ __all__ = [
15
15
  "range_over_dim_strided",
16
16
  "range_over_merged_dims",
17
17
  "replace_dim",
18
+ "replace_dim_v2",
18
19
  "set_sparse_dim",
19
20
  "dim_match_priority_when_needed",
20
21
  "num_elements_of_shape",
@@ -82,13 +83,15 @@ def range_over_merged_dims(
82
83
 
83
84
  def replace_dim(source: Tensor, *, in_dim: Dim, out_dim: Optional[Dim] = None) -> Tuple[Tensor, Dim]:
84
85
  """
85
- Also see: :func:`rf.merge_dims`, :func:`rf.split_dims`.
86
+ Also see: :func:`replace_dim_v2`, :func:`rf.merge_dims`, :func:`rf.split_dims`.
86
87
 
87
88
  :param source:
88
- :param in_dim:
89
- :param out_dim:
90
- :return: source with in_dim replaced by out_dim, and new out_dim.
91
- this does not work for the sparse_dim. see :func:`set_sparse_dim` for that case.
89
+ :param in_dim: should be in ``source.dims``, to be replaced.
90
+ If you want to replace the ``source.sparse_dim``, see :func:`set_sparse_dim`.
91
+ :param out_dim: If not given, will create a new dim with the same size as ``in_dim``.
92
+ Note: If the size of ``out_dim`` is different from ``in_dim``,
93
+ currently the dim tag is replaced and there is no error -- this is not checked.
94
+ :return: ``source`` with ``in_dim`` replaced by ``out_dim``, and ``out_dim``.
92
95
  """
93
96
  if not out_dim:
94
97
  out_dim = in_dim.copy(same_as_self=False, description="new-dim")
@@ -96,6 +99,56 @@ def replace_dim(source: Tensor, *, in_dim: Dim, out_dim: Optional[Dim] = None) -
96
99
  return source._raw_backend.replace_dim(source, in_dim=in_dim, out_dim=out_dim), out_dim
97
100
 
98
101
 
102
+ def replace_dim_v2(
103
+ source: Tensor, *, in_dim: Dim, out_dim: Dim, allow_expand: bool = True, allow_shrink: bool = True
104
+ ) -> Tensor:
105
+ """
106
+ Extends :func:`replace_dim` by also allowing to expand or shrink the dim
107
+ (or rather, to not ignore this; when :func:`replace_dim` is used on a dim with different size,
108
+ it will ignore this and anyway accept the new dim tag (currently)).
109
+
110
+ :param source:
111
+ :param in_dim: should be in ``source.dims``, to be replaced.
112
+ If you want to replace the ``source.sparse_dim``, see :func:`set_sparse_dim`.
113
+ :param out_dim: should not be in ``source.dims``, to be replaced.
114
+ Note: In contrast to :func:`replace_dim`, you must provide this explicitly.
115
+ :param allow_expand: if True, allow to expand the dim, i.e. if ``out_dim.size > in_dim.size``.
116
+ :param allow_shrink: if True, allow to shrink the dim, i.e. if ``out_dim.size < in_dim.size``.
117
+ :return: ``source`` with ``in_dim`` replaced by ``out_dim``.
118
+ """
119
+ if not rf.is_executing_eagerly():
120
+ raise NotImplementedError # just not implemented yet. we can do via :func:`cond`
121
+ if in_dim not in source.dims:
122
+ raise ValueError(f"replace_dim_v2: dim {in_dim} not in {source}")
123
+ if out_dim in source.dims:
124
+ raise ValueError(f"replace_dim_v2: dim {out_dim} already in {source}")
125
+ old_size = in_dim.get_dim_value()
126
+ new_size = out_dim.get_dim_value()
127
+ if new_size == old_size:
128
+ res, _ = rf.replace_dim(source, in_dim=in_dim, out_dim=out_dim)
129
+ elif new_size > old_size:
130
+ if not allow_expand:
131
+ raise ValueError(
132
+ f"replace_dim_v2: not allowed to expand: {old_size} -> {new_size},"
133
+ f" for {in_dim=} {out_dim=}, in {source=}"
134
+ )
135
+ res, _ = rf.pad(
136
+ source,
137
+ axes=[in_dim],
138
+ padding=[(0, out_dim.get_dim_value_tensor() - in_dim.get_dim_value_tensor())],
139
+ out_dims=[out_dim],
140
+ value=0,
141
+ )
142
+ else:
143
+ if not allow_shrink:
144
+ raise ValueError(
145
+ f"replace_dim_v2: not allowed to shrink: {old_size} -> {new_size},"
146
+ f" for {in_dim=} {out_dim=}, in {source=}"
147
+ )
148
+ res, _ = rf.slice(source, axis=in_dim, size=out_dim)
149
+ return res
150
+
151
+
99
152
  def set_sparse_dim(source: Tensor, sparse_dim: Dim) -> Tensor:
100
153
  """
101
154
  :param source:
@@ -0,0 +1,311 @@
1
+ """
2
+ Some utility functions on nested structures.
3
+ """
4
+
5
+ from __future__ import annotations
6
+ from typing import TypeVar, Optional, Sequence, Tuple, Dict
7
+ import functools
8
+ import re
9
+ import tree
10
+ from returnn.tensor import Tensor, Dim
11
+ import returnn.frontend as rf
12
+
13
+
14
+ __all__ = ["gather_nested", "masked_select_nested", "masked_scatter_nested"]
15
+
16
+
17
+ T = TypeVar("T")
18
+
19
+
20
+ def gather_nested(s: T, *, indices: Tensor, dim_map: Optional[Dict[Dim, Dim]] = None) -> T:
21
+ """
22
+ This is like :func:`gather`, but for nested structures.
23
+
24
+ :param s: nested structure
25
+ :param indices: indices tensor. see :func:`gather`
26
+ :param dim_map: if given, this will be updated with the new dim map
27
+ :return: s with gathered tensors
28
+ """
29
+ assert indices.sparse_dim
30
+ if dim_map is None:
31
+ dim_map = {}
32
+ tree.map_structure(functools.partial(_gather_prepare_dims, indices=indices, dim_map=dim_map), s)
33
+ s = tree.map_structure(functools.partial(_gather, indices=indices, dim_map=dim_map), s)
34
+ return s
35
+
36
+
37
+ def _gather_prepare_dims(s: T, *, indices: Tensor, dim_map: Dict[Dim, Dim]) -> T:
38
+ if isinstance(s, Dim):
39
+ if s.dimension is not None: # static
40
+ return s
41
+ if s in dim_map:
42
+ return dim_map[s]
43
+ if indices.sparse_dim in s.dyn_size_ext.dims:
44
+ new_dyn_size = _gather(s.dyn_size_ext, indices=indices, dim_map=dim_map)
45
+ new_dim = Dim(new_dyn_size, name=_extend_dim_name(s.name))
46
+ dim_map[s] = new_dim
47
+ return new_dim
48
+ return s
49
+ # everything else ignored at this stage
50
+
51
+
52
+ def _gather(s: T, *, indices: Tensor, dim_map: Optional[Dict[Dim, Dim]] = None) -> T:
53
+ if isinstance(s, Tensor):
54
+ if dim_map and any(d in dim_map for d in s.dims):
55
+ for d in s.dims:
56
+ if d in dim_map:
57
+ s = rf.replace_dim_v2(s, in_dim=d, out_dim=dim_map[d])
58
+ if indices.sparse_dim in s.dims:
59
+ # really the default case, otherwise e.g. scalar or so, independent of beam
60
+ s = rf.gather(s, indices=indices)
61
+ return s
62
+ if isinstance(s, Dim):
63
+ if s.dimension is not None: # static
64
+ return s
65
+ if dim_map and s in dim_map:
66
+ return dim_map[s]
67
+ assert indices.sparse_dim not in s.dyn_size_ext.dims # not expected, should be in dim_map
68
+ return s
69
+ raise TypeError(f"_gather: unexpected type ({type(s)})")
70
+
71
+
72
+ def masked_select_nested(
73
+ s: T,
74
+ *,
75
+ mask: Tensor,
76
+ mask_cpu: Optional[Tensor] = None,
77
+ dims: Sequence[Dim],
78
+ out_dim: Optional[Dim] = None,
79
+ dim_map: Optional[Dict[Dim, Dim]] = None,
80
+ ) -> Tuple[T, Dim, Dict[Dim, Dim]]:
81
+ """
82
+ This is like :func:`masked_select`, but for nested structures.
83
+
84
+ :param s: nested structure
85
+ :param mask: mask tensor. see :func:`masked_select`
86
+ :param mask_cpu: mask tensor for CPU. this is used e.g. for dyn dim sizes
87
+ :param dims: dims to mask. see :func:`masked_select`
88
+ :param out_dim: the packed out dim. see :func:`masked_select`. if not given, a new one will be created.
89
+ :param dim_map: if given, this will be updated with the new dim map
90
+ :return: s with masked dims, out_dim, and a newly created dim map
91
+ """
92
+ if out_dim is None:
93
+ out_dim = Dim(None, name="packed_new_label") # Flat_Batch_InBeam
94
+ if dim_map is None:
95
+ dim_map = {}
96
+ tree.map_structure(
97
+ functools.partial(
98
+ _masked_select_prepare_dims,
99
+ mask=mask_cpu if mask_cpu is not None else mask,
100
+ dims=dims,
101
+ out_dim=out_dim,
102
+ dim_map=dim_map,
103
+ ),
104
+ s,
105
+ )
106
+ s = tree.map_structure(
107
+ functools.partial(
108
+ _masked_select,
109
+ mask=mask,
110
+ mask_cpu=mask_cpu,
111
+ dims=dims,
112
+ out_dim=out_dim,
113
+ dim_map=dim_map,
114
+ ),
115
+ s,
116
+ )
117
+ return s, out_dim, dim_map
118
+
119
+
120
+ def _masked_select_prepare_dims(s, *, mask: Tensor, dims: Sequence[Dim], out_dim: Dim, dim_map: Dict[Dim, Dim]):
121
+ if isinstance(s, Dim):
122
+ if s.dimension is not None: # static
123
+ return s
124
+ if not any(d in s.dyn_size_ext.dims for d in dims):
125
+ return s
126
+ if s in dim_map:
127
+ return dim_map[s]
128
+ new_dyn_size = _masked_select(s.dyn_size_ext, mask=mask, dims=dims, out_dim=out_dim, dim_map=dim_map)
129
+ new_dim = Dim(new_dyn_size, name=_extend_dim_name(s.name))
130
+ dim_map[s] = new_dim
131
+ return new_dim
132
+ # everything else ignored at this stage
133
+
134
+
135
+ def _masked_select(
136
+ s: T, *, mask: Tensor, mask_cpu: Optional[Tensor] = None, dims: Sequence[Dim], out_dim: Dim, dim_map: Dict[Dim, Dim]
137
+ ) -> T:
138
+ if isinstance(s, Tensor):
139
+ if not any(d in s.dims for d in dims):
140
+ return s # e.g. scalar or so, independent from dims
141
+ if s.device == "cpu" and mask_cpu is not None:
142
+ mask = mask_cpu
143
+ # For the masked_select, we need that all masked dims are present, so add them if not.
144
+ # (E.g., when we mask [batch,beam], but we only have [batch], we need to add the beam dim.)
145
+ if any(d not in s.dims for d in dims):
146
+ s = rf.expand_dims(s, dims=[d for d in dims if d not in s.dims])
147
+ # The packing itself (masked_select).
148
+ s, _ = rf.masked_select(s, mask=mask, dims=dims, out_dim=out_dim)
149
+ # In the resulting tensor, potentially replace dims.
150
+ # In addition to the dim replacement, we also might need to slice, as the size might be smaller.
151
+ if any(d in dim_map for d in s.dims):
152
+ for d in s.dims:
153
+ if d in dim_map:
154
+ s, _ = rf.slice(s, axis=d, size=dim_map[d])
155
+ return s
156
+ if isinstance(s, Dim):
157
+ if s.dimension is not None: # static
158
+ return s
159
+ if not any(d in s.dyn_size_ext.dims for d in dims):
160
+ return s
161
+ assert s in dim_map
162
+ return dim_map[s]
163
+ raise TypeError(f"_masked_select: unexpected type ({type(s)})")
164
+
165
+
166
+ def masked_scatter_nested(
167
+ s: T,
168
+ backup: T,
169
+ *,
170
+ mask: Tensor,
171
+ mask_cpu: Tensor,
172
+ dims: Sequence[Dim],
173
+ in_dim: Dim,
174
+ masked_select_dim_map: Dict[Dim, Dim],
175
+ masked_scatter_dim_map: Optional[Dict[Dim, Dim]] = None,
176
+ ) -> T:
177
+ """
178
+ Reverse of :func:`masked_select_nested`.
179
+
180
+ :param s: nested structure, where dims are packed, i.e. (in_dim,...)
181
+ :param backup: nested structure, where we scatter into. tensors like (dims...,...)
182
+ :param mask: mask tensor. see :func:`masked_scatter`/:func:`masked_select`
183
+ :param mask_cpu: mask tensor for CPU. this is used e.g. for dyn dim sizes. see :func:`masked_scatter`
184
+ :param dims: dims to mask. see :func:`masked_scatter`/:func:`masked_select`
185
+ :param in_dim: the packed in dim. see :func:`masked_scatter`
186
+ :param masked_select_dim_map: the dim map from :func:`masked_select_nested`.
187
+ This describes how to map dims from s to backup.
188
+ :param masked_scatter_dim_map: for any new dims created by this function, this will be updated
189
+ :return: backup with s scattered in
190
+ """
191
+ reverse_dim_map = {v: k for k, v in masked_select_dim_map.items()}
192
+ if masked_scatter_dim_map is None:
193
+ masked_scatter_dim_map = {}
194
+
195
+ tree.map_structure(
196
+ functools.partial(
197
+ _masked_scatter_merge_dims,
198
+ mask=mask_cpu,
199
+ dims=dims,
200
+ in_dim=in_dim,
201
+ reverse_dim_map=reverse_dim_map,
202
+ merged_dim_map=masked_scatter_dim_map,
203
+ ),
204
+ s,
205
+ backup,
206
+ )
207
+ s = tree.map_structure(
208
+ functools.partial(
209
+ _masked_scatter,
210
+ mask=mask,
211
+ mask_cpu=mask_cpu,
212
+ dims=dims,
213
+ in_dim=in_dim,
214
+ reverse_dim_map=reverse_dim_map,
215
+ merged_dim_map=masked_scatter_dim_map,
216
+ ),
217
+ s,
218
+ backup,
219
+ )
220
+ return s
221
+
222
+
223
+ def _masked_scatter_merge_dims(
224
+ s: T,
225
+ backup: T,
226
+ *,
227
+ mask: Tensor,
228
+ dims: Sequence[Dim],
229
+ in_dim: Dim,
230
+ reverse_dim_map: Dict[Dim, Dim],
231
+ merged_dim_map: Dict[Dim, Dim],
232
+ ) -> T:
233
+ if isinstance(s, Dim):
234
+ # This is slightly more complex than in the _masked_select case:
235
+ # We need to merge the s and backup depending on the mask.
236
+ if s in reverse_dim_map:
237
+ s = reverse_dim_map[s]
238
+ if s == backup:
239
+ return s
240
+ if s in merged_dim_map:
241
+ return merged_dim_map[s]
242
+ # Note: s/backup might even be static dims.
243
+ new_size = _masked_scatter(
244
+ s.get_size_tensor(),
245
+ backup.get_size_tensor(),
246
+ mask=mask,
247
+ dims=dims,
248
+ in_dim=in_dim,
249
+ reverse_dim_map=reverse_dim_map,
250
+ merged_dim_map=merged_dim_map,
251
+ )
252
+ assert new_size.dims_set == (
253
+ (s.get_size_tensor().dims_set | backup.get_size_tensor().dims_set) - {in_dim}
254
+ ) | set(dims)
255
+ new_dim = Dim(new_size, name=backup.name)
256
+ merged_dim_map[s] = new_dim
257
+ merged_dim_map[backup] = new_dim
258
+ return new_dim
259
+ # everything else ignored at this stage
260
+
261
+
262
+ def _masked_scatter(
263
+ s: T,
264
+ backup: T,
265
+ *,
266
+ mask: Tensor,
267
+ mask_cpu: Optional[Tensor] = None,
268
+ dims: Sequence[Dim],
269
+ in_dim: Dim,
270
+ reverse_dim_map: Dict[Dim, Dim],
271
+ merged_dim_map: Dict[Dim, Dim],
272
+ ) -> T:
273
+ if isinstance(s, Tensor):
274
+ assert isinstance(backup, Tensor)
275
+ if s.device == "cpu" and mask_cpu is not None:
276
+ mask = mask_cpu
277
+ if in_dim not in s.dims:
278
+ s = rf.expand_dim(s, in_dim)
279
+ # Do the reverse of _masked_select above.
280
+ # First replace the dims back.
281
+ if any(d in reverse_dim_map for d in s.dims):
282
+ for d in s.dims:
283
+ if d in reverse_dim_map:
284
+ s = rf.replace_dim_v2(s, in_dim=d, out_dim=reverse_dim_map[d], allow_shrink=False)
285
+ # We also might need to replace newly merged dims, both in s and backup.
286
+ for d in s.dims:
287
+ if d in merged_dim_map:
288
+ s = rf.replace_dim_v2(s, in_dim=d, out_dim=merged_dim_map[d])
289
+ for d in backup.dims:
290
+ if d in merged_dim_map:
291
+ backup = rf.replace_dim_v2(backup, in_dim=d, out_dim=merged_dim_map[d])
292
+ # The unpacking itself (reversing the masked_select, i.e. masked_scatter).
293
+ s = rf.masked_scatter(s, backup, mask=mask, dims=dims, in_dim=in_dim)
294
+ return s
295
+ if isinstance(s, Dim):
296
+ # This is slightly more complex than in the _masked_select case:
297
+ # We need to merge the s and backup depending on the mask.
298
+ if s in reverse_dim_map:
299
+ s = reverse_dim_map[s]
300
+ if s in merged_dim_map:
301
+ return merged_dim_map[s]
302
+ return s
303
+ raise TypeError(f"_masked_scatter: unexpected type ({type(s)})")
304
+
305
+
306
+ def _extend_dim_name(name: str) -> str:
307
+ # check ends with _<num>
308
+ m = re.match(r"^(.*)_(\d+)$", name)
309
+ if m:
310
+ return f"{m.group(1)}_{int(m.group(2)) + 1}"
311
+ return name + "_1"
@@ -1767,19 +1767,25 @@ class TorchBackend(Backend[torch.Tensor]):
1767
1767
  source_raw = source.copy_compatible_to_dims_raw(source_templ_dims)
1768
1768
 
1769
1769
  out_dims = tuple(dims) + tuple(remaining_dims)
1770
+ out_shape = [d.get_dim_value() for d in out_dims]
1770
1771
  if backup is None:
1771
- out_shape = [d.get_dim_value() for d in out_dims]
1772
1772
  out_raw = torch.zeros(out_shape, dtype=source_raw.dtype, device=source_raw.device)
1773
1773
  else:
1774
1774
  assert set(backup.dims).issubset(out_dims), f"backup dims {backup.dims} not subset of out dims {out_dims}"
1775
1775
  for d in out_dims:
1776
1776
  if d not in backup.dims:
1777
1777
  backup = rf.expand_dim(backup, dim=d)
1778
- out_dims = backup.dims
1778
+ backup = backup.copy_transpose(out_dims)
1779
1779
  out_raw = backup.raw_tensor.clone() # we operate inplace below
1780
1780
 
1781
1781
  mask = mask.copy_masked(mask_value=False)
1782
1782
  mask_raw = mask.copy_compatible_to_dims_raw(out_dims)
1783
+ if torch.__version__ < (2, 1):
1784
+ # There is a bug in older PyTorch where masked_scatter_ does not work correctly with non-contiguous tensors.
1785
+ # https://github.com/pytorch/pytorch/issues/99638
1786
+ out_raw = out_raw.contiguous()
1787
+ mask_raw = mask_raw.contiguous()
1788
+ source_raw = source_raw.contiguous()
1783
1789
  out_raw.masked_scatter_(mask_raw, source_raw)
1784
1790
  return Tensor(
1785
1791
  "masked_scatter",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: returnn
3
- Version: 1.20250123.234142
3
+ Version: 1.20250125.618
4
4
  Summary: The RWTH extensible training framework for universal recurrent neural networks
5
5
  Home-page: https://github.com/rwth-i6/returnn/
6
6
  Author: Albert Zeyer
@@ -186,6 +186,7 @@ returnn/frontend/loss.py
186
186
  returnn/frontend/math_.py
187
187
  returnn/frontend/matmul.py
188
188
  returnn/frontend/module.py
189
+ returnn/frontend/nested.py
189
190
  returnn/frontend/normalization.py
190
191
  returnn/frontend/parameter.py
191
192
  returnn/frontend/parametrizations.py
@@ -200,6 +200,145 @@ def test_pad_packed_batched():
200
200
  np.testing.assert_array_equal(in_.raw_tensor, out.raw_tensor)
201
201
 
202
202
 
203
+ def test_masked_select_masked_scatter_vs_where_rev_dims():
204
+ """
205
+ Compare rf.where vs rf.masked_select+rf.masked_scatter.
206
+ Some op (e.g. LM update) could be done more efficiently on just the packed data (rf.masked_select),
207
+ that is why rf.masked_select+rf.masked_scatter can be useful over just using rf.where.
208
+ (In general, when computing the new ``a`` is expensive.)
209
+ The test does not cover this part on the computation (we just feed in some random ``a``),
210
+ but it checks that the results are the same,
211
+ as we had some problems with that in the past.
212
+ """
213
+ # noinspection PyShadowingNames
214
+ batch_dim = Dim(2, name="batch")
215
+ beam_dim = Dim(3, name="beam")
216
+
217
+ extern_data = TensorDict(
218
+ {
219
+ "mask": Tensor("mask", [beam_dim, batch_dim], dtype="bool"),
220
+ # Note: The dim order is relevant for this test. It passes when it is [batch_dim, beam_dim]...
221
+ "a": Tensor("a", [beam_dim, batch_dim], dtype="int32"),
222
+ "b": Tensor("b", [beam_dim, batch_dim], dtype="int32"),
223
+ }
224
+ )
225
+
226
+ # noinspection PyShadowingNames
227
+ def _forward_step(*, extern_data: TensorDict, **_kwargs):
228
+ mask = extern_data["mask"]
229
+ a = extern_data["a"]
230
+ b = extern_data["b"]
231
+ a.mark_as_output("a", shape=[beam_dim, batch_dim])
232
+ b.mark_as_output("b", shape=[beam_dim, batch_dim])
233
+ mask.mark_as_output("mask", shape=[beam_dim, batch_dim])
234
+
235
+ # Code via rf.where.
236
+ res_where = rf.where(mask, a, b)
237
+ assert res_where.dims_set == {beam_dim, batch_dim}
238
+ res_where.mark_as_output("res_where", shape=[beam_dim, batch_dim])
239
+
240
+ # Code via rf.masked_select and rf.masked_scatter.
241
+ a_packed, packed_dim = rf.masked_select(a, mask=mask, dims=[batch_dim, beam_dim])
242
+ assert a_packed.dims_set == {packed_dim}
243
+ res_packed = rf.masked_scatter(a_packed, b, mask=mask, dims=[batch_dim, beam_dim], in_dim=packed_dim)
244
+ assert res_packed.dims_set == {batch_dim, beam_dim}
245
+ res_packed.mark_as_output("res_packed", shape=[beam_dim, batch_dim])
246
+
247
+ out_dict = run_model(extern_data, lambda **_kwargs: rf.Module(), _forward_step, test_tensorflow=False)
248
+ res_where = out_dict["res_where"]
249
+ res_packed = out_dict["res_packed"]
250
+ assert res_where.raw_tensor.shape == res_packed.raw_tensor.shape
251
+ print("a:")
252
+ print(out_dict["a"].raw_tensor)
253
+ print("b:")
254
+ print(out_dict["b"].raw_tensor)
255
+ print("mask:")
256
+ print(out_dict["mask"].raw_tensor)
257
+ print("result with where:")
258
+ print(res_where.raw_tensor)
259
+ print("result with packing:")
260
+ print(res_packed.raw_tensor)
261
+ np.testing.assert_equal(res_where.raw_tensor, res_packed.raw_tensor)
262
+
263
+
264
+ def test_masked_select_masked_scatter_vs_where_md_rev_dims():
265
+ """
266
+ Like :func:`test_masked_select_masked_scatter_vs_where_rev_dims`
267
+ but we add another spatial dim, which then needs some further handling.
268
+ """
269
+ # noinspection PyShadowingNames
270
+ batch_dim = Dim(2, name="batch")
271
+ beam_dim = Dim(3, name="beam")
272
+ hist_a_dim = Dim(Tensor("hist_a", [batch_dim, beam_dim], dtype="int32"))
273
+ hist_b_dim = Dim(Tensor("hist_b", [batch_dim, beam_dim], dtype="int32"))
274
+
275
+ extern_data = TensorDict(
276
+ {
277
+ "mask": Tensor("mask", [beam_dim, batch_dim], dtype="bool"),
278
+ "a": Tensor("a", [beam_dim, batch_dim, hist_a_dim], dtype="int32"),
279
+ "b": Tensor("b", [beam_dim, batch_dim, hist_b_dim], dtype="int32"),
280
+ }
281
+ )
282
+
283
+ # noinspection PyShadowingNames
284
+ def _forward_step(*, extern_data: TensorDict, **_kwargs):
285
+ mask = extern_data["mask"]
286
+ a = extern_data["a"]
287
+ b = extern_data["b"]
288
+ a.mark_as_output("a", shape=[beam_dim, batch_dim, hist_a_dim])
289
+ b.mark_as_output("b", shape=[beam_dim, batch_dim, hist_b_dim])
290
+ mask.mark_as_output("mask", shape=[beam_dim, batch_dim])
291
+ hist_a_size = hist_a_dim.get_size_tensor()
292
+ hist_b_size = hist_b_dim.get_size_tensor()
293
+
294
+ # Code via rf.where.
295
+ hist_comb_sizes = rf.where(mask, hist_a_size, hist_b_size)
296
+ hist_comb_dim = Dim(hist_comb_sizes, name="hist_comb")
297
+ a_ = rf.replace_dim_v2(a, in_dim=hist_a_dim, out_dim=hist_comb_dim)
298
+ b_ = rf.replace_dim_v2(b, in_dim=hist_b_dim, out_dim=hist_comb_dim)
299
+ res_where = rf.where(mask, a_, b_)
300
+ assert res_where.dims_set == {beam_dim, batch_dim, hist_comb_dim}
301
+ res_where.mark_as_output("res_where", shape=[beam_dim, batch_dim, hist_comb_dim])
302
+
303
+ # Code via rf.masked_select and rf.masked_scatter.
304
+ hist_a_packed_size, packed_dim = rf.masked_select(hist_a_size, mask=mask, dims=[batch_dim, beam_dim])
305
+ hist_a_packed_dim = Dim(hist_a_packed_size, name="hist_a_packed")
306
+ a_packed, _ = rf.masked_select(a, mask=mask, dims=[batch_dim, beam_dim], out_dim=packed_dim)
307
+ a_packed = rf.replace_dim_v2(a_packed, in_dim=hist_a_dim, out_dim=hist_a_packed_dim)
308
+ assert a_packed.dims_set == {packed_dim, hist_a_packed_dim}
309
+ hist_merged_size = rf.masked_scatter(
310
+ hist_a_packed_size, hist_b_size, mask=mask, dims=[batch_dim, beam_dim], in_dim=packed_dim
311
+ )
312
+ hist_merged_dim = Dim(hist_merged_size, name="hist_merged")
313
+ a_packed = rf.replace_dim_v2(a_packed, in_dim=hist_a_packed_dim, out_dim=hist_merged_dim)
314
+ b_packed = rf.replace_dim_v2(b, in_dim=hist_b_dim, out_dim=hist_merged_dim)
315
+ res_packed = rf.masked_scatter(a_packed, b_packed, mask=mask, dims=[batch_dim, beam_dim], in_dim=packed_dim)
316
+ assert res_packed.dims_set == {batch_dim, beam_dim, hist_merged_dim}
317
+ res_packed.mark_as_output("res_packed", shape=[beam_dim, batch_dim, hist_merged_dim])
318
+
319
+ out_dict = run_model(extern_data, lambda **_kwargs: rf.Module(), _forward_step, test_tensorflow=False)
320
+ res_where = out_dict["res_where"]
321
+ res_packed = out_dict["res_packed"]
322
+ hist_where_dim = res_where.dims[-1]
323
+ hist_packed_dim = res_packed.dims[-1]
324
+ assert hist_where_dim.dyn_size_ext.dims_set == hist_packed_dim.dyn_size_ext.dims_set == {batch_dim, beam_dim}
325
+ hist_where_size_raw = hist_where_dim.dyn_size_ext.copy_compatible_to_dims_raw((batch_dim, beam_dim))
326
+ hist_packed_size_raw = hist_packed_dim.dyn_size_ext.copy_compatible_to_dims_raw((batch_dim, beam_dim))
327
+ assert (hist_where_size_raw == hist_packed_size_raw).all()
328
+ assert res_where.raw_tensor.shape == res_packed.raw_tensor.shape
329
+ print("a:")
330
+ print(out_dict["a"].raw_tensor)
331
+ print("b:")
332
+ print(out_dict["b"].raw_tensor)
333
+ print("mask:")
334
+ print(out_dict["mask"].raw_tensor)
335
+ print("result with where:")
336
+ print(res_where.raw_tensor)
337
+ print("result with packing:")
338
+ print(res_packed.raw_tensor)
339
+ np.testing.assert_equal(res_where.raw_tensor, res_packed.raw_tensor)
340
+
341
+
203
342
  def test_reshape():
204
343
  time_dim = Dim(Tensor("time", [batch_dim], dtype="int32"))
205
344
  in_dim = Dim(7, name="in")
@@ -1,2 +0,0 @@
1
- version = '1.20250123.234142'
2
- long_version = '1.20250123.234142+git.65c8b3c'