Equimo 2.7.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 (219) hide show
  1. {equimo-2.7.0 → equimo-2.8.0}/CHANGELOG.md +96 -0
  2. {equimo-2.7.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.7.0 → equimo-2.8.0}/NOTICE +42 -0
  5. {equimo-2.7.0 → equimo-2.8.0}/PKG-INFO +35 -3
  6. {equimo-2.7.0 → equimo-2.8.0}/README.md +30 -2
  7. equimo-2.8.0/docs/licensing/sam3-provenance.md +81 -0
  8. {equimo-2.7.0 → equimo-2.8.0}/docs/stability.md +14 -0
  9. {equimo-2.7.0 → equimo-2.8.0}/models/huggingface/NOTICE +14 -0
  10. {equimo-2.7.0 → equimo-2.8.0}/models/huggingface/README.md +12 -1
  11. equimo-2.8.0/pyproject.toml +136 -0
  12. equimo-2.7.0/pyproject.toml → equimo-2.8.0/pyproject.toml.orig +12 -1
  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.7.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.7.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.7.0 → equimo-2.8.0}/src/equimo/core/implicit/deq.py +5 -5
  26. {equimo-2.7.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.7.0 → equimo-2.8.0}/src/equimo/core/layers/__init__.py +4 -0
  29. equimo-2.8.0/src/equimo/core/layers/_apply.py +13 -0
  30. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/attention.py +158 -19
  31. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/dropout.py +7 -7
  32. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/ffn.py +38 -0
  33. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/generic.py +9 -4
  34. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/mamba.py +4 -3
  35. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/norm.py +14 -2
  36. equimo-2.8.0/src/equimo/core/ops/EGM.md +80 -0
  37. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/ops/__init__.py +2 -0
  38. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/ops/probability.py +10 -0
  39. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/ops/scan.py +19 -19
  40. equimo-2.8.0/src/equimo/core/parameters.py +209 -0
  41. {equimo-2.7.0/src/equimo/finetune → equimo-2.8.0/src/equimo/core}/tags.py +51 -140
  42. equimo-2.8.0/src/equimo/finetune/EGM.md +296 -0
  43. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/_typing.py +2 -1
  44. equimo-2.8.0/src/equimo/finetune/audio/EGM.md +53 -0
  45. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/config.py +9 -10
  46. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/continued_ssl.py +5 -1
  47. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/feature_extraction.py +3 -2
  48. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/labels.py +48 -9
  49. equimo-2.8.0/src/equimo/finetune/language/EGM.md +47 -0
  50. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/masks.py +1 -21
  51. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/merging.py +4 -1
  52. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/paths.py +2 -25
  53. equimo-2.8.0/src/equimo/finetune/peft/EGM.md +246 -0
  54. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/_common.py +13 -0
  55. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/_compat.py +22 -3
  56. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/adapters.py +21 -9
  57. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/dora.py +1 -1
  58. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/ia3.py +1 -1
  59. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/lora.py +51 -20
  60. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/prefix.py +3 -3
  61. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/prompts.py +17 -42
  62. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/scale_shift.py +7 -3
  63. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/vera.py +5 -3
  64. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/pooling.py +2 -1
  65. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/regularization.py +14 -7
  66. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/serialization.py +29 -10
  67. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/surgery.py +1 -1
  68. equimo-2.8.0/src/equimo/finetune/tags.py +182 -0
  69. equimo-2.8.0/src/equimo/finetune/vision/EGM.md +66 -0
  70. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/eomt.py +4 -8
  71. equimo-2.8.0/src/equimo/language/EGM.md +87 -0
  72. equimo-2.8.0/src/equimo/language/__init__.py +18 -0
  73. equimo-2.8.0/src/equimo/language/data/bpe_simple_vocab_16e6.txt.gz +0 -0
  74. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/language/models.py +128 -2
  75. equimo-2.8.0/src/equimo/language/tokenizers.py +253 -0
  76. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/serialization.py +98 -23
  77. equimo-2.8.0/src/equimo/tabular/EGM.md +33 -0
  78. equimo-2.8.0/src/equimo/tabular/layers/EGM.md +100 -0
  79. equimo-2.8.0/src/equimo/tabular/models/EGM.md +77 -0
  80. equimo-2.8.0/src/equimo/timeseries/EGM.md +30 -0
  81. equimo-2.8.0/src/equimo/timeseries/layers/EGM.md +47 -0
  82. equimo-2.8.0/src/equimo/timeseries/models/EGM.md +64 -0
  83. equimo-2.8.0/src/equimo/vision/EGM.md +152 -0
  84. equimo-2.8.0/src/equimo/vision/_encoder_identity.py +46 -0
  85. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/io.py +3 -1
  86. equimo-2.8.0/src/equimo/vision/layers/EGM.md +229 -0
  87. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/attention.py +30 -22
  88. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/convolution.py +27 -2
  89. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/downsample.py +2 -2
  90. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/posemb.py +274 -113
  91. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/wavelet.py +1 -1
  92. equimo-2.8.0/src/equimo/vision/models/EGM.md +216 -0
  93. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/eomt.py +2 -14
  94. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/fastervit.py +4 -1
  95. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/lowformer.py +3 -0
  96. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/parcae.py +13 -16
  97. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/pmd.py +3 -1
  98. equimo-2.8.0/src/equimo/vision/models/sam3/EGM.md +246 -0
  99. equimo-2.8.0/src/equimo/vision/models/sam3/__init__.py +36 -0
  100. equimo-2.8.0/src/equimo/vision/models/sam3/decoding.py +79 -0
  101. equimo-2.8.0/src/equimo/vision/models/sam3/detector.py +876 -0
  102. equimo-2.8.0/src/equimo/vision/models/sam3/encoder.py +262 -0
  103. equimo-2.8.0/src/equimo/vision/models/sam3/interactive.py +681 -0
  104. equimo-2.8.0/src/equimo/vision/models/sam3/model.py +270 -0
  105. equimo-2.8.0/src/equimo/vision/models/sam3/tracker.py +1287 -0
  106. equimo-2.8.0/src/equimo/vision/models/sam3/video.py +1145 -0
  107. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/shvit.py +1 -1
  108. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/vit.py +6 -6
  109. equimo-2.8.0/src/equimo/vision/ops.py +214 -0
  110. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/pmt_checkpoint.py +17 -3
  111. equimo-2.8.0/src/equimo/vision/query_training/EGM.md +108 -0
  112. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/_loss.py +3 -3
  113. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/segmentation.py +105 -2
  114. equimo-2.7.0/src/equimo/__init__.py +0 -1
  115. equimo-2.7.0/src/equimo/core/emamodel.py +0 -31
  116. equimo-2.7.0/src/equimo/language/__init__.py +0 -9
  117. equimo-2.7.0/src/equimo/language/tokenizers.py +0 -99
  118. equimo-2.7.0/src/equimo/vision/_encoder_identity.py +0 -27
  119. {equimo-2.7.0 → equimo-2.8.0}/LICENSE.md +0 -0
  120. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/Apache-2.0.txt +0 -0
  121. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/ast-BSD-3-Clause.txt +0 -0
  122. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/convnext-Apache-2.0.txt +0 -0
  123. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/convnextv2-CC-BY-NC-4.0.txt +0 -0
  124. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/dinov2-Apache-2.0.txt +0 -0
  125. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/dinov3-License.md +0 -0
  126. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/eupe-FAIR-Noncommercial-Research-License.md +0 -0
  127. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/lingbot-vision-Apache-2.0.txt +0 -0
  128. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/siglip2-Apache-2.0.txt +0 -0
  129. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/t0-alpha-Apache-2.0.txt +0 -0
  130. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/tabpfn-3-License-v1.0.txt +0 -0
  131. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/pretrained/tips-CC-BY-4.0.txt +0 -0
  132. {equimo-2.7.0 → equimo-2.8.0}/LICENSES/tfc-t0-APACHE-2.0.txt +0 -0
  133. {equimo-2.7.0 → equimo-2.8.0}/docs/licensing/t0-source-provenance.md +0 -0
  134. {equimo-2.7.0 → equimo-2.8.0}/docs/migration-v2.md +0 -0
  135. {equimo-2.7.0 → equimo-2.8.0}/docs/timeseries.md +0 -0
  136. {equimo-2.7.0 → equimo-2.8.0}/models/huggingface/convnext-conversion.json +0 -0
  137. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/_checkpoint_limits.py +0 -0
  138. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/_io.py +0 -0
  139. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/__init__.py +0 -0
  140. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/io.py +0 -0
  141. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/layers/__init__.py +0 -0
  142. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/layers/patch.py +0 -0
  143. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/models/__init__.py +0 -0
  144. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/audio/models/ast.py +0 -0
  145. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/catalog.py +0 -0
  146. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/conversion/__init__.py +0 -0
  147. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/__init__.py +0 -0
  148. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/_prng.py +0 -0
  149. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/factory.py +0 -0
  150. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/__init__.py +0 -0
  151. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/_base.py +0 -0
  152. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/injectors.py +0 -0
  153. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/implicit/stabilizers.py +0 -0
  154. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/intermediates.py +0 -0
  155. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/_registry.py +0 -0
  156. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/activation.py +0 -0
  157. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/core/layers/rotary.py +0 -0
  158. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/__init__.py +0 -0
  159. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/_blocks.py +0 -0
  160. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/_serialization_codecs.py +0 -0
  161. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/audio/__init__.py +0 -0
  162. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/audio/recipes.py +0 -0
  163. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/audio/selectors.py +0 -0
  164. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/calibration.py +0 -0
  165. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/heads.py +0 -0
  166. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/inspection.py +0 -0
  167. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/language/__init__.py +0 -0
  168. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/language/recipes.py +0 -0
  169. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/language/selectors.py +0 -0
  170. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/__init__.py +0 -0
  171. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/base.py +0 -0
  172. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/peft/bitfit.py +0 -0
  173. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/recipes.py +0 -0
  174. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/selectors.py +0 -0
  175. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/__init__.py +0 -0
  176. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/dense.py +0 -0
  177. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/finetune/vision/pmt.py +0 -0
  178. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/registry.py +0 -0
  179. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/__init__.py +0 -0
  180. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/__init__.py +0 -0
  181. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/attention.py +0 -0
  182. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/blocks.py +0 -0
  183. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/decoder.py +0 -0
  184. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/mlp.py +0 -0
  185. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/preprocessing.py +0 -0
  186. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/layers/registry.py +0 -0
  187. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/models/__init__.py +0 -0
  188. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/tabular/models/tabpfn.py +0 -0
  189. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/__init__.py +0 -0
  190. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/__init__.py +0 -0
  191. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/axis_attn.py +0 -0
  192. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/blocks.py +0 -0
  193. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/patch_encoder.py +0 -0
  194. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/registry.py +0 -0
  195. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/layers/residual_mlp.py +0 -0
  196. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/models/__init__.py +0 -0
  197. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/timeseries/models/t0.py +0 -0
  198. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/utils.py +0 -0
  199. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/__init__.py +0 -0
  200. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/__init__.py +0 -0
  201. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/patch.py +0 -0
  202. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/registry.py +0 -0
  203. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/layers/squeeze_excite.py +0 -0
  204. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/__init__.py +0 -0
  205. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/_embedding.py +0 -0
  206. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/_features.py +0 -0
  207. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/attnet.py +0 -0
  208. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/convnext.py +0 -0
  209. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/deq.py +0 -0
  210. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/iformer.py +0 -0
  211. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/mlla.py +0 -0
  212. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/mobilenet.py +0 -0
  213. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/partialformer.py +0 -0
  214. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/pmt.py +0 -0
  215. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/reduceformer.py +0 -0
  216. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/models/vssd.py +0 -0
  217. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/__init__.py +0 -0
  218. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/_assignment.py +0 -0
  219. {equimo-2.7.0 → equimo-2.8.0}/src/equimo/vision/query_training/_sampling.py +0 -0
@@ -2,6 +2,102 @@
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
+
5
101
  ## [2.7.0] - 2026-10-26
6
102
 
7
103
  ### Added
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Equimo
3
- Version: 2.7.0
3
+ Version: 2.8.0
4
4
  Summary: Implementation of modern multimodal models in JAX/Equinox
5
5
  License-Expression: MIT AND Apache-2.0
6
6
  License-File: LICENSE.md
@@ -13,6 +13,7 @@ License-File: LICENSES/pretrained/dinov2-Apache-2.0.txt
13
13
  License-File: LICENSES/pretrained/dinov3-License.md
14
14
  License-File: LICENSES/pretrained/eupe-FAIR-Noncommercial-Research-License.md
15
15
  License-File: LICENSES/pretrained/lingbot-vision-Apache-2.0.txt
16
+ License-File: LICENSES/pretrained/sam-License.md
16
17
  License-File: LICENSES/pretrained/siglip2-Apache-2.0.txt
17
18
  License-File: LICENSES/pretrained/t0-alpha-Apache-2.0.txt
18
19
  License-File: LICENSES/pretrained/tabpfn-3-License-v1.0.txt
@@ -36,6 +37,8 @@ Requires-Dist: lz4>=4.4.3
36
37
  Requires-Dist: requests>=2.32.3
37
38
  Requires-Dist: torch>=2.11,<2.12 ; extra == 'audio'
38
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'
39
42
  Requires-Dist: matplotlib>=3.10.1 ; extra == 'extras'
40
43
  Requires-Dist: pillow>=11.1.0 ; extra == 'extras'
41
44
  Requires-Dist: scikit-learn>=1.6.1 ; extra == 'extras'
@@ -45,6 +48,7 @@ Requires-Dist: torch>=2.6.0 ; extra == 'torch'
45
48
  Requires-Dist: timm>=1.0.15 ; extra == 'torch'
46
49
  Requires-Python: >=3.12, <3.15
47
50
  Provides-Extra: audio
51
+ Provides-Extra: clip
48
52
  Provides-Extra: extras
49
53
  Provides-Extra: language
50
54
  Provides-Extra: torch
@@ -59,6 +63,12 @@ Equimo provides JAX/Equinox implementations of recent architectures across modal
59
63
  modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, tabular
60
64
  includes TabPFN-3 core models, and the experimental time-series namespace includes the raw T0 backbone.
61
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
+
62
72
  ## Features
63
73
 
64
74
  - Pure JAX/Equinox implementations
@@ -108,7 +118,7 @@ Equimo is organized by modality, with reusable building blocks separated from mo
108
118
 
109
119
  | Namespace | Purpose |
110
120
  | ---------------------- | --------------------------------------------------------------------------------------- |
111
- | `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 |
112
122
  | `equimo.vision` | Vision models, vision layers, and image IO |
113
123
  | `equimo.language` | Text encoders and tokenizers |
114
124
  | `equimo.audio` | Audio models, layers, and checkpoint-linked AST waveform preprocessing |
@@ -152,6 +162,7 @@ Beyond a standard ViT (e.g., DINOv2 or SigLIP), Equimo provides other SotA archi
152
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 | ✅‡ |
153
163
  | EUPE | [Efficient Universal Perception Encoder](https://arxiv.org/abs/2603.22387) | 2026 | ✅ |
154
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 | ✅¶ |
155
166
  | ViT-5 | [ViT-5: Vision Transformers for The Mid-2020s](https://arxiv.org/abs/2602.08071) | 2026 | ✅ |
156
167
 
157
168
  \*: Only contains the Linear Angular Attention module. It is straightforward to build a ViT around it, but may require
@@ -168,6 +179,9 @@ network from these blocks.
168
179
  tokens, and self-attention without a key bias; the Giant variant uses a SwiGLU FFN. Pretrained Small, Base, Large, and
169
180
  Giant backbones are available — see [pretrained models](#list-of-pretrained-models).
170
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
+
171
185
  ## Implemented Audio Models
172
186
 
173
187
  | Model | Paper | Year | Status |
@@ -799,6 +813,7 @@ The following models have pretrained weights available in Equimo:
799
813
  - [TabPFN-3](https://arxiv.org/abs/2605.13986)
800
814
  - [T0-alpha](https://huggingface.co/theforecastingcompany/t0-alpha)
801
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)
802
817
 
803
818
  Before using any pretrained weights, review the [pretrained-model license index](LICENSES/pretrained/README.md). It
804
819
  links the current upstream terms and records when each bundled license snapshot was last checked. Upstream licenses can
@@ -806,7 +821,7 @@ change, so the copies in this repository may be outdated; always check the lates
806
821
  terms are welcome as issues or pull requests.
807
822
 
808
823
  Model identifiers map to filenames in Equimo's
809
- [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).
810
825
 
811
826
  Published ConvNeXt size factories load the default classifier with `pretrained=True`:
812
827
 
@@ -1024,6 +1039,23 @@ def loss_and_grads(model_fp32, images, labels, key):
1024
1039
  return softmax_cross_entropy_with_integer_labels(logits, labels).mean()
1025
1040
  ```
1026
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
+
1027
1059
  Numerically sensitive operations cast locally to float32 and return the model dtype: normalization statistics, rotary
1028
1060
  factors, and every softmax. Attention between tokens applies `jax.nn.softmax` to float32 logits. Other softmaxes
1029
1061
  (attention pooling, attention-pooling heads, adapter fusion, the tabular decoder, and the `"softmax"` activation) use
@@ -7,6 +7,12 @@ Equimo provides JAX/Equinox implementations of recent architectures across modal
7
7
  modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, tabular
8
8
  includes TabPFN-3 core models, and the experimental time-series namespace includes the raw T0 backbone.
9
9
 
10
+ ![SAM 3.1 tracking the concept "person" through a film scene](https://rhizome-labs.com/equimo/sam31-video-tracking.gif)
11
+
12
+ *SAM 3.1 video tracking from the text prompt `"person"`, with
13
+ [the code in the guide](docs/sam3.md#tracking-a-film-clip). Excerpt from* Pulp Fiction *(1994, Miramax), which belongs
14
+ to its rights holders and is not covered by Equimo's licenses.*
15
+
10
16
  ## Features
11
17
 
12
18
  - Pure JAX/Equinox implementations
@@ -56,7 +62,7 @@ Equimo is organized by modality, with reusable building blocks separated from mo
56
62
 
57
63
  | Namespace | Purpose |
58
64
  | ---------------------- | --------------------------------------------------------------------------------------- |
59
- | `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers |
65
+ | `equimo.core` | Shared layers, scan ops, implicit/DEQ utilities, EMA helpers, parameter tags and masks |
60
66
  | `equimo.vision` | Vision models, vision layers, and image IO |
61
67
  | `equimo.language` | Text encoders and tokenizers |
62
68
  | `equimo.audio` | Audio models, layers, and checkpoint-linked AST waveform preprocessing |
@@ -100,6 +106,7 @@ Beyond a standard ViT (e.g., DINOv2 or SigLIP), Equimo provides other SotA archi
100
106
  | 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
107
  | EUPE | [Efficient Universal Perception Encoder](https://arxiv.org/abs/2603.22387) | 2026 | ✅ |
102
108
  | LingBot-Vision | [Vision Pretraining for Dense Spatial Perception](https://arxiv.org/abs/2607.05247) | 2026 | ✅§ |
109
+ | SAM 3.1 | [SAM 3: Segment Anything with Concepts](https://arxiv.org/abs/2511.16719) | 2025 | ✅¶ |
103
110
  | ViT-5 | [ViT-5: Vision Transformers for The Mid-2020s](https://arxiv.org/abs/2602.08071) | 2026 | ✅ |
104
111
 
105
112
  \*: Only contains the Linear Angular Attention module. It is straightforward to build a ViT around it, but may require
@@ -116,6 +123,9 @@ network from these blocks.
116
123
  tokens, and self-attention without a key bias; the Giant variant uses a SwiGLU FFN. Pretrained Small, Base, Large, and
117
124
  Giant backbones are available — see [pretrained models](#list-of-pretrained-models).
118
125
 
126
+ ¶: SAM 3.1 finds every instance of a concept in an image, segments objects from clicks, and tracks through video
127
+ (experimental). See the [SAM 3.1 guide](docs/sam3.md). Its weights are under the SAM License.
128
+
119
129
  ## Implemented Audio Models
120
130
 
121
131
  | Model | Paper | Year | Status |
@@ -747,6 +757,7 @@ The following models have pretrained weights available in Equimo:
747
757
  - [TabPFN-3](https://arxiv.org/abs/2605.13986)
748
758
  - [T0-alpha](https://huggingface.co/theforecastingcompany/t0-alpha)
749
759
  - [LingBot-Vision](https://arxiv.org/abs/2607.05247) (Small, Base, Large, and Giant)
760
+ - [SAM 3.1](https://arxiv.org/abs/2511.16719) (the `sam31_multiplex` vision and `sam31_text` text models)
750
761
 
751
762
  Before using any pretrained weights, review the [pretrained-model license index](LICENSES/pretrained/README.md). It
752
763
  links the current upstream terms and records when each bundled license snapshot was last checked. Upstream licenses can
@@ -754,7 +765,7 @@ change, so the copies in this repository may be outdated; always check the lates
754
765
  terms are welcome as issues or pull requests.
755
766
 
756
767
  Model identifiers map to filenames in Equimo's
757
- [Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/2ce35f6512516a67ff99c473423e6ca48aa0ae01/models/default).
768
+ [Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/f4b4cf5bc2d47a98fd0df11eddb08fd3bb5dded6/models/default).
758
769
 
759
770
  Published ConvNeXt size factories load the default classifier with `pretrained=True`:
760
771
 
@@ -972,6 +983,23 @@ def loss_and_grads(model_fp32, images, labels, key):
972
983
  return softmax_cross_entropy_with_integer_labels(logits, labels).mean()
973
984
  ```
974
985
 
986
+ Give the optimizer only the trainable leaves and Equimo's weight-decay mask. `trainable_mask` leaves out buffers, such
987
+ as frozen PEFT bases, which weight decay would otherwise change; `weight_decay_mask` leaves biases, norms, layer scales,
988
+ state-space dynamics, every other array with at most one axis, position embeddings, and learned class, register,
989
+ distillation, and mask tokens undecayed:
990
+
991
+ ```python
992
+ import optax
993
+ from equimo.core.parameters import trainable_mask, weight_decay_mask
994
+
995
+ params, static = eqx.partition(model_fp32, trainable_mask(model_fp32))
996
+ optimizer = optax.adamw(3e-4, weight_decay=0.05, mask=weight_decay_mask)
997
+ opt_state = optimizer.init(params)
998
+ ```
999
+
1000
+ Differentiate with respect to `params` and rebuild the model with `eqx.combine(params, static)`. Fine-tuning plans apply
1001
+ the same policy.
1002
+
975
1003
  Numerically sensitive operations cast locally to float32 and return the model dtype: normalization statistics, rotary
976
1004
  factors, and every softmax. Attention between tokens applies `jax.nn.softmax` to float32 logits. Other softmaxes
977
1005
  (attention pooling, attention-pooling heads, adapter fusion, the tabular decoder, and the `"softmax"` activation) use
@@ -0,0 +1,81 @@
1
+ # SAM 3.1 behavior provenance
2
+
3
+ Equimo's SAM 3.1 port was first drafted from `docs/designs/sam3.md`, Equimo, the SAM 3 paper and the SAM 3.1 release
4
+ post, without reading the reference source. The tiny component tests then compare it against the reference at
5
+ `f1647e8d0c1d280991f4d1b7d974c2704537fe66`. Each row records a behavior that differed, the test that caught it, and the
6
+ revision that fixed it. The code stays under `MIT AND Apache-2.0`; this note is the record of what changed after reading
7
+ the reference, and it is not legal advice.
8
+
9
+ | Behavior corrected | Test | Revision |
10
+ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
11
+ | The joint logit goes through `inverse_sigmoid` with a 1e-3 clamp, so it stays within about +/-6.9. | `tests/test_sam3.py::test_joint_score_and_boxes_match_the_reference` | `tksqkunw` |
12
+ | Geometry prompts sum separate direct, pooled and position projections, add a class token, normalize the image first, and use a final projection and norm. | `tests/test_sam3.py::test_geometry_encoder_matches_the_reference_with_exemplars` | `tksqkunw` |
13
+ | The box relative-position bias uses signed log-scaled offsets to both box edges, with one network per axis. | `tests/test_sam3.py::test_decoder_matches_the_reference` | `tksqkunw` |
14
+ | The decoder's text cross-attention takes box positions; box positions are sine-encoded in y, x, width, height order; the queries and the presence token have their own output norms. | `tests/test_sam3.py::test_decoder_matches_the_reference` | `tksqkunw` |
15
+ | Scoring refines the prompt with a residual network and norm, then scales the dot product by `1 / sqrt(dim)`. | `tests/test_sam3.py::test_scoring_matches_the_reference` | `tksqkunw` |
16
+ | The segmentation head runs 2 pixel-decoder stages and has separate instance and semantic projections, and Equimo drops the unused semantic one. | `tests/test_sam3.py::test_segmentation_matches_the_reference` | `tksqkunw` |
17
+ | The two-way transformer adds position encodings per attention, its first block adds no self-attention residual, and it ends with a final cross-attention. | `tests/test_sam3.py::test_interactive_decoder_matches_the_reference` | `tksqkunw` |
18
+ | Each mask token has its own mask-embedding network, and the upsampler has a single norm. | `tests/test_sam3.py::test_interactive_decoder_matches_the_reference` | `tksqkunw` |
19
+ | The prompt encoder always appends a padding point, and an empty prompt also encodes one padding point in the first slot. | `tests/test_sam3.py::test_prompt_encoder_matches_the_reference_for_masks_and_boxes` | `tksqkunw` |
20
+ | A mask prompt follows the stability rule even with no points. | `tests/test_sam3.py::test_interactive_decoder_matches_the_reference` | `tksqkunw` |
21
+ | Multiplex slots have their own object, IoU and mask tokens; valid and invalid embeddings apply only to mask tokens; the decoder takes no sparse or dense prompts. | `tests/test_sam3.py::test_multiplex_decoder_matches_the_reference` | `tksqkunw` |
22
+ | The memory encoder's channel widths grow by 4 from `start_channels`, and its fuser depth is configurable. | `tests/test_sam3.py::test_memory_encoder_matches_the_reference` | `tksqkunw` |
23
+ | Memory attention adds projected image features to its queries and keys, adds position to the keys, scales the input position by 0.1, and uses exact GELU in its feed-forward. | `tests/test_sam3.py::test_memory_attention_matches_the_reference` | `tksqkunw` |
24
+ | The causal text encoder does not drop padded keys; right padding cannot reach real tokens through the causal mask. | `tests/test_language.py::test_causal_text_transformer_matches_the_reference_on_the_tiny_fixture` | `tksqkunw` |
25
+ | `roi_align` reads the border for samples outside the map, as torchvision's CUDA kernel does, instead of zeroing samples further than a pixel away. | `tests/test_vision_ops.py::test_roi_align_matches_torchvision` | `tksqkunw` |
26
+ | Bilinear mask resizing uses torch's float32 sample positions, through `resize_bilinear`. | `tests/test_vision_ops.py::test_bilinear_resize_matches_torch` | `tksqkunw` |
27
+ | Single-frame mask NMS measures overlap as intersection over minimum, not against the higher-ranked mask's area. | `tests/test_sam3.py::test_mask_nms_keeps_what_the_reference_keeps` | `tksqkunw` |
28
+ | The tracker has parameters for the checkpoint's object-absent pointer and memory and its interactive pointer and mask downsample, so no trained weight goes without a destination. | `tests/test_sam3.py::test_tiny_reference_state_fills_every_parameter_or_is_listed` | `pytzottv` |
29
+ | Exemplars with no text: the 3.1 predictor encodes the string `<text placeholder>` as the text prompt, where `ConceptPrompt.create` leaves it empty. Documented; the model is unchanged. | `tests/test_sam3_reference.py::test_exemplars_alone_keep_the_reference_detections` | `rpnrlnxk` |
30
+ | A detection with two or more strong overlaps is ambiguous for its whole row and column, including its matches; a track counts as matched by a raw overlap of at least 0.5. | `tests/test_sam3.py::test_association_zeroes_ambiguous_rows_and_columns` | `yvmtxxvn` |
31
+ | New detections need the keep mask unless nothing is tracked, and then only the boundary filter is ignored; NMS-suppressed detections are never new. | `tests/test_sam3.py::test_detections_suppressed_by_nms_are_never_new` | `yvmtxxvn` |
32
+ | Empty tracks do not count as unmatched in the hot-start. | `tests/test_sam3_video.py::test_hot_start_counts_only_tracks_with_pixels_as_unmatched` | `yvmtxxvn` |
33
+ | Duplicates count overlaps of at least 0.1, once per shared detection, and only against strictly earlier objects. | `tests/test_sam3_video.py::test_hot_start_counts_each_shared_detection`, `::test_objects_of_the_same_frame_are_never_duplicates` | `yvmtxxvn` |
34
+ | Reconditioning covers objects removed on the frame, keeps the tracker's logits where both masks agree, replaces the pointer through the interactive head, and leaves the frame non-conditioning. | `tests/test_sam3.py::test_commit_reconditions_and_suppresses_the_output_masks`, `::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
35
+ | Occlusion uses the masks after reconditioning, empty masks rather than the object score, compares strictly with the other object already occluded, treats objects removed on this frame as always occluded, and writes -10 to a suppressed mask. | `tests/test_sam3_video.py::test_occlusion_reads_the_masks_after_reconditioning`, `::test_objects_removed_this_frame_are_suppressed_first_when_they_overlap`, `::test_occlusion_ties_suppress_nobody` | `yvmtxxvn` |
36
+ | The object cap counts objects before this frame's removals, and new objects keep the kept-detections-first detection order unless they go over it. | `tests/test_sam3_video.py::test_object_limit_counts_objects_removed_on_the_same_frame`, `::test_new_objects_keep_kept_detections_first_when_under_the_limit` | `yvmtxxvn` |
37
+ | New objects are placed per state by best fit over empty slots, filling its buckets in order, and only a new state stores a conditioning frame. | `tests/test_sam3_video.py::test_new_objects_join_the_fullest_state_that_holds_them`, `::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
38
+ | Objects of the prompt frame are confirmed like any other, and the streak counts both frame-0 passes through the match mask. | `tests/test_sam3_video.py::test_prompt_frame_keeps_the_highest_scores_over_the_object_limit`, `tests/test_sam3.py::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
39
+ | An unconfirmed object is hidden only while still live two frames later, removed objects stay shown up to their last frame with a score of -1e4, and new objects render from the detector mask on their birth frame. | `tests/test_sam3.py::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
40
+ | Objects without pixels are dropped before overlap resolution, which goes to the highest tracker probability (the detection probability on a birth frame), so an object can remain with an empty mask. | `tests/test_sam3_video.py::test_rendering_keeps_an_object_that_lost_all_its_pixels` | `yvmtxxvn` |
41
+ | Memory is written on every frame including the prompt frame's second pass, with global per-pixel shrinkage over all objects in ID order, `2 * sigmoid - 1` in slots, zeros for absent slots, and `no_object_memory` for every slot that does not appear. | `tests/test_sam3.py::test_injected_memory_tracks_and_stores_like_the_reference`, `::test_area_shrinkage_clamps_empty_masks_when_others_exist` | `yvmtxxvn` |
42
+ | Re-encoding after adding objects is per state, from masks that pass through the source frame size with antialiasing, with overlaps resolved by highest logit at the image size. | `tests/test_sam3.py::test_tracker_replays_the_reference_clip`, `::test_non_overlap_applies_within_each_state_only` | `yvmtxxvn` |
43
+ | Added and reconditioned objects use `interactive_pointer_proj` from the binary mask downsampled by `interactive_mask_downsample`, with a score of +/-10 from whether the mask has pixels. | `tests/test_sam3.py::test_tracker_replays_the_reference_clip` | `yvmtxxvn` |
44
+ | Interactive pointers use the first mask token unless the prompt is multimask, even when stability selects another mask. | `tests/test_sam3.py::test_point_track_matches_the_reference` | `yvmtxxvn` |
45
+ | Propagated pointers of objects scored as absent go through `no_object_pointer`. | `tests/test_sam3.py::test_injected_memory_tracks_and_stores_like_the_reference` | `yvmtxxvn` |
46
+ | The spatial temporal embedding of conditioning frames counts down from entry 6 by distance and recent frames count up; the pointer encoding has sines first, cosines second and no 2 pi scale. | `tests/test_sam3.py::test_injected_memory_tracks_and_stores_like_the_reference` | `yvmtxxvn` |
47
+ | A new object from points stores its mask through the source frame size with its real object score on a conditioning frame; later frames store memory from their own masks, without shrinkage. | `tests/test_sam3.py::test_point_track_matches_the_reference` | `yvmtxxvn` |
48
+ | Box and point exemplars reach only the prompt frame; later frames detect from the text alone. | `tests/test_sam3_reference.py::test_exemplars_reach_only_the_prompt_frame_as_in_the_reference` | `wvpuyryx` |
49
+
50
+ ## Sources
51
+
52
+ The first draft was written, without reading the reference, from `docs/designs/sam3.md`, Equimo, the SAM 3 paper (arXiv
53
+ 2511.16719) and the SAM 3.1 release post. The reference was read only after it, at
54
+ `f1647e8d0c1d280991f4d1b7d974c2704537fe66`, to find the differences logged above and to write the fixture harness, which
55
+ generates fixtures through it. The tokenizer and its vocabulary come from OpenAI's MIT-licensed CLIP release; the
56
+ vocabulary file is byte-identical to the one the reference ships.
57
+
58
+ Legal review took place before release.
59
+
60
+ ## Fixture harness
61
+
62
+ The reference's own numerics also needed one correction, in the fixture harness rather than the port. Importing
63
+ `sam3.model.sam3_multiplex_base` turns TF32 on for convolutions and matmul, so the harness now restores float32 after
64
+ that import, and building the video predictor turns it on again, so `models/sam31_reference.py:reference_precision`
65
+ clears it after the build as well as `float32_reference` does after the import.
66
+
67
+ The tiny text encoder's `positional_embedding` and `text_projection` are only allocated by the reference, for a
68
+ checkpoint to fill, so the harness initializes them from their own seeded generator. Without that, the tiny detector and
69
+ text outputs were NaN, and comparing NaN with NaN passes.
70
+
71
+ Generating the full-weight video fixture also needed two changes in the harness, neither of which changes what the
72
+ reference computes. Float32 memory attention runs in blocks of 1,024 queries, because the dense math-kernel logits do
73
+ not fit in 16 GB, and the detector runs one frame at a time instead of in the builder's chunks of 16 frames, for the
74
+ same reason.
75
+
76
+ ## Full-weight video parity
77
+
78
+ The full-weight check in `tests/test_sam3_reference.py` reproduced the reference's decision trace, object IDs and masks
79
+ on the first run (lowest per-object mask IoU 0.9925), so it logged no behavior difference and no row above (revision
80
+ `ryznoxzq`). The reference numbers detections by their position in its filtered detection list, while the driver reports
81
+ the raw query index, so the check compares objects, as the design's criterion does, and not those indices.
@@ -34,6 +34,11 @@ Fused cuDNN attention, selected with `equimo.core.layers.with_attention_implemen
34
34
  experimental. Its supported dtypes, masks, and module coverage follow cuDNN and `jax.nn.dot_product_attention` and may
35
35
  change in a minor release. The default `implementation="xla"` is stable.
36
36
 
37
+ SAM 3.1 is covered in two tiers. The image endpoints (`Sam3.features`, `encode_image`, `detect`, `predict_interactive`,
38
+ `decode_concepts`, `encode_concept`), the `sam31_text` model and `ClipBpeTokenizer` are stable. `TrackerState`,
39
+ `CommitPlan`, `propagate`, `associate`, `commit`, and the video driver and policy in `equimo.vision.models.sam3.video`
40
+ are experimental and may change in a minor release.
41
+
37
42
  Optional integrations remain optional. Their public Equimo wrappers are stable, but the supported Python range may be
38
43
  narrower when an upstream dependency does not publish wheels. Equimo documents and tests those exceptions explicitly.
39
44
 
@@ -53,6 +58,15 @@ line. Their internal checksum cannot be reconstructed, so readers identify that
53
58
  rejects them by default and returns an explicitly unverified result only when `allow_legacy=True`; `load_weights`
54
59
  continues to read them with a warning. Equimo v1 archives and the removed v1 `load_model` API are outside this contract.
55
60
 
61
+ Before Equimo 2.8, RoPE and Swin position embeddings stored values that follow from their configuration, such as RoPE
62
+ frequencies, as PyTree leaves. They are now computed when used, which changes the structural signature of the affected
63
+ models; this is a correctness fix, since optimizers could change those values through weight decay. Model archives saved
64
+ before 2.8 remain readable throughout the v2 release line: `load_weights` recognizes the older layout and raises
65
+ `ValueError` if a stored value differs from the computed one by more than four machine epsilons of its dtype, while
66
+ `inspect_checkpoint` accepts the older signature without comparing values. Fine-tuning bundle and PMT hashes or digests
67
+ that covered those values are accepted when they match the older layout, but loading a bundle whose trained delta
68
+ changed one of them raises `FineTuneBundleError`.
69
+
56
70
  Each Equimo release pins its built-in Hugging Face model repository to an immutable revision and embeds the Git LFS
57
71
  SHA-256 of every uploaded archive. An explicit archive SHA-256 can also be supplied to `load_weights` for deployments
58
72
  that maintain their own digest manifest.
@@ -77,3 +77,17 @@ Equimo converted the parameters to its JAX/Equinox layout and archive format.
77
77
  Each archive records its timm tag, upstream Hugging Face commit, preprocessing
78
78
  configuration, and numerical conversion checks. Sources and bundled licenses
79
79
  are linked in README.md. No endorsement by the upstream authors is implied.
80
+
81
+ SAM 3.1
82
+ -------
83
+
84
+ Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved.
85
+ Source: https://github.com/facebookresearch/sam3
86
+ Checkpoint: facebook/sam3.1, sam3.1_multiplex.pt
87
+ License: SAM License; see LICENSES/pretrained/sam-License.md and
88
+ models/default/sam31/sam-License.md.
89
+
90
+ Equimo converted the checkpoint's vision and text parameters to its
91
+ JAX/Equinox layout and archive format, as sam31_multiplex and sam31_text. The
92
+ converted archives remain SAM Materials under the SAM License. They are not an
93
+ official Meta product, and no endorsement by Meta is implied.