tensorfs 0.3.92__tar.gz → 0.6.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 (235) hide show
  1. {tensorfs-0.3.92 → tensorfs-0.6.0}/Cargo.lock +130 -3
  2. {tensorfs-0.3.92 → tensorfs-0.6.0}/Cargo.toml +1 -1
  3. {tensorfs-0.3.92 → tensorfs-0.6.0}/PKG-INFO +1 -1
  4. tensorfs-0.6.0/crates/tensorfs-core/Cargo.toml +40 -0
  5. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/build.rs +7 -11
  6. tensorfs-0.6.0/crates/tensorfs-core/examples/filesystem_parent_death_gate.rs +89 -0
  7. tensorfs-0.6.0/crates/tensorfs-core/examples/mine-vectors.rs +152 -0
  8. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/resident_conversion_profile.rs +1 -1
  9. tensorfs-0.6.0/crates/tensorfs-core/src/b64.rs +33 -0
  10. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +12 -468
  11. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -29
  12. tensorfs-0.6.0/crates/tensorfs-core/src/bin/tfs/fetch.rs +407 -0
  13. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/ingest.rs +5 -724
  14. tensorfs-0.6.0/crates/tensorfs-core/src/bin/tfs/main.rs +727 -0
  15. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/repo.rs +37 -495
  16. tensorfs-0.6.0/crates/tensorfs-core/src/bin/tfs/snap.rs +81 -0
  17. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/cache_roots.rs +100 -0
  18. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/catalog.rs +12 -64
  19. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/checkpoint.rs +2 -13
  20. tensorfs-0.6.0/crates/tensorfs-core/src/derived/channel.rs +918 -0
  21. tensorfs-0.6.0/crates/tensorfs-core/src/derived/next_attempt_tests.rs +246 -0
  22. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived.rs +185 -124
  23. tensorfs-0.6.0/crates/tensorfs-core/src/ensure/admission.rs +302 -0
  24. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ensure.rs +1 -1
  25. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/err.rs +0 -23
  26. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/fetch.rs +1 -81
  27. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/filesystem_identity.rs +62 -7
  28. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/fill.rs +2 -35
  29. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/gc.rs +211 -47
  30. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/convert.rs +20 -161
  31. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/h3_lora.rs +1 -1
  32. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/journal.rs +1 -17
  33. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/mod.rs +1 -6
  34. tensorfs-0.6.0/crates/tensorfs-core/src/ingest/sdxl_lora.rs +259 -0
  35. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/source.rs +12 -11
  36. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/transaction.rs +3 -80
  37. tensorfs-0.6.0/crates/tensorfs-core/src/jcs.rs +249 -0
  38. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/lib.rs +36 -7
  39. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/machine.rs +1 -1
  40. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/meta.rs +158 -7
  41. tensorfs-0.6.0/crates/tensorfs-core/src/object_roots.rs +238 -0
  42. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/read.rs +38 -12
  43. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/reclaim.rs +65 -74
  44. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/registry.rs +20 -0
  45. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/repo_cache.rs +10 -10
  46. tensorfs-0.6.0/crates/tensorfs-core/src/sha256.rs +80 -0
  47. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/source_artifact.rs +2 -25
  48. tensorfs-0.6.0/crates/tensorfs-core/src/source_model.rs +975 -0
  49. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/stats.rs +0 -12
  50. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/storage.rs +19 -176
  51. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/store.rs +50 -39
  52. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/download.rs +54 -11
  53. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/hub.rs +44 -3
  54. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/mod.rs +4 -2
  55. tensorfs-0.6.0/crates/tensorfs-core/src/transport/publish.rs +314 -0
  56. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/pull.rs +5 -17
  57. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/tests.rs +270 -38
  58. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/unsynced.rs +3 -3
  59. {tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs → tensorfs-0.6.0/crates/tensorfs-core/tests}/conform.rs +13 -221
  60. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/ensure.rs +14 -67
  61. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fetch_faults.rs +2 -3
  62. tensorfs-0.6.0/crates/tensorfs-core/tests/filesystem_parent_death_gate.py +158 -0
  63. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/h3_lora.rs +0 -14
  64. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -1
  65. tensorfs-0.6.0/crates/tensorfs-core/tests/home.rs +116 -0
  66. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/liveness.rs +0 -4
  67. tensorfs-0.6.0/crates/tensorfs-core/tests/owned_store.rs +368 -0
  68. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/repo_cache.rs +25 -84
  69. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/repo_store.rs +29 -229
  70. tensorfs-0.6.0/crates/tensorfs-core/tests/sdxl_lora.rs +273 -0
  71. tensorfs-0.6.0/crates/tensorfs-core/tests/source_model.rs +144 -0
  72. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_plan.rs +0 -4
  73. tensorfs-0.6.0/crates/tensorfs-core/tests/store_boundaries.rs +366 -0
  74. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/trust_index.rs +33 -0
  75. tensorfs-0.6.0/crates/tensorfs-core/tests/vectors.rs +1536 -0
  76. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/write_through.rs +28 -15
  77. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/API.md +57 -32
  78. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/Cargo.toml +5 -1
  79. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/cuda.rs +21 -0
  80. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/cursor.rs +16 -7
  81. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/device.rs +272 -139
  82. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/faults.rs +24 -19
  83. tensorfs-0.6.0/crates/tensorfs-plane/src/host.rs +1067 -0
  84. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/io.rs +135 -170
  85. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/layout.rs +2 -0
  86. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/lib.rs +2 -1
  87. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/plane.rs +337 -106
  88. tensorfs-0.6.0/crates/tensorfs-plane/src/window.rs +174 -0
  89. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/common/mod.rs +0 -25
  90. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/gpu.rs +381 -148
  91. tensorfs-0.6.0/crates/tensorfs-plane/tests/layout_identity.rs +85 -0
  92. tensorfs-0.6.0/crates/tensorfs-plane/tests/sealed.rs +264 -0
  93. tensorfs-0.6.0/crates/tensorfs-plane/tests/window.rs +207 -0
  94. tensorfs-0.6.0/crates/tensorfs-py/Cargo.toml +20 -0
  95. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/docs.rs +5 -0
  96. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/ensure.rs +2 -2
  97. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/lib.rs +26 -10
  98. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/plane.rs +160 -3
  99. tensorfs-0.6.0/crates/tensorfs-py/src/readplan.rs +97 -0
  100. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/store.rs +2 -92
  101. {tensorfs-0.3.92 → tensorfs-0.6.0}/pyproject.toml +4 -4
  102. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/__init__.py +120 -212
  103. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_derived_channel.py +24 -20
  104. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_ext.pyi +174 -224
  105. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_source_channel.py +4 -3
  106. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_tensors.py +5 -4
  107. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/derived.py +29 -26
  108. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/errors.py +0 -44
  109. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/plane.py +15 -2
  110. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/plane.pyi +66 -4
  111. tensorfs-0.6.0/python/tensorfs/records.py +731 -0
  112. tensorfs-0.3.92/crates/tensorfs-core/Cargo.toml +0 -25
  113. tensorfs-0.3.92/crates/tensorfs-core/src/b64.rs +0 -83
  114. tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -1422
  115. tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/main.rs +0 -2979
  116. tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -1103
  117. tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -392
  118. tensorfs-0.3.92/crates/tensorfs-core/src/ensure/admission.rs +0 -333
  119. tensorfs-0.3.92/crates/tensorfs-core/src/ingest/gguf.rs +0 -599
  120. tensorfs-0.3.92/crates/tensorfs-core/src/jcs.rs +0 -527
  121. tensorfs-0.3.92/crates/tensorfs-core/src/sha256.rs +0 -511
  122. tensorfs-0.3.92/crates/tensorfs-core/src/staging.rs +0 -387
  123. tensorfs-0.3.92/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -228
  124. tensorfs-0.3.92/crates/tensorfs-core/tests/home.rs +0 -169
  125. tensorfs-0.3.92/crates/tensorfs-core/tests/sha256_backends.rs +0 -188
  126. tensorfs-0.3.92/crates/tensorfs-core/tests/staging.rs +0 -594
  127. tensorfs-0.3.92/crates/tensorfs-core/tests/store_boundaries.rs +0 -723
  128. tensorfs-0.3.92/crates/tensorfs-plane/src/host.rs +0 -387
  129. tensorfs-0.3.92/crates/tensorfs-py/Cargo.toml +0 -16
  130. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  131. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  132. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  133. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/asset_update.rs +0 -0
  134. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  135. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/canon.rs +0 -0
  136. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/capability.rs +0 -0
  137. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  138. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/cbor.rs +0 -0
  139. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  140. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/corpus.rs +0 -0
  141. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  142. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  143. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  144. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  145. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  146. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  147. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  148. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  149. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  150. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  151. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  152. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/descriptors.rs +0 -0
  153. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/disk.rs +0 -0
  154. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/dtype.rs +0 -0
  155. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/durability.rs +0 -0
  156. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
  157. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/fit.rs +0 -0
  158. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/header.rs +0 -0
  159. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/home.rs +0 -0
  160. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ids.rs +0 -0
  161. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  162. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  163. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  164. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  165. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  166. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
  167. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
  168. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  169. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  170. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  171. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  172. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
  173. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/limits.rs +0 -0
  174. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/manifest.rs +0 -0
  175. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/project.rs +0 -0
  176. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/providers.rs +0 -0
  177. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/receipt.rs +0 -0
  178. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/relation.rs +0 -0
  179. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/repository.rs +0 -0
  180. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/spec.rs +0 -0
  181. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/api.rs +0 -0
  182. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
  183. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/http.rs +0 -0
  184. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  185. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  186. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  187. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  188. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/push.rs +0 -0
  189. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/sources.rs +0 -0
  190. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
  191. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/vectors.rs +0 -0
  192. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  193. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  194. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/as_is.rs +0 -0
  195. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
  196. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  197. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
  198. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  199. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  200. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  201. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fit.rs +0 -0
  202. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  203. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  204. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  205. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  206. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  207. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  208. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  209. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  210. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  211. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  212. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  213. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
  214. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  215. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  216. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  217. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  218. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  219. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  220. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  221. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  222. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_download.rs +0 -0
  223. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  224. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  225. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  226. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  227. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/version.rs +0 -0
  228. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
  229. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
  230. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
  231. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/census.rs +0 -0
  232. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/host_tier.rs +0 -0
  233. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/errors.rs +0 -0
  234. {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/ingest.rs +0 -0
  235. {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/py.typed +0 -0
@@ -26,6 +26,15 @@ version = "2.13.1"
26
26
  source = "registry+https://github.com/rust-lang/crates.io-index"
27
27
  checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
28
28
 
29
+ [[package]]
30
+ name = "block-buffer"
31
+ version = "0.10.4"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
34
+ dependencies = [
35
+ "generic-array",
36
+ ]
37
+
29
38
  [[package]]
30
39
  name = "cc"
31
40
  version = "1.4.4"
@@ -48,12 +57,41 @@ version = "0.2.2"
48
57
  source = "registry+https://github.com/rust-lang/crates.io-index"
49
58
  checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527"
50
59
 
60
+ [[package]]
61
+ name = "cpufeatures"
62
+ version = "0.2.17"
63
+ source = "registry+https://github.com/rust-lang/crates.io-index"
64
+ checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
65
+ dependencies = [
66
+ "libc",
67
+ ]
68
+
69
+ [[package]]
70
+ name = "crypto-common"
71
+ version = "0.1.7"
72
+ source = "registry+https://github.com/rust-lang/crates.io-index"
73
+ checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
74
+ dependencies = [
75
+ "generic-array",
76
+ "typenum",
77
+ ]
78
+
51
79
  [[package]]
52
80
  name = "deranged"
53
81
  version = "0.5.8"
54
82
  source = "registry+https://github.com/rust-lang/crates.io-index"
55
83
  checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
56
84
 
85
+ [[package]]
86
+ name = "digest"
87
+ version = "0.10.7"
88
+ source = "registry+https://github.com/rust-lang/crates.io-index"
89
+ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
90
+ dependencies = [
91
+ "block-buffer",
92
+ "crypto-common",
93
+ ]
94
+
57
95
  [[package]]
58
96
  name = "errno"
59
97
  version = "0.3.14"
@@ -92,6 +130,16 @@ dependencies = [
92
130
  "winapi",
93
131
  ]
94
132
 
133
+ [[package]]
134
+ name = "generic-array"
135
+ version = "0.14.7"
136
+ source = "registry+https://github.com/rust-lang/crates.io-index"
137
+ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
138
+ dependencies = [
139
+ "typenum",
140
+ "version_check",
141
+ ]
142
+
95
143
  [[package]]
96
144
  name = "getrandom"
97
145
  version = "0.2.17"
@@ -127,6 +175,12 @@ version = "0.5.0"
127
175
  source = "registry+https://github.com/rust-lang/crates.io-index"
128
176
  checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
129
177
 
178
+ [[package]]
179
+ name = "itoa"
180
+ version = "1.0.18"
181
+ source = "registry+https://github.com/rust-lang/crates.io-index"
182
+ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
183
+
130
184
  [[package]]
131
185
  name = "libc"
132
186
  version = "0.2.189"
@@ -160,6 +214,12 @@ version = "0.12.1"
160
214
  source = "registry+https://github.com/rust-lang/crates.io-index"
161
215
  checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
162
216
 
217
+ [[package]]
218
+ name = "memchr"
219
+ version = "2.8.3"
220
+ source = "registry+https://github.com/rust-lang/crates.io-index"
221
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
222
+
163
223
  [[package]]
164
224
  name = "minicbor"
165
225
  version = "2.3.0"
@@ -381,6 +441,21 @@ dependencies = [
381
441
  "untrusted",
382
442
  ]
383
443
 
444
+ [[package]]
445
+ name = "ryu-js"
446
+ version = "1.0.3"
447
+ source = "registry+https://github.com/rust-lang/crates.io-index"
448
+ checksum = "04d056b875a9d2e6cb9a61d127afee9ac5999b9f87bcb32079d1318e505be714"
449
+
450
+ [[package]]
451
+ name = "serde"
452
+ version = "1.0.229"
453
+ source = "registry+https://github.com/rust-lang/crates.io-index"
454
+ checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
455
+ dependencies = [
456
+ "serde_core",
457
+ ]
458
+
384
459
  [[package]]
385
460
  name = "serde_core"
386
461
  version = "1.0.229"
@@ -401,6 +476,41 @@ dependencies = [
401
476
  "syn 3.0.4",
402
477
  ]
403
478
 
479
+ [[package]]
480
+ name = "serde_json"
481
+ version = "1.0.151"
482
+ source = "registry+https://github.com/rust-lang/crates.io-index"
483
+ checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
484
+ dependencies = [
485
+ "itoa",
486
+ "memchr",
487
+ "serde",
488
+ "serde_core",
489
+ "zmij",
490
+ ]
491
+
492
+ [[package]]
493
+ name = "serde_json_canonicalizer"
494
+ version = "0.3.2"
495
+ source = "registry+https://github.com/rust-lang/crates.io-index"
496
+ checksum = "fe52319a927259afbfa5180c5157cd8167edfd3e8c254f9558c7fef44c5649f2"
497
+ dependencies = [
498
+ "ryu-js",
499
+ "serde",
500
+ "serde_json",
501
+ ]
502
+
503
+ [[package]]
504
+ name = "sha2"
505
+ version = "0.10.9"
506
+ source = "registry+https://github.com/rust-lang/crates.io-index"
507
+ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
508
+ dependencies = [
509
+ "cfg-if",
510
+ "cpufeatures",
511
+ "digest",
512
+ ]
513
+
404
514
  [[package]]
405
515
  name = "shlex"
406
516
  version = "2.0.1"
@@ -449,8 +559,9 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
449
559
 
450
560
  [[package]]
451
561
  name = "tensorfs-core"
452
- version = "0.3.92"
562
+ version = "0.6.0"
453
563
  dependencies = [
564
+ "base64",
454
565
  "fs2",
455
566
  "libc",
456
567
  "minicbor",
@@ -459,12 +570,16 @@ dependencies = [
459
570
  "rusqlite",
460
571
  "rustix",
461
572
  "rustls",
573
+ "serde",
574
+ "serde_json",
575
+ "serde_json_canonicalizer",
576
+ "sha2",
462
577
  "webpki-roots 0.26.11",
463
578
  ]
464
579
 
465
580
  [[package]]
466
581
  name = "tensorfs-plane"
467
- version = "0.3.92"
582
+ version = "0.6.0"
468
583
  dependencies = [
469
584
  "libc",
470
585
  "libloading",
@@ -474,7 +589,7 @@ dependencies = [
474
589
 
475
590
  [[package]]
476
591
  name = "tensorfs-py"
477
- version = "0.3.92"
592
+ version = "0.6.0"
478
593
  dependencies = [
479
594
  "pyo3",
480
595
  "tensorfs-core",
@@ -520,6 +635,12 @@ version = "0.1.9"
520
635
  source = "registry+https://github.com/rust-lang/crates.io-index"
521
636
  checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
522
637
 
638
+ [[package]]
639
+ name = "typenum"
640
+ version = "1.20.1"
641
+ source = "registry+https://github.com/rust-lang/crates.io-index"
642
+ checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
643
+
523
644
  [[package]]
524
645
  name = "unicode-ident"
525
646
  version = "1.0.24"
@@ -703,3 +824,9 @@ name = "zeroize"
703
824
  version = "1.9.0"
704
825
  source = "registry+https://github.com/rust-lang/crates.io-index"
705
826
  checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
827
+
828
+ [[package]]
829
+ name = "zmij"
830
+ version = "1.0.23"
831
+ source = "registry+https://github.com/rust-lang/crates.io-index"
832
+ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-plane", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.92"
6
+ version = "0.6.0"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.92
3
+ Version: 0.6.0
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -0,0 +1,40 @@
1
+ [package]
2
+ name = "tensorfs-core"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+
6
+ [[bin]]
7
+ name = "tfs"
8
+ path = "src/bin/tfs/main.rs"
9
+ required-features = ["store"]
10
+
11
+ [features]
12
+ # The store, downloader, ingest, GC and everything that opens one. Without it: documents,
13
+ # headers, read plans and the fit function only (what a plane-only executor links).
14
+ default = ["store"]
15
+ store = ["dep:fs2", "dep:rusqlite", "dep:rustix", "dep:rustls", "dep:webpki-roots", "dep:nix"]
16
+
17
+ [dependencies]
18
+ base64 = "0.22"
19
+ fs2 = { version = "0.4", optional = true }
20
+ minicbor = { version = "2.3.0", default-features = false, features = ["alloc"] }
21
+ rusqlite = { version = "0.32", features = ["bundled"], optional = true }
22
+ serde = "1"
23
+ serde_json = { version = "1", features = ["float_roundtrip"] }
24
+ serde_json_canonicalizer = "0.3"
25
+ sha2 = "0.10"
26
+ rustix = { version = "1.1.4", default-features = false, features = ["fs", "std", "net", "event", "process"], optional = true }
27
+ # tfs-049: the ONE transport (src/transport/). rustls is the one TLS stack, used only
28
+ # there; scripts/fence.py refuses it anywhere else so a second mover cannot grow.
29
+ rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"], optional = true }
30
+ webpki-roots = { version = "0.26", optional = true }
31
+
32
+ [target.'cfg(target_os = "linux")'.dependencies]
33
+ nix = { version = "0.31.3", default-features = false, features = ["fs", "user"], optional = true }
34
+
35
+ [build-dependencies]
36
+ sha2 = "0.10"
37
+
38
+ [dev-dependencies]
39
+ libc = "0.2"
40
+ rcgen = "0.13"
@@ -1,7 +1,5 @@
1
1
  //! Capture actual native source/dependency/build inputs, including same-version edits.
2
- #[allow(dead_code)]
3
- #[path = "src/sha256.rs"]
4
- mod sha256;
2
+ use sha2::{Digest, Sha256};
5
3
  use std::{env, fs, path::Path};
6
4
  fn collect(path: &Path, files: &mut Vec<std::path::PathBuf>) {
7
5
  if path.is_dir() {
@@ -26,13 +24,13 @@ fn main() {
26
24
  collect(Path::new(path), &mut files);
27
25
  }
28
26
  files.sort();
29
- let mut hash = sha256::Sha256::new();
27
+ let mut hash = Sha256::new();
30
28
  for file in files {
31
29
  let name = file.to_string_lossy();
32
30
  let bytes = fs::read(&file).unwrap();
33
- hash.update(&(name.len() as u64).to_le_bytes());
31
+ hash.update((name.len() as u64).to_le_bytes());
34
32
  hash.update(name.as_bytes());
35
- hash.update(&(bytes.len() as u64).to_le_bytes());
33
+ hash.update((bytes.len() as u64).to_le_bytes());
36
34
  hash.update(&bytes);
37
35
  }
38
36
  for key in [
@@ -45,15 +43,13 @@ fn main() {
45
43
  println!("cargo:rerun-if-env-changed={key}");
46
44
  hash.update(key.as_bytes());
47
45
  hash.update(env::var(key).unwrap_or_default().as_bytes());
48
- hash.update(&[0]);
46
+ hash.update([0]);
49
47
  }
50
48
  let rustc = std::process::Command::new(env::var("RUSTC").unwrap())
51
49
  .arg("--version")
52
50
  .output()
53
51
  .unwrap();
54
52
  hash.update(&rustc.stdout);
55
- println!(
56
- "cargo:rustc-env=TENSORFS_IMPLEMENTATION_SHA256={}",
57
- sha256::hex(&hash.finish())
58
- );
53
+ let digest: String = hash.finalize().iter().map(|b| format!("{b:02x}")).collect();
54
+ println!("cargo:rustc-env=TENSORFS_IMPLEMENTATION_SHA256={digest}");
59
55
  }
@@ -0,0 +1,89 @@
1
+ //! CPU-only process fixture compiling the actual private filesystem guard, not a copy.
2
+
3
+ #[cfg(target_os = "linux")]
4
+ #[path = "../src/filesystem_identity.rs"]
5
+ mod filesystem_identity;
6
+ #[cfg(target_os = "linux")]
7
+ use tensorfs_core::store;
8
+
9
+ #[cfg(target_os = "linux")]
10
+ fn main() -> std::io::Result<()> {
11
+ use std::fs;
12
+ use std::io::{Read, Write};
13
+ use std::os::unix::fs::MetadataExt;
14
+ use std::panic::{catch_unwind, AssertUnwindSafe};
15
+ use std::path::PathBuf;
16
+
17
+ use rustix::process::{
18
+ getpid, parent_process_death_signal, set_parent_process_death_signal, Signal,
19
+ };
20
+
21
+ let args: Vec<String> = std::env::args().collect();
22
+ let root = PathBuf::from(&args[2]);
23
+ if args[1] == "setup" {
24
+ store::Store::init(&root).expect("real native Store init");
25
+ return Ok(());
26
+ }
27
+ let signal = match args[3].as_str() {
28
+ "0" => None,
29
+ "9" => Some(Signal::KILL),
30
+ "15" => Some(Signal::TERM),
31
+ _ => panic!("fixture supports disabled, SIGKILL and SIGTERM"),
32
+ };
33
+ set_parent_process_death_signal(signal)?;
34
+ let before = parent_process_death_signal()?.map_or(0, Signal::as_raw);
35
+ let mut in_scope = before;
36
+ let mut file_uid = 0;
37
+ if args[1] == "store" {
38
+ store::Store::open(&root).expect("real native foreign-owner Store open");
39
+ } else {
40
+ let mut operation = || -> std::io::Result<()> {
41
+ let _guard = filesystem_identity::FilesystemIdentity::for_store_root(&root)?;
42
+ in_scope = parent_process_death_signal()?.map_or(0, Signal::as_raw);
43
+ match args[1].as_str() {
44
+ "success" => {
45
+ let path = root.join("guard-fixture-data");
46
+ fs::write(&path, b"real scoped native I/O")?;
47
+ assert_eq!(fs::read(&path)?, b"real scoped native I/O");
48
+ file_uid = fs::metadata(&path)?.uid();
49
+ }
50
+ "error" => {
51
+ assert_eq!(
52
+ fs::read(root.join("absent-fixture-file"))
53
+ .unwrap_err()
54
+ .kind(),
55
+ std::io::ErrorKind::NotFound
56
+ );
57
+ return Err(std::io::Error::other("owned I/O failure"));
58
+ }
59
+ "unwind" => panic!("owned scope unwind"),
60
+ "wait" => {
61
+ println!(
62
+ "{{\"ready\":true,\"guard\":{in_scope},\"pid\":{}}}",
63
+ getpid().as_raw_nonzero()
64
+ );
65
+ std::io::stdout().flush()?;
66
+ std::io::stdin().read_exact(&mut [0])?;
67
+ }
68
+ _ => panic!("unknown fixture operation"),
69
+ }
70
+ Ok(())
71
+ };
72
+ match args[1].as_str() {
73
+ "unwind" => assert!(catch_unwind(AssertUnwindSafe(operation)).is_err()),
74
+ "error" => assert!(operation().is_err()),
75
+ _ => operation()?,
76
+ }
77
+ }
78
+ let after = parent_process_death_signal()?.map_or(0, Signal::as_raw);
79
+ let maps = fs::read_to_string("/proc/self/maps")?;
80
+ let cuda_mapped = maps.contains("libcuda") || maps.contains("libnvidia");
81
+ println!("{{\"before\":{before},\"in_scope\":{in_scope},\"after\":{after},\"file_uid\":{file_uid},\"cuda_mapped\":{cuda_mapped}}}");
82
+ Ok(())
83
+ }
84
+
85
+ #[cfg(not(target_os = "linux"))]
86
+ fn main() {
87
+ eprintln!("Linux-only parent-death credential fixture");
88
+ std::process::exit(2);
89
+ }
@@ -0,0 +1,152 @@
1
+ //! PRODUCER-MINED vector rows (scripts/mine-vectors.py) into the canonical vector document
2
+ //! `vectors/mined/<name>.json`:
3
+ //!
4
+ //! cargo run -p tensorfs-core --example mine-vectors -- <rows> <name> [<match>]
5
+
6
+ use std::process::ExitCode;
7
+
8
+ use tensorfs_core::dtype::Dtype;
9
+ use tensorfs_core::vectors::{Case, EncodingVectors};
10
+
11
+ macro_rules! ok {
12
+ ($e:expr) => {
13
+ match $e {
14
+ Ok(v) => v,
15
+ Err(e) => {
16
+ eprintln!("REFUSED {e}");
17
+ return ExitCode::FAILURE;
18
+ }
19
+ }
20
+ };
21
+ }
22
+
23
+ fn main() -> ExitCode {
24
+ let args: Vec<String> = std::env::args().skip(1).collect();
25
+ match args.as_slice() {
26
+ [rows, name] => mine(std::path::Path::new(rows), name, ""),
27
+ [rows, name, want] => mine(std::path::Path::new(rows), name, want),
28
+ _ => {
29
+ eprintln!("usage: mine-vectors <rows> <name> [<match>]");
30
+ ExitCode::from(2)
31
+ }
32
+ }
33
+ }
34
+
35
+ /// Turn PRODUCER-MINED rows into the canonical vector document. The rows carry raw bytes
36
+ /// and nothing else; canonicalisation happens here, once, in the one writer.
37
+ fn mine(rows: &std::path::Path, name: &str, want: &str) -> ExitCode {
38
+ let text = match std::fs::read_to_string(rows) {
39
+ Ok(t) => t,
40
+ Err(e) => {
41
+ eprintln!("{}: {e}", rows.display());
42
+ return ExitCode::FAILURE;
43
+ }
44
+ };
45
+ let shape = |s: &str| -> Vec<u64> {
46
+ if s.is_empty() {
47
+ vec![]
48
+ } else {
49
+ s.split(',').filter_map(|d| d.parse().ok()).collect()
50
+ }
51
+ };
52
+
53
+ let mut cases: Vec<Case> = Vec::new();
54
+ let mut cur: Option<Case> = None;
55
+ for line in text.lines() {
56
+ let t: Vec<&str> = line.split_whitespace().collect();
57
+ match t.first().copied() {
58
+ Some("case") => {
59
+ if let Some(c) = cur.take() {
60
+ cases.push(c);
61
+ }
62
+ cur = Some(Case {
63
+ name: t[1].to_string(),
64
+ logical_dtype: Dtype::F32,
65
+ logical_shape: vec![],
66
+ roles: vec![],
67
+ expect_logical_bits: vec![],
68
+ });
69
+ }
70
+ Some("logical") => {
71
+ if let Some(c) = cur.as_mut() {
72
+ c.logical_dtype = ok!(Dtype::parse(t[1]));
73
+ c.logical_shape = shape(t.get(2).copied().unwrap_or(""));
74
+ }
75
+ }
76
+ Some("expect") => {
77
+ if let Some(c) = cur.as_mut() {
78
+ c.expect_logical_bits = ok!(tensorfs_core::b64::decode(t[1]));
79
+ }
80
+ }
81
+ Some("role") => {
82
+ if let Some(c) = cur.as_mut() {
83
+ let (rname, dt) = (t[1].to_string(), ok!(Dtype::parse(t[2])));
84
+ // a rank-0 role prints an empty shape field, so the payload shifts left
85
+ let (sh, b64) = if t.len() >= 5 {
86
+ (shape(t[3]), t[4])
87
+ } else {
88
+ (vec![], t[3])
89
+ };
90
+ c.roles.push((
91
+ rname,
92
+ tensorfs_core::vectors::RoleBits {
93
+ dtype: dt,
94
+ shape: sh,
95
+ bits: ok!(tensorfs_core::b64::decode(b64)),
96
+ },
97
+ ));
98
+ }
99
+ }
100
+ _ => {}
101
+ }
102
+ }
103
+ if let Some(c) = cur.take() {
104
+ cases.push(c);
105
+ }
106
+ cases.retain(|c| c.name.contains(want));
107
+ for c in cases.iter_mut() {
108
+ c.roles.sort_by(|a, b| a.0.cmp(&b.0));
109
+ }
110
+ if cases.is_empty() {
111
+ eprintln!("no mined case matches {want:?}");
112
+ return ExitCode::from(2);
113
+ }
114
+ let v = EncodingVectors { cases };
115
+ let bytes = v.fixture_bytes();
116
+ if let Err(e) = EncodingVectors::parse_fixture(&bytes) {
117
+ {
118
+ eprintln!("REFUSED {e}");
119
+ return ExitCode::FAILURE;
120
+ }
121
+ }
122
+ let d: std::path::PathBuf = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
123
+ .join("../../vectors/mined")
124
+ .components()
125
+ .collect();
126
+ if let Err(e) = std::fs::create_dir_all(&d) {
127
+ eprintln!("{}: {e}", d.display());
128
+ return ExitCode::FAILURE;
129
+ }
130
+ let path = d.join(format!("{name}.json"));
131
+ if let Err(e) = std::fs::write(&path, &bytes) {
132
+ eprintln!("{}: {e}", path.display());
133
+ return ExitCode::FAILURE;
134
+ }
135
+ println!("mined {} ({} B)", path.display(), bytes.len());
136
+ println!(" cases {}", v.cases.len());
137
+ println!(
138
+ " fixture_id {}",
139
+ tensorfs_core::ids::object_id(&v.fixture_bytes())
140
+ );
141
+ for c in &v.cases {
142
+ println!(
143
+ " {:<34} logical {} {:?}, roles {:?}",
144
+ c.name,
145
+ c.logical_dtype.name(),
146
+ c.logical_shape,
147
+ c.roles.iter().map(|(n, _)| n.as_str()).collect::<Vec<_>>()
148
+ );
149
+ }
150
+ ExitCode::SUCCESS
151
+ }
152
+
@@ -105,7 +105,7 @@ fn main() {
105
105
  .filter(|s| s.alias == "plain/1")
106
106
  .map(|s| (s.alias.to_string(), s.spec))
107
107
  .collect::<Vec<_>>();
108
- let mut plan = convert::plan(conv, &sources, &target, &specs, &Default::default()).unwrap();
108
+ let mut plan = convert::plan(conv, &sources, &target, &specs).unwrap();
109
109
  let order = plan
110
110
  .ops
111
111
  .iter()
@@ -0,0 +1,33 @@
1
+ //! Canonical padded RFC 4648 base64: the `base64` crate's STANDARD engine, which requires
2
+ //! canonical padding and refuses trailing bits, so a decode re-encodes to its input.
3
+
4
+ use base64::{engine::general_purpose::STANDARD, Engine};
5
+
6
+ use crate::err::{Code, Refusal, Result};
7
+
8
+ pub fn encode(data: &[u8]) -> String {
9
+ STANDARD.encode(data)
10
+ }
11
+
12
+ pub fn decode(s: &str) -> Result<Vec<u8>> {
13
+ STANDARD.decode(s).map_err(|e| Refusal {
14
+ code: Code::BAD_BASE64,
15
+ detail: e.to_string(),
16
+ })
17
+ }
18
+
19
+ #[cfg(test)]
20
+ mod tests {
21
+ use super::*;
22
+
23
+ #[test]
24
+ fn round_trips_and_refuses_what_is_not_canonical() {
25
+ for data in [&b""[..], b"f", b"fo", b"foo", b"foob", b"fooba", b"foobar"] {
26
+ assert_eq!(decode(&encode(data)).unwrap(), data);
27
+ }
28
+ assert_eq!(encode(b"foobar"), "Zm9vYmFy");
29
+ for bad in ["Zg", "Zg=", "Zh==", "Zm9v\n", " Zm9v", "Zm9v====", "Zm=9", "Z===", "Zm9vYg", "Zm9vYh==", "@@@@"] {
30
+ assert_eq!(decode(bad).unwrap_err().code, Code::BAD_BASE64, "{bad:?}");
31
+ }
32
+ }
33
+ }