Equimo 2.6.0__tar.gz → 2.8.0__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.
Files changed (221) hide show
  1. {equimo-2.6.0 → equimo-2.8.0}/CHANGELOG.md +134 -0
  2. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/README.md +10 -0
  3. equimo-2.8.0/LICENSES/pretrained/sam-License.md +96 -0
  4. {equimo-2.6.0 → equimo-2.8.0}/NOTICE +42 -0
  5. equimo-2.6.0/README.md → equimo-2.8.0/PKG-INFO +132 -9
  6. equimo-2.6.0/PKG-INFO → equimo-2.8.0/README.md +76 -61
  7. equimo-2.8.0/docs/licensing/sam3-provenance.md +81 -0
  8. {equimo-2.6.0 → equimo-2.8.0}/docs/stability.md +18 -0
  9. {equimo-2.6.0 → equimo-2.8.0}/models/huggingface/NOTICE +14 -0
  10. {equimo-2.6.0 → equimo-2.8.0}/models/huggingface/README.md +12 -1
  11. equimo-2.8.0/pyproject.toml +136 -0
  12. equimo-2.6.0/pyproject.toml → equimo-2.8.0/pyproject.toml.orig +15 -4
  13. equimo-2.8.0/src/equimo/EGM.md +227 -0
  14. equimo-2.8.0/src/equimo/__init__.py +1 -0
  15. equimo-2.8.0/src/equimo/_legacy_layouts.py +167 -0
  16. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/_pretrained.py +3 -1
  17. equimo-2.8.0/src/equimo/audio/EGM.md +61 -0
  18. equimo-2.8.0/src/equimo/audio/layers/EGM.md +42 -0
  19. equimo-2.8.0/src/equimo/audio/models/EGM.md +64 -0
  20. equimo-2.8.0/src/equimo/conversion/EGM.md +56 -0
  21. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/conversion/utils.py +22 -10
  22. equimo-2.8.0/src/equimo/core/EGM.md +126 -0
  23. equimo-2.8.0/src/equimo/core/emamodel.py +42 -0
  24. equimo-2.8.0/src/equimo/core/implicit/EGM.md +124 -0
  25. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/implicit/deq.py +5 -5
  26. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/implicit/strategies.py +3 -2
  27. equimo-2.8.0/src/equimo/core/layers/EGM.md +272 -0
  28. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/__init__.py +6 -0
  29. equimo-2.8.0/src/equimo/core/layers/_apply.py +13 -0
  30. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/activation.py +3 -1
  31. equimo-2.8.0/src/equimo/core/layers/attention.py +577 -0
  32. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/dropout.py +7 -7
  33. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/ffn.py +38 -0
  34. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/generic.py +9 -4
  35. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/mamba.py +4 -3
  36. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/norm.py +14 -2
  37. equimo-2.8.0/src/equimo/core/ops/EGM.md +80 -0
  38. equimo-2.8.0/src/equimo/core/ops/__init__.py +20 -0
  39. equimo-2.8.0/src/equimo/core/ops/probability.py +213 -0
  40. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/ops/scan.py +20 -20
  41. equimo-2.8.0/src/equimo/core/parameters.py +209 -0
  42. {equimo-2.6.0/src/equimo/finetune → equimo-2.8.0/src/equimo/core}/tags.py +51 -140
  43. equimo-2.8.0/src/equimo/finetune/EGM.md +296 -0
  44. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/_typing.py +2 -1
  45. equimo-2.8.0/src/equimo/finetune/audio/EGM.md +53 -0
  46. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/config.py +9 -10
  47. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/continued_ssl.py +5 -1
  48. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/feature_extraction.py +5 -4
  49. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/heads.py +10 -9
  50. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/labels.py +48 -9
  51. equimo-2.8.0/src/equimo/finetune/language/EGM.md +47 -0
  52. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/masks.py +1 -21
  53. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/merging.py +4 -1
  54. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/paths.py +2 -25
  55. equimo-2.8.0/src/equimo/finetune/peft/EGM.md +246 -0
  56. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/_common.py +13 -0
  57. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/_compat.py +22 -3
  58. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/adapters.py +25 -13
  59. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/dora.py +1 -1
  60. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/ia3.py +1 -1
  61. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/lora.py +51 -20
  62. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/prefix.py +12 -13
  63. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/prompts.py +17 -42
  64. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/scale_shift.py +7 -3
  65. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/vera.py +5 -3
  66. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/pooling.py +5 -5
  67. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/regularization.py +14 -7
  68. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/serialization.py +29 -10
  69. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/surgery.py +1 -1
  70. equimo-2.8.0/src/equimo/finetune/tags.py +182 -0
  71. equimo-2.8.0/src/equimo/finetune/vision/EGM.md +66 -0
  72. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/vision/eomt.py +4 -8
  73. equimo-2.8.0/src/equimo/language/EGM.md +87 -0
  74. equimo-2.8.0/src/equimo/language/__init__.py +18 -0
  75. equimo-2.8.0/src/equimo/language/data/bpe_simple_vocab_16e6.txt.gz +0 -0
  76. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/language/models.py +128 -2
  77. equimo-2.8.0/src/equimo/language/tokenizers.py +253 -0
  78. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/serialization.py +98 -23
  79. equimo-2.8.0/src/equimo/tabular/EGM.md +33 -0
  80. equimo-2.8.0/src/equimo/tabular/layers/EGM.md +100 -0
  81. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/attention.py +48 -6
  82. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/decoder.py +4 -3
  83. equimo-2.8.0/src/equimo/tabular/models/EGM.md +77 -0
  84. equimo-2.8.0/src/equimo/timeseries/EGM.md +30 -0
  85. equimo-2.8.0/src/equimo/timeseries/layers/EGM.md +47 -0
  86. equimo-2.8.0/src/equimo/timeseries/models/EGM.md +64 -0
  87. equimo-2.8.0/src/equimo/vision/EGM.md +152 -0
  88. equimo-2.8.0/src/equimo/vision/_encoder_identity.py +46 -0
  89. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/io.py +3 -1
  90. equimo-2.8.0/src/equimo/vision/layers/EGM.md +229 -0
  91. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/attention.py +30 -22
  92. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/convolution.py +27 -2
  93. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/downsample.py +2 -2
  94. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/posemb.py +274 -113
  95. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/wavelet.py +1 -1
  96. equimo-2.8.0/src/equimo/vision/models/EGM.md +216 -0
  97. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/eomt.py +2 -14
  98. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/fastervit.py +4 -1
  99. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/lowformer.py +3 -0
  100. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/parcae.py +13 -16
  101. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/pmd.py +3 -1
  102. equimo-2.8.0/src/equimo/vision/models/sam3/EGM.md +246 -0
  103. equimo-2.8.0/src/equimo/vision/models/sam3/__init__.py +36 -0
  104. equimo-2.8.0/src/equimo/vision/models/sam3/decoding.py +79 -0
  105. equimo-2.8.0/src/equimo/vision/models/sam3/detector.py +876 -0
  106. equimo-2.8.0/src/equimo/vision/models/sam3/encoder.py +262 -0
  107. equimo-2.8.0/src/equimo/vision/models/sam3/interactive.py +681 -0
  108. equimo-2.8.0/src/equimo/vision/models/sam3/model.py +270 -0
  109. equimo-2.8.0/src/equimo/vision/models/sam3/tracker.py +1287 -0
  110. equimo-2.8.0/src/equimo/vision/models/sam3/video.py +1145 -0
  111. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/shvit.py +1 -1
  112. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/vit.py +6 -6
  113. equimo-2.8.0/src/equimo/vision/ops.py +214 -0
  114. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/pmt_checkpoint.py +17 -3
  115. equimo-2.8.0/src/equimo/vision/query_training/EGM.md +108 -0
  116. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/query_training/_loss.py +4 -5
  117. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/segmentation.py +145 -5
  118. equimo-2.6.0/src/equimo/__init__.py +0 -1
  119. equimo-2.6.0/src/equimo/core/emamodel.py +0 -31
  120. equimo-2.6.0/src/equimo/core/layers/attention.py +0 -304
  121. equimo-2.6.0/src/equimo/core/ops/__init__.py +0 -3
  122. equimo-2.6.0/src/equimo/language/__init__.py +0 -9
  123. equimo-2.6.0/src/equimo/language/tokenizers.py +0 -99
  124. equimo-2.6.0/src/equimo/vision/_encoder_identity.py +0 -27
  125. {equimo-2.6.0 → equimo-2.8.0}/LICENSE.md +0 -0
  126. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/Apache-2.0.txt +0 -0
  127. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/ast-BSD-3-Clause.txt +0 -0
  128. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/convnext-Apache-2.0.txt +0 -0
  129. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/convnextv2-CC-BY-NC-4.0.txt +0 -0
  130. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/dinov2-Apache-2.0.txt +0 -0
  131. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/dinov3-License.md +0 -0
  132. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/eupe-FAIR-Noncommercial-Research-License.md +0 -0
  133. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/lingbot-vision-Apache-2.0.txt +0 -0
  134. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/siglip2-Apache-2.0.txt +0 -0
  135. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/t0-alpha-Apache-2.0.txt +0 -0
  136. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/tabpfn-3-License-v1.0.txt +0 -0
  137. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/pretrained/tips-CC-BY-4.0.txt +0 -0
  138. {equimo-2.6.0 → equimo-2.8.0}/LICENSES/tfc-t0-APACHE-2.0.txt +0 -0
  139. {equimo-2.6.0 → equimo-2.8.0}/docs/licensing/t0-source-provenance.md +0 -0
  140. {equimo-2.6.0 → equimo-2.8.0}/docs/migration-v2.md +0 -0
  141. {equimo-2.6.0 → equimo-2.8.0}/docs/timeseries.md +0 -0
  142. {equimo-2.6.0 → equimo-2.8.0}/models/huggingface/convnext-conversion.json +0 -0
  143. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/_checkpoint_limits.py +0 -0
  144. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/_io.py +0 -0
  145. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/audio/__init__.py +0 -0
  146. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/audio/io.py +0 -0
  147. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/audio/layers/__init__.py +0 -0
  148. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/audio/layers/patch.py +0 -0
  149. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/audio/models/__init__.py +0 -0
  150. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/audio/models/ast.py +0 -0
  151. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/catalog.py +0 -0
  152. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/conversion/__init__.py +0 -0
  153. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/__init__.py +0 -0
  154. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/_prng.py +0 -0
  155. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/factory.py +0 -0
  156. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/implicit/__init__.py +0 -0
  157. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/implicit/_base.py +0 -0
  158. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/implicit/injectors.py +0 -0
  159. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/implicit/stabilizers.py +0 -0
  160. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/intermediates.py +0 -0
  161. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/_registry.py +0 -0
  162. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/core/layers/rotary.py +0 -0
  163. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/__init__.py +0 -0
  164. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/_blocks.py +0 -0
  165. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/_serialization_codecs.py +0 -0
  166. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/audio/__init__.py +0 -0
  167. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/audio/recipes.py +0 -0
  168. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/audio/selectors.py +0 -0
  169. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/calibration.py +0 -0
  170. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/inspection.py +0 -0
  171. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/language/__init__.py +0 -0
  172. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/language/recipes.py +0 -0
  173. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/language/selectors.py +0 -0
  174. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/__init__.py +0 -0
  175. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/base.py +0 -0
  176. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/peft/bitfit.py +0 -0
  177. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/recipes.py +0 -0
  178. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/selectors.py +0 -0
  179. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/vision/__init__.py +0 -0
  180. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/vision/dense.py +0 -0
  181. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/finetune/vision/pmt.py +0 -0
  182. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/registry.py +0 -0
  183. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/__init__.py +0 -0
  184. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/__init__.py +0 -0
  185. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/blocks.py +0 -0
  186. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/mlp.py +0 -0
  187. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/preprocessing.py +0 -0
  188. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/layers/registry.py +0 -0
  189. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/models/__init__.py +0 -0
  190. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/tabular/models/tabpfn.py +0 -0
  191. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/__init__.py +0 -0
  192. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/layers/__init__.py +0 -0
  193. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/layers/axis_attn.py +0 -0
  194. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/layers/blocks.py +0 -0
  195. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/layers/patch_encoder.py +0 -0
  196. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/layers/registry.py +0 -0
  197. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/layers/residual_mlp.py +0 -0
  198. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/models/__init__.py +0 -0
  199. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/timeseries/models/t0.py +0 -0
  200. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/utils.py +0 -0
  201. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/__init__.py +0 -0
  202. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/__init__.py +0 -0
  203. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/patch.py +0 -0
  204. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/registry.py +0 -0
  205. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/layers/squeeze_excite.py +0 -0
  206. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/__init__.py +0 -0
  207. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/_embedding.py +0 -0
  208. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/_features.py +0 -0
  209. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/attnet.py +0 -0
  210. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/convnext.py +0 -0
  211. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/deq.py +0 -0
  212. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/iformer.py +0 -0
  213. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/mlla.py +0 -0
  214. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/mobilenet.py +0 -0
  215. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/partialformer.py +0 -0
  216. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/pmt.py +0 -0
  217. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/reduceformer.py +0 -0
  218. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/models/vssd.py +0 -0
  219. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/query_training/__init__.py +0 -0
  220. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/query_training/_assignment.py +0 -0
  221. {equimo-2.6.0 → equimo-2.8.0}/src/equimo/vision/query_training/_sampling.py +0 -0
@@ -2,6 +2,140 @@
2
2
 
3
3
  All notable changes to Equimo are documented here. Equimo follows Semantic Versioning from version 2.0.0 onward.
4
4
 
5
+ ## [2.8.0] - 2026-11-10
6
+
7
+ ### Added
8
+
9
+ - SAM 3.1 in `equimo.vision.models.sam3` (`Sam3`, `sam31_multiplex`, `decode_concepts`, the prompt and output types and
10
+ an experimental video tracker), `sam31_text` and `ClipBpeTokenizer` in `equimo.language` with a `clip` extra, and
11
+ converted weights under the SAM License. See `docs/sam3.md`.
12
+ - SAM 3.1 prompting helpers: `encode_concept`, `source_size` for prompts given in original pixels, default positive
13
+ interactive labels with validation, and `decode_concepts` keeping every query by default.
14
+ - `Sam3VideoTracker.remove_object`.
15
+ - `equimo.core.parameters` describes how optimizers should treat each leaf, for every training workflow:
16
+ `trainable_mask` (an Equinox filter excluding buffers), `weight_decay_mask` (also usable as an Optax `mask`),
17
+ `DEFAULT_NO_DECAY_TAGS`, `buffer_mask`, `module_tags`, and the field markers `buffer()` and `tagged(...)`. The path
18
+ tagger moved to `equimo.core.tags`; `equimo.finetune` and `equimo.finetune.tags` re-export the same functions.
19
+
20
+ ### Changed
21
+
22
+ - RoPE and Swin position embeddings compute the values that follow from their configuration (`VisionRoPE.freqs`,
23
+ `DinoRoPE.periods`, `RoPE.rotations`, and the `PosEmbMLPSwinv1D`/`PosEmbMLPSwinv2D` coordinate and index tables) when
24
+ used instead of storing them as PyTree leaves, so optimizers no longer see them and weight decay can no longer change
25
+ them. They remain readable as attributes but cannot be replaced with `eqx.tree_at`; set them through constructor
26
+ arguments. The structural signatures of models using them change. Checkpoints, fine-tuning bundles, and PMT artifacts
27
+ saved by earlier versions still load; `load_weights` raises `ValueError` when a stored value differs from the computed
28
+ one by more than rounding, for example after weight decay, and `load_delta` raises `FineTuneBundleError` for a bundle
29
+ whose trained delta changed such a value. Earlier versions cannot read checkpoints, bundles, or PMT artifacts that 2.8
30
+ saves for these models. The value hashes that identify a model (fine-tuning bundle base-checkpoint hashes, merge
31
+ checks, PMT encoder digests) cover the static fields of these modules instead, such as RoPE `base` and
32
+ `periods_dtype`, so a base model that differs only in those settings is rejected.
33
+ - Frozen PEFT arrays are declared buffers and excluded from every trainability mode: VeRA `vera_A`/`vera_B`, LoRA-FA
34
+ `frozen_A`/`correction_matrix`, RandLoRA bases, PiSSA `base_weight_delta`, OFT `unmerged_weight`, and a fixed
35
+ AdaptFormer `scale`. `mode="full"` previously trained the VeRA bases, the LoRA-FA correction matrix, and the OFT
36
+ backup weight. `make_param_labels` without `trainable_paths` gives buffers the label `None` instead of a decay label.
37
+ - The default no-weight-decay policy (`LLRDConfig.no_weight_decay_tags`, `DEFAULT_NO_DECAY_TAGS`) also excludes layer
38
+ scales (`block.layer_scale`, including PMD lateral scales) and state-space dynamics (`ssm`: Mamba `A_log`, `D`,
39
+ `dt_bias`; Parcae `A_log`, `dt_bias`, `B`, `C`). Leaves of registered normalization layers are tagged `norm` whatever
40
+ their field name, including norms inside `eqx.nn.Sequential`, and leaves named `*_bias` are tagged `bias`. The path
41
+ tagger also tags the Swin-v2 continuous position-bias MLP (`pos_emb_funct`, used by FasterViT HAT blocks)
42
+ `embedding.position`. These tags change tag-based selection (`TargetSpec` tags, `train_norm`, `train_bias`, and the
43
+ `norm`, `head_plus_norm`, `bias`, and surgical modes), parameter roles, plan labels, and plan fingerprints.
44
+ `CANONICAL_TAGS` gains `ssm`, `buffer`, and `vector`.
45
+ - The path tagger tags arrays with at most one axis `vector`, and the default no-weight-decay policy excludes them, as
46
+ timm, MAE, and OpenCLIP do. With the tags above, built-in backbones need no `vector` tag; PEFT and probe-head vectors
47
+ no longer decay: DoRA magnitudes, AdaLoRA singular values, VeRA and RandLoRA scales, IA3 vectors, FourierFT
48
+ coefficients, scale/shift parameters, adapter residual scales, and the `AttentionPool` and
49
+ `AttentionPoolingClassifierHead` query vectors. Their plan labels change from `*_decay` to `*_no_decay`.
50
+ - Position-embedding tables are evaluated while tracing, so `jax.jit` programs and ONNX exports hold them as constants.
51
+ MLLA attention rotates queries and keys with one RoPE call, so its programs hold one table per block. Exporting `RoPE`
52
+ (MLLA) or the Swin tables to ONNX needs a jax2onnx release that includes enpasos/jax2onnx#291; jax2onnx 0.17.1 and
53
+ 0.18.0 fail on them.
54
+ - `VisionParcae.weight_decay_mask()` follows the default policy, so it also leaves biases, norms, layer scales, vectors,
55
+ and position embeddings undecayed.
56
+ - `update_ema_model` averages only trainable leaves; integer arrays and buffers take the current model's values.
57
+ - `l2_sp_loss`, `adapter_norm_loss`, and `task_vector_norm_loss` skip buffers.
58
+ - `VisionTransformer` raises `TypeError` for unknown constructor arguments instead of ignoring them.
59
+ - `DropPath` keeps or drops the whole unbatched input with one draw, matching `DropPathAdd`; it previously dropped rows
60
+ of the leading axis (tokens or channels) independently.
61
+ - `PromptedModel.__call__` raises `ValueError` when the base model has no `head`; use `features()` for headless models.
62
+ - `apply_adalora` raises `ValueError` for a nonzero `dropout`, which AdaLoRA wrappers cannot apply.
63
+ - `load_image` raises `ValueError` when only one of `mean` and `std` is given.
64
+ - Tokenizer files are cached under a directory derived from the full URL, so pinned revisions no longer share a cache
65
+ entry; existing tokenizers are downloaded once more.
66
+
67
+ ### Fixed
68
+
69
+ - `FasterViT` runs models with three or more stages. Their window stages previously raised `ValueError` on every forward
70
+ endpoint.
71
+ - `SHViT.__call__` pools before its final norm. It previously raised `ValueError` with the default `norm_layer`.
72
+ - `LowFormer` drops the stem entry of `att_strides`, so each stage uses its own stride and the presets run at 224
73
+ pixels. The last attention stage of every preset changes shape: its checkpoints saved by earlier versions no longer
74
+ load.
75
+ - `FeatureSpec(pooling="attention")` returns the feature dtype instead of float32 for low-precision features.
76
+ - `apply_eva_lora` skips targets it already wrapped instead of raising for missing activation artifacts.
77
+ - `MllaBlock` (used by `Mlla` and `Vssd`) applies its output projection to the gated attention output and keeps the
78
+ first convolutional position encoding in the residual stream, as in MLLA and VSSD. Outputs of these models change.
79
+ - EUPE ViTs use the DINOv3 patch RoPE configuration, including training-time coordinate rescaling, which their config
80
+ previously set under an ignored key. Inference outputs are unchanged.
81
+ - EUPE ViTs compute their RoPE periods in bfloat16, as the EUPE checkpoints store them. Pretrained outputs are
82
+ unchanged; models built with `pretrained=False` previously used float32 periods.
83
+ - LoRA-FA with `custom_vjp=False`, RandLoRA, and AdaptFormer with a fixed scale stop gradients to their frozen arrays.
84
+ - `GroupSpec.tags` holds the tags shared by every leaf of the group instead of the first leaf's tags, so tag-based
85
+ optimizer rules, such as Rollfast's `GroupRule(tag=...)`, no longer depend on which leaf a group happened to start
86
+ with.
87
+ - `apply_lora_rank_pattern` keeps the `metadata` of LoRA wrappers, such as PiSSA's initialization record.
88
+ - Plans with layer-wise learning-rate decay, or other non-uniform multipliers, on PEFT models no longer raise
89
+ "inconsistent learning rate": PEFT labels then also name the block, head, or embedding (`lora_A_block_03_decay`
90
+ instead of `lora_A_decay`). Labels under uniform rates are unchanged.
91
+ - `apply_adalora` honors `scaling="alpha_over_sqrt_r"`.
92
+ - The `dynamictanh` norm (`DyT`) can be used as a block `norm_layer`.
93
+ - Adapters, AdaptFormer, scale/shift, and `AttentionPool` return the activation dtype instead of promoting bfloat16 to
94
+ float32.
95
+ - `save_delta` without `base_model` accepts a `TrainableSpec(mode="peft")` that trains no head, norm, or bias.
96
+ - `SentencePieceTokenizer` checks for the `language` extra before downloading, writes downloads atomically, and times
97
+ out after 60 seconds.
98
+ - PyTorch conversion renames only whole `scale` and `kernel` path components, keeps dictionary keys in parameter names,
99
+ and rejects an unknown `source` even when a `torch_model` is given.
100
+
101
+ ## [2.7.0] - 2026-10-26
102
+
103
+ ### Added
104
+
105
+ - `equimo.core.ops` exports `softmax`, `log_softmax`, `softmax_cross_entropy_with_integer_labels`, and
106
+ `softmax_cross_entropy_with_logit_targets`, following "A Fix for Softmax and Cross-Entropy". They compute in at least
107
+ float32, return the input dtype, and keep the dominant logit's small gradient at high confidence. The logit-target
108
+ loss, for distillation, also preserves near-equality gradients, stops target gradients, and supports higher-order
109
+ derivatives.
110
+ - Experimental fused attention: `equimo.core.layers.with_attention_implementation(model, "cudnn")` runs core,
111
+ prefix-tuned, and tabular attention through cuDNN's fused kernel for bfloat16 or float16 models on CUDA GPUs, and
112
+ attention modules accept the same choice as an `implementation` argument. On an RTX 4080, it shortened ViT and EoMT
113
+ training steps by 7-22% and reduced their temporary memory by 17-56%. It does not support attention dropout or
114
+ jax2onnx export; the default `"xla"` implementation is unchanged.
115
+ - `semantic_crop_origins` places the fewest evenly spaced crops that cover a scaled image, for sliding-window evaluation
116
+ with `merge_semantic_crops`. With the shorter side scaled to the crop size, it matches the EoMT reference's windows,
117
+ except that its last crop always ends at the image edge: the reference's floating-point spacing stops a pixel short
118
+ for some sizes, such as a 1,347-pixel side with 448-pixel crops.
119
+
120
+ ### Changed
121
+
122
+ - Equimo requires JAX and jaxlib 0.11.1 or newer. With it, a compiled step that captures both a frozen encoder and its
123
+ images as constants matches eager execution, which JAX 0.8.1 did not.
124
+ - Attention pooling, attention-pooling heads, adapter fusion, the tabular decoder, and the `"softmax"` activation
125
+ compute softmax in at least float32 with the corrected derivative of `equimo.core.ops.softmax`, returning the model
126
+ dtype. Tabular attention computes its softmax in at least float32. Attention logits are cast before scaling, avoiding
127
+ a second bfloat16 rounding when the square root of the head dimension is not a power of two. Float32 forward results
128
+ and checkpoint structure are unchanged.
129
+
130
+ ### Fixed
131
+
132
+ - Query classification uses stable cross-entropy, so confident correct predictions retain nonzero losses and target
133
+ gradients.
134
+ - `selective_scan` returns the input dtype. Its float32 scan state leaked into bfloat16 outputs, unlike `ssd`.
135
+ - `merge_semantic_crops` raises a `ValueError` when the crops leave part of the scaled image uncovered. It returned NaN
136
+ scores there instead, and any final resize spread them to every output pixel, so the argmax labelled the whole image
137
+ class 0.
138
+
5
139
  ## [2.6.0] - 2026-10-17
6
140
 
7
141
  ### Fixed
@@ -23,6 +23,7 @@ still current.
23
23
  | dinov3 | `dinov3_` | 8 | DINOv3 License | [snapshot](dinov3-License.md) | [DINOv3](https://github.com/facebookresearch/dinov3) | [upstream license](https://github.com/facebookresearch/dinov3/blob/main/LICENSE.md) | 2026-08-21 |
24
24
  | eupe | `eupe_` | 6 | FAIR Noncommercial Research License v1 | [snapshot](eupe-FAIR-Noncommercial-Research-License.md) | [EUPE](https://github.com/facebookresearch/EUPE) | [upstream license](https://github.com/facebookresearch/EUPE/blob/main/LICENSE.md) | 2026-08-21 |
25
25
  | lingbot | `lingbot_` | 4 | Apache 2.0 | [snapshot](lingbot-vision-Apache-2.0.txt) | [LingBot-Vision checkpoints](https://huggingface.co/collections/robbyant/lingbot-vision) | [upstream license](https://github.com/robbyant/lingbot-vision/blob/main/LICENSE) | 2026-09-23 |
26
+ | sam31 | `sam31_` | 2 | SAM License | [snapshot](sam-License.md) | [SAM 3.1](https://github.com/facebookresearch/sam3) | [upstream license](https://github.com/facebookresearch/sam3/blob/main/LICENSE) | 2026-11-09 |
26
27
  | siglip2 | `siglip2_` | 15 | Apache 2.0 | [snapshot](siglip2-Apache-2.0.txt) | [SigLIP 2 model](https://huggingface.co/google/siglip2-base-patch16-256) | [current license declaration](https://huggingface.co/google/siglip2-base-patch16-256) | 2026-08-21 |
27
28
  | t0 | `t0_` | 1 | Apache 2.0 | [snapshot](t0-alpha-Apache-2.0.txt) | [T0-alpha model](https://huggingface.co/theforecastingcompany/t0-alpha) | [upstream license](https://github.com/theforecastingcompany/tfc-t0/blob/main/LICENSE) | 2026-08-21 |
28
29
  | tabpfn | `tabpfn_` | 8 | TABPFN-3 License v1.0 | [snapshot](tabpfn-3-License-v1.0.txt) | [TabPFN-3 model](https://huggingface.co/Prior-Labs/tabpfn_3) | [upstream license](https://huggingface.co/Prior-Labs/tabpfn_3/blob/main/LICENSE) | 2026-08-21 |
@@ -80,6 +81,15 @@ the upstream vision and text checkpoint parameters to its JAX/Equinox parameter
80
81
  source is the [`google-deepmind/tips` project](https://github.com/google-deepmind/tips), which states that it is not an
81
82
  official Google product. No endorsement by the upstream authors is implied.
82
83
 
84
+ ### SAM 3.1
85
+
86
+ The `sam31_multiplex` and `sam31_text` archives are converted from Meta's SAM 3.1 checkpoint (`facebook/sam3.1`,
87
+ `sam3.1_multiplex.pt`) and remain SAM Materials under the [SAM License](sam-License.md). Equimo converted the parameters
88
+ to its JAX/Equinox layout and archive format; they are not an official Meta product and no endorsement by Meta is
89
+ implied. The license requires that a copy of it accompany any distribution, that publications using the materials
90
+ acknowledge them (section 1.b.ii), and that uses comply with trade controls (sections 1.b.iii and 1.b.v). Equimo's SAM
91
+ 3.1 code is not SAM Materials in the author's reading; see `docs/licensing/sam3-provenance.md`.
92
+
83
93
  ### T0-alpha
84
94
 
85
95
  Equimo converted the upstream T0-alpha checkpoint to its JAX/Equinox parameter layout and archive format. The Apache-2.0
@@ -0,0 +1,96 @@
1
+ SAM License\
2
+ Last Updated: November 19, 2025
3
+
4
+ “Agreement” means the terms and conditions for use, reproduction, distribution and modification of the SAM Materials set
5
+ forth herein.
6
+
7
+ “SAM Materials” means, collectively, Documentation and the models, software and algorithms, including machine-learning
8
+ model code, trained model weights, inference-enabling code, training-enabling code, fine-tuning enabling code, and other
9
+ elements of the foregoing distributed by Meta and made available under this Agreement.
10
+
11
+ “Documentation” means the specifications, manuals and documentation accompanying SAM Materials distributed by Meta.
12
+
13
+ “Licensee” or “you” means you, or your employer or any other person or entity (if you are entering into this Agreement
14
+ on such person or entity’s behalf), of the age required under applicable laws, rules or regulations to provide legal
15
+ consent and that has legal authority to bind your employer or such other person or entity if you are entering in this
16
+ Agreement on their behalf.
17
+
18
+ “Meta” or “we” means Meta Platforms Ireland Limited (if you are located in or, if you are an entity, your principal
19
+ place of business is in the EEA or Switzerland) or Meta Platforms, Inc. (if you are located outside of the EEA or
20
+ Switzerland).
21
+
22
+ “Sanctions” means any economic or trade sanctions or restrictions administered or enforced by the United States
23
+ (including the Office of Foreign Assets Control of the U.S. Department of the Treasury (“OFAC”), the U.S. Department of
24
+ State and the U.S. Department of Commerce), the United Nations, the European Union, or the United Kingdom.
25
+
26
+ “Trade Controls” means any of the following: Sanctions and applicable export and import controls.
27
+
28
+ By using or distributing any portion or element of the SAM Materials, you agree to be bound by this Agreement.
29
+
30
+ 1\. License Rights and Redistribution.
31
+
32
+ a. Grant of Rights. You are granted a non-exclusive, worldwide, non-transferable and royalty-free limited license under
33
+ Meta’s intellectual property or other rights owned by Meta embodied in the SAM Materials to use, reproduce, distribute,
34
+ copy, create derivative works of, and make modifications to the SAM Materials.
35
+
36
+ b. Redistribution and Use. i. Distribution of SAM Materials, and any derivative works thereof, are subject to the terms
37
+ of this Agreement. If you distribute or make the SAM Materials, or any derivative works thereof, available to a third
38
+ party, you may only do so under the terms of this Agreement and you shall provide a copy of this Agreement with any such
39
+ SAM Materials.
40
+
41
+ ii. If you submit for publication the results of research you perform on, using, or otherwise in connection with SAM
42
+ Materials, you must acknowledge the use of SAM Materials in your publication.
43
+
44
+ iii. Your use of the SAM Materials must comply with applicable laws and regulations, including Trade Control Laws and
45
+ applicable privacy and data protection laws. iv. Your use of the SAM Materials will not involve or encourage others to
46
+ reverse engineer, decompile or discover the underlying components of the SAM Materials. v. You are not the target of
47
+ Trade Controls and your use of SAM Materials must comply with Trade Controls. You agree not to use, or permit others to
48
+ use, SAM Materials for any activities subject to the International Traffic in Arms Regulations (ITAR) or end uses
49
+ prohibited by Trade Controls, including those related to military or warfare purposes, nuclear industries or
50
+ applications, espionage, or the development or use of guns or illegal weapons. 2. User Support. Your use of the SAM
51
+ Materials is done at your own discretion; Meta does not process any information nor provide any service in relation to
52
+ such use. Meta is under no obligation to provide any support services for the SAM Materials. Any support provided is “as
53
+ is”, “with all faults”, and without warranty of any kind.
54
+
55
+ 3\. Disclaimer of Warranty. UNLESS REQUIRED BY APPLICABLE LAW, THE SAM MATERIALS AND ANY OUTPUT AND RESULTS THEREFROM ARE
56
+ PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OF ANY KIND, AND META DISCLAIMS ALL WARRANTIES OF ANY KIND, BOTH
57
+ EXPRESS AND IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR
58
+ FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USING OR
59
+ REDISTRIBUTING THE SAM MATERIALS AND ASSUME ANY RISKS ASSOCIATED WITH YOUR USE OF THE SAM MATERIALS AND ANY OUTPUT AND
60
+ RESULTS.
61
+
62
+ 4\. Limitation of Liability. IN NO EVENT WILL META OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, WHETHER IN
63
+ CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY
64
+ DIRECT OR INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF META OR ITS AFFILIATES
65
+ HAVE BEEN ADVISED OF THE POSSIBILITY OF ANY OF THE FOREGOING.
66
+
67
+ 5\. Intellectual Property.
68
+
69
+ a. Subject to Meta’s ownership of SAM Materials and derivatives made by or for Meta, with respect to any derivative
70
+ works and modifications of the SAM Materials that are made by you, as between you and Meta, you are and will be the
71
+ owner of such derivative works and modifications.
72
+
73
+ b. If you institute litigation or other proceedings against Meta or any entity (including a cross-claim or counterclaim
74
+ in a lawsuit) alleging that the SAM Materials, outputs or results, or any portion of any of the foregoing, constitutes
75
+ infringement of intellectual property or other rights owned or licensable by you, then any licenses granted to you under
76
+ this Agreement shall terminate as of the date such litigation or claim is filed or instituted. You will indemnify and
77
+ hold harmless Meta from and against any claim by any third party arising out of or related to your use or distribution
78
+ of the SAM Materials.
79
+
80
+ 6\. Term and Termination. The term of this Agreement will commence upon your acceptance of this Agreement or access to
81
+ the SAM Materials and will continue in full force and effect until terminated in accordance with the terms and
82
+ conditions herein. Meta may terminate this Agreement if you are in breach of any term or condition of this Agreement.
83
+ Upon termination of this Agreement, you shall delete and cease use of the SAM Materials. Sections 3, 4 and 7 shall
84
+ survive the termination of this Agreement.
85
+
86
+ 7\. Governing Law and Jurisdiction. This Agreement will be governed and construed under the laws of the State of
87
+ California without regard to choice of law principles, and the UN Convention on Contracts for the International Sale of
88
+ Goods does not apply to this Agreement. The courts of California shall have exclusive jurisdiction of any dispute
89
+ arising out of this Agreement.
90
+
91
+ 8\. Modifications and Amendments. Meta may modify this Agreement from time to time; provided that they are similar in
92
+ spirit to the current version of the Agreement, but may differ in detail to address new problems or concerns. All such
93
+ changes will be effective immediately. Your continued use of the SAM Materials after any modification to this Agreement
94
+ constitutes your agreement to such modification. Except as provided in this Agreement, no modification or addition to
95
+ any provision of this Agreement will be binding unless it is in writing and signed by an authorized representative of
96
+ both you and Meta.
@@ -66,3 +66,45 @@ This product includes software derived from Chronos-2 by Amazon.com, Inc. or
66
66
  its affiliates, Copyright Amazon.com, Inc. All Rights Reserved, licensed under
67
67
  the Apache License 2.0.
68
68
  Source: https://github.com/amazon-science/chronos-forecasting
69
+
70
+ CLIP tokenizer and vocabulary
71
+ -----------------------------
72
+
73
+ ClipBpeTokenizer in src/equimo/language/tokenizers.py is adapted from
74
+ clip/simple_tokenizer.py in OpenAI's CLIP release, and
75
+ src/equimo/language/data/bpe_simple_vocab_16e6.txt.gz is the vocabulary from
76
+ that release.
77
+
78
+ Source: https://github.com/openai/CLIP
79
+
80
+ MIT License
81
+
82
+ Copyright (c) 2021 OpenAI
83
+
84
+ Permission is hereby granted, free of charge, to any person obtaining a copy
85
+ of this software and associated documentation files (the "Software"), to deal
86
+ in the Software without restriction, including without limitation the rights
87
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
88
+ copies of the Software, and to permit persons to whom the Software is
89
+ furnished to do so, subject to the following conditions:
90
+
91
+ The above copyright notice and this permission notice shall be included in all
92
+ copies or substantial portions of the Software.
93
+
94
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
95
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
96
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
97
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
98
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
99
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
100
+ SOFTWARE.
101
+
102
+ SAM 3.1 weights
103
+ ---------------
104
+
105
+ Equimo's sam31_multiplex and sam31_text archives are converted from Meta's
106
+ SAM 3.1 checkpoint and remain under the SAM License; see
107
+ LICENSES/pretrained/sam-License.md. No SAM Materials are included in this
108
+ distribution: the archives are downloaded separately. Equimo's SAM 3.1 code is
109
+ under Equimo's license; docs/licensing/sam3-provenance.md records how it was
110
+ written.
@@ -1,3 +1,59 @@
1
+ Metadata-Version: 2.4
2
+ Name: Equimo
3
+ Version: 2.8.0
4
+ Summary: Implementation of modern multimodal models in JAX/Equinox
5
+ License-Expression: MIT AND Apache-2.0
6
+ License-File: LICENSE.md
7
+ License-File: LICENSES/Apache-2.0.txt
8
+ License-File: LICENSES/pretrained/README.md
9
+ License-File: LICENSES/pretrained/ast-BSD-3-Clause.txt
10
+ License-File: LICENSES/pretrained/convnext-Apache-2.0.txt
11
+ License-File: LICENSES/pretrained/convnextv2-CC-BY-NC-4.0.txt
12
+ License-File: LICENSES/pretrained/dinov2-Apache-2.0.txt
13
+ License-File: LICENSES/pretrained/dinov3-License.md
14
+ License-File: LICENSES/pretrained/eupe-FAIR-Noncommercial-Research-License.md
15
+ License-File: LICENSES/pretrained/lingbot-vision-Apache-2.0.txt
16
+ License-File: LICENSES/pretrained/sam-License.md
17
+ License-File: LICENSES/pretrained/siglip2-Apache-2.0.txt
18
+ License-File: LICENSES/pretrained/t0-alpha-Apache-2.0.txt
19
+ License-File: LICENSES/pretrained/tabpfn-3-License-v1.0.txt
20
+ License-File: LICENSES/pretrained/tips-CC-BY-4.0.txt
21
+ License-File: LICENSES/tfc-t0-APACHE-2.0.txt
22
+ License-File: NOTICE
23
+ Classifier: Development Status :: 5 - Production/Stable
24
+ Classifier: Intended Audience :: Developers
25
+ Classifier: Intended Audience :: Science/Research
26
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
27
+ Classifier: Programming Language :: Python :: 3.12
28
+ Classifier: Programming Language :: Python :: 3.13
29
+ Classifier: Programming Language :: Python :: 3.14
30
+ Requires-Dist: banax>=0.1.2
31
+ Requires-Dist: einops>=0.8.0
32
+ Requires-Dist: equinox>=0.13.3
33
+ Requires-Dist: jax>=0.11.1
34
+ Requires-Dist: jaxlib>=0.11.1
35
+ Requires-Dist: loguru>=0.7.3
36
+ Requires-Dist: lz4>=4.4.3
37
+ Requires-Dist: requests>=2.32.3
38
+ Requires-Dist: torch>=2.11,<2.12 ; extra == 'audio'
39
+ Requires-Dist: torchaudio>=2.11,<2.12 ; extra == 'audio'
40
+ Requires-Dist: ftfy>=6.1,<7 ; extra == 'clip'
41
+ Requires-Dist: regex>=2024.11.6 ; extra == 'clip'
42
+ Requires-Dist: matplotlib>=3.10.1 ; extra == 'extras'
43
+ Requires-Dist: pillow>=11.1.0 ; extra == 'extras'
44
+ Requires-Dist: scikit-learn>=1.6.1 ; extra == 'extras'
45
+ Requires-Dist: tensorflow>=2.18.1 ; extra == 'language'
46
+ Requires-Dist: tensorflow-text>=2.18.1 ; extra == 'language'
47
+ Requires-Dist: torch>=2.6.0 ; extra == 'torch'
48
+ Requires-Dist: timm>=1.0.15 ; extra == 'torch'
49
+ Requires-Python: >=3.12, <3.15
50
+ Provides-Extra: audio
51
+ Provides-Extra: clip
52
+ Provides-Extra: extras
53
+ Provides-Extra: language
54
+ Provides-Extra: torch
55
+ Description-Content-Type: text/markdown
56
+
1
57
  # Equimo: Modern Multimodal Models in JAX/Equinox
2
58
 
3
59
  **WARNING**: This is a research library implementing recent model architectures. The implementations are based on paper
@@ -7,6 +63,12 @@ Equimo provides JAX/Equinox implementations of recent architectures across modal
7
63
  modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, tabular
8
64
  includes TabPFN-3 core models, and the experimental time-series namespace includes the raw T0 backbone.
9
65
 
66
+ ![SAM 3.1 tracking the concept "person" through a film scene](https://rhizome-labs.com/equimo/sam31-video-tracking.gif)
67
+
68
+ *SAM 3.1 video tracking from the text prompt `"person"`, with
69
+ [the code in the guide](docs/sam3.md#tracking-a-film-clip). Excerpt from* Pulp Fiction *(1994, Miramax), which belongs
70
+ to its rights holders and is not covered by Equimo's licenses.*
71
+
10
72
  ## Features
11
73
 
12
74
  - Pure JAX/Equinox implementations
@@ -56,7 +118,7 @@ Equimo is organized by modality, with reusable building blocks separated from mo
56
118
 
57
119
  | Namespace | Purpose |
58
120
  | ---------------------- | --------------------------------------------------------------------------------------- |
59
- | `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers |
121
+ | `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers, parameter tags and masks |
60
122
  | `equimo.vision` | Vision models, vision layers, and image IO |
61
123
  | `equimo.language` | Text encoders and tokenizers |
62
124
  | `equimo.audio` | Audio models, layers, and checkpoint-linked AST waveform preprocessing |
@@ -100,6 +162,7 @@ Beyond a standard ViT (e.g., DINOv2 or SigLIP), Equimo provides other SotA archi
100
162
  | FreeNet | [FreeNet: Liberating Depth-Wise Separable Operations for Building Faster Mobile Vision Architectures](https://ojs.aaai.org/index.php/AAAI/article/view/33041) | 2025 | ✅‡ |
101
163
  | EUPE | [Efficient Universal Perception Encoder](https://arxiv.org/abs/2603.22387) | 2026 | ✅ |
102
164
  | LingBot-Vision | [Vision Pretraining for Dense Spatial Perception](https://arxiv.org/abs/2607.05247) | 2026 | ✅§ |
165
+ | SAM 3.1 | [SAM 3: Segment Anything with Concepts](https://arxiv.org/abs/2511.16719) | 2025 | ✅¶ |
103
166
  | ViT-5 | [ViT-5: Vision Transformers for The Mid-2020s](https://arxiv.org/abs/2602.08071) | 2026 | ✅ |
104
167
 
105
168
  \*: Only contains the Linear Angular Attention module. It is straightforward to build a ViT around it, but may require
@@ -116,6 +179,9 @@ network from these blocks.
116
179
  tokens, and self-attention without a key bias; the Giant variant uses a SwiGLU FFN. Pretrained Small, Base, Large, and
117
180
  Giant backbones are available — see [pretrained models](#list-of-pretrained-models).
118
181
 
182
+ ¶: SAM 3.1 finds every instance of a concept in an image, segments objects from clicks, and tracks through video
183
+ (experimental). See the [SAM 3.1 guide](docs/sam3.md). Its weights are under the SAM License.
184
+
119
185
  ## Implemented Audio Models
120
186
 
121
187
  | Model | Paper | Year | Status |
@@ -216,6 +282,7 @@ Minimal example:
216
282
  import jax
217
283
  import equimo.finetune as eqft
218
284
  import equimo.vision.models as em
285
+ from equimo.core.ops import softmax_cross_entropy_with_integer_labels
219
286
 
220
287
  key = jax.random.PRNGKey(0)
221
288
  model = em.vit_tiny_patch16_224(num_classes=10, key=key)
@@ -236,7 +303,7 @@ frozen = plan.frozen
236
303
  def loss_fn(trainable, batch):
237
304
  model = plan.combine(trainable)
238
305
  logits = jax.vmap(lambda x: model(x, key=key, inference=False))(batch["x"])
239
- return cross_entropy(logits, batch["y"]) # supplied by user code
306
+ return softmax_cross_entropy_with_integer_labels(logits, batch["y"]).mean()
240
307
  ```
241
308
 
242
309
  Frozen leaves are absent from `plan.trainable`; they are not assigned a zero learning rate. `plan.labels` and
@@ -746,6 +813,7 @@ The following models have pretrained weights available in Equimo:
746
813
  - [TabPFN-3](https://arxiv.org/abs/2605.13986)
747
814
  - [T0-alpha](https://huggingface.co/theforecastingcompany/t0-alpha)
748
815
  - [LingBot-Vision](https://arxiv.org/abs/2607.05247) (Small, Base, Large, and Giant)
816
+ - [SAM 3.1](https://arxiv.org/abs/2511.16719) (the `sam31_multiplex` vision and `sam31_text` text models)
749
817
 
750
818
  Before using any pretrained weights, review the [pretrained-model license index](LICENSES/pretrained/README.md). It
751
819
  links the current upstream terms and records when each bundled license snapshot was last checked. Upstream licenses can
@@ -753,7 +821,7 @@ change, so the copies in this repository may be outdated; always check the lates
753
821
  terms are welcome as issues or pull requests.
754
822
 
755
823
  Model identifiers map to filenames in Equimo's
756
- [Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/2ce35f6512516a67ff99c473423e6ca48aa0ae01/models/default).
824
+ [Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/f4b4cf5bc2d47a98fd0df11eddb08fd3bb5dded6/models/default).
757
825
 
758
826
  Published ConvNeXt size factories load the default classifier with `pretrained=True`:
759
827
 
@@ -945,14 +1013,69 @@ import jax
945
1013
  import jax.numpy as jnp
946
1014
  import equinox as eqx
947
1015
 
948
- model_bf16 = jax.tree_util.tree_map(
949
- lambda leaf: leaf.astype(jnp.bfloat16) if eqx.is_inexact_array(leaf) else leaf,
950
- model_fp32,
951
- )
1016
+
1017
+ def to_bfloat16(tree):
1018
+ return jax.tree_util.tree_map(
1019
+ lambda leaf: leaf.astype(jnp.bfloat16) if eqx.is_inexact_array(leaf) else leaf,
1020
+ tree,
1021
+ )
1022
+
1023
+
1024
+ model_bf16 = to_bfloat16(model_fp32)
1025
+ ```
1026
+
1027
+ For training, keep float32 parameters and cast inside the loss. Gradients then return in float32 and the optimizer
1028
+ updates float32 values; bfloat16 parameters drop updates smaller than about 0.4% of their magnitude.
1029
+
1030
+ ```python
1031
+ from equimo.core.ops import softmax_cross_entropy_with_integer_labels
1032
+
1033
+
1034
+ @eqx.filter_value_and_grad
1035
+ def loss_and_grads(model_fp32, images, labels, key):
1036
+ model = to_bfloat16(model_fp32)
1037
+ keys = jax.random.split(key, images.shape[0])
1038
+ logits = jax.vmap(lambda x, k: model(x, key=k, inference=False))(images, keys)
1039
+ return softmax_cross_entropy_with_integer_labels(logits, labels).mean()
1040
+ ```
1041
+
1042
+ Give the optimizer only the trainable leaves and Equimo's weight-decay mask. `trainable_mask` leaves out buffers, such
1043
+ as frozen PEFT bases, which weight decay would otherwise change; `weight_decay_mask` leaves biases, norms, layer scales,
1044
+ state-space dynamics, every other array with at most one axis, position embeddings, and learned class, register,
1045
+ distillation, and mask tokens undecayed:
1046
+
1047
+ ```python
1048
+ import optax
1049
+ from equimo.core.parameters import trainable_mask, weight_decay_mask
1050
+
1051
+ params, static = eqx.partition(model_fp32, trainable_mask(model_fp32))
1052
+ optimizer = optax.adamw(3e-4, weight_decay=0.05, mask=weight_decay_mask)
1053
+ opt_state = optimizer.init(params)
1054
+ ```
1055
+
1056
+ Differentiate with respect to `params` and rebuild the model with `eqx.combine(params, static)`. Fine-tuning plans apply
1057
+ the same policy.
1058
+
1059
+ Numerically sensitive operations cast locally to float32 and return the model dtype: normalization statistics, rotary
1060
+ factors, and every softmax. Attention between tokens applies `jax.nn.softmax` to float32 logits. Other softmaxes
1061
+ (attention pooling, attention-pooling heads, adapter fusion, the tabular decoder, and the `"softmax"` activation) use
1062
+ `equimo.core.ops.softmax`, whose derivative also stays accurate for highly confident distributions. For the same reason,
1063
+ use the [`equimo.core.ops` classification losses](docs/finetuning/classification_losses.md). The
1064
+ [performance notes](docs/performance.md#softmax-precision) give the measurements behind these choices.
1065
+
1066
+ On NVIDIA GPUs with TF32 tensor cores (Ampere and newer), JAX's default precision may run float32 matrix multiplications
1067
+ as TF32. For float32 reference accuracy, run the computation under `jax.default_matmul_precision("highest")`.
1068
+
1069
+ On CUDA GPUs, bfloat16 and float16 models can run attention through cuDNN's fused kernel, which saves memory and time on
1070
+ long sequences. This is experimental, requires inactive attention dropout, and cannot be exported with jax2onnx:
1071
+
1072
+ ```python
1073
+ from equimo.core.layers import with_attention_implementation
1074
+
1075
+ model = with_attention_implementation(model_bf16, "cudnn") # "xla" switches back
952
1076
  ```
953
1077
 
954
- Isolated `float32` upcasts are mandatory for numerically sensitive operations (softmax, layer norm variance). These are
955
- applied internally where needed.
1078
+ See the [fused-attention measurements](docs/performance.md#fused-attention).
956
1079
 
957
1080
  ## Contributing
958
1081