tokenomos 0.0.1__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 (173) hide show
  1. tokenomos-0.0.1/.github/workflows/ci.yml +74 -0
  2. tokenomos-0.0.1/.github/workflows/release.yml +123 -0
  3. tokenomos-0.0.1/.gitignore +234 -0
  4. tokenomos-0.0.1/Cargo.lock +282 -0
  5. tokenomos-0.0.1/Cargo.toml +24 -0
  6. tokenomos-0.0.1/LICENSE +201 -0
  7. tokenomos-0.0.1/PKG-INFO +537 -0
  8. tokenomos-0.0.1/README.md +501 -0
  9. tokenomos-0.0.1/bench/caption.py +119 -0
  10. tokenomos-0.0.1/bench/caption_gaps.py +113 -0
  11. tokenomos-0.0.1/bench/decode.py +191 -0
  12. tokenomos-0.0.1/bench/grammar.py +160 -0
  13. tokenomos-0.0.1/bench/http_front.py +170 -0
  14. tokenomos-0.0.1/bench/prep.py +198 -0
  15. tokenomos-0.0.1/bench/profile/gdn_kernel.py +228 -0
  16. tokenomos-0.0.1/bench/profile/nsys_steps.py +93 -0
  17. tokenomos-0.0.1/bench/profile/nsys_timeline.py +122 -0
  18. tokenomos-0.0.1/bench/profile/roofline.py +133 -0
  19. tokenomos-0.0.1/bench/profile/tune_gemm.py +95 -0
  20. tokenomos-0.0.1/bench/profile/tune_nvfp4.py +145 -0
  21. tokenomos-0.0.1/bench/serve_caption.py +89 -0
  22. tokenomos-0.0.1/bench/suite/arms.py +149 -0
  23. tokenomos-0.0.1/bench/suite/boxes.example.json +21 -0
  24. tokenomos-0.0.1/bench/suite/capped.py +21 -0
  25. tokenomos-0.0.1/bench/suite/run.py +339 -0
  26. tokenomos-0.0.1/bench/suite/vllm_caption.py +79 -0
  27. tokenomos-0.0.1/bench/tap.py +176 -0
  28. tokenomos-0.0.1/bench/vision.py +117 -0
  29. tokenomos-0.0.1/docs/assets/beat.jpg +0 -0
  30. tokenomos-0.0.1/docs/assets/captions.jpg +0 -0
  31. tokenomos-0.0.1/docs/assets/decode.jpg +0 -0
  32. tokenomos-0.0.1/docs/assets/teaser.jpg +0 -0
  33. tokenomos-0.0.1/docs/measurements/bottlenecks.md +199 -0
  34. tokenomos-0.0.1/docs/measurements/captions.md +135 -0
  35. tokenomos-0.0.1/docs/measurements/gemma4.md +53 -0
  36. tokenomos-0.0.1/docs/measurements/grammar.md +40 -0
  37. tokenomos-0.0.1/docs/measurements/lfm3-vl-2b.md +79 -0
  38. tokenomos-0.0.1/docs/measurements/qwen35.md +117 -0
  39. tokenomos-0.0.1/docs/measurements/turing-ampere.md +178 -0
  40. tokenomos-0.0.1/docs/measurements/windows-4090.md +56 -0
  41. tokenomos-0.0.1/pyproject.toml +76 -0
  42. tokenomos-0.0.1/rustfmt.toml +5 -0
  43. tokenomos-0.0.1/scripts/check_md_black.py +44 -0
  44. tokenomos-0.0.1/scripts/docs/plots.py +209 -0
  45. tokenomos-0.0.1/scripts/docs/teaser.py +305 -0
  46. tokenomos-0.0.1/src/tokenomos/__init__.py +11 -0
  47. tokenomos-0.0.1/src/tokenomos/api/__init__.py +1 -0
  48. tokenomos-0.0.1/src/tokenomos/api/llm.py +311 -0
  49. tokenomos-0.0.1/src/tokenomos/api/prep/__init__.py +2 -0
  50. tokenomos-0.0.1/src/tokenomos/api/prep/ring.py +81 -0
  51. tokenomos-0.0.1/src/tokenomos/api/prep/worker.py +127 -0
  52. tokenomos-0.0.1/src/tokenomos/api/router.py +168 -0
  53. tokenomos-0.0.1/src/tokenomos/api/server.py +232 -0
  54. tokenomos-0.0.1/src/tokenomos/api/template.py +72 -0
  55. tokenomos-0.0.1/src/tokenomos/api/tokens.py +42 -0
  56. tokenomos-0.0.1/src/tokenomos/core/__init__.py +0 -0
  57. tokenomos-0.0.1/src/tokenomos/core/engine.py +883 -0
  58. tokenomos-0.0.1/src/tokenomos/core/floats.py +52 -0
  59. tokenomos-0.0.1/src/tokenomos/core/grammar.py +169 -0
  60. tokenomos-0.0.1/src/tokenomos/core/pools.py +108 -0
  61. tokenomos-0.0.1/src/tokenomos/core/prefix.py +134 -0
  62. tokenomos-0.0.1/src/tokenomos/core/staging.py +40 -0
  63. tokenomos-0.0.1/src/tokenomos/core/state.py +46 -0
  64. tokenomos-0.0.1/src/tokenomos/kernels/__init__.py +11 -0
  65. tokenomos-0.0.1/src/tokenomos/kernels/activations.py +12 -0
  66. tokenomos-0.0.1/src/tokenomos/kernels/attention/__init__.py +0 -0
  67. tokenomos-0.0.1/src/tokenomos/kernels/attention/paged.py +472 -0
  68. tokenomos-0.0.1/src/tokenomos/kernels/attention/qk.py +155 -0
  69. tokenomos-0.0.1/src/tokenomos/kernels/conv/__init__.py +1 -0
  70. tokenomos-0.0.1/src/tokenomos/kernels/conv/grid2d.py +110 -0
  71. tokenomos-0.0.1/src/tokenomos/kernels/conv/varlen.py +232 -0
  72. tokenomos-0.0.1/src/tokenomos/kernels/engine/__init__.py +0 -0
  73. tokenomos-0.0.1/src/tokenomos/kernels/engine/slots.py +216 -0
  74. tokenomos-0.0.1/src/tokenomos/kernels/gdn/__init__.py +2 -0
  75. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/LICENSE +21 -0
  76. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/__init__.py +10 -0
  77. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/chunk.py +241 -0
  78. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/chunk_delta_h.py +343 -0
  79. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/chunk_o.py +188 -0
  80. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/chunk_scaled_dot_kkt.py +163 -0
  81. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/cumsum.py +256 -0
  82. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/fused_gdn_prefill_post_conv.py +251 -0
  83. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/index.py +42 -0
  84. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/l2norm.py +157 -0
  85. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/op.py +64 -0
  86. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/solve_tril.py +515 -0
  87. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/utils.py +199 -0
  88. tokenomos-0.0.1/src/tokenomos/kernels/gdn/fla/wy_fast.py +140 -0
  89. tokenomos-0.0.1/src/tokenomos/kernels/gdn/norm.py +131 -0
  90. tokenomos-0.0.1/src/tokenomos/kernels/gdn/prefill.py +361 -0
  91. tokenomos-0.0.1/src/tokenomos/kernels/gdn/state.py +212 -0
  92. tokenomos-0.0.1/src/tokenomos/kernels/gdn/tables/nvidia-geforce-rtx-2080-ti.json +1 -0
  93. tokenomos-0.0.1/src/tokenomos/kernels/gdn/tables/nvidia-geforce-rtx-3090.json +1 -0
  94. tokenomos-0.0.1/src/tokenomos/kernels/gdn/tables/nvidia-geforce-rtx-4090.json +1 -0
  95. tokenomos-0.0.1/src/tokenomos/kernels/gdn/tables/nvidia-geforce-rtx-5090.json +1 -0
  96. tokenomos-0.0.1/src/tokenomos/kernels/grammar/__init__.py +1 -0
  97. tokenomos-0.0.1/src/tokenomos/kernels/grammar/device.py +212 -0
  98. tokenomos-0.0.1/src/tokenomos/kernels/linear/__init__.py +0 -0
  99. tokenomos-0.0.1/src/tokenomos/kernels/linear/fp16.py +125 -0
  100. tokenomos-0.0.1/src/tokenomos/kernels/linear/fp8.py +137 -0
  101. tokenomos-0.0.1/src/tokenomos/kernels/linear/int8.py +206 -0
  102. tokenomos-0.0.1/src/tokenomos/kernels/linear/skinny.py +69 -0
  103. tokenomos-0.0.1/src/tokenomos/kernels/mxfp8/__init__.py +2 -0
  104. tokenomos-0.0.1/src/tokenomos/kernels/mxfp8/ops.py +149 -0
  105. tokenomos-0.0.1/src/tokenomos/kernels/mxfp8/producers.py +81 -0
  106. tokenomos-0.0.1/src/tokenomos/kernels/mxfp8/tables/nvidia-geforce-rtx-5090.json +251 -0
  107. tokenomos-0.0.1/src/tokenomos/kernels/norm/__init__.py +0 -0
  108. tokenomos-0.0.1/src/tokenomos/kernels/norm/fused.py +151 -0
  109. tokenomos-0.0.1/src/tokenomos/kernels/nvfp4/__init__.py +2 -0
  110. tokenomos-0.0.1/src/tokenomos/kernels/nvfp4/ops.py +294 -0
  111. tokenomos-0.0.1/src/tokenomos/kernels/nvfp4/producers.py +330 -0
  112. tokenomos-0.0.1/src/tokenomos/kernels/nvfp4/tables/nvidia-geforce-rtx-5090.json +2364 -0
  113. tokenomos-0.0.1/src/tokenomos/kernels/rounding.py +32 -0
  114. tokenomos-0.0.1/src/tokenomos/kernels/sampling/__init__.py +0 -0
  115. tokenomos-0.0.1/src/tokenomos/kernels/sampling/sample.py +149 -0
  116. tokenomos-0.0.1/src/tokenomos/models/__init__.py +85 -0
  117. tokenomos-0.0.1/src/tokenomos/models/blocks/__init__.py +3 -0
  118. tokenomos-0.0.1/src/tokenomos/models/blocks/attention.py +259 -0
  119. tokenomos-0.0.1/src/tokenomos/models/blocks/decoder.py +202 -0
  120. tokenomos-0.0.1/src/tokenomos/models/blocks/ffn.py +32 -0
  121. tokenomos-0.0.1/src/tokenomos/models/blocks/gdn.py +190 -0
  122. tokenomos-0.0.1/src/tokenomos/models/blocks/linear.py +318 -0
  123. tokenomos-0.0.1/src/tokenomos/models/blocks/norm.py +45 -0
  124. tokenomos-0.0.1/src/tokenomos/models/blocks/rope.py +73 -0
  125. tokenomos-0.0.1/src/tokenomos/models/blocks/shortconv.py +59 -0
  126. tokenomos-0.0.1/src/tokenomos/models/contract.py +137 -0
  127. tokenomos-0.0.1/src/tokenomos/models/gemma4/__init__.py +0 -0
  128. tokenomos-0.0.1/src/tokenomos/models/gemma4/arch.py +222 -0
  129. tokenomos-0.0.1/src/tokenomos/models/gemma4/processor.py +46 -0
  130. tokenomos-0.0.1/src/tokenomos/models/gemma4/vision.py +265 -0
  131. tokenomos-0.0.1/src/tokenomos/models/imageprep.py +50 -0
  132. tokenomos-0.0.1/src/tokenomos/models/lfm3/__init__.py +1 -0
  133. tokenomos-0.0.1/src/tokenomos/models/lfm3/arch.py +131 -0
  134. tokenomos-0.0.1/src/tokenomos/models/lfm3/processor.py +25 -0
  135. tokenomos-0.0.1/src/tokenomos/models/lfm3/vision.py +293 -0
  136. tokenomos-0.0.1/src/tokenomos/models/load/__init__.py +1 -0
  137. tokenomos-0.0.1/src/tokenomos/models/load/checkpoint.py +174 -0
  138. tokenomos-0.0.1/src/tokenomos/models/qwen35/__init__.py +1 -0
  139. tokenomos-0.0.1/src/tokenomos/models/qwen35/arch.py +172 -0
  140. tokenomos-0.0.1/src/tokenomos/models/qwen35/processor.py +62 -0
  141. tokenomos-0.0.1/src/tokenomos/models/qwen35/vision.py +185 -0
  142. tokenomos-0.0.1/src/tokenomos/models/reference.py +93 -0
  143. tokenomos-0.0.1/src/tokenomos-rust/grammar/device.rs +328 -0
  144. tokenomos-0.0.1/src/tokenomos-rust/grammar/matcher.rs +643 -0
  145. tokenomos-0.0.1/src/tokenomos-rust/grammar/mod.rs +10 -0
  146. tokenomos-0.0.1/src/tokenomos-rust/grammar/python.rs +142 -0
  147. tokenomos-0.0.1/src/tokenomos-rust/grammar/schema.rs +131 -0
  148. tokenomos-0.0.1/src/tokenomos-rust/grammar/store.rs +356 -0
  149. tokenomos-0.0.1/src/tokenomos-rust/lib.rs +17 -0
  150. tokenomos-0.0.1/tests/api/test_llm.py +39 -0
  151. tokenomos-0.0.1/tests/api/test_server.py +46 -0
  152. tokenomos-0.0.1/tests/api/test_watch_stdin.py +25 -0
  153. tokenomos-0.0.1/tests/conftest.py +34 -0
  154. tokenomos-0.0.1/tests/core/test_engine.py +249 -0
  155. tokenomos-0.0.1/tests/core/test_floats.py +65 -0
  156. tokenomos-0.0.1/tests/core/test_pools.py +27 -0
  157. tokenomos-0.0.1/tests/core/test_staging.py +22 -0
  158. tokenomos-0.0.1/tests/kernels/test_attention.py +211 -0
  159. tokenomos-0.0.1/tests/kernels/test_conv.py +69 -0
  160. tokenomos-0.0.1/tests/kernels/test_fp16.py +123 -0
  161. tokenomos-0.0.1/tests/kernels/test_fp8_dynamic.py +78 -0
  162. tokenomos-0.0.1/tests/kernels/test_gdn_prefill.py +172 -0
  163. tokenomos-0.0.1/tests/kernels/test_gdn_state.py +80 -0
  164. tokenomos-0.0.1/tests/kernels/test_int8.py +63 -0
  165. tokenomos-0.0.1/tests/kernels/test_mxfp8.py +131 -0
  166. tokenomos-0.0.1/tests/kernels/test_norm.py +56 -0
  167. tokenomos-0.0.1/tests/kernels/test_nvfp4.py +68 -0
  168. tokenomos-0.0.1/tests/kernels/test_qk.py +45 -0
  169. tokenomos-0.0.1/tests/kernels/test_rounding.py +64 -0
  170. tokenomos-0.0.1/tests/kernels/test_sampling.py +101 -0
  171. tokenomos-0.0.1/tests/kernels/test_slots.py +132 -0
  172. tokenomos-0.0.1/tests/models/test_checkpoint.py +77 -0
  173. tokenomos-0.0.1/tests/models/test_lfm3.py +193 -0
@@ -0,0 +1,74 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ # A compute project: CI checks the code's form, the Rust core and every test that needs no GPU;
9
+ # kernels and engines are checked by the suite and the benches on the cards
10
+ jobs:
11
+ test:
12
+ name: Test (${{ matrix.os }}, py${{ matrix.python-version }})
13
+ runs-on: ${{ matrix.os }}
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ os: [ubuntu-latest, windows-latest]
18
+ python-version: ['3.12', '3.13']
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - uses: actions/setup-python@v5
22
+ with:
23
+ python-version: ${{ matrix.python-version }}
24
+ - uses: dtolnay/rust-toolchain@stable
25
+ - uses: Swatinem/rust-cache@v2
26
+ - name: Build the wheel
27
+ run: |
28
+ python -m pip install --upgrade pip maturin
29
+ maturin build --release --out dist
30
+ - name: Install the built wheel
31
+ shell: bash
32
+ run: |
33
+ python -m pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
34
+ WHEEL=$(ls dist/*.whl)
35
+ python -m pip install "${WHEEL}[dev,tensorcore]"
36
+ - name: Tests
37
+ run: python -m pytest tests -q -m "not gpu"
38
+
39
+ rust:
40
+ name: Rust (fmt, clippy, unit tests)
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ - uses: actions/setup-python@v5
45
+ with:
46
+ python-version: '3.13'
47
+ - uses: dtolnay/rust-toolchain@stable
48
+ with:
49
+ components: rustfmt, clippy
50
+ - uses: Swatinem/rust-cache@v2
51
+ - name: cargo fmt
52
+ run: cargo fmt --check
53
+ - name: cargo clippy
54
+ run: cargo clippy --all-targets -- -D warnings
55
+ # Without the python feature the test binary links nothing of Python
56
+ - name: cargo test
57
+ run: cargo test --no-default-features
58
+
59
+ lint:
60
+ name: Lint
61
+ runs-on: ubuntu-latest
62
+ steps:
63
+ - uses: actions/checkout@v4
64
+ - uses: actions/setup-python@v5
65
+ with:
66
+ python-version: '3.13'
67
+ - name: Install
68
+ run: pip install black ruff
69
+ - name: black
70
+ run: python -m black --check --line-length 100 src tests bench scripts
71
+ - name: ruff
72
+ run: python -m ruff check src tests bench scripts
73
+ - name: Markdown code blocks
74
+ run: python scripts/check_md_black.py .
@@ -0,0 +1,123 @@
1
+ name: Release
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ push:
7
+ tags:
8
+ - 'v*'
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ defaults:
15
+ run:
16
+ shell: bash
17
+
18
+ # The only workflow that uploads tokenomos, so PyPI needs one trusted publisher: this file
19
+ # (release.yml), environment `pypi`.
20
+ jobs:
21
+ # A tag that disagrees with Cargo.toml is a mis-cut release: stop before anything is uploaded,
22
+ # since a PyPI filename cannot be reused
23
+ version:
24
+ name: Tag matches the version
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: actions/setup-python@v5
29
+ with:
30
+ python-version: '3.13'
31
+ - name: Check
32
+ if: github.event_name != 'workflow_dispatch'
33
+ run: |
34
+ version=$(python -c "import tomllib; print(tomllib.load(open('Cargo.toml', 'rb'))['package']['version'])")
35
+ test "${GITHUB_REF_NAME#v}" = "${version}" \
36
+ || { echo "tag ${GITHUB_REF_NAME} != Cargo.toml ${version}"; exit 1; }
37
+
38
+ # abi3: one wheel per platform
39
+ build-wheels:
40
+ name: Wheel for ${{ matrix.target }}
41
+ needs: version
42
+ runs-on: ${{ matrix.os }}
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ include:
47
+ - { os: ubuntu-latest, target: x86_64-unknown-linux-gnu, manylinux: '2_28' }
48
+ - { os: windows-latest, target: x86_64-pc-windows-msvc, manylinux: '' }
49
+ steps:
50
+ - uses: actions/checkout@v4
51
+ - uses: actions/setup-python@v5
52
+ with:
53
+ python-version: '3.13'
54
+ - uses: PyO3/maturin-action@v1
55
+ with:
56
+ target: ${{ matrix.target }}
57
+ manylinux: ${{ matrix.manylinux || 'auto' }}
58
+ args: --release --out dist
59
+ - name: Test the wheel in a clean venv
60
+ run: |
61
+ python -m venv .venv-wheel
62
+ if [ "${RUNNER_OS}" = "Windows" ]; then . .venv-wheel/Scripts/activate; else . .venv-wheel/bin/activate; fi
63
+ pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
64
+ pip install dist/*.whl
65
+ # away from src/, so the import is the installed wheel
66
+ cd dist && python -c "from tokenomos._rs import grammar; import tokenomos; print(tokenomos.LLM)"
67
+ - uses: actions/upload-artifact@v4
68
+ with:
69
+ name: wheels-${{ matrix.target }}
70
+ path: dist/*.whl
71
+ if-no-files-found: error
72
+ retention-days: 7
73
+
74
+ build-sdist:
75
+ name: Build the sdist
76
+ needs: version
77
+ runs-on: ubuntu-latest
78
+ steps:
79
+ - uses: actions/checkout@v4
80
+ - uses: actions/setup-python@v5
81
+ with:
82
+ python-version: '3.13'
83
+ - name: Build
84
+ run: |
85
+ pip install maturin twine
86
+ maturin sdist --out dist
87
+ twine check dist/*
88
+ - uses: actions/upload-artifact@v4
89
+ with:
90
+ name: sdist
91
+ path: dist/*.tar.gz
92
+ if-no-files-found: error
93
+ retention-days: 7
94
+
95
+ publish-to-pypi:
96
+ name: Publish to PyPI
97
+ needs: [build-wheels, build-sdist]
98
+ runs-on: ubuntu-latest
99
+ if: github.event_name == 'release' || startsWith(github.ref, 'refs/tags/v')
100
+ environment:
101
+ name: pypi
102
+ url: https://pypi.org/p/tokenomos
103
+ permissions:
104
+ contents: write
105
+ id-token: write
106
+ steps:
107
+ - uses: actions/download-artifact@v4
108
+ with:
109
+ path: dist
110
+ merge-multiple: true
111
+ - name: List artifacts
112
+ run: ls -lh dist/
113
+ - name: Upload to the GitHub release
114
+ uses: softprops/action-gh-release@v2
115
+ if: startsWith(github.ref, 'refs/tags/')
116
+ with:
117
+ files: dist/*
118
+ fail_on_unmatched_files: false
119
+ - name: Publish to PyPI
120
+ uses: pypa/gh-action-pypi-publish@release/v1
121
+ with:
122
+ skip-existing: true
123
+ verbose: true
@@ -0,0 +1,234 @@
1
+ __pycache__/
2
+ *.pyc
3
+ /target/
4
+ /plans/
5
+ /reports/
6
+ /bench/suite/boxes.json
7
+ *.so
8
+ *.pyd
9
+ *.pdb
10
+ .venv/
11
+
12
+ # Byte-compiled / optimized / DLL files
13
+ __pycache__/
14
+ *.py[codz]
15
+ *$py.class
16
+
17
+ # C extensions
18
+ *.so
19
+
20
+ # Distribution / packaging
21
+ .Python
22
+ build/
23
+ develop-eggs/
24
+ dist/
25
+ downloads/
26
+ eggs/
27
+ .eggs/
28
+ lib/
29
+ lib64/
30
+ parts/
31
+ sdist/
32
+ var/
33
+ wheels/
34
+ share/python-wheels/
35
+ *.egg-info/
36
+ .installed.cfg
37
+ *.egg
38
+ MANIFEST
39
+
40
+ # PyInstaller
41
+ # Usually these files are written by a python script from a template
42
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
43
+ *.manifest
44
+ *.spec
45
+
46
+ # Installer logs
47
+ pip-log.txt
48
+ pip-delete-this-directory.txt
49
+
50
+ # Unit test / coverage reports
51
+ htmlcov/
52
+ .tox/
53
+ .nox/
54
+ .coverage
55
+ .coverage.*
56
+ .cache
57
+ nosetests.xml
58
+ coverage.xml
59
+ *.cover
60
+ *.py.cover
61
+ *.lcov
62
+ .hypothesis/
63
+ .pytest_cache/
64
+ cover/
65
+
66
+ # Translations
67
+ *.mo
68
+ *.pot
69
+
70
+ # Django stuff:
71
+ *.log
72
+ local_settings.py
73
+ db.sqlite3
74
+ db.sqlite3-journal
75
+
76
+ # Flask stuff:
77
+ instance/
78
+ .webassets-cache
79
+
80
+ # Scrapy stuff:
81
+ .scrapy
82
+
83
+ # Sphinx documentation
84
+ docs/_build/
85
+
86
+ # PyBuilder
87
+ .pybuilder/
88
+ target/
89
+
90
+ # Jupyter Notebook
91
+ .ipynb_checkpoints
92
+
93
+ # IPython
94
+ profile_default/
95
+ ipython_config.py
96
+
97
+ # pyenv
98
+ # For a library or package, you might want to ignore these files since the code is
99
+ # intended to run in multiple environments; otherwise, check them in:
100
+ # .python-version
101
+
102
+ # pipenv
103
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
104
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
105
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
106
+ # install all needed dependencies.
107
+ # Pipfile.lock
108
+
109
+ # uv
110
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
111
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
112
+ # commonly ignored for libraries.
113
+ # uv.lock
114
+
115
+ # poetry
116
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
117
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
118
+ # commonly ignored for libraries.
119
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
120
+ # poetry.lock
121
+ # poetry.toml
122
+
123
+ # pdm
124
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
125
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
126
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
127
+ # pdm.lock
128
+ # pdm.toml
129
+ .pdm-python
130
+ .pdm-build/
131
+
132
+ # pixi
133
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
134
+ # pixi.lock
135
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
136
+ # in the .venv directory. It is recommended not to include this directory in version control.
137
+ .pixi/*
138
+ !.pixi/config.toml
139
+
140
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
141
+ __pypackages__/
142
+
143
+ # Celery stuff
144
+ celerybeat-schedule*
145
+ celerybeat.pid
146
+
147
+ # Redis
148
+ *.rdb
149
+ *.aof
150
+ *.pid
151
+
152
+ # RabbitMQ
153
+ mnesia/
154
+ rabbitmq/
155
+ rabbitmq-data/
156
+
157
+ # ActiveMQ
158
+ activemq-data/
159
+
160
+ # SageMath parsed files
161
+ *.sage.py
162
+
163
+ # Environments
164
+ .env
165
+ .envrc
166
+ .venv
167
+ env/
168
+ venv/
169
+ ENV/
170
+ env.bak/
171
+ venv.bak/
172
+
173
+ # Conda environments
174
+ conda-meta/
175
+
176
+ # Spyder project settings
177
+ .spyderproject
178
+ .spyproject
179
+
180
+ # Rope project settings
181
+ .ropeproject
182
+
183
+ # mkdocs/Zensical documentation
184
+ /site
185
+
186
+ # mypy
187
+ .mypy_cache/
188
+ .dmypy.json
189
+ dmypy.json
190
+
191
+ # Pyre type checker
192
+ .pyre/
193
+
194
+ # pytype static type analyzer
195
+ .pytype/
196
+
197
+ # Cython debug symbols
198
+ cython_debug/
199
+
200
+ # PyCharm
201
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
202
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
203
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
204
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
205
+ # .idea/
206
+
207
+ # Abstra
208
+ # Abstra is an AI-powered process automation framework.
209
+ # Ignore directories containing user credentials, local state, and settings.
210
+ # Learn more at https://abstra.io/docs
211
+ .abstra/
212
+
213
+ # Visual Studio Code
214
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that
215
+ # can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
216
+ # and can be added to the global gitignore or merged into this file. However, if you prefer, you
217
+ # could uncomment the following to ignore the entire vscode folder
218
+ # .vscode/
219
+ # Temporary file for partial code execution
220
+ tempCodeRunnerFile.py
221
+
222
+ # Ruff stuff:
223
+ .ruff_cache/
224
+
225
+ # PyPI configuration file
226
+ .pypirc
227
+
228
+ # Marimo
229
+ marimo/_static/
230
+ marimo/_lsp/
231
+ __marimo__/
232
+
233
+ # Streamlit
234
+ .streamlit/secrets.toml
@@ -0,0 +1,282 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.5.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
10
+
11
+ [[package]]
12
+ name = "equivalent"
13
+ version = "1.0.3"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826"
16
+
17
+ [[package]]
18
+ name = "foldhash"
19
+ version = "0.2.0"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
22
+
23
+ [[package]]
24
+ name = "hashbrown"
25
+ version = "0.17.1"
26
+ source = "registry+https://github.com/rust-lang/crates.io-index"
27
+ checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
28
+
29
+ [[package]]
30
+ name = "heck"
31
+ version = "0.5.0"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
34
+
35
+ [[package]]
36
+ name = "indexmap"
37
+ version = "2.14.2"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
40
+ dependencies = [
41
+ "equivalent",
42
+ "hashbrown",
43
+ ]
44
+
45
+ [[package]]
46
+ name = "indoc"
47
+ version = "2.0.8"
48
+ source = "registry+https://github.com/rust-lang/crates.io-index"
49
+ checksum = "a37b2691796cffeb8a8cd305ac66e65841559f147f4e63231d0eafa4db5384d1"
50
+ dependencies = [
51
+ "rustversion",
52
+ ]
53
+
54
+ [[package]]
55
+ name = "itoa"
56
+ version = "1.0.18"
57
+ source = "registry+https://github.com/rust-lang/crates.io-index"
58
+ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
59
+
60
+ [[package]]
61
+ name = "libc"
62
+ version = "0.2.191"
63
+ source = "registry+https://github.com/rust-lang/crates.io-index"
64
+ checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
65
+
66
+ [[package]]
67
+ name = "memchr"
68
+ version = "2.8.3"
69
+ source = "registry+https://github.com/rust-lang/crates.io-index"
70
+ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
71
+
72
+ [[package]]
73
+ name = "memoffset"
74
+ version = "0.9.1"
75
+ source = "registry+https://github.com/rust-lang/crates.io-index"
76
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
77
+ dependencies = [
78
+ "autocfg",
79
+ ]
80
+
81
+ [[package]]
82
+ name = "once_cell"
83
+ version = "1.21.4"
84
+ source = "registry+https://github.com/rust-lang/crates.io-index"
85
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
86
+
87
+ [[package]]
88
+ name = "portable-atomic"
89
+ version = "1.15.0"
90
+ source = "registry+https://github.com/rust-lang/crates.io-index"
91
+ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
92
+
93
+ [[package]]
94
+ name = "proc-macro2"
95
+ version = "1.0.107"
96
+ source = "registry+https://github.com/rust-lang/crates.io-index"
97
+ checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
98
+ dependencies = [
99
+ "unicode-ident",
100
+ ]
101
+
102
+ [[package]]
103
+ name = "pyo3"
104
+ version = "0.25.1"
105
+ source = "registry+https://github.com/rust-lang/crates.io-index"
106
+ checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
107
+ dependencies = [
108
+ "indoc",
109
+ "libc",
110
+ "memoffset",
111
+ "once_cell",
112
+ "portable-atomic",
113
+ "pyo3-build-config",
114
+ "pyo3-ffi",
115
+ "pyo3-macros",
116
+ "unindent",
117
+ ]
118
+
119
+ [[package]]
120
+ name = "pyo3-build-config"
121
+ version = "0.25.1"
122
+ source = "registry+https://github.com/rust-lang/crates.io-index"
123
+ checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
124
+ dependencies = [
125
+ "once_cell",
126
+ "target-lexicon",
127
+ ]
128
+
129
+ [[package]]
130
+ name = "pyo3-ffi"
131
+ version = "0.25.1"
132
+ source = "registry+https://github.com/rust-lang/crates.io-index"
133
+ checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
134
+ dependencies = [
135
+ "libc",
136
+ "pyo3-build-config",
137
+ ]
138
+
139
+ [[package]]
140
+ name = "pyo3-macros"
141
+ version = "0.25.1"
142
+ source = "registry+https://github.com/rust-lang/crates.io-index"
143
+ checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
144
+ dependencies = [
145
+ "proc-macro2",
146
+ "pyo3-macros-backend",
147
+ "quote",
148
+ "syn 2.0.119",
149
+ ]
150
+
151
+ [[package]]
152
+ name = "pyo3-macros-backend"
153
+ version = "0.25.1"
154
+ source = "registry+https://github.com/rust-lang/crates.io-index"
155
+ checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
156
+ dependencies = [
157
+ "heck",
158
+ "proc-macro2",
159
+ "pyo3-build-config",
160
+ "quote",
161
+ "syn 2.0.119",
162
+ ]
163
+
164
+ [[package]]
165
+ name = "quote"
166
+ version = "1.0.47"
167
+ source = "registry+https://github.com/rust-lang/crates.io-index"
168
+ checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
169
+ dependencies = [
170
+ "proc-macro2",
171
+ ]
172
+
173
+ [[package]]
174
+ name = "rustc-hash"
175
+ version = "2.1.3"
176
+ source = "registry+https://github.com/rust-lang/crates.io-index"
177
+ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
178
+
179
+ [[package]]
180
+ name = "rustversion"
181
+ version = "1.0.23"
182
+ source = "registry+https://github.com/rust-lang/crates.io-index"
183
+ checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
184
+
185
+ [[package]]
186
+ name = "serde"
187
+ version = "1.0.229"
188
+ source = "registry+https://github.com/rust-lang/crates.io-index"
189
+ checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
190
+ dependencies = [
191
+ "serde_core",
192
+ ]
193
+
194
+ [[package]]
195
+ name = "serde_core"
196
+ version = "1.0.229"
197
+ source = "registry+https://github.com/rust-lang/crates.io-index"
198
+ checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
199
+ dependencies = [
200
+ "serde_derive",
201
+ ]
202
+
203
+ [[package]]
204
+ name = "serde_derive"
205
+ version = "1.0.229"
206
+ source = "registry+https://github.com/rust-lang/crates.io-index"
207
+ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
208
+ dependencies = [
209
+ "proc-macro2",
210
+ "quote",
211
+ "syn 3.0.9",
212
+ ]
213
+
214
+ [[package]]
215
+ name = "serde_json"
216
+ version = "1.0.154"
217
+ source = "registry+https://github.com/rust-lang/crates.io-index"
218
+ checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6"
219
+ dependencies = [
220
+ "foldhash",
221
+ "indexmap",
222
+ "itoa",
223
+ "memchr",
224
+ "serde",
225
+ "serde_core",
226
+ "zmij",
227
+ ]
228
+
229
+ [[package]]
230
+ name = "syn"
231
+ version = "2.0.119"
232
+ source = "registry+https://github.com/rust-lang/crates.io-index"
233
+ checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
234
+ dependencies = [
235
+ "proc-macro2",
236
+ "quote",
237
+ "unicode-ident",
238
+ ]
239
+
240
+ [[package]]
241
+ name = "syn"
242
+ version = "3.0.9"
243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
244
+ checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
245
+ dependencies = [
246
+ "proc-macro2",
247
+ "quote",
248
+ "unicode-ident",
249
+ ]
250
+
251
+ [[package]]
252
+ name = "target-lexicon"
253
+ version = "0.13.5"
254
+ source = "registry+https://github.com/rust-lang/crates.io-index"
255
+ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
256
+
257
+ [[package]]
258
+ name = "tokenomos"
259
+ version = "0.0.1"
260
+ dependencies = [
261
+ "pyo3",
262
+ "rustc-hash",
263
+ "serde_json",
264
+ ]
265
+
266
+ [[package]]
267
+ name = "unicode-ident"
268
+ version = "1.0.27"
269
+ source = "registry+https://github.com/rust-lang/crates.io-index"
270
+ checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
271
+
272
+ [[package]]
273
+ name = "unindent"
274
+ version = "0.2.4"
275
+ source = "registry+https://github.com/rust-lang/crates.io-index"
276
+ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
277
+
278
+ [[package]]
279
+ name = "zmij"
280
+ version = "1.0.23"
281
+ source = "registry+https://github.com/rust-lang/crates.io-index"
282
+ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"