quiverlab 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- quiverlab-0.1.0/LICENSE +21 -0
- quiverlab-0.1.0/PKG-INFO +603 -0
- quiverlab-0.1.0/README.md +548 -0
- quiverlab-0.1.0/pyproject.toml +110 -0
- quiverlab-0.1.0/setup.cfg +4 -0
- quiverlab-0.1.0/src/quiverlab/__init__.py +42 -0
- quiverlab-0.1.0/src/quiverlab/batch/__init__.py +20 -0
- quiverlab-0.1.0/src/quiverlab/batch/builders.py +68 -0
- quiverlab-0.1.0/src/quiverlab/batch/db.py +157 -0
- quiverlab-0.1.0/src/quiverlab/batch/scan.py +257 -0
- quiverlab-0.1.0/src/quiverlab/citations/__init__.py +5 -0
- quiverlab-0.1.0/src/quiverlab/citations/bibliography.py +125 -0
- quiverlab-0.1.0/src/quiverlab/citations/references.bib +420 -0
- quiverlab-0.1.0/src/quiverlab/citations/registry.py +275 -0
- quiverlab-0.1.0/src/quiverlab/combinat/__init__.py +2 -0
- quiverlab-0.1.0/src/quiverlab/combinat/quiver.py +108 -0
- quiverlab-0.1.0/src/quiverlab/combinat/relations.py +199 -0
- quiverlab-0.1.0/src/quiverlab/core/__init__.py +2 -0
- quiverlab-0.1.0/src/quiverlab/core/algebra.py +678 -0
- quiverlab-0.1.0/src/quiverlab/core/monomial.py +158 -0
- quiverlab-0.1.0/src/quiverlab/engine/__init__.py +13 -0
- quiverlab-0.1.0/src/quiverlab/engine/_kernels.py +276 -0
- quiverlab-0.1.0/src/quiverlab/engine/adapter.py +84 -0
- quiverlab-0.1.0/src/quiverlab/engine/bimodule.py +297 -0
- quiverlab-0.1.0/src/quiverlab/engine/coxeter.py +373 -0
- quiverlab-0.1.0/src/quiverlab/engine/coxeter2.py +241 -0
- quiverlab-0.1.0/src/quiverlab/engine/coxeter_spectrum.py +259 -0
- quiverlab-0.1.0/src/quiverlab/engine/cyclic.py +271 -0
- quiverlab-0.1.0/src/quiverlab/engine/deepen.py +236 -0
- quiverlab-0.1.0/src/quiverlab/engine/hh_engine.py +323 -0
- quiverlab-0.1.0/src/quiverlab/engine/linalg_fast.py +102 -0
- quiverlab-0.1.0/src/quiverlab/engine/resolutions.py +112 -0
- quiverlab-0.1.0/src/quiverlab/engine/resolutions_bardzell.py +472 -0
- quiverlab-0.1.0/src/quiverlab/engine/resolutions_minimal.py +1029 -0
- quiverlab-0.1.0/src/quiverlab/engine/resolutions_periodic.py +96 -0
- quiverlab-0.1.0/src/quiverlab/engine/scan2.py +430 -0
- quiverlab-0.1.0/src/quiverlab/engine/scan3.py +136 -0
- quiverlab-0.1.0/src/quiverlab/engine/tt_calculus.py +339 -0
- quiverlab-0.1.0/src/quiverlab/errors.py +40 -0
- quiverlab-0.1.0/src/quiverlab/families/__init__.py +16 -0
- quiverlab-0.1.0/src/quiverlab/families/basic.py +22 -0
- quiverlab-0.1.0/src/quiverlab/families/discover.py +79 -0
- quiverlab-0.1.0/src/quiverlab/families/dynkin.py +58 -0
- quiverlab-0.1.0/src/quiverlab/families/exterior.py +16 -0
- quiverlab-0.1.0/src/quiverlab/families/incidence.py +35 -0
- quiverlab-0.1.0/src/quiverlab/families/nakayama.py +70 -0
- quiverlab-0.1.0/src/quiverlab/families/path_algebra.py +13 -0
- quiverlab-0.1.0/src/quiverlab/families/poset.py +51 -0
- quiverlab-0.1.0/src/quiverlab/families/preprojective.py +116 -0
- quiverlab-0.1.0/src/quiverlab/families/quantum.py +67 -0
- quiverlab-0.1.0/src/quiverlab/families/radical_square_zero.py +9 -0
- quiverlab-0.1.0/src/quiverlab/families/tensor.py +52 -0
- quiverlab-0.1.0/src/quiverlab/families/trivial_extension.py +327 -0
- quiverlab-0.1.0/src/quiverlab/families/truncated.py +30 -0
- quiverlab-0.1.0/src/quiverlab/families/zoo.py +72 -0
- quiverlab-0.1.0/src/quiverlab/families/zoo_catalog.json +6280 -0
- quiverlab-0.1.0/src/quiverlab/fields/__init__.py +6 -0
- quiverlab-0.1.0/src/quiverlab/fields/complexfield.py +137 -0
- quiverlab-0.1.0/src/quiverlab/fields/conway.py +32 -0
- quiverlab-0.1.0/src/quiverlab/fields/domain.py +132 -0
- quiverlab-0.1.0/src/quiverlab/fields/finitefield.py +149 -0
- quiverlab-0.1.0/src/quiverlab/fields/gaussian.py +50 -0
- quiverlab-0.1.0/src/quiverlab/fields/linalg.py +87 -0
- quiverlab-0.1.0/src/quiverlab/fields/primefield.py +51 -0
- quiverlab-0.1.0/src/quiverlab/fields/rationals.py +38 -0
- quiverlab-0.1.0/src/quiverlab/groebner/__init__.py +13 -0
- quiverlab-0.1.0/src/quiverlab/groebner/certificate.py +42 -0
- quiverlab-0.1.0/src/quiverlab/groebner/complete.py +80 -0
- quiverlab-0.1.0/src/quiverlab/groebner/events.py +26 -0
- quiverlab-0.1.0/src/quiverlab/groebner/lower.py +52 -0
- quiverlab-0.1.0/src/quiverlab/groebner/order.py +74 -0
- quiverlab-0.1.0/src/quiverlab/groebner/overlap.py +63 -0
- quiverlab-0.1.0/src/quiverlab/groebner/reduction.py +99 -0
- quiverlab-0.1.0/src/quiverlab/groebner/system.py +90 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/__init__.py +3 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/bar.py +152 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/basis_reps.py +165 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/cyclic.py +165 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/cyclic_reps.py +174 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/hh_reps.py +193 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/products.py +454 -0
- quiverlab-0.1.0/src/quiverlab/hochschild/table.py +31 -0
- quiverlab-0.1.0/src/quiverlab/hpc/__init__.py +24 -0
- quiverlab-0.1.0/src/quiverlab/hpc/__main__.py +8 -0
- quiverlab-0.1.0/src/quiverlab/hpc/cli.py +456 -0
- quiverlab-0.1.0/src/quiverlab/hpc/deepen_runner.py +62 -0
- quiverlab-0.1.0/src/quiverlab/hpc/report.py +682 -0
- quiverlab-0.1.0/src/quiverlab/hpc/resources.py +296 -0
- quiverlab-0.1.0/src/quiverlab/hpc/spec.py +1745 -0
- quiverlab-0.1.0/src/quiverlab/invariants/__init__.py +1 -0
- quiverlab-0.1.0/src/quiverlab/invariants/betti.py +71 -0
- quiverlab-0.1.0/src/quiverlab/invariants/cartan.py +71 -0
- quiverlab-0.1.0/src/quiverlab/invariants/frobenius.py +314 -0
- quiverlab-0.1.0/src/quiverlab/invariants/pathbasis.py +58 -0
- quiverlab-0.1.0/src/quiverlab/invariants/scalar.py +119 -0
- quiverlab-0.1.0/src/quiverlab/invariants/spectral.py +149 -0
- quiverlab-0.1.0/src/quiverlab/invariants/sweep.py +65 -0
- quiverlab-0.1.0/src/quiverlab/modules/__init__.py +6 -0
- quiverlab-0.1.0/src/quiverlab/modules/builders.py +92 -0
- quiverlab-0.1.0/src/quiverlab/modules/complex_reps.py +542 -0
- quiverlab-0.1.0/src/quiverlab/modules/decompose.py +396 -0
- quiverlab-0.1.0/src/quiverlab/modules/duality.py +117 -0
- quiverlab-0.1.0/src/quiverlab/modules/ext.py +115 -0
- quiverlab-0.1.0/src/quiverlab/modules/ext_algebra.py +666 -0
- quiverlab-0.1.0/src/quiverlab/modules/hom.py +212 -0
- quiverlab-0.1.0/src/quiverlab/modules/injective.py +83 -0
- quiverlab-0.1.0/src/quiverlab/modules/koszul.py +505 -0
- quiverlab-0.1.0/src/quiverlab/modules/linalg_mod.py +139 -0
- quiverlab-0.1.0/src/quiverlab/modules/module.py +327 -0
- quiverlab-0.1.0/src/quiverlab/modules/opposite.py +67 -0
- quiverlab-0.1.0/src/quiverlab/modules/qpa_module.py +186 -0
- quiverlab-0.1.0/src/quiverlab/modules/radtopsoc.py +121 -0
- quiverlab-0.1.0/src/quiverlab/modules/resolution.py +172 -0
- quiverlab-0.1.0/src/quiverlab/modules/tor.py +181 -0
- quiverlab-0.1.0/src/quiverlab/modules/yoneda.py +373 -0
- quiverlab-0.1.0/src/quiverlab/qpa/__init__.py +7 -0
- quiverlab-0.1.0/src/quiverlab/qpa/crosscheck.py +377 -0
- quiverlab-0.1.0/src/quiverlab/qpa/scripts.py +262 -0
- quiverlab-0.1.0/src/quiverlab/qpa/session.py +108 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/__init__.py +33 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/_fieldshim.py +22 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/aarith.py +49 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/ambiguities.py +59 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/build.py +17 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/cap.py +108 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/comparison.py +833 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/cup.py +106 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/diagonal.py +325 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/engine_facade.py +79 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/homology.py +173 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/pelt.py +69 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/products.py +113 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/resolution.py +247 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/terms.py +19 -0
- quiverlab-0.1.0/src/quiverlab/resolutions_cs/trace.py +42 -0
- quiverlab-0.1.0/src/quiverlab/trace/__init__.py +17 -0
- quiverlab-0.1.0/src/quiverlab/trace/events.py +249 -0
- quiverlab-0.1.0/src/quiverlab/trace/interpretations.py +292 -0
- quiverlab-0.1.0/src/quiverlab/trace/json_guide.py +221 -0
- quiverlab-0.1.0/src/quiverlab/trace/modules.py +876 -0
- quiverlab-0.1.0/src/quiverlab/trace/products.py +619 -0
- quiverlab-0.1.0/src/quiverlab/trace/provenance.py +88 -0
- quiverlab-0.1.0/src/quiverlab/trace/recorder.py +163 -0
- quiverlab-0.1.0/src/quiverlab/trace/render_html.py +2200 -0
- quiverlab-0.1.0/src/quiverlab/trace/render_json.py +123 -0
- quiverlab-0.1.0/src/quiverlab/trace/render_text.py +286 -0
- quiverlab-0.1.0/src/quiverlab/trace/results_html.py +661 -0
- quiverlab-0.1.0/src/quiverlab/trace/writer.py +176 -0
- quiverlab-0.1.0/src/quiverlab/viz/__init__.py +16 -0
- quiverlab-0.1.0/src/quiverlab/viz/draw.py +77 -0
- quiverlab-0.1.0/src/quiverlab/viz/layout.py +159 -0
- quiverlab-0.1.0/src/quiverlab/viz/tikz.py +40 -0
- quiverlab-0.1.0/src/quiverlab.egg-info/PKG-INFO +603 -0
- quiverlab-0.1.0/src/quiverlab.egg-info/SOURCES.txt +159 -0
- quiverlab-0.1.0/src/quiverlab.egg-info/dependency_links.txt +1 -0
- quiverlab-0.1.0/src/quiverlab.egg-info/entry_points.txt +2 -0
- quiverlab-0.1.0/src/quiverlab.egg-info/requires.txt +36 -0
- quiverlab-0.1.0/src/quiverlab.egg-info/top_level.txt +1 -0
- quiverlab-0.1.0/tests/test_errors.py +21 -0
- quiverlab-0.1.0/tests/test_no_floats.py +305 -0
- quiverlab-0.1.0/tests/test_quickstart.py +41 -0
quiverlab-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Marco Armenta
|
|
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.
|
quiverlab-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: quiverlab
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Exact representation theory of quivers with relations, for algebraists: modules and AR theory, resolutions, Ext-algebras, Hochschild and cyclic (co)homology, invariants
|
|
5
|
+
Author-email: Marco Armenta <drmarcoarmenta@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://marcoarmenta.github.io/quiverlab/
|
|
8
|
+
Project-URL: Documentation, https://marcoarmenta.github.io/quiverlab/
|
|
9
|
+
Project-URL: Repository, https://github.com/MarcoArmenta/quiverlab
|
|
10
|
+
Project-URL: Issues, https://github.com/MarcoArmenta/quiverlab/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/MarcoArmenta/quiverlab/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: quiver,path algebra,Hochschild cohomology,Gerstenhaber bracket,representation theory,homological algebra,exact arithmetic
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Operating System :: OS Independent
|
|
22
|
+
Classifier: Typing :: Typed
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: numpy>=1.21
|
|
27
|
+
Requires-Dist: sympy>=1.12
|
|
28
|
+
Requires-Dist: matplotlib>=3.7
|
|
29
|
+
Provides-Extra: fast
|
|
30
|
+
Requires-Dist: numba>=0.64; extra == "fast"
|
|
31
|
+
Provides-Extra: hpc
|
|
32
|
+
Requires-Dist: pyyaml>=6; extra == "hpc"
|
|
33
|
+
Provides-Extra: web
|
|
34
|
+
Requires-Dist: fastapi>=0.115; extra == "web"
|
|
35
|
+
Requires-Dist: uvicorn[standard]>=0.30; extra == "web"
|
|
36
|
+
Requires-Dist: jinja2>=3.1; extra == "web"
|
|
37
|
+
Requires-Dist: python-ulid>=2.7; extra == "web"
|
|
38
|
+
Requires-Dist: pydantic>=2.7; extra == "web"
|
|
39
|
+
Provides-Extra: qpa
|
|
40
|
+
Requires-Dist: passagemath-gap[qpa]>=10.8; sys_platform != "win32" and extra == "qpa"
|
|
41
|
+
Provides-Extra: docs
|
|
42
|
+
Requires-Dist: mkdocs-material>=9.5; extra == "docs"
|
|
43
|
+
Requires-Dist: mkdocstrings[python]>=0.26; extra == "docs"
|
|
44
|
+
Requires-Dist: mkdocs-jupyter>=0.25; extra == "docs"
|
|
45
|
+
Requires-Dist: mkdocs-gen-files>=0.5; extra == "docs"
|
|
46
|
+
Requires-Dist: mkdocs-literate-nav>=0.6; extra == "docs"
|
|
47
|
+
Requires-Dist: mkdocs-section-index>=0.3; extra == "docs"
|
|
48
|
+
Requires-Dist: mike>=2.1; extra == "docs"
|
|
49
|
+
Provides-Extra: dev
|
|
50
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
51
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
52
|
+
Requires-Dist: twine>=5.1; extra == "dev"
|
|
53
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
54
|
+
Dynamic: license-file
|
|
55
|
+
|
|
56
|
+
# QuiverLab
|
|
57
|
+
|
|
58
|
+
[](https://github.com/MarcoArmenta/quiverlab/actions/workflows/ci.yml)
|
|
59
|
+
[](https://marcoarmenta.github.io/quiverlab/)
|
|
60
|
+
[](https://marcoarmenta.github.io/quiverlab/verification/)
|
|
61
|
+
[](https://pypi.org/project/quiverlab/)
|
|
62
|
+
[](https://github.com/MarcoArmenta/quiverlab/blob/main/pyproject.toml)
|
|
63
|
+
[](LICENSE)
|
|
64
|
+
<!-- [](https://doi.org/<doi>) -->
|
|
65
|
+
|
|
66
|
+
# **Exact representation theory of quivers with relations, for algebraists**
|
|
67
|
+
Modules and Auslander–Reiten theory, resolutions, Ext-algebras and Koszulity,
|
|
68
|
+
Hochschild (co)homology with its calculus (cup, Gerstenhaber, cap, Connes), cyclic homology, and
|
|
69
|
+
Cartan/Coxeter/spectral invariants, all exactly.
|
|
70
|
+
|
|
71
|
+
## ⬇️ DOWNLOAD APPLICATION HERE
|
|
72
|
+
|
|
73
|
+
> ### **[⬇ Download the QuiverLab app](https://github.com/MarcoArmenta/quiverlab/releases/tag/app-latest)** — one file, no install, no code.
|
|
74
|
+
>
|
|
75
|
+
> Double-click it and the GUI opens in your browser: draw a quiver, pick a
|
|
76
|
+
> field, read exact results. Fully offline.
|
|
77
|
+
>
|
|
78
|
+
> | OS | Download |
|
|
79
|
+
> |---|---|
|
|
80
|
+
> | **macOS** (Apple Silicon: M1–M4) | [QuiverLab-macos-arm64.zip](https://github.com/MarcoArmenta/quiverlab/releases/download/app-latest/QuiverLab-macos-arm64.zip) |
|
|
81
|
+
> | **Windows** | [QuiverLab-windows.exe](https://github.com/MarcoArmenta/quiverlab/releases/download/app-latest/QuiverLab-windows.exe) |
|
|
82
|
+
> | **Linux** (x86-64) | [QuiverLab-linux-x86_64.tar.gz](https://github.com/MarcoArmenta/quiverlab/releases/download/app-latest/QuiverLab-linux-x86_64.tar.gz) |
|
|
83
|
+
>
|
|
84
|
+
> First-open notes (the app is not code-signed yet, so each OS warns **once**):
|
|
85
|
+
>
|
|
86
|
+
> **macOS** — unzip and double-click; when the *"Apple could not verify…"*
|
|
87
|
+
> dialog appears click **Done** (not "Move to Trash"), then System Settings →
|
|
88
|
+
> Privacy & Security → scroll to Security → **Open Anyway** → Open. (Terminal
|
|
89
|
+
> alternative: `xattr -d com.apple.quarantine ./QuiverLab`.)
|
|
90
|
+
>
|
|
91
|
+
> **Windows** — if
|
|
92
|
+
> SmartScreen appears, choose *More info* → *Run anyway*.
|
|
93
|
+
>
|
|
94
|
+
> **Linux** — `tar xzf`,
|
|
95
|
+
> then run `./QuiverLab`.
|
|
96
|
+
>
|
|
97
|
+
> **Intel Mac** — no one-file build (GitHub retired its
|
|
98
|
+
> Intel-mac builders); use
|
|
99
|
+
> `docker run -p 8000:8000 ghcr.io/marcoarmenta/quiverlab:latest gui`
|
|
100
|
+
> or the [pip path](https://marcoarmenta.github.io/quiverlab/offline-app/).
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
## The two metagoals
|
|
104
|
+
|
|
105
|
+
QuiverLab is built toward two long-term goals, and every release is measured
|
|
106
|
+
against them:
|
|
107
|
+
|
|
108
|
+
1. **No code required.** Every computation the library can do should be
|
|
109
|
+
reachable without writing a single line of code: draw the quiver and the
|
|
110
|
+
relations in the browser GUI, specify modules entry-by-entry in the no-code
|
|
111
|
+
panel, export a config file for a cluster, and read the results as rendered
|
|
112
|
+
mathematics (or a PDF report). Python is a power-user option, never a
|
|
113
|
+
prerequisite.
|
|
114
|
+
2. **Any computation done in representation theory.** The aim is that whatever
|
|
115
|
+
a representation theorist of finite-dimensional algebras computes in a paper
|
|
116
|
+
— homological invariants, module-theoretic constructions, Auslander–Reiten
|
|
117
|
+
data, Ext algebras, spectral/Coxeter data, and beyond — can be computed
|
|
118
|
+
here, exactly and with certified, oracle-tested results. The gap between
|
|
119
|
+
this goal and the current surface is tracked openly as the coverage program
|
|
120
|
+
in [`docs/plans/ROADMAP.md`](docs/plans/ROADMAP.md); if your computation is
|
|
121
|
+
missing, it belongs on that list.
|
|
122
|
+
|
|
123
|
+
QuiverLab computes with finite-dimensional algebras `kQ/I` over the complex numbers
|
|
124
|
+
(exactly — no floating point, ever) and over all finite fields: certified
|
|
125
|
+
finite-dimensionality, Hochschild (co)homology with cup products and Gerstenhaber
|
|
126
|
+
brackets, the first full Chouhy–Solotar resolution, module Ext, and Cartan/Coxeter
|
|
127
|
+
invariants. Floats fail loudly by design.
|
|
128
|
+
|
|
129
|
+
## Get QuiverLab
|
|
130
|
+
|
|
131
|
+
Most users want one of these, in this order:
|
|
132
|
+
|
|
133
|
+
**1. Download the desktop app** — one file, double-click it, and the zero-code
|
|
134
|
+
GUI opens in your browser on localhost, fully offline, using your machine's
|
|
135
|
+
real cores and RAM. Grab the binary for your OS from the
|
|
136
|
+
[**download box at the top of this page**](#️-download-application-here)
|
|
137
|
+
(macOS / Windows / Linux), which also carries the one-time first-open steps for
|
|
138
|
+
the unsigned binaries.
|
|
139
|
+
|
|
140
|
+
**2. Download the containerized application** — one image, the full exact
|
|
141
|
+
engine, no Python setup (registry paths are lowercase-only):
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
docker pull ghcr.io/marcoarmenta/quiverlab:latest # or: apptainer pull quiverlab.sif docker://ghcr.io/marcoarmenta/quiverlab:latest
|
|
145
|
+
docker run --rm -p 8000:8000 ghcr.io/marcoarmenta/quiverlab:latest gui
|
|
146
|
+
# open http://localhost:8000 — the zero-code GUI, fully offline, using your
|
|
147
|
+
# machine's cores and RAM. The same image runs batch configs; see
|
|
148
|
+
# "Writing and running config files" below.
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**3. Clone the repo and build the container yourself:**
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
git clone https://github.com/MarcoArmenta/quiverlab.git && cd quiverlab
|
|
155
|
+
docker build -f container/Dockerfile -t quiverlab:local .
|
|
156
|
+
docker run --rm -p 8000:8000 quiverlab:local gui
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**4. Use the web interface** — the self-hostable server tier (`webapp/`):
|
|
160
|
+
instant answers for small examples, queued jobs with permalinks for deep ones,
|
|
161
|
+
and a shared exact-result cache — see [Web interface](#web-interface).
|
|
162
|
+
|
|
163
|
+
**5. Prefer code?** - Python-library installs and SLURM clusters are covered
|
|
164
|
+
[at the bottom](#install-the-python-library).
|
|
165
|
+
|
|
166
|
+
## Three lines to a Hochschild table
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from quiverlab import Quiver, CC
|
|
170
|
+
|
|
171
|
+
Q = Quiver(vertices=[1, 2, 3], arrows={"a": (1, 2), "b": (2, 3), "c": (1, 3)})
|
|
172
|
+
print(Q.algebra(relations=["a*b"], field=CC).hochschild_cohomology(3))
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Learn more
|
|
176
|
+
|
|
177
|
+
- **Documentation:** <https://marcoarmenta.github.io/quiverlab/>
|
|
178
|
+
- **Tutorials:** [executable notebooks](docs/tutorials/) — start here.
|
|
179
|
+
- **Under the hood:** [internals chapters](docs/internals/) — how each number is produced.
|
|
180
|
+
- **No-code interfaces:** the containerized app ships an offline GUI (`quiverlab-hpc gui`), and the self-hostable server tier (`webapp/`) adds queued and email-verified big jobs — see [Web interface](#web-interface).
|
|
181
|
+
- **Cite:** see the JOSS paper (`paper/paper.md`) and [`CITATION.cff`](CITATION.cff).
|
|
182
|
+
|
|
183
|
+
## The classic characteristic pathology, in one loop
|
|
184
|
+
|
|
185
|
+
```python
|
|
186
|
+
from quiverlab import truncated_polynomial, CC, GF
|
|
187
|
+
|
|
188
|
+
for field in (CC, GF(2), GF(3)):
|
|
189
|
+
print(field, truncated_polynomial(2, field=field).hochschild_cohomology(4).dims)
|
|
190
|
+
# CC [2, 1, 1, 1, 1]
|
|
191
|
+
# GF(2) [2, 2, 2, 2, 2]
|
|
192
|
+
# GF(3) [2, 1, 1, 1, 1]
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## General quivers with relations (kQ/I)
|
|
196
|
+
|
|
197
|
+
```python
|
|
198
|
+
from quiverlab import Quiver, CC
|
|
199
|
+
|
|
200
|
+
Q = Quiver(vertices=[1, 2, 3, 4],
|
|
201
|
+
arrows={"a": (1, 2), "b": (2, 4), "c": (1, 3), "d": (3, 4)})
|
|
202
|
+
A = Q.algebra(relations=["a*b - c*d"], field=CC) # commutative square, exact
|
|
203
|
+
print(A.dim) # 9
|
|
204
|
+
print(A.hochschild_cohomology(1)) # HH^0 = 1 HH^1 = 0
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Non-monomial relations are completed with an exact noncommutative Gröbner
|
|
208
|
+
(Buchberger–Mora overlap) engine and certified finite-dimensional; a
|
|
209
|
+
non-admissible or infinite presentation fails loudly with `AdmissibilityError`
|
|
210
|
+
or `NotFiniteDimensionalError`, never a hang.
|
|
211
|
+
|
|
212
|
+
## Modules and invariants
|
|
213
|
+
|
|
214
|
+
```python
|
|
215
|
+
from quiverlab import Quiver, CC
|
|
216
|
+
|
|
217
|
+
A = Quiver([1, 2, 3, 4], {"a": (1, 2), "b": (2, 4), "c": (1, 3), "d": (3, 4)}
|
|
218
|
+
).algebra(relations=["a*b - c*d"], field=CC) # commutative square
|
|
219
|
+
|
|
220
|
+
S1, S4 = A.simple(1), A.simple(4)
|
|
221
|
+
A.projective(1).dimension_vector() # {1: 1, 2: 1, 3: 1, 4: 1}
|
|
222
|
+
A.ext(S1, S4, 2) # 1 (Ext^2 of simples)
|
|
223
|
+
int(A.global_dimension()) # 2
|
|
224
|
+
A.loewy_length() # 3
|
|
225
|
+
A.simple(1).projective_resolution(4) # P_1 <- P_2(+)P_3 <- P_4 <- 0
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Every module is a right A-module over the stated exact field; Ext, Hom, and the
|
|
229
|
+
projective resolution are exact. Exact `spectral_radius`/`mahler_measure`, `center()`,
|
|
230
|
+
`complexity()` (a lower-bound estimate — can under-report, exact only on local /
|
|
231
|
+
single-vertex inputs), and `sweep()` (invariant × field) round out the invariant surface.
|
|
232
|
+
|
|
233
|
+
## Families and citations
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from quiverlab import NakayamaAlgebra, QuantumCI, families, bibliography
|
|
237
|
+
|
|
238
|
+
A = NakayamaAlgebra([3, 2, 2]) # cyclic Nakayama, dim 7
|
|
239
|
+
print(A.hochschild_cohomology(0)) # HH^0 = 1
|
|
240
|
+
print(A.citations()) # ('nakayama', 'assem_book', 'bar')
|
|
241
|
+
|
|
242
|
+
print(families()) # the whole v1 catalog with signatures
|
|
243
|
+
print(bibliography(A.citations())) # grouped, annotated references
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## How quiverlab is verified
|
|
247
|
+
|
|
248
|
+
Every shipped feature is unit tested (the suite is 2772 tests over the
|
|
249
|
+
`[dev,fast,docs,web,qpa,hpc]` extras), and the mathematics is pinned by **two classes
|
|
250
|
+
of oracle** — surfaced since Plan 32 as four orthogonal, runnable marker classes
|
|
251
|
+
(`oracle_literature` / `oracle_crossengine` / `oracle_selfcert` / `qpa`), audited
|
|
252
|
+
against live collection:
|
|
253
|
+
|
|
254
|
+
- **Theory and literature, on constructed examples.** We build many algebras the
|
|
255
|
+
literature (or a theorem we know) has already resolved and assert quiverlab
|
|
256
|
+
reproduces the published value exactly — Happel's hereditary vanishing, the
|
|
257
|
+
Buchweitz–Green–Madsen–Solberg / Bergh–Erdmann quantum complete intersection,
|
|
258
|
+
the classical `k[x]/(x^n)` and Künneth commutative-CI values, and more. Where no
|
|
259
|
+
single published vector is at hand we cross-check an *independent* path in the
|
|
260
|
+
library and say so inline. The read-only hanlab bank supplies byte-level
|
|
261
|
+
closed-form oracles.
|
|
262
|
+
- **Cross-engine and external agreement.** The bar complex, the minimal `A^e`,
|
|
263
|
+
Bardzell, and Chouhy–Solotar resolutions are independent engines; where two
|
|
264
|
+
overlap they must agree degreewise over the primes `{32003, 2, 3, 5}`. And
|
|
265
|
+
wherever the GAP package **QPA** implements a feature we recompute with it and
|
|
266
|
+
demand equality (`A.crosscheck(...)`). QPA does not implement everything
|
|
267
|
+
quiverlab does; the docs page names exactly where it is used and which theory
|
|
268
|
+
oracle stands in where it cannot.
|
|
269
|
+
|
|
270
|
+
Exactness is enforced structurally: an AST gate bans every float from `src/`, and
|
|
271
|
+
the entire deep suite runs twice in CI — once on the numba kernels, once on the
|
|
272
|
+
pure-Python path (`QUIVERLAB_NO_NUMBA=1`) — with the two required to agree exactly.
|
|
273
|
+
The full methodology, a subsystem → oracles → test-file table, the CI matrix, and
|
|
274
|
+
an honest-scope section live in **[How quiverlab is verified](https://marcoarmenta.github.io/quiverlab/verification/)**
|
|
275
|
+
(`docs/verification.md`).
|
|
276
|
+
|
|
277
|
+
## Status
|
|
278
|
+
|
|
279
|
+
Engine, module, and families phase (Plans 01–06 delivered, together with the
|
|
280
|
+
Plan-04 Chouhy–Solotar resolution). On top of the foundations — monomial presentations,
|
|
281
|
+
exact fields, bar-complex Hochschild (co)homology — the hanlab deep engine is now
|
|
282
|
+
ported and wired in:
|
|
283
|
+
|
|
284
|
+
- **A fast GF(p) engine** behind the field interface: `hochschild_cohomology`
|
|
285
|
+
and `hochschild_homology` take `engine="auto" | "bar" | "fast"`. `auto` picks
|
|
286
|
+
the numpy mod-p rank engine over prime fields and the exact bar path
|
|
287
|
+
everywhere else; both agree exactly where both can run. The fast engine still
|
|
288
|
+
builds the exponential bar basis, so it guards its depth loudly (raise
|
|
289
|
+
`max_cells` deliberately) — the depth *unlock* lives in the resolutions below.
|
|
290
|
+
- **Deep monomial resolutions.** The minimal (Bardzell) and periodic bimodule
|
|
291
|
+
resolutions reach degrees the bar complex never could — k[x]/(x^a) and cyclic
|
|
292
|
+
Nakayama to depth 40 instantly — and certify structural facts (a finite global
|
|
293
|
+
dimension shows up as vanishing generators), cross-checked exactly against the
|
|
294
|
+
bar oracle over primes {32003, 2, 3, 5} on the overlap range.
|
|
295
|
+
- **The Chouhy–Solotar resolution** (`resolutions_cs`, `engine="cs"`). The
|
|
296
|
+
domain-generic CS projective bimodule resolution for admissible kQ/I — its
|
|
297
|
+
HH•/HH^• dimensions and representative (co)cycles reach Hochschild degrees the
|
|
298
|
+
bar oracle cannot, with CS↔bar comparison maps; it specializes to Bardzell's
|
|
299
|
+
minimal resolution on monomial algebras (operation transport is certified
|
|
300
|
+
inside the bar-buildable window).
|
|
301
|
+
- **Tamarkin–Tsygan calculus**, as a public product surface: **cup/cap products,
|
|
302
|
+
the Gerstenhaber bracket, and the induced Connes differentials** on `HH^•`/`HH_•`
|
|
303
|
+
(`A.cup_products`, `A.cap_products`, `A.gerstenhaber_brackets`,
|
|
304
|
+
`A.connes_differentials`) — exact structure-constant tables on the recorded HH
|
|
305
|
+
basis, with worked-steps reports; plus **cyclic homology** (Connes' mixed complex).
|
|
306
|
+
- **Invariants:** the integer **Cartan** matrix, the **Coxeter** matrix and its
|
|
307
|
+
characteristic polynomial (all fields, exact via sympy); and, over GF(p), the
|
|
308
|
+
**Nakayama** automorphism with the **Frobenius** and **symmetric** tests
|
|
309
|
+
(loud `FieldError` off a prime field).
|
|
310
|
+
- **Modules, scalar invariants, and the exact spectral layer.** Right A-modules
|
|
311
|
+
with exact **Ext**, **Hom**, and minimal **projective resolutions**; the scalar
|
|
312
|
+
invariants **Loewy length**, **center**, and **complexity** (GF(p); the last a
|
|
313
|
+
lower-bound estimate that can under-report, exact only on local / single-vertex
|
|
314
|
+
inputs); and the
|
|
315
|
+
exact **spectral radius** / **Mahler measure** of the Coxeter polynomial as
|
|
316
|
+
sympy algebraic numbers — no floats, ever.
|
|
317
|
+
- **Algebra families and citations.** A curated catalog of named families
|
|
318
|
+
(`NakayamaAlgebra`, `QuantumCI`, `ExteriorAlgebra`, `IncidenceAlgebra`,
|
|
319
|
+
`PreprojectiveAlgebra`, `TrivialExtension`, `TensorProduct`, …) with `families()`
|
|
320
|
+
discovery and the `zoo` iterator, each stamped with the literature it comes from;
|
|
321
|
+
`A.citations()` and `bibliography(...)` resolve those keys to grouped, annotated
|
|
322
|
+
references, plus a batch scan surface for family sweeps.
|
|
323
|
+
- **Zero-code GUI** — the containerized app serves the full-engine GUI offline
|
|
324
|
+
on localhost (`quiverlab-hpc gui`), with your machine's real cores and RAM.
|
|
325
|
+
|
|
326
|
+
Everything is exact — no floating point, ever — and the full test suite runs
|
|
327
|
+
green on both the numba kernel path and the pure-Python path
|
|
328
|
+
(`QUIVERLAB_NO_NUMBA=1`).
|
|
329
|
+
|
|
330
|
+
Honest scope note: the calculus is now public as **structure-constant tables** over
|
|
331
|
+
the whole HH basis (`A.cup_products(top)` and friends). A classy `A.cup(u, v)` on
|
|
332
|
+
two *named* cohomology-class representatives still awaits the cohomology-classes
|
|
333
|
+
machinery of a later phase (see `docs/plans/ROADMAP.md`); and the Gerstenhaber
|
|
334
|
+
bracket is GF(p)-only and window-bounded.
|
|
335
|
+
|
|
336
|
+
Coming next (see `docs/plans/ROADMAP.md`): full operation transport, drawing and
|
|
337
|
+
TikZ export, worked-steps PDFs, and an optional QPA backend.
|
|
338
|
+
|
|
339
|
+
## Draw it, and read the worked steps
|
|
340
|
+
|
|
341
|
+
```python
|
|
342
|
+
from quiverlab import Quiver, CC
|
|
343
|
+
|
|
344
|
+
Q = Quiver(vertices=[1, 2, 3, 4],
|
|
345
|
+
arrows={"a": (1, 2), "b": (2, 4), "c": (1, 3), "d": (3, 4)})
|
|
346
|
+
A = Q.algebra(relations=["a*b - c*d"], field=CC)
|
|
347
|
+
|
|
348
|
+
A.draw(file="square.svg") # matplotlib PNG/SVG: loops, parallels, relations below
|
|
349
|
+
print(A.tikz()) # same layout, paste-into-paper TikZ
|
|
350
|
+
|
|
351
|
+
A.hochschild_cohomology(2) # writes quiverlab_traces/HHc_<hash>.pdf (or .html) and
|
|
352
|
+
# prints: Worked steps: quiverlab_traces/HHc_3f2a.pdf (N pp)
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Worked-steps documents are on by default (`quiverlab.verbose = True`); every claim
|
|
356
|
+
in them is a golden-file-tested equality with the value the engine computed. Turn
|
|
357
|
+
them off per call (`A.hochschild_cohomology(2, verbose=False)`) or globally
|
|
358
|
+
(`quiverlab.verbose = False`). Reports are delivered as a self-contained,
|
|
359
|
+
JavaScript-free HTML document (math shown as TeX source) plus an exact JSON event
|
|
360
|
+
stream; the browser's Print-to-PDF turns the HTML into a page-ready document when
|
|
361
|
+
one is needed.
|
|
362
|
+
|
|
363
|
+
## Web interface
|
|
364
|
+
|
|
365
|
+
A no-code web GUI (`webapp/`) exposes the library for algebraists who prefer not
|
|
366
|
+
to write Python: pick a family, a field, and invariants; read exact results with
|
|
367
|
+
rendered mathematics; download the worked-steps PDF. Small computations run
|
|
368
|
+
instantly; deep ones become queued jobs with a permalink; very large ones run as
|
|
369
|
+
email-verified **big jobs** (a single-use magic link; requires an outbound SMTP
|
|
370
|
+
relay, disabled otherwise). Every result carries a References block (the
|
|
371
|
+
literature the computation stands on, from the library's citations subsystem),
|
|
372
|
+
and `/literature` shows the full curated bibliography. The UI is bilingual
|
|
373
|
+
(English at `/`, Spanish at `/es/`) with a public feedback form at `/feedback`
|
|
374
|
+
(including a "suggest literature" category).
|
|
375
|
+
|
|
376
|
+
Results are cached: because every computation is exact and deterministic, a
|
|
377
|
+
previously computed example is never recomputed — an identical request is served
|
|
378
|
+
instantly from the cache, across users. Email verification gates only the *cost* of
|
|
379
|
+
computing a new big example, not access to the mathematics, so a big example that
|
|
380
|
+
someone already computed is served immediately, with no email needed.
|
|
381
|
+
|
|
382
|
+
Each finished computation exposes downloadable artifacts under
|
|
383
|
+
`/download/<job-id>/…`: `result.json` (exact dimensions, references, and a
|
|
384
|
+
copy-paste reproduction snippet), the worked-steps `trace.pdf` (or a
|
|
385
|
+
self-contained `trace_steps.html` when no LaTeX toolchain is present), and
|
|
386
|
+
`tikz.tex` when a drawing was requested. Every number is exact — the server never
|
|
387
|
+
approximates, and an out-of-scope request fails loudly rather than silently
|
|
388
|
+
truncating.
|
|
389
|
+
|
|
390
|
+
Run it locally:
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
pip install -e ".[web,fast]"
|
|
394
|
+
uvicorn webapp.server.app:create_app --factory --reload # terminal 1
|
|
395
|
+
python -m webapp.worker.run_loop # terminal 2
|
|
396
|
+
# open http://127.0.0.1:8000
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
The web tier is two processes sharing one SQLite database: the FastAPI app
|
|
400
|
+
(instant computations under a hard wall-time net; everything larger is enqueued)
|
|
401
|
+
and one or more worker loops (each job runs in a resource-capped subprocess). A
|
|
402
|
+
full-stack local smoke driving the real processes over HTTP lives at
|
|
403
|
+
[`scripts/webapp_smoke.py`](scripts/webapp_smoke.py); the equivalent flow runs
|
|
404
|
+
in-process (no ports) as `tests/webapp/test_acceptance.py`.
|
|
405
|
+
|
|
406
|
+
Deploy (DRAC Arbutus, Docker Compose + Caddy TLS): see
|
|
407
|
+
[`webapp/deploy/PROVISIONING.md`](webapp/deploy/PROVISIONING.md).
|
|
408
|
+
|
|
409
|
+
## HPC and offline use (container)
|
|
410
|
+
|
|
411
|
+
The same library ships as **one container** (`ghcr.io/marcoarmenta/quiverlab`) with
|
|
412
|
+
a `quiverlab-hpc` CLI, serving two stories from the one image.
|
|
413
|
+
|
|
414
|
+
**Run a big example on a SLURM cluster in 5 steps** (only `ssh`/`scp`/`sbatch`
|
|
415
|
+
needed; Apptainer is rootless):
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
apptainer pull quiverlab.sif docker://ghcr.io/marcoarmenta/quiverlab:latest # 1. pull
|
|
419
|
+
apptainer run quiverlab.sif sample-config > my-config.yaml # 2. config (or export from the GUI)
|
|
420
|
+
sbatch slurm/quiverlab-drac.sbatch my-config.yaml result.json # 3. submit
|
|
421
|
+
scp you@cluster:result.json . # 4. fetch
|
|
422
|
+
apptainer run --bind "$PWD" quiverlab.sif render result.json -o report.html # 5. render locally (HTML/JSON)
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
Very large examples become reachable via **atomic per-degree checkpoints**: a job
|
|
426
|
+
that runs out of wall time exits 75, requeues, and resumes from `$SCRATCH` on the
|
|
427
|
+
next submit — just `sbatch` again. **quiverlab is CPU-only** — request cores
|
|
428
|
+
(`--cpus-per-task`) and RAM (`--mem`), never a GPU; the arithmetic is exact
|
|
429
|
+
(integers mod p / rationals) and a GPU would sit idle. `quiverlab-hpc estimate
|
|
430
|
+
my-config.yaml` suggests the resources.
|
|
431
|
+
|
|
432
|
+
**Offline laptop app.** Pull the image once with internet, then run
|
|
433
|
+
`apptainer run quiverlab.sif gui` (or `docker run -p 8000:8000 … gui`) and open
|
|
434
|
+
`http://localhost:8000` — the zero-code GUI computes locally with no network, showing
|
|
435
|
+
your machine's detected cores/RAM, memory/time estimates, and the limits you are
|
|
436
|
+
computing under, and ships precomputed examples.
|
|
437
|
+
|
|
438
|
+
Full instructions: [Run on your HPC cluster](docs/hpc.md) and
|
|
439
|
+
[Offline laptop app](docs/offline-app.md).
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
## Writing and running config files (the containerized app)
|
|
443
|
+
|
|
444
|
+
Everything the container computes is driven by **one YAML document** — the same
|
|
445
|
+
schema the webapp and the browser GUI speak, so a config exported from the GUI
|
|
446
|
+
runs unchanged on a cluster. Run it with any of the three installs:
|
|
447
|
+
|
|
448
|
+
```bash
|
|
449
|
+
# Docker (make the output dir writable for the in-image uid first)
|
|
450
|
+
mkdir -p out && chmod 777 out
|
|
451
|
+
docker run --rm -v "$PWD:/cfg:ro" -v "$PWD/out:/out" quiverlab:local \
|
|
452
|
+
run /cfg/my-config.yaml -o /out/result.json
|
|
453
|
+
docker run --rm -v "$PWD/out:/out" quiverlab:local \
|
|
454
|
+
render /out/result.json -o /out/report.html --format html
|
|
455
|
+
|
|
456
|
+
# Apptainer (clusters; rootless)
|
|
457
|
+
apptainer run --bind "$PWD" quiverlab.sif run my-config.yaml -o result.json
|
|
458
|
+
apptainer run --bind "$PWD" quiverlab.sif render result.json -o report.html
|
|
459
|
+
|
|
460
|
+
# Plain pip install (no container)
|
|
461
|
+
pip install "quiverlab[fast,hpc]"
|
|
462
|
+
quiverlab-hpc run my-config.yaml -o result.json
|
|
463
|
+
quiverlab-hpc render result.json -o report.html
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
`quiverlab-hpc sample-config` prints an annotated template and
|
|
467
|
+
`quiverlab-hpc estimate my-config.yaml` suggests `--time/--cpus-per-task/--mem`
|
|
468
|
+
before you submit. The rendered report shows the quiver presentation (labeled
|
|
469
|
+
arrows), every requested invariant with rendered matrices, and a resources
|
|
470
|
+
footer (wall time, peak RSS, cores).
|
|
471
|
+
|
|
472
|
+
### Anatomy of a config
|
|
473
|
+
|
|
474
|
+
```yaml
|
|
475
|
+
schema: 2 # 1 = algebra-only; 2 required for module blocks
|
|
476
|
+
algebra: # EITHER a named family ...
|
|
477
|
+
kind: family
|
|
478
|
+
family: QuantumCI # discover names: python -c "import quiverlab; print(quiverlab.families())"
|
|
479
|
+
params: {q: 2, a: 2, b: 2}
|
|
480
|
+
field: {kind: GF, p: 32003, n: 1} # GF(p^n), or {kind: CC} for exact char 0
|
|
481
|
+
compute: # any subset; ranged kinds take "kind:lo..hi"
|
|
482
|
+
- "hh_cohomology:0..8"
|
|
483
|
+
- cartan
|
|
484
|
+
artifacts: {tikz: true} # optional; tikz.tex written beside result.json
|
|
485
|
+
hpc: # optional; CLI-only budgets
|
|
486
|
+
time_limit_s: 3600
|
|
487
|
+
max_mem_bytes: 4294967296
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
**Compute kinds.** Algebra-level: `hh_cohomology:lo..hi`, `hh_homology:lo..hi`,
|
|
491
|
+
`cartan`, `coxeter_polynomial`, `global_dimension`, `center`, `dimension`.
|
|
492
|
+
Module-level (need a `module` block, schema 2): `dimension_vector`,
|
|
493
|
+
`rad_top_soc`, `decompose`, `tau`, `tau_minus`, `projective_resolution:0..n`,
|
|
494
|
+
`injective_resolution:0..n`, `projective_dimension`, `injective_dimension`,
|
|
495
|
+
`ext:0..n` (needs `ext_target`), `tor:0..n` (needs `tor_target`, a **left**
|
|
496
|
+
module).
|
|
497
|
+
|
|
498
|
+
**Module blocks.** A module is either a builtin pick
|
|
499
|
+
(`module: {builtin: {kind: simple|projective|injective, vertex: 3, side: right}}`)
|
|
500
|
+
or an explicit representation: `dims` maps **string** vertex labels to
|
|
501
|
+
dimensions (missing vertices are 0), `maps` gives one `dim_target x dim_source`
|
|
502
|
+
matrix per arrow (arrows touching a 0-dimensional vertex may be omitted).
|
|
503
|
+
Entries are exact data — integers or fraction strings like `"1/2"`; floats are
|
|
504
|
+
refused loudly. `side: left` means a representation of the opposite quiver.
|
|
505
|
+
|
|
506
|
+
### Worked configs
|
|
507
|
+
|
|
508
|
+
A hereditary path algebra over **exact characteristic 0** — no proxy prime:
|
|
509
|
+
|
|
510
|
+
```yaml
|
|
511
|
+
schema: 1
|
|
512
|
+
algebra:
|
|
513
|
+
kind: family
|
|
514
|
+
family: PathAlgebra
|
|
515
|
+
params: {type_or_quiver: "A5"}
|
|
516
|
+
field: {kind: CC}
|
|
517
|
+
compute: [cartan, coxeter_polynomial, global_dimension, dimension]
|
|
518
|
+
# dim 15, gl.dim = 1 (exact), the A5 Coxeter polynomial
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
The exterior algebra in char 0 — Hochschild cohomology grows linearly:
|
|
522
|
+
|
|
523
|
+
```yaml
|
|
524
|
+
schema: 1
|
|
525
|
+
algebra:
|
|
526
|
+
kind: family
|
|
527
|
+
family: ExteriorAlgebra
|
|
528
|
+
params: {n: 2}
|
|
529
|
+
field: {kind: CC}
|
|
530
|
+
compute: ["hh_cohomology:0..4", center, dimension]
|
|
531
|
+
# HH^0..4 = [2, 4, 6, 8, 10]
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
A truncated path algebra over the **non-prime field GF(9)**:
|
|
535
|
+
|
|
536
|
+
```yaml
|
|
537
|
+
schema: 1
|
|
538
|
+
algebra:
|
|
539
|
+
kind: family
|
|
540
|
+
family: TruncatedPathAlgebra
|
|
541
|
+
params: {type_or_quiver: "A6", r: 3}
|
|
542
|
+
field: {kind: GF, p: 3, n: 2}
|
|
543
|
+
compute: [cartan, global_dimension, "hh_cohomology:0..4"]
|
|
544
|
+
# gl.dim = 3 (exact)
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
An **explicit quiver** (the Kronecker quiver, no relations) with a no-code
|
|
548
|
+
module given by matrices — the regular representation `R_2` (`a` acts by 1,
|
|
549
|
+
`b` by 2):
|
|
550
|
+
|
|
551
|
+
```yaml
|
|
552
|
+
schema: 2
|
|
553
|
+
algebra:
|
|
554
|
+
kind: quiver
|
|
555
|
+
vertices: [1, 2]
|
|
556
|
+
arrows: {a: [1, 2], b: [1, 2]}
|
|
557
|
+
relations: []
|
|
558
|
+
field: {kind: GF, p: 5, n: 1}
|
|
559
|
+
compute: [dimension, cartan, global_dimension, dimension_vector,
|
|
560
|
+
rad_top_soc, decompose, tau, "projective_resolution:0..3"]
|
|
561
|
+
module:
|
|
562
|
+
side: right
|
|
563
|
+
dims: {"1": 1, "2": 1}
|
|
564
|
+
maps:
|
|
565
|
+
a: [[1]]
|
|
566
|
+
b: [[2]]
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
An explicit quiver with a **non-monomial relation** — the commutative square,
|
|
570
|
+
over CC:
|
|
571
|
+
|
|
572
|
+
```yaml
|
|
573
|
+
schema: 1
|
|
574
|
+
algebra:
|
|
575
|
+
kind: quiver
|
|
576
|
+
vertices: [1, 2, 3, 4]
|
|
577
|
+
arrows: {a: [1, 2], b: [1, 3], c: [2, 4], d: [3, 4]}
|
|
578
|
+
relations: ["a*c - b*d"]
|
|
579
|
+
field: {kind: CC}
|
|
580
|
+
compute: [dimension, global_dimension, center, "hh_cohomology:0..3"]
|
|
581
|
+
# dim 9, gl.dim = 2 (exact)
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
Larger ready-to-run configs live in
|
|
585
|
+
[`container/examples/`](container/examples/): the quantum complete intersection
|
|
586
|
+
with the full invariant surface ([`qci-q2.yaml`](container/examples/qci-q2.yaml)),
|
|
587
|
+
a cyclic Nakayama algebra with a decomposable module
|
|
588
|
+
([`nakayama-kz4.yaml`](container/examples/nakayama-kz4.yaml)), the 3x3
|
|
589
|
+
commutative grid with interior modules paired by the Auslander-Reiten
|
|
590
|
+
translate — `Ext^1(M, tau M) = 1` ([`grid3x3.yaml`](container/examples/grid3x3.yaml)),
|
|
591
|
+
and a dim-220 deep-degree run ([`nakayama-kz20-deep.yaml`](container/examples/nakayama-kz20-deep.yaml)).
|
|
592
|
+
Every one computes byte-identically in the container and from the wheel.
|
|
593
|
+
|
|
594
|
+
## Install the Python library
|
|
595
|
+
|
|
596
|
+
```bash
|
|
597
|
+
pip install quiverlab # pure-Python core, no external systems
|
|
598
|
+
pip install "quiverlab[fast]" # + numba GF(p) acceleration (optional)
|
|
599
|
+
pip install "quiverlab[qpa]" # + GAP/QPA cross-check backend (macOS/Linux)
|
|
600
|
+
pip install "quiverlab[fast,hpc]" # + the quiverlab-hpc CLI (configs, reports)
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
MIT © 2026 Marco Armenta
|