Equimo 2.0.0__tar.gz → 2.1.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 (158) hide show
  1. equimo-2.1.0/CHANGELOG.md +108 -0
  2. equimo-2.1.0/LICENSES/tfc-t0-APACHE-2.0.txt +190 -0
  3. equimo-2.1.0/NOTICE +20 -0
  4. {equimo-2.0.0 → equimo-2.1.0}/PKG-INFO +96 -9
  5. {equimo-2.0.0 → equimo-2.1.0}/README.md +92 -7
  6. {equimo-2.0.0 → equimo-2.1.0}/docs/stability.md +20 -2
  7. equimo-2.1.0/docs/timeseries.md +142 -0
  8. {equimo-2.0.0 → equimo-2.1.0}/pyproject.toml +18 -3
  9. equimo-2.1.0/src/equimo/__init__.py +1 -0
  10. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/_pretrained.py +1 -0
  11. equimo-2.1.0/src/equimo/audio/layers/__init__.py +25 -0
  12. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/audio/layers/patch.py +4 -38
  13. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/audio/models/ast.py +51 -61
  14. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/catalog.py +3 -82
  15. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/conversion/utils.py +0 -1
  16. equimo-2.1.0/src/equimo/core/_prng.py +34 -0
  17. equimo-2.1.0/src/equimo/core/factory.py +101 -0
  18. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/implicit/deq.py +11 -5
  19. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/implicit/injectors.py +10 -27
  20. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/implicit/stabilizers.py +11 -28
  21. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/implicit/strategies.py +16 -32
  22. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/__init__.py +14 -0
  23. equimo-2.1.0/src/equimo/core/layers/_registry.py +105 -0
  24. equimo-2.1.0/src/equimo/core/layers/attention.py +304 -0
  25. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/dropout.py +14 -47
  26. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/ffn.py +7 -49
  27. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/generic.py +88 -22
  28. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/mamba.py +4 -50
  29. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/norm.py +16 -50
  30. equimo-2.1.0/src/equimo/core/layers/rotary.py +254 -0
  31. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/__init__.py +1 -100
  32. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/audio/recipes.py +2 -3
  33. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/config.py +0 -75
  34. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/feature_extraction.py +6 -2
  35. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/heads.py +23 -67
  36. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/labels.py +2 -4
  37. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/language/__init__.py +1 -2
  38. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/language/recipes.py +1 -9
  39. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/merging.py +1 -111
  40. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/__init__.py +0 -12
  41. equimo-2.1.0/src/equimo/finetune/peft/_common.py +99 -0
  42. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/adapters.py +47 -148
  43. equimo-2.1.0/src/equimo/finetune/peft/base.py +59 -0
  44. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/dora.py +6 -53
  45. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/ia3.py +7 -32
  46. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/lora.py +18 -177
  47. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/prefix.py +37 -39
  48. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/prompts.py +27 -58
  49. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/scale_shift.py +3 -11
  50. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/vera.py +5 -24
  51. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/pooling.py +0 -14
  52. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/recipes.py +0 -98
  53. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/regularization.py +4 -7
  54. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/selectors.py +0 -8
  55. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/serialization.py +298 -383
  56. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/surgery.py +4 -68
  57. equimo-2.1.0/src/equimo/finetune/vision/__init__.py +11 -0
  58. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/language/models.py +3 -2
  59. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/registry.py +2 -0
  60. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/serialization.py +319 -94
  61. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/attention.py +17 -3
  62. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/blocks.py +15 -23
  63. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/decoder.py +3 -4
  64. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/mlp.py +2 -3
  65. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/preprocessing.py +0 -1
  66. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/registry.py +0 -2
  67. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/models/tabpfn.py +20 -27
  68. equimo-2.1.0/src/equimo/timeseries/__init__.py +1 -0
  69. equimo-2.1.0/src/equimo/timeseries/layers/__init__.py +14 -0
  70. equimo-2.1.0/src/equimo/timeseries/layers/axis_attn.py +79 -0
  71. equimo-2.1.0/src/equimo/timeseries/layers/blocks.py +64 -0
  72. equimo-2.1.0/src/equimo/timeseries/layers/patch_encoder.py +44 -0
  73. equimo-2.1.0/src/equimo/timeseries/layers/registry.py +22 -0
  74. equimo-2.1.0/src/equimo/timeseries/layers/residual_mlp.py +36 -0
  75. equimo-2.1.0/src/equimo/timeseries/models/__init__.py +15 -0
  76. equimo-2.1.0/src/equimo/timeseries/models/t0.py +799 -0
  77. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/attention.py +65 -278
  78. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/convolution.py +68 -134
  79. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/downsample.py +7 -46
  80. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/patch.py +3 -49
  81. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/posemb.py +94 -170
  82. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/squeeze_excite.py +4 -46
  83. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/wavelet.py +3 -49
  84. equimo-2.1.0/src/equimo/vision/models/_embedding.py +154 -0
  85. equimo-2.1.0/src/equimo/vision/models/_features.py +155 -0
  86. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/attnet.py +13 -21
  87. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/convnext.py +14 -76
  88. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/deq.py +18 -21
  89. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/fastervit.py +9 -6
  90. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/iformer.py +14 -75
  91. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/lowformer.py +28 -23
  92. equimo-2.1.0/src/equimo/vision/models/mlla.py +212 -0
  93. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/mobilenet.py +24 -24
  94. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/parcae.py +86 -160
  95. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/partialformer.py +11 -6
  96. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/reduceformer.py +18 -21
  97. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/shvit.py +4 -3
  98. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/vit.py +109 -139
  99. equimo-2.1.0/src/equimo/vision/models/vssd.py +129 -0
  100. equimo-2.0.0/CHANGELOG.md +0 -68
  101. equimo-2.0.0/src/equimo/__init__.py +0 -1
  102. equimo-2.0.0/src/equimo/audio/layers/__init__.py +0 -56
  103. equimo-2.0.0/src/equimo/core/layers/_registry.py +0 -40
  104. equimo-2.0.0/src/equimo/core/layers/attention.py +0 -392
  105. equimo-2.0.0/src/equimo/finetune/integrations/__init__.py +0 -3
  106. equimo-2.0.0/src/equimo/finetune/integrations/_groups.py +0 -29
  107. equimo-2.0.0/src/equimo/finetune/integrations/optax.py +0 -26
  108. equimo-2.0.0/src/equimo/finetune/integrations/rollfast.py +0 -26
  109. equimo-2.0.0/src/equimo/finetune/peft/base.py +0 -36
  110. equimo-2.0.0/src/equimo/finetune/profiles.py +0 -869
  111. equimo-2.0.0/src/equimo/finetune/tabular/__init__.py +0 -11
  112. equimo-2.0.0/src/equimo/finetune/tabular/recipes.py +0 -33
  113. equimo-2.0.0/src/equimo/finetune/vision/__init__.py +0 -32
  114. equimo-2.0.0/src/equimo/finetune/vision/prompts.py +0 -25
  115. equimo-2.0.0/src/equimo/finetune/vision/recipes.py +0 -154
  116. equimo-2.0.0/src/equimo/finetune/vision/selectors.py +0 -63
  117. equimo-2.0.0/src/equimo/vision/models/mlla.py +0 -223
  118. equimo-2.0.0/src/equimo/vision/models/vssd.py +0 -245
  119. {equimo-2.0.0 → equimo-2.1.0}/LICENSE.md +0 -0
  120. {equimo-2.0.0 → equimo-2.1.0}/docs/migration-v2.md +0 -0
  121. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/_io.py +0 -0
  122. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/audio/__init__.py +0 -0
  123. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/audio/io.py +0 -0
  124. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/audio/models/__init__.py +0 -0
  125. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/conversion/__init__.py +0 -0
  126. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/__init__.py +0 -0
  127. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/emamodel.py +0 -0
  128. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/implicit/__init__.py +0 -0
  129. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/implicit/_base.py +0 -0
  130. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/intermediates.py +0 -0
  131. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/layers/activation.py +0 -0
  132. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/ops/__init__.py +0 -0
  133. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/core/ops/scan.py +0 -0
  134. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/_serialization_codecs.py +0 -0
  135. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/_typing.py +0 -0
  136. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/audio/__init__.py +0 -0
  137. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/audio/selectors.py +0 -0
  138. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/calibration.py +0 -0
  139. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/continued_ssl.py +0 -0
  140. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/inspection.py +0 -0
  141. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/language/selectors.py +0 -0
  142. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/masks.py +0 -0
  143. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/paths.py +0 -0
  144. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/_compat.py +0 -0
  145. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/peft/bitfit.py +0 -0
  146. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/tags.py +0 -0
  147. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/finetune/vision/dense.py +0 -0
  148. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/language/__init__.py +0 -0
  149. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/language/tokenizers.py +0 -0
  150. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/__init__.py +0 -0
  151. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/layers/__init__.py +0 -0
  152. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/tabular/models/__init__.py +0 -0
  153. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/utils.py +0 -0
  154. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/__init__.py +0 -0
  155. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/io.py +0 -0
  156. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/__init__.py +0 -0
  157. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/layers/registry.py +0 -0
  158. {equimo-2.0.0 → equimo-2.1.0}/src/equimo/vision/models/__init__.py +0 -0
@@ -0,0 +1,108 @@
1
+ # Changelog
2
+
3
+ All notable changes to Equimo are documented here. Equimo follows Semantic Versioning from version 2.0.0 onward.
4
+
5
+ ## [2.1.0] - 2026-08-10
6
+
7
+ ### Added
8
+
9
+ - Layout-aware `RotaryFactors` and canonical rotary generation/application helpers under `equimo.core.layers`.
10
+ - An experimental `equimo.timeseries` namespace with the raw T0/T0-alpha patch-transformer backbone, converted
11
+ pretrained weights, and a documented tensor, scaling, padding, and output contract.
12
+ - Apache-2.0 licensing and upstream attribution for the T0-derived modules, alongside Equimo's MIT-licensed original
13
+ code.
14
+
15
+ ### Removed
16
+
17
+ - **Breaking:** raw `(sin, cos)` rotary plumbing (`get_sincos()` and `rope_sincos=`), the general `qk_transform`
18
+ attention callback, and rotary helper re-exports from attention modules. Rotary producers now return `RotaryFactors`
19
+ from `get_factors()`, and attention accepts `rotary=`.
20
+ - **Breaking:** unused fine-tuning API surface identified by a code audit (nothing removed was exercised by
21
+ documentation, examples, or tests beyond its own definition): the method-profile layer (`profiles.py`,
22
+ `MethodProfile`, `FineTunePlan.profile`), the `*Recipe` shells duplicating the real `*Config` classes (`LoRARecipe`,
23
+ `DoRARecipe`, `AdapterRecipe`, `VPTShallowRecipe`, `VPTDeepRecipe`, `LinearProbeRecipe`, `LinearProbeConfig`,
24
+ `FineTuneRecipe`, `HeadSpec`, `SAMMetadata`), the `equimo.finetune.integrations` package, the
25
+ `equimo.finetune.tabular` package and other one-line aliases (`partition_for_training`, `locked_tower`,
26
+ `linear_probe`, `attention_pool_probe`, `adapter_transformer_strong`, `merge_and_save`), the unused
27
+ `MergeMethod`/`MergePlan`/`KnOTSMerging` and `PEFTModuleMixin` protocols, and `CompactLeafMap`,
28
+ `TokenClassificationHead`, `TokenIndexPool`, `is_layer_norm`. Method fidelity notes moved to
29
+ `docs/finetuning/method_defaults.md`.
30
+ - Constructor parameters that were accepted but silently ignored: `C3(n)`, `FasterNetBlock(kernel_size, padding)`,
31
+ `DoubleConvBlock(norm_max_group)`, `LinearAngularAttention(qk_norm)`, `RFAttentionBlock(residual_mbconv)`,
32
+ `ConvAttention(norm_kwargs)`, `Vssd(d_state, d_conv)`, and `interpolate_antialias` on `FasterViT`/`PartialFormer`.
33
+ - `equimo.catalog`'s runtime descriptor-validation framework and `create_model` remain; the authoring contract is now
34
+ enforced by tests.
35
+
36
+ ### Changed
37
+
38
+ - **Breaking:** `save_delta` and `load_delta` accept a single, documented call order:
39
+ `save_delta(model, path, *, base_model=None, spec=None, ...)` and `load_delta(base_model, path_or_bundle)`. The
40
+ on-disk bundle format is unchanged.
41
+ - `replace_head` always validates the replacement head; the `validate_shape` and `preserve_old_head_metadata` flags are
42
+ removed.
43
+ - Internal consolidation with no behavioral or checkpoint impact: shared registry factories, model-variant factory,
44
+ drop-path and layer-scale helpers, PEFT micro-helpers and wrapper walkers, entry-based delta codec drivers,
45
+ feature-forward mixins, and shared ViT/Parcae embedding builders. Saved-checkpoint compatibility is guarded by a new
46
+ structure-signature test (`tests/test_checkpoint_signature_stability.py`).
47
+ - Core attention accepts leading batch axes and optional Q/K transforms. Nonzero masks identify allowed pairs, and fully
48
+ masked query rows now contribute zero attention probability mass.
49
+
50
+ ### Fixed
51
+
52
+ - Corrected ViT-5 and direct vision RoPE feature pairing, T0 XPos low-precision dtypes, rectangular MLLA RoPE grids, and
53
+ TabPFN custom `rope_base` isolation from Equinox's theta-blind global factor cache.
54
+ - Deterministic built-in model and layer paths no longer stage dead JAX PRNG operations when `inference=True`, enabling
55
+ direct export through converters that do not lower randomness primitives while preserving training key schedules.
56
+ VisionParcae's explicitly stochastic state initializers remain key-dependent; `state_init="zero"` provides its
57
+ PRNG-free export path.
58
+
59
+ ## [2.0.0] - 2026-07-15
60
+
61
+ ### Added
62
+
63
+ - Public modality namespaces for vision, language, audio, and tabular models, with shared layers under `equimo.core`.
64
+ - The `equimo.finetune` subsystem, including trainability plans, PEFT methods, feature extraction, calibration, merging,
65
+ and portable delta bundles.
66
+ - Versioned model-checkpoint metadata with model-structure and SHA-256 validation. Newly written model, delta, and
67
+ calibration archives are staged atomically and read with explicit resource limits.
68
+ - An experimental, read-only model catalog in `equimo.catalog`.
69
+
70
+ ### Changed
71
+
72
+ - Python support is 3.12 through 3.14. The declared JAX and Equinox minima now match the effective requirements of the
73
+ runtime dependency graph.
74
+ - Model loading uses a constructed model plus `equimo.serialization.load_weights`. The built-in Hugging Face repository
75
+ points to an immutable revision, and every uploaded archive is verified against its pinned Git LFS SHA-256 digest.
76
+ - Fine-tuning paths now escape dots, backslashes, and integer-looking string keys, keeping mapping keys distinct from
77
+ sequence indices.
78
+ - Language pooling and positional/mask operations preserve low-precision model dtypes while accumulating sensitive
79
+ reductions in float32.
80
+
81
+ ### Fixed
82
+
83
+ - Corrected the state-space duality scan recurrence, chunk transitions, and output dtype.
84
+ - Corrected the DINO projection head by removing the activation after its final linear layer.
85
+ - Corrected convolutional patch-embedding output shapes for odd image sizes.
86
+ - Made `DropPath` and `DropPathAdd` accept scalar JAX probabilities and handle a probability of one deterministically.
87
+ - Preserved unknown token ID zero instead of treating every zero token as padding.
88
+ - Forwarded `key` and `inference` independently through feature extractors and heads.
89
+ - Preserved unmatched destination parameters during non-strict PyTorch conversion and handled CPU, conjugate/negative,
90
+ bfloat16, and destination dtype conversion safely.
91
+ - Made AdaLoRA, LoRA-FA, FourierFT, and ordinary trainable leaves round-trip through fine-tuning bundles; merge,
92
+ unmerge, and strip now cover the complete supported LoRA family.
93
+ - Rejected non-finite calibration statistics.
94
+
95
+ ### Security and reliability
96
+
97
+ - Archive extraction no longer replaces a caller-owned sibling directory.
98
+ - Model, delta, and calibration readers reject duplicate, unexpected, non-regular, oversized, truncated, or
99
+ checksum-mismatched members.
100
+ - Archive extraction locks work on both POSIX and Windows.
101
+
102
+ ### Removed
103
+
104
+ - The v1 top-level `equimo.models`, `equimo.layers`, `equimo.io`, `equimo.implicit`, and `equimo.experimental` layouts.
105
+ - The v1 metadata-driven `load_model` constructor. Equimo v1 archives are not part of the v2 compatibility contract.
106
+
107
+ Existing model archives uploaded for the v2 alpha releases remain loadable and do not need to be regenerated. See the
108
+ [v2 migration guide](docs/migration-v2.md) and [stability policy](docs/stability.md).
@@ -0,0 +1,190 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ Copyright 2026 The Forecasting Company
179
+
180
+ Licensed under the Apache License, Version 2.0 (the "License");
181
+ you may not use this file except in compliance with the License.
182
+ You may obtain a copy of the License at
183
+
184
+ http://www.apache.org/licenses/LICENSE-2.0
185
+
186
+ Unless required by applicable law or agreed to in writing, software
187
+ distributed under the License is distributed on an "AS IS" BASIS,
188
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
189
+ See the License for the specific language governing permissions and
190
+ limitations under the License.
equimo-2.1.0/NOTICE ADDED
@@ -0,0 +1,20 @@
1
+ Equimo
2
+ Copyright 2024-2026 Clément Poiret and Equimo contributors
3
+
4
+ This distribution includes a JAX/Equinox adaptation of portions of T0
5
+ (tfc-t0), modified by Equimo contributors. The affected implementation is
6
+ under src/equimo/timeseries and models/t0.py.
7
+
8
+ The upstream attribution notice follows:
9
+
10
+ T0 (tfc-t0)
11
+ Copyright 2026 The Forecasting Company
12
+
13
+ This product includes software developed at Datadog (https://www.datadoghq.com/),
14
+ Copyright 2025 Datadog, Inc., licensed under the Apache License 2.0.
15
+ Source: https://github.com/DataDog/toto
16
+
17
+ This product includes software derived from Chronos-2 by Amazon.com, Inc. or
18
+ its affiliates, Copyright Amazon.com, Inc. All Rights Reserved, licensed under
19
+ the Apache License 2.0.
20
+ Source: https://github.com/amazon-science/chronos-forecasting
@@ -1,9 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Equimo
3
- Version: 2.0.0
3
+ Version: 2.1.0
4
4
  Summary: Implementation of modern multimodal models in JAX/Equinox
5
- License-Expression: MIT
5
+ License-Expression: MIT AND Apache-2.0
6
6
  License-File: LICENSE.md
7
+ License-File: LICENSES/tfc-t0-APACHE-2.0.txt
8
+ License-File: NOTICE
7
9
  Classifier: Development Status :: 5 - Production/Stable
8
10
  Classifier: Intended Audience :: Developers
9
11
  Classifier: Intended Audience :: Science/Research
@@ -39,7 +41,7 @@ Description-Content-Type: text/markdown
39
41
 
40
42
  **WARNING**: This is a research library implementing recent model architectures. The implementations are based on paper descriptions and may not be exact replicas of the original implementations. Use with caution in production environments.
41
43
 
42
- Equimo provides JAX/Equinox implementations of recent architectures across modalities. Vision is the most complete modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, and tabular includes TabPFN-3 core models.
44
+ Equimo provides JAX/Equinox implementations of recent architectures across modalities. Vision is the most complete modality today; language has first-class text encoders/tokenizers, audio includes AST spectrogram models, tabular includes TabPFN-3 core models, and the experimental time-series namespace includes the raw T0 backbone.
43
45
 
44
46
  ## Features
45
47
 
@@ -50,7 +52,7 @@ Equimo provides JAX/Equinox implementations of recent architectures across modal
50
52
  - String-based layer resolution everywhere — pass `"layernorm"` instead of `eqx.nn.LayerNorm`
51
53
  - Modular design for easy experimentation
52
54
  - Extensive documentation and type hints
53
- - Modality-specific namespaces: `equimo.vision`, `equimo.language`, `equimo.audio`, `equimo.tabular`
55
+ - Modality-specific namespaces: `equimo.vision`, `equimo.language`, `equimo.audio`, `equimo.tabular`, `equimo.timeseries`
54
56
  - Generic serialization utilities in `equimo.serialization`
55
57
  - Equinox-native fine-tuning utilities in `equimo.finetune`
56
58
 
@@ -80,6 +82,9 @@ uv sync --locked --group dev
80
82
  uv run pre-commit install
81
83
  ```
82
84
 
85
+ See the [testing strategy](docs/testing.md) for model/layer inventories,
86
+ fine-tuning integration coverage, ONNX checks, and scheduled upstream parity.
87
+
83
88
  ## Package Layout
84
89
 
85
90
  Equimo is organized by modality, with reusable building blocks separated from
@@ -92,6 +97,7 @@ modality-specific code:
92
97
  | `equimo.language` | Text encoders and tokenizers |
93
98
  | `equimo.audio` | Audio models, layers, and checkpoint-linked AST waveform preprocessing |
94
99
  | `equimo.tabular` | Tabular models and tabular layers |
100
+ | `equimo.timeseries` | Experimental time-series models and layers, currently the raw T0 backbone |
95
101
  | `equimo.finetune` | Trainability plans, heads, PEFT modules, deltas, model merging, and fine-tuning recipes |
96
102
  | `equimo.serialization` | Checkpoint save/load, weight loading, archive download/decompression |
97
103
  | `equimo.registry` | Modality-aware model registry |
@@ -179,6 +185,17 @@ regressor, and a time-series regressor. Upstream TabPFN-3 weights are released
179
185
  under `tabpfn-3-license-v1.0`; review that license before using pretrained
180
186
  weights outside research or internal evaluation.
181
187
 
188
+ ## Implemented Time-Series Models
189
+
190
+ | Model | Source | Status |
191
+ | ----- | ------ | ------ |
192
+ | T0-alpha | [The Forecasting Company](https://huggingface.co/theforecastingcompany/t0-alpha) | ✅ Experimental |
193
+
194
+ `equimo.timeseries` exposes T0's raw patch-transformer forward pass,
195
+ converted T0-alpha weights, and a JAX-native `predict()` adapter with upstream
196
+ scaling, quantile interpolation, forecast selection, and long-horizon rollout.
197
+ See the [time-series guide](docs/timeseries.md) for the complete contract.
198
+
182
199
  ## Vision Usage
183
200
 
184
201
  ```python
@@ -210,7 +227,7 @@ features = model.features(x, key=key, inference=True)
210
227
 
211
228
  See [`docs/usage.md`](./docs/usage.md) for a compact non-fine-tuning usage
212
229
  guide covering model construction, feature extraction, text encoders, TabPFN,
213
- serialization, and registries.
230
+ the experimental T0 backbone, serialization, and registries.
214
231
 
215
232
  Runnable examples live under [`examples/`](./examples):
216
233
 
@@ -365,6 +382,7 @@ model = em.dinov2_vitb14(pretrained=True)
365
382
  | `MobileNetv3` | `mobilenetv3_{small,large}` |
366
383
  | `AudioSpectrogramTransformer` | `ast_{tiny,small,base}_patch16_224`, `ast_base_patch16_384`, `ast_base_patch16_audioset_10_10_0_4593`, `ast_base_patch16_speechcommands_v2_10_10_0_9812` |
367
384
  | `TabPFN` | `tabpfn`, `tabpfn_v3_classifier_*`, `tabpfn_regressor`, `tabpfn_v3_regressor_*` |
385
+ | `T0` | `t0`, `t0_alpha` |
368
386
 
369
387
  > `LowFormer` requires `attention_type` (`"softmax"` or `"sigmoid"`) which has
370
388
  > no sensible default and must be supplied by the caller.
@@ -672,11 +690,13 @@ Equimo provides utilities for saving models locally and loading pre-trained mode
672
690
  ### Saving Models Locally
673
691
 
674
692
  ```python
693
+ import hashlib
675
694
  from pathlib import Path
676
- from equimo.serialization import save_model
695
+
696
+ from equimo.serialization import inspect_checkpoint, save_model
677
697
 
678
698
  # Save model with compression (creates .tar.lz4 file)
679
- save_model(
699
+ checkpoint_path = save_model(
680
700
  Path("path/to/save/model"),
681
701
  model,
682
702
  model_config,
@@ -692,8 +712,22 @@ save_model(
692
712
  torch_hub_cfg,
693
713
  compression=False,
694
714
  )
715
+
716
+ # Inspect integrity and model compatibility without deserializing weights.
717
+ checkpoint = inspect_checkpoint(checkpoint_path, model=model)
718
+ assert checkpoint.verified and not checkpoint.legacy
719
+ print(checkpoint.weights_sha256)
720
+
721
+ # The complete archive digest is a distinct packaging identity.
722
+ archive_sha256 = hashlib.sha256(checkpoint_path.read_bytes()).hexdigest()
695
723
  ```
696
724
 
725
+ `save_model` returns the exact path written, including an automatically appended
726
+ `.tar.lz4` suffix. Given the same model, metadata, and Equimo/JAX/Equinox
727
+ versions, compressed saves are byte-identical. The archive uses canonical
728
+ metadata JSON, fixed PAX member metadata, and fixed streaming LZ4 frame options;
729
+ the Equinox-owned parameter stream and its dtype are unchanged.
730
+
697
731
  ### Loading Weights
698
732
 
699
733
  ```python
@@ -721,6 +755,17 @@ metadata-driven `load_model` API are not part of the v2 compatibility contract.
721
755
  Built-in downloads are also checked against the SHA-256 digest recorded at the
722
756
  pinned Hugging Face repository revision.
723
757
 
758
+ `inspect_checkpoint` accepts a local archive or uncompressed directory and
759
+ never downloads. Its `weights_sha256` is the digest of Equinox's serialized
760
+ parameter stream, not the digest of the complete `.tar.lz4` file.
761
+ `CheckpointInfo.verified` means the versioned metadata and parameter digest were
762
+ validated; passing `model=` additionally validates its class and array-leaf
763
+ structure. Schema-less v2-alpha checkpoints fail inspection by default. An
764
+ explicit `allow_legacy=True` returns `legacy=True, verified=False` with a
765
+ computed—but not metadata-verified—parameter digest. `load_weights` continues
766
+ to accept those v2-alpha checkpoints with a warning as required by the v2
767
+ compatibility policy.
768
+
724
769
  Constructor parameters are controlled when building the target model:
725
770
 
726
771
  ```python
@@ -752,8 +797,9 @@ The following models have pretrained weights available in Equimo:
752
797
  - [EUPE](https://arxiv.org/abs/2603.22387) (both ViT and ConvNeXt variants)
753
798
  - [AST](https://arxiv.org/abs/2104.01778)
754
799
  - [TabPFN-3](https://arxiv.org/abs/2605.13986)
800
+ - [T0-alpha](https://huggingface.co/theforecastingcompany/t0-alpha)
755
801
 
756
- Model identifiers map to filenames in Equimo's [Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/bdf43d88f504d6fc3fc7850eb053df0bd762989c/models/default).
802
+ Model identifiers map to filenames in Equimo's [Hugging Face repository](https://huggingface.co/poiretclement/equimo/tree/8525ac8d42a078874330384fd2d7fdc07a604448/models/default).
757
803
 
758
804
  The experimental catalog currently covers one representative model per
759
805
  modality. Catalog keys use an explicit `<modality>/<variant>` namespace:
@@ -775,6 +821,7 @@ Catalog-covered pretrained identifiers (validated against catalog data):
775
821
  <!-- model-catalog:begin -->
776
822
  - `ast_base_patch16_audioset_10_10_0_4593`
777
823
  - `tabpfn_v3_classifier_default`
824
+ - `t0_alpha`
778
825
  - `dinov2_vits14_reg`
779
826
  <!-- model-catalog:end -->
780
827
 
@@ -886,6 +933,42 @@ the specialized regressor variants. The regressor returns raw bucket logits; any
886
933
  post-processing to scalar predictions should follow the chosen downstream
887
934
  regression decoding strategy.
888
935
 
936
+ ## Time Series
937
+
938
+ `equimo.timeseries` is experimental and exposes the raw T0 patch-transformer
939
+ backbone plus `model.predict()` for upstream-style forecasting. Direct calls
940
+ accept four arrays shaped `(variates, time)` and return native quantiles shaped
941
+ `(variates, ceil(time / patch_size), patch_size, quantiles)`.
942
+
943
+ ```python
944
+ import jax.numpy as jnp
945
+ import jax.random as jr
946
+
947
+ import equimo.timeseries.models as tm
948
+
949
+ key = jr.PRNGKey(0)
950
+ model = tm.t0_alpha(pretrained=True, key=key)
951
+
952
+ values_scaled = jnp.zeros((1, 96), dtype=jnp.float32)
953
+ mask = jnp.zeros((1, 96), dtype=jnp.int8)
954
+ group_ids = jnp.zeros((1, 96), dtype=jnp.int32)
955
+ variate_type = jnp.zeros((1, 96), dtype=jnp.int32)
956
+
957
+ raw_quantiles = model(
958
+ values_scaled,
959
+ mask,
960
+ group_ids,
961
+ variate_type,
962
+ key=key,
963
+ inference=True,
964
+ )
965
+ ```
966
+
967
+ Direct backbone calls consume values as supplied. Use `model.predict(context,
968
+ horizon, quantiles)` for preprocessing, inverse scaling, forecast extraction,
969
+ quantile interpolation, and rollout. The [time-series guide](docs/timeseries.md)
970
+ defines the input and output contracts.
971
+
889
972
  ## Mixed Precision
890
973
 
891
974
  Equimo follows a strict WYSIWYG policy — modules never silently cast inputs or weights.
@@ -914,7 +997,11 @@ change.
914
997
 
915
998
  ## License
916
999
 
917
- This project is licensed under the MIT License; see [LICENSE.md](LICENSE.md).
1000
+ Equimo's original code is licensed under the [MIT License](LICENSE.md).
1001
+ T0-derived modules incorporate Apache-2.0-licensed upstream work; see
1002
+ [NOTICE](NOTICE) and the
1003
+ [T0 Apache-2.0 license](LICENSES/tfc-t0-APACHE-2.0.txt). The package metadata
1004
+ reports the combined expression `MIT AND Apache-2.0`.
918
1005
 
919
1006
  ## Citation
920
1007