ampzip 1.0.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.
- ampzip-1.0.0/.gitignore +26 -0
- ampzip-1.0.0/CHANGELOG.md +5 -0
- ampzip-1.0.0/CITATION.cff +27 -0
- ampzip-1.0.0/LICENSE +21 -0
- ampzip-1.0.0/PKG-INFO +171 -0
- ampzip-1.0.0/README.md +114 -0
- ampzip-1.0.0/ampzip/__init__.py +7 -0
- ampzip-1.0.0/ampzip/__main__.py +7 -0
- ampzip-1.0.0/ampzip/_version.py +26 -0
- ampzip-1.0.0/ampzip/atoms.py +74 -0
- ampzip-1.0.0/ampzip/engine/Cargo.lock +200 -0
- ampzip-1.0.0/ampzip/engine/Cargo.toml +22 -0
- ampzip-1.0.0/ampzip/engine/pyproject.toml +29 -0
- ampzip-1.0.0/ampzip/engine/src/eval.rs +245 -0
- ampzip-1.0.0/ampzip/engine/src/ident.rs +425 -0
- ampzip-1.0.0/ampzip/engine/src/lib.rs +823 -0
- ampzip-1.0.0/ampzip/engine/src/parse.rs +407 -0
- ampzip-1.0.0/ampzip/engine/src/poly.rs +562 -0
- ampzip-1.0.0/ampzip/search/__init__.py +5 -0
- ampzip-1.0.0/ampzip/search/action_space.py +101 -0
- ampzip-1.0.0/ampzip/search/actions.py +135 -0
- ampzip-1.0.0/ampzip/search/finiteflow.py +367 -0
- ampzip-1.0.0/ampzip/search/gbfs.py +707 -0
- ampzip-1.0.0/ampzip/search/gbfs_checkpoint.py +260 -0
- ampzip-1.0.0/ampzip/search/objective_atoms.py +111 -0
- ampzip-1.0.0/ampzip/search/observation.py +64 -0
- ampzip-1.0.0/ampzip/search/spurious.py +309 -0
- ampzip-1.0.0/ampzip/search/value_den.py +96 -0
- ampzip-1.0.0/ampzip/simplifier/__init__.py +41 -0
- ampzip-1.0.0/ampzip/simplifier/__main__.py +5 -0
- ampzip-1.0.0/ampzip/simplifier/_paths.py +97 -0
- ampzip-1.0.0/ampzip/simplifier/_source.py +84 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/__init__.py +5 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/_post.py +353 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/_post_worker.py +45 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/base.py +27 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/cds.py +463 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/gbfs.py +302 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/gbfs_c.py +366 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/gbfs_d.py +33 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/gbfs_e.py +356 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/gbfs_f.py +92 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/sft_beam.py +172 -0
- ampzip-1.0.0/ampzip/simplifier/algorithms/sft_greedy.py +264 -0
- ampzip-1.0.0/ampzip/simplifier/atomize.py +237 -0
- ampzip-1.0.0/ampzip/simplifier/cli.py +452 -0
- ampzip-1.0.0/ampzip/simplifier/fetch_backends.py +280 -0
- ampzip-1.0.0/ampzip/simplifier/input_limits.py +293 -0
- ampzip-1.0.0/ampzip/simplifier/limits.py +139 -0
- ampzip-1.0.0/ampzip/simplifier/log.py +53 -0
- ampzip-1.0.0/ampzip/simplifier/parse.py +246 -0
- ampzip-1.0.0/ampzip/simplifier/patches/sft_eval_extensions.patch +126 -0
- ampzip-1.0.0/ampzip/simplifier/reconstruct.py +426 -0
- ampzip-1.0.0/ampzip/simplifier/result.py +74 -0
- ampzip-1.0.0/ampzip/simplifier/runner.py +606 -0
- ampzip-1.0.0/ampzip/simplifier/validate.py +358 -0
- ampzip-1.0.0/ampzip/verify/__init__.py +18 -0
- ampzip-1.0.0/ampzip/verify/field.py +72 -0
- ampzip-1.0.0/ampzip/verify/kinematics.py +83 -0
- ampzip-1.0.0/ampzip/verify/twistor.py +166 -0
- ampzip-1.0.0/ampzip/verify/verifier.py +243 -0
- ampzip-1.0.0/ampzip/webservice/README.md +95 -0
- ampzip-1.0.0/ampzip/webservice/__init__.py +24 -0
- ampzip-1.0.0/ampzip/webservice/__main__.py +30 -0
- ampzip-1.0.0/ampzip/webservice/app.py +561 -0
- ampzip-1.0.0/ampzip/webservice/audit.py +106 -0
- ampzip-1.0.0/ampzip/webservice/auth.py +161 -0
- ampzip-1.0.0/ampzip/webservice/config.py +221 -0
- ampzip-1.0.0/ampzip/webservice/deploy/cloudflared-config.example.yml +17 -0
- ampzip-1.0.0/ampzip/webservice/deploy/cloudflared.service +20 -0
- ampzip-1.0.0/ampzip/webservice/deploy/webservice.env.example +65 -0
- ampzip-1.0.0/ampzip/webservice/deploy/webservice.service +33 -0
- ampzip-1.0.0/ampzip/webservice/hashpw.py +51 -0
- ampzip-1.0.0/ampzip/webservice/jobs.py +281 -0
- ampzip-1.0.0/ampzip/webservice/pwhash.py +34 -0
- ampzip-1.0.0/ampzip/webservice/ratelimit.py +37 -0
- ampzip-1.0.0/ampzip/webservice/safety.py +19 -0
- ampzip-1.0.0/ampzip/webservice/static/index.html +1573 -0
- ampzip-1.0.0/ampzip/webservice/static/mathjax/LICENSE +202 -0
- ampzip-1.0.0/ampzip/webservice/static/mathjax/tex-svg.js +1 -0
- ampzip-1.0.0/docs/DEPLOY.md +131 -0
- ampzip-1.0.0/docs/ENGINE.md +116 -0
- ampzip-1.0.0/docs/GBFS_VARIANTS.md +24 -0
- ampzip-1.0.0/docs/KNOWN_ISSUES.md +5 -0
- ampzip-1.0.0/docs/LIMITS.md +129 -0
- ampzip-1.0.0/docs/SECURITY.md +21 -0
- ampzip-1.0.0/pyproject.toml +81 -0
- ampzip-1.0.0/tests/conftest.py +26 -0
- ampzip-1.0.0/tests/fixtures/gbfs_invariants.json +1329 -0
- ampzip-1.0.0/tests/run_tests.py +107 -0
- ampzip-1.0.0/tests/smoke.sh +70 -0
- ampzip-1.0.0/tests/test_atomize.py +140 -0
- ampzip-1.0.0/tests/test_atoms.py +149 -0
- ampzip-1.0.0/tests/test_backends_smoke.py +49 -0
- ampzip-1.0.0/tests/test_cds_timeout.py +66 -0
- ampzip-1.0.0/tests/test_display_count.py +104 -0
- ampzip-1.0.0/tests/test_engine_limits.py +76 -0
- ampzip-1.0.0/tests/test_fresh_install.sh +153 -0
- ampzip-1.0.0/tests/test_gate.py +23 -0
- ampzip-1.0.0/tests/test_gbfs_checkpoint.py +103 -0
- ampzip-1.0.0/tests/test_gbfs_e_budget.py +38 -0
- ampzip-1.0.0/tests/test_gbfs_f.py +174 -0
- ampzip-1.0.0/tests/test_gbfs_invariants.py +74 -0
- ampzip-1.0.0/tests/test_gbfs_packing.py +75 -0
- ampzip-1.0.0/tests/test_gbfs_stop_reasons.py +73 -0
- ampzip-1.0.0/tests/test_input_limits.py +269 -0
- ampzip-1.0.0/tests/test_input_property.py +311 -0
- ampzip-1.0.0/tests/test_numerical_check.py +171 -0
- ampzip-1.0.0/tests/test_parse.py +173 -0
- ampzip-1.0.0/tests/test_post_timeout.py +28 -0
- ampzip-1.0.0/tests/test_reconstruct.py +146 -0
- ampzip-1.0.0/tests/test_registry_defaults.py +47 -0
- ampzip-1.0.0/tests/test_spurious.py +148 -0
- ampzip-1.0.0/tests/test_target_judge.py +78 -0
- ampzip-1.0.0/tests/test_validate_engine_coeff.py +30 -0
- ampzip-1.0.0/tests/test_verify_engine.py +188 -0
- ampzip-1.0.0/tests/test_webservice_clamps.py +41 -0
ampzip-1.0.0/.gitignore
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# macOS
|
|
2
|
+
.DS_Store
|
|
3
|
+
|
|
4
|
+
# Python
|
|
5
|
+
__pycache__/
|
|
6
|
+
*.py[cod]
|
|
7
|
+
*.egg-info/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
.pytest_cache/
|
|
13
|
+
.ipynb_checkpoints/
|
|
14
|
+
|
|
15
|
+
# Rust
|
|
16
|
+
target/
|
|
17
|
+
|
|
18
|
+
# Editors
|
|
19
|
+
.vscode/
|
|
20
|
+
.idea/
|
|
21
|
+
|
|
22
|
+
# Local environment and secrets
|
|
23
|
+
.env
|
|
24
|
+
|
|
25
|
+
# Model weights are fetched separately, never committed
|
|
26
|
+
*.pth
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use AmpZip, please cite the accompanying paper and the software."
|
|
3
|
+
title: "AmpZip"
|
|
4
|
+
abstract: "Training-free simplification of massless spinor-helicity amplitudes by greedy best-first search."
|
|
5
|
+
type: software
|
|
6
|
+
version: 1.0.0
|
|
7
|
+
license: MIT
|
|
8
|
+
authors:
|
|
9
|
+
- family-names: Fei
|
|
10
|
+
given-names: Yifan
|
|
11
|
+
- family-names: Liu
|
|
12
|
+
given-names: Zhen
|
|
13
|
+
repository-code: "https://github.com/AmpLens/AmpLens"
|
|
14
|
+
keywords:
|
|
15
|
+
- scattering amplitudes
|
|
16
|
+
- spinor-helicity
|
|
17
|
+
- computer algebra
|
|
18
|
+
- best-first search
|
|
19
|
+
preferred-citation:
|
|
20
|
+
type: article
|
|
21
|
+
title: "Fast, training-free simplification of spinor-helicity amplitudes"
|
|
22
|
+
authors:
|
|
23
|
+
- family-names: Fei
|
|
24
|
+
given-names: Yifan
|
|
25
|
+
- family-names: Liu
|
|
26
|
+
given-names: Zhen
|
|
27
|
+
year: 2026
|
ampzip-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yifan Fei and Zhen Liu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
ampzip-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: ampzip
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Training-free simplification of spinor-helicity amplitudes: best-first search over value-preserving identities, with randomized finite-field checks
|
|
5
|
+
Project-URL: Homepage, https://github.com/AmpLens/AmpLens
|
|
6
|
+
Project-URL: Source, https://github.com/AmpLens/AmpLens/tree/main/AmpZip
|
|
7
|
+
Project-URL: Changelog, https://github.com/AmpLens/AmpLens/blob/main/AmpZip/CHANGELOG.md
|
|
8
|
+
Author: Yifan Fei, Zhen Liu
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: computer algebra,scattering amplitudes,spinor-helicity,symbolic simplification
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Programming Language :: Rust
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
19
|
+
Requires-Python: >=3.12
|
|
20
|
+
Requires-Dist: ampzip-engine==1.0.*
|
|
21
|
+
Requires-Dist: numpy>=1.24
|
|
22
|
+
Requires-Dist: platformdirs>=3
|
|
23
|
+
Requires-Dist: sympy<1.14,>=1.13
|
|
24
|
+
Provides-Extra: cds
|
|
25
|
+
Requires-Dist: diophantine>=0.2; extra == 'cds'
|
|
26
|
+
Requires-Dist: gdown>=5; extra == 'cds'
|
|
27
|
+
Requires-Dist: gymnasium>=0.29; extra == 'cds'
|
|
28
|
+
Requires-Dist: pandas>=2; extra == 'cds'
|
|
29
|
+
Requires-Dist: torch>=2.0; extra == 'cds'
|
|
30
|
+
Requires-Dist: tqdm>=4.64; extra == 'cds'
|
|
31
|
+
Requires-Dist: wolframclient>=1.1; extra == 'cds'
|
|
32
|
+
Provides-Extra: dev
|
|
33
|
+
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
34
|
+
Requires-Dist: maturin<2.0,>=1.5; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
36
|
+
Provides-Extra: ml
|
|
37
|
+
Requires-Dist: diophantine>=0.2; extra == 'ml'
|
|
38
|
+
Requires-Dist: gymnasium>=0.29; extra == 'ml'
|
|
39
|
+
Requires-Dist: pandas>=2; extra == 'ml'
|
|
40
|
+
Requires-Dist: torch>=2.0; extra == 'ml'
|
|
41
|
+
Requires-Dist: tqdm>=4.64; extra == 'ml'
|
|
42
|
+
Requires-Dist: wolframclient>=1.1; extra == 'ml'
|
|
43
|
+
Provides-Extra: sft
|
|
44
|
+
Requires-Dist: diophantine>=0.2; extra == 'sft'
|
|
45
|
+
Requires-Dist: gymnasium>=0.29; extra == 'sft'
|
|
46
|
+
Requires-Dist: pandas>=2; extra == 'sft'
|
|
47
|
+
Requires-Dist: torch>=2.0; extra == 'sft'
|
|
48
|
+
Requires-Dist: tqdm>=4.64; extra == 'sft'
|
|
49
|
+
Requires-Dist: wolframclient>=1.1; extra == 'sft'
|
|
50
|
+
Provides-Extra: web
|
|
51
|
+
Requires-Dist: cryptography>=3.4; ((sys_platform != 'win32' or platform_machine != 'ARM64') and (sys_platform != 'darwin' or platform_machine != 'x86_64')) and extra == 'web'
|
|
52
|
+
Requires-Dist: fastapi>=0.110; extra == 'web'
|
|
53
|
+
Requires-Dist: pydantic>=2; extra == 'web'
|
|
54
|
+
Requires-Dist: pyjwt>=2.8; extra == 'web'
|
|
55
|
+
Requires-Dist: uvicorn[standard]>=0.29; extra == 'web'
|
|
56
|
+
Description-Content-Type: text/markdown
|
|
57
|
+
|
|
58
|
+
# AmpZip
|
|
59
|
+
|
|
60
|
+
AmpZip simplifies massless four-, five- and six-point spinor-helicity amplitudes using greedy best-first search over Schouten, momentum-conservation and momentum-squared identities. It provides command-line and web interfaces, with optional SFT and CDS backends.
|
|
61
|
+
|
|
62
|
+
Input notation:
|
|
63
|
+
|
|
64
|
+
- `ab(i,j)` denotes an angle bracket ⟨i j⟩.
|
|
65
|
+
- `sb(i,j)` denotes a square bracket [i j].
|
|
66
|
+
- `s(i,j,...)` denotes the Mandelstam invariant s<sub>ij…</sub>.
|
|
67
|
+
- `chain('as', a, [m1, m2, ...], b)` denotes a Dirac chain ⟨a|(pₘ₁ + pₘ₂ + ⋯)|b].
|
|
68
|
+
|
|
69
|
+
Combine these using `+`, `-`, `*`, `/`, `**` and parentheses. For example:
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
ab(1,2)**3/(ab(2,3)*ab(3,4)*ab(4,1))
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
See [docs/LIMITS.md](docs/LIMITS.md) for details.
|
|
76
|
+
|
|
77
|
+
## Install
|
|
78
|
+
|
|
79
|
+
**From PyPI**, as binary wheels for Linux, macOS and Windows on Python 3.12 and later:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pip install ampzip # command line
|
|
83
|
+
pip install 'ampzip[web]' # plus the web service
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**From source**, which needs a Rust toolchain from <https://rustup.rs>:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
git clone https://github.com/AmpLens/AmpLens
|
|
90
|
+
cd AmpLens/AmpZip
|
|
91
|
+
pip install ./ampzip/engine # the Rust engine, distributed as `ampzip-engine`
|
|
92
|
+
pip install -e '.[web,dev]'
|
|
93
|
+
python tests/run_tests.py
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Web service with Docker**, run from the `AmpZip` directory:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
docker compose up # then open http://127.0.0.1:8000
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Command line
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
ampzip --expr "ab(1,2)**3/(ab(2,3)*ab(3,4)*ab(4,1))"
|
|
106
|
+
ampzip --expr "ab(1,3)*sb(2,4)*(s(1,2)+s(1,4))/s(1,2)**2"
|
|
107
|
+
ampzip --expr "(chain('as',6,[1,2],3)**3)/(ab(6,1)*ab(1,2)*sb(3,4)*sb(4,5)*s(6,1,2))" \
|
|
108
|
+
--algorithms model_free_gbfs,gbfs_f --gbfs-max-apps 60000 --gbfs-max-seconds 120
|
|
109
|
+
ampzip --expr-file amplitude.txt --json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The number of legs is inferred from the labels or can be specified by `--n-point`. For each backend, the output shows the bracket counts before and after simplification and the simplest expression found. AmpZip logs each simplification to `cli.jsonl` in the user log directory. Use `--log-dir` or `AMPZIP_LOG_DIR` to change the location.
|
|
113
|
+
|
|
114
|
+
Run `ampzip --help` to see all options.
|
|
115
|
+
|
|
116
|
+
Use `--algorithms` to select one or more backends, separated by commas.
|
|
117
|
+
|
|
118
|
+
| Backend | Description |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `model_free_gbfs` | The default. Greedy best-first search with the factored bracket count as its objective. |
|
|
121
|
+
| `gbfs_c`, `gbfs_d`, `gbfs_e`, `gbfs_f` | Search variants with alternative objectives or per-term simplification. |
|
|
122
|
+
| `sft_greedy` | SFT with greedy action selection. |
|
|
123
|
+
| `sft_best_of_n` | SFT with best-of-N selection. |
|
|
124
|
+
| `cds_oneshot` | CDS sequence-to-sequence simplification. |
|
|
125
|
+
|
|
126
|
+
SFT uses the model checkpoints published with arXiv:2603.11164. CDS uses the model checkpoints published with arXiv:2408.04720.
|
|
127
|
+
|
|
128
|
+
SFT and CDS require separate installation. See [Optional learned backends](#optional-learned-backends) below.
|
|
129
|
+
|
|
130
|
+
## Web service
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
WEBSVC_AUTH_MODE=dev \
|
|
134
|
+
WEBSVC_DEV_ALLOW_NO_AUTH=1 \
|
|
135
|
+
ampzip-web # http://127.0.0.1:8000
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Enter an expression and select the backends to run. Results appear as each backend finishes. Available derivations are shown in the derivation panel.
|
|
139
|
+
|
|
140
|
+
The command above starts the service locally without authentication. For remote access, configure HTTP Basic or Cloudflare Access as described in the [deployment](docs/DEPLOY.md) and [security](docs/SECURITY.md) guides.
|
|
141
|
+
|
|
142
|
+
## Optional learned backends
|
|
143
|
+
|
|
144
|
+
The SFT and CDS backends require code and model checkpoints from their authors. Use the commands below to install the dependencies and download the required files.
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
pip install 'ampzip[sft]'
|
|
148
|
+
ampzip fetch-backends
|
|
149
|
+
|
|
150
|
+
pip install 'ampzip[cds]'
|
|
151
|
+
ampzip fetch-backends --cds # CDS checkpoints, approximately 890 MB
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
If you downloaded the backends to a different directory, set `AMPZIP_BACKENDS` to that path.
|
|
155
|
+
|
|
156
|
+
## Documentation
|
|
157
|
+
|
|
158
|
+
- [Input notation and limits](docs/LIMITS.md)
|
|
159
|
+
- [GBFS variants](docs/GBFS_VARIANTS.md)
|
|
160
|
+
- [Rust engine and Python API](docs/ENGINE.md)
|
|
161
|
+
- [Web service deployment](docs/DEPLOY.md)
|
|
162
|
+
- [Web service security](docs/SECURITY.md)
|
|
163
|
+
- [Known issues](docs/KNOWN_ISSUES.md)
|
|
164
|
+
- [Changelog](CHANGELOG.md)
|
|
165
|
+
- [Citation information](CITATION.cff)
|
|
166
|
+
|
|
167
|
+
Inputs and commands for the paper's experiments are available in [Paper resources](https://github.com/AmpLens/AmpLens/tree/main/paper).
|
|
168
|
+
|
|
169
|
+
## License
|
|
170
|
+
|
|
171
|
+
MIT, see [LICENSE](LICENSE).
|
ampzip-1.0.0/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# AmpZip
|
|
2
|
+
|
|
3
|
+
AmpZip simplifies massless four-, five- and six-point spinor-helicity amplitudes using greedy best-first search over Schouten, momentum-conservation and momentum-squared identities. It provides command-line and web interfaces, with optional SFT and CDS backends.
|
|
4
|
+
|
|
5
|
+
Input notation:
|
|
6
|
+
|
|
7
|
+
- `ab(i,j)` denotes an angle bracket ⟨i j⟩.
|
|
8
|
+
- `sb(i,j)` denotes a square bracket [i j].
|
|
9
|
+
- `s(i,j,...)` denotes the Mandelstam invariant s<sub>ij…</sub>.
|
|
10
|
+
- `chain('as', a, [m1, m2, ...], b)` denotes a Dirac chain ⟨a|(pₘ₁ + pₘ₂ + ⋯)|b].
|
|
11
|
+
|
|
12
|
+
Combine these using `+`, `-`, `*`, `/`, `**` and parentheses. For example:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
ab(1,2)**3/(ab(2,3)*ab(3,4)*ab(4,1))
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
See [docs/LIMITS.md](docs/LIMITS.md) for details.
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
**From PyPI**, as binary wheels for Linux, macOS and Windows on Python 3.12 and later:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install ampzip # command line
|
|
26
|
+
pip install 'ampzip[web]' # plus the web service
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**From source**, which needs a Rust toolchain from <https://rustup.rs>:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
git clone https://github.com/AmpLens/AmpLens
|
|
33
|
+
cd AmpLens/AmpZip
|
|
34
|
+
pip install ./ampzip/engine # the Rust engine, distributed as `ampzip-engine`
|
|
35
|
+
pip install -e '.[web,dev]'
|
|
36
|
+
python tests/run_tests.py
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Web service with Docker**, run from the `AmpZip` directory:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
docker compose up # then open http://127.0.0.1:8000
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Command line
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
ampzip --expr "ab(1,2)**3/(ab(2,3)*ab(3,4)*ab(4,1))"
|
|
49
|
+
ampzip --expr "ab(1,3)*sb(2,4)*(s(1,2)+s(1,4))/s(1,2)**2"
|
|
50
|
+
ampzip --expr "(chain('as',6,[1,2],3)**3)/(ab(6,1)*ab(1,2)*sb(3,4)*sb(4,5)*s(6,1,2))" \
|
|
51
|
+
--algorithms model_free_gbfs,gbfs_f --gbfs-max-apps 60000 --gbfs-max-seconds 120
|
|
52
|
+
ampzip --expr-file amplitude.txt --json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The number of legs is inferred from the labels or can be specified by `--n-point`. For each backend, the output shows the bracket counts before and after simplification and the simplest expression found. AmpZip logs each simplification to `cli.jsonl` in the user log directory. Use `--log-dir` or `AMPZIP_LOG_DIR` to change the location.
|
|
56
|
+
|
|
57
|
+
Run `ampzip --help` to see all options.
|
|
58
|
+
|
|
59
|
+
Use `--algorithms` to select one or more backends, separated by commas.
|
|
60
|
+
|
|
61
|
+
| Backend | Description |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `model_free_gbfs` | The default. Greedy best-first search with the factored bracket count as its objective. |
|
|
64
|
+
| `gbfs_c`, `gbfs_d`, `gbfs_e`, `gbfs_f` | Search variants with alternative objectives or per-term simplification. |
|
|
65
|
+
| `sft_greedy` | SFT with greedy action selection. |
|
|
66
|
+
| `sft_best_of_n` | SFT with best-of-N selection. |
|
|
67
|
+
| `cds_oneshot` | CDS sequence-to-sequence simplification. |
|
|
68
|
+
|
|
69
|
+
SFT uses the model checkpoints published with arXiv:2603.11164. CDS uses the model checkpoints published with arXiv:2408.04720.
|
|
70
|
+
|
|
71
|
+
SFT and CDS require separate installation. See [Optional learned backends](#optional-learned-backends) below.
|
|
72
|
+
|
|
73
|
+
## Web service
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
WEBSVC_AUTH_MODE=dev \
|
|
77
|
+
WEBSVC_DEV_ALLOW_NO_AUTH=1 \
|
|
78
|
+
ampzip-web # http://127.0.0.1:8000
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Enter an expression and select the backends to run. Results appear as each backend finishes. Available derivations are shown in the derivation panel.
|
|
82
|
+
|
|
83
|
+
The command above starts the service locally without authentication. For remote access, configure HTTP Basic or Cloudflare Access as described in the [deployment](docs/DEPLOY.md) and [security](docs/SECURITY.md) guides.
|
|
84
|
+
|
|
85
|
+
## Optional learned backends
|
|
86
|
+
|
|
87
|
+
The SFT and CDS backends require code and model checkpoints from their authors. Use the commands below to install the dependencies and download the required files.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
pip install 'ampzip[sft]'
|
|
91
|
+
ampzip fetch-backends
|
|
92
|
+
|
|
93
|
+
pip install 'ampzip[cds]'
|
|
94
|
+
ampzip fetch-backends --cds # CDS checkpoints, approximately 890 MB
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
If you downloaded the backends to a different directory, set `AMPZIP_BACKENDS` to that path.
|
|
98
|
+
|
|
99
|
+
## Documentation
|
|
100
|
+
|
|
101
|
+
- [Input notation and limits](docs/LIMITS.md)
|
|
102
|
+
- [GBFS variants](docs/GBFS_VARIANTS.md)
|
|
103
|
+
- [Rust engine and Python API](docs/ENGINE.md)
|
|
104
|
+
- [Web service deployment](docs/DEPLOY.md)
|
|
105
|
+
- [Web service security](docs/SECURITY.md)
|
|
106
|
+
- [Known issues](docs/KNOWN_ISSUES.md)
|
|
107
|
+
- [Changelog](CHANGELOG.md)
|
|
108
|
+
- [Citation information](CITATION.cff)
|
|
109
|
+
|
|
110
|
+
Inputs and commands for the paper's experiments are available in [Paper resources](https://github.com/AmpLens/AmpLens/tree/main/paper).
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT, see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""ampzip: training-free simplification of spinor-helicity amplitudes.
|
|
2
|
+
|
|
3
|
+
``simplifier`` holds the CLI, the input check and the backends, ``search`` the best-first
|
|
4
|
+
search, ``verify`` the finite-field test and ``webservice`` the HTTP service. The moves are
|
|
5
|
+
executed by the extension module ``ampzip_engine`` built from ``ampzip/engine``.
|
|
6
|
+
"""
|
|
7
|
+
from ._version import __version__ # noqa: F401
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""The package version, from one source.
|
|
2
|
+
|
|
3
|
+
An installed distribution reports the version in its metadata, taken from `pyproject.toml`
|
|
4
|
+
at build time. A source checkout run without installing reads the same field from the
|
|
5
|
+
`pyproject.toml` next to the package.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from importlib.metadata import PackageNotFoundError, version as _dist_version
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _read() -> str:
|
|
14
|
+
try:
|
|
15
|
+
return _dist_version("ampzip")
|
|
16
|
+
except PackageNotFoundError:
|
|
17
|
+
pass
|
|
18
|
+
try:
|
|
19
|
+
import tomllib
|
|
20
|
+
data = tomllib.loads((Path(__file__).resolve().parents[1] / "pyproject.toml").read_text())
|
|
21
|
+
return str(data["project"]["version"]) + "+source"
|
|
22
|
+
except Exception: # noqa: BLE001 no pyproject next to the package
|
|
23
|
+
return "0+unknown"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
__version__ = _read()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""The bracket atoms and their canonical ordering.
|
|
2
|
+
|
|
3
|
+
`ab(i, j)` is the angle bracket ⟨i j⟩ and `sb(i, j)` the square bracket [i j], both as
|
|
4
|
+
uninterpreted sympy functions of two leg labels. Every expression the package handles is
|
|
5
|
+
built from these two atoms and `opaque_den`, the engine's marker for a polynomial
|
|
6
|
+
denominator factor, which is created where it is needed.
|
|
7
|
+
|
|
8
|
+
`canonical_order(expr)` rewrites every bracket to `i < j`, pushing the antisymmetry sign into
|
|
9
|
+
the coefficient: `ab(2, 1) -> -ab(1, 2)`. The engine, the atomizer and the display layer all
|
|
10
|
+
rely on this spelling, so a Mandelstam `s_ij = ⟨ij⟩[ji]` is stored as `-ab(i,j)*sb(i,j)`.
|
|
11
|
+
|
|
12
|
+
`ATOMS` is the registry of atom classes by name that the input check consults. A new atom
|
|
13
|
+
kind is added by registering it here together with its canonicalisation rule.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import Dict, Type
|
|
18
|
+
|
|
19
|
+
import sympy as sp
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _leg_labels(printer, args):
|
|
23
|
+
"""The leg labels for display. An integer prints as itself, and a symbol such as `p_{3}`
|
|
24
|
+
prints as its bare label."""
|
|
25
|
+
return [printer._print(a).replace("p_{", "").replace("}", "") for a in args]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class _Bracket(sp.Function):
|
|
29
|
+
"""A two-leg bracket. Subclasses only choose the delimiters."""
|
|
30
|
+
|
|
31
|
+
_delims = ("", "")
|
|
32
|
+
|
|
33
|
+
# sympy would infer is_number from the integer leg labels and then evaluate bracket
|
|
34
|
+
# products numerically while printing, which takes seconds on a power of a sum.
|
|
35
|
+
is_number = False
|
|
36
|
+
|
|
37
|
+
def _latex(self, printer, exp=1):
|
|
38
|
+
i, j = _leg_labels(printer, self.args)
|
|
39
|
+
left, right = self._delims
|
|
40
|
+
body = f"{left}{i} {j}{right}"
|
|
41
|
+
return body if exp == 1 else f"{body}^{{{exp}}}"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ab(_Bracket):
|
|
45
|
+
"""Angle bracket ⟨i j⟩ of legs i and j."""
|
|
46
|
+
|
|
47
|
+
_delims = (r"\langle ", r" \rangle")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class sb(_Bracket):
|
|
51
|
+
"""Square bracket [i j] of legs i and j."""
|
|
52
|
+
|
|
53
|
+
_delims = (r"\left[ ", r" \right]")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
ATOMS: Dict[str, Type[sp.Function]] = {"ab": ab, "sb": sb}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def bracket_classes():
|
|
60
|
+
"""The two bracket classes in the order every caller unpacks them, `ab, sb`."""
|
|
61
|
+
return ab, sb
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def canonical_order(expr: sp.Expr) -> sp.Expr:
|
|
65
|
+
"""Rewrite each two-leg bracket with its legs ascending, times -1 when they were swapped.
|
|
66
|
+
|
|
67
|
+
It applies to every two-argument function atom in `expr`, which is what the bracket
|
|
68
|
+
antisymmetry needs, and leaves one-argument atoms such as `opaque_den` alone.
|
|
69
|
+
"""
|
|
70
|
+
replace = {}
|
|
71
|
+
for fun in expr.atoms(sp.Function):
|
|
72
|
+
if len(fun.args) == 2 and fun.args[0] > fun.args[1]:
|
|
73
|
+
replace[fun] = fun.func(fun.args[1], fun.args[0]) * (-1)
|
|
74
|
+
return expr.subs(replace)
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# This file is automatically @generated by Cargo.
|
|
2
|
+
# It is not intended for manual editing.
|
|
3
|
+
version = 4
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "ampzip_engine"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
dependencies = [
|
|
9
|
+
"blake2",
|
|
10
|
+
"pyo3",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[[package]]
|
|
14
|
+
name = "blake2"
|
|
15
|
+
version = "0.10.6"
|
|
16
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
17
|
+
checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
|
|
18
|
+
dependencies = [
|
|
19
|
+
"digest",
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[[package]]
|
|
23
|
+
name = "block-buffer"
|
|
24
|
+
version = "0.10.4"
|
|
25
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
26
|
+
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
|
|
27
|
+
dependencies = [
|
|
28
|
+
"generic-array",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[[package]]
|
|
32
|
+
name = "crypto-common"
|
|
33
|
+
version = "0.1.7"
|
|
34
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
35
|
+
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
|
|
36
|
+
dependencies = [
|
|
37
|
+
"generic-array",
|
|
38
|
+
"typenum",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[[package]]
|
|
42
|
+
name = "digest"
|
|
43
|
+
version = "0.10.7"
|
|
44
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
45
|
+
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
|
46
|
+
dependencies = [
|
|
47
|
+
"block-buffer",
|
|
48
|
+
"crypto-common",
|
|
49
|
+
"subtle",
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
[[package]]
|
|
53
|
+
name = "generic-array"
|
|
54
|
+
version = "0.14.7"
|
|
55
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
56
|
+
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
|
|
57
|
+
dependencies = [
|
|
58
|
+
"typenum",
|
|
59
|
+
"version_check",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
[[package]]
|
|
63
|
+
name = "heck"
|
|
64
|
+
version = "0.5.0"
|
|
65
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
66
|
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
67
|
+
|
|
68
|
+
[[package]]
|
|
69
|
+
name = "libc"
|
|
70
|
+
version = "0.2.186"
|
|
71
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
72
|
+
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
|
73
|
+
|
|
74
|
+
[[package]]
|
|
75
|
+
name = "once_cell"
|
|
76
|
+
version = "1.21.4"
|
|
77
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
78
|
+
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
|
79
|
+
|
|
80
|
+
[[package]]
|
|
81
|
+
name = "portable-atomic"
|
|
82
|
+
version = "1.13.1"
|
|
83
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
84
|
+
checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
|
|
85
|
+
|
|
86
|
+
[[package]]
|
|
87
|
+
name = "proc-macro2"
|
|
88
|
+
version = "1.0.106"
|
|
89
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
90
|
+
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
|
|
91
|
+
dependencies = [
|
|
92
|
+
"unicode-ident",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
[[package]]
|
|
96
|
+
name = "pyo3"
|
|
97
|
+
version = "0.29.0"
|
|
98
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
99
|
+
checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
|
|
100
|
+
dependencies = [
|
|
101
|
+
"libc",
|
|
102
|
+
"once_cell",
|
|
103
|
+
"portable-atomic",
|
|
104
|
+
"pyo3-build-config",
|
|
105
|
+
"pyo3-ffi",
|
|
106
|
+
"pyo3-macros",
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
[[package]]
|
|
110
|
+
name = "pyo3-build-config"
|
|
111
|
+
version = "0.29.0"
|
|
112
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
113
|
+
checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
|
|
114
|
+
dependencies = [
|
|
115
|
+
"target-lexicon",
|
|
116
|
+
]
|
|
117
|
+
|
|
118
|
+
[[package]]
|
|
119
|
+
name = "pyo3-ffi"
|
|
120
|
+
version = "0.29.0"
|
|
121
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
122
|
+
checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
|
|
123
|
+
dependencies = [
|
|
124
|
+
"libc",
|
|
125
|
+
"pyo3-build-config",
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
[[package]]
|
|
129
|
+
name = "pyo3-macros"
|
|
130
|
+
version = "0.29.0"
|
|
131
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
132
|
+
checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
|
|
133
|
+
dependencies = [
|
|
134
|
+
"proc-macro2",
|
|
135
|
+
"pyo3-macros-backend",
|
|
136
|
+
"quote",
|
|
137
|
+
"syn",
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
[[package]]
|
|
141
|
+
name = "pyo3-macros-backend"
|
|
142
|
+
version = "0.29.0"
|
|
143
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
144
|
+
checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
|
|
145
|
+
dependencies = [
|
|
146
|
+
"heck",
|
|
147
|
+
"proc-macro2",
|
|
148
|
+
"quote",
|
|
149
|
+
"syn",
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
[[package]]
|
|
153
|
+
name = "quote"
|
|
154
|
+
version = "1.0.45"
|
|
155
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
156
|
+
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
|
157
|
+
dependencies = [
|
|
158
|
+
"proc-macro2",
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
[[package]]
|
|
162
|
+
name = "subtle"
|
|
163
|
+
version = "2.6.1"
|
|
164
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
165
|
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
|
166
|
+
|
|
167
|
+
[[package]]
|
|
168
|
+
name = "syn"
|
|
169
|
+
version = "2.0.118"
|
|
170
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
171
|
+
checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
|
|
172
|
+
dependencies = [
|
|
173
|
+
"proc-macro2",
|
|
174
|
+
"quote",
|
|
175
|
+
"unicode-ident",
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
[[package]]
|
|
179
|
+
name = "target-lexicon"
|
|
180
|
+
version = "0.13.5"
|
|
181
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
182
|
+
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
183
|
+
|
|
184
|
+
[[package]]
|
|
185
|
+
name = "typenum"
|
|
186
|
+
version = "1.20.1"
|
|
187
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
188
|
+
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
|
|
189
|
+
|
|
190
|
+
[[package]]
|
|
191
|
+
name = "unicode-ident"
|
|
192
|
+
version = "1.0.24"
|
|
193
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
194
|
+
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
|
195
|
+
|
|
196
|
+
[[package]]
|
|
197
|
+
name = "version_check"
|
|
198
|
+
version = "0.9.5"
|
|
199
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
200
|
+
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|