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.
Files changed (161) hide show
  1. quiverlab-0.1.0/LICENSE +21 -0
  2. quiverlab-0.1.0/PKG-INFO +603 -0
  3. quiverlab-0.1.0/README.md +548 -0
  4. quiverlab-0.1.0/pyproject.toml +110 -0
  5. quiverlab-0.1.0/setup.cfg +4 -0
  6. quiverlab-0.1.0/src/quiverlab/__init__.py +42 -0
  7. quiverlab-0.1.0/src/quiverlab/batch/__init__.py +20 -0
  8. quiverlab-0.1.0/src/quiverlab/batch/builders.py +68 -0
  9. quiverlab-0.1.0/src/quiverlab/batch/db.py +157 -0
  10. quiverlab-0.1.0/src/quiverlab/batch/scan.py +257 -0
  11. quiverlab-0.1.0/src/quiverlab/citations/__init__.py +5 -0
  12. quiverlab-0.1.0/src/quiverlab/citations/bibliography.py +125 -0
  13. quiverlab-0.1.0/src/quiverlab/citations/references.bib +420 -0
  14. quiverlab-0.1.0/src/quiverlab/citations/registry.py +275 -0
  15. quiverlab-0.1.0/src/quiverlab/combinat/__init__.py +2 -0
  16. quiverlab-0.1.0/src/quiverlab/combinat/quiver.py +108 -0
  17. quiverlab-0.1.0/src/quiverlab/combinat/relations.py +199 -0
  18. quiverlab-0.1.0/src/quiverlab/core/__init__.py +2 -0
  19. quiverlab-0.1.0/src/quiverlab/core/algebra.py +678 -0
  20. quiverlab-0.1.0/src/quiverlab/core/monomial.py +158 -0
  21. quiverlab-0.1.0/src/quiverlab/engine/__init__.py +13 -0
  22. quiverlab-0.1.0/src/quiverlab/engine/_kernels.py +276 -0
  23. quiverlab-0.1.0/src/quiverlab/engine/adapter.py +84 -0
  24. quiverlab-0.1.0/src/quiverlab/engine/bimodule.py +297 -0
  25. quiverlab-0.1.0/src/quiverlab/engine/coxeter.py +373 -0
  26. quiverlab-0.1.0/src/quiverlab/engine/coxeter2.py +241 -0
  27. quiverlab-0.1.0/src/quiverlab/engine/coxeter_spectrum.py +259 -0
  28. quiverlab-0.1.0/src/quiverlab/engine/cyclic.py +271 -0
  29. quiverlab-0.1.0/src/quiverlab/engine/deepen.py +236 -0
  30. quiverlab-0.1.0/src/quiverlab/engine/hh_engine.py +323 -0
  31. quiverlab-0.1.0/src/quiverlab/engine/linalg_fast.py +102 -0
  32. quiverlab-0.1.0/src/quiverlab/engine/resolutions.py +112 -0
  33. quiverlab-0.1.0/src/quiverlab/engine/resolutions_bardzell.py +472 -0
  34. quiverlab-0.1.0/src/quiverlab/engine/resolutions_minimal.py +1029 -0
  35. quiverlab-0.1.0/src/quiverlab/engine/resolutions_periodic.py +96 -0
  36. quiverlab-0.1.0/src/quiverlab/engine/scan2.py +430 -0
  37. quiverlab-0.1.0/src/quiverlab/engine/scan3.py +136 -0
  38. quiverlab-0.1.0/src/quiverlab/engine/tt_calculus.py +339 -0
  39. quiverlab-0.1.0/src/quiverlab/errors.py +40 -0
  40. quiverlab-0.1.0/src/quiverlab/families/__init__.py +16 -0
  41. quiverlab-0.1.0/src/quiverlab/families/basic.py +22 -0
  42. quiverlab-0.1.0/src/quiverlab/families/discover.py +79 -0
  43. quiverlab-0.1.0/src/quiverlab/families/dynkin.py +58 -0
  44. quiverlab-0.1.0/src/quiverlab/families/exterior.py +16 -0
  45. quiverlab-0.1.0/src/quiverlab/families/incidence.py +35 -0
  46. quiverlab-0.1.0/src/quiverlab/families/nakayama.py +70 -0
  47. quiverlab-0.1.0/src/quiverlab/families/path_algebra.py +13 -0
  48. quiverlab-0.1.0/src/quiverlab/families/poset.py +51 -0
  49. quiverlab-0.1.0/src/quiverlab/families/preprojective.py +116 -0
  50. quiverlab-0.1.0/src/quiverlab/families/quantum.py +67 -0
  51. quiverlab-0.1.0/src/quiverlab/families/radical_square_zero.py +9 -0
  52. quiverlab-0.1.0/src/quiverlab/families/tensor.py +52 -0
  53. quiverlab-0.1.0/src/quiverlab/families/trivial_extension.py +327 -0
  54. quiverlab-0.1.0/src/quiverlab/families/truncated.py +30 -0
  55. quiverlab-0.1.0/src/quiverlab/families/zoo.py +72 -0
  56. quiverlab-0.1.0/src/quiverlab/families/zoo_catalog.json +6280 -0
  57. quiverlab-0.1.0/src/quiverlab/fields/__init__.py +6 -0
  58. quiverlab-0.1.0/src/quiverlab/fields/complexfield.py +137 -0
  59. quiverlab-0.1.0/src/quiverlab/fields/conway.py +32 -0
  60. quiverlab-0.1.0/src/quiverlab/fields/domain.py +132 -0
  61. quiverlab-0.1.0/src/quiverlab/fields/finitefield.py +149 -0
  62. quiverlab-0.1.0/src/quiverlab/fields/gaussian.py +50 -0
  63. quiverlab-0.1.0/src/quiverlab/fields/linalg.py +87 -0
  64. quiverlab-0.1.0/src/quiverlab/fields/primefield.py +51 -0
  65. quiverlab-0.1.0/src/quiverlab/fields/rationals.py +38 -0
  66. quiverlab-0.1.0/src/quiverlab/groebner/__init__.py +13 -0
  67. quiverlab-0.1.0/src/quiverlab/groebner/certificate.py +42 -0
  68. quiverlab-0.1.0/src/quiverlab/groebner/complete.py +80 -0
  69. quiverlab-0.1.0/src/quiverlab/groebner/events.py +26 -0
  70. quiverlab-0.1.0/src/quiverlab/groebner/lower.py +52 -0
  71. quiverlab-0.1.0/src/quiverlab/groebner/order.py +74 -0
  72. quiverlab-0.1.0/src/quiverlab/groebner/overlap.py +63 -0
  73. quiverlab-0.1.0/src/quiverlab/groebner/reduction.py +99 -0
  74. quiverlab-0.1.0/src/quiverlab/groebner/system.py +90 -0
  75. quiverlab-0.1.0/src/quiverlab/hochschild/__init__.py +3 -0
  76. quiverlab-0.1.0/src/quiverlab/hochschild/bar.py +152 -0
  77. quiverlab-0.1.0/src/quiverlab/hochschild/basis_reps.py +165 -0
  78. quiverlab-0.1.0/src/quiverlab/hochschild/cyclic.py +165 -0
  79. quiverlab-0.1.0/src/quiverlab/hochschild/cyclic_reps.py +174 -0
  80. quiverlab-0.1.0/src/quiverlab/hochschild/hh_reps.py +193 -0
  81. quiverlab-0.1.0/src/quiverlab/hochschild/products.py +454 -0
  82. quiverlab-0.1.0/src/quiverlab/hochschild/table.py +31 -0
  83. quiverlab-0.1.0/src/quiverlab/hpc/__init__.py +24 -0
  84. quiverlab-0.1.0/src/quiverlab/hpc/__main__.py +8 -0
  85. quiverlab-0.1.0/src/quiverlab/hpc/cli.py +456 -0
  86. quiverlab-0.1.0/src/quiverlab/hpc/deepen_runner.py +62 -0
  87. quiverlab-0.1.0/src/quiverlab/hpc/report.py +682 -0
  88. quiverlab-0.1.0/src/quiverlab/hpc/resources.py +296 -0
  89. quiverlab-0.1.0/src/quiverlab/hpc/spec.py +1745 -0
  90. quiverlab-0.1.0/src/quiverlab/invariants/__init__.py +1 -0
  91. quiverlab-0.1.0/src/quiverlab/invariants/betti.py +71 -0
  92. quiverlab-0.1.0/src/quiverlab/invariants/cartan.py +71 -0
  93. quiverlab-0.1.0/src/quiverlab/invariants/frobenius.py +314 -0
  94. quiverlab-0.1.0/src/quiverlab/invariants/pathbasis.py +58 -0
  95. quiverlab-0.1.0/src/quiverlab/invariants/scalar.py +119 -0
  96. quiverlab-0.1.0/src/quiverlab/invariants/spectral.py +149 -0
  97. quiverlab-0.1.0/src/quiverlab/invariants/sweep.py +65 -0
  98. quiverlab-0.1.0/src/quiverlab/modules/__init__.py +6 -0
  99. quiverlab-0.1.0/src/quiverlab/modules/builders.py +92 -0
  100. quiverlab-0.1.0/src/quiverlab/modules/complex_reps.py +542 -0
  101. quiverlab-0.1.0/src/quiverlab/modules/decompose.py +396 -0
  102. quiverlab-0.1.0/src/quiverlab/modules/duality.py +117 -0
  103. quiverlab-0.1.0/src/quiverlab/modules/ext.py +115 -0
  104. quiverlab-0.1.0/src/quiverlab/modules/ext_algebra.py +666 -0
  105. quiverlab-0.1.0/src/quiverlab/modules/hom.py +212 -0
  106. quiverlab-0.1.0/src/quiverlab/modules/injective.py +83 -0
  107. quiverlab-0.1.0/src/quiverlab/modules/koszul.py +505 -0
  108. quiverlab-0.1.0/src/quiverlab/modules/linalg_mod.py +139 -0
  109. quiverlab-0.1.0/src/quiverlab/modules/module.py +327 -0
  110. quiverlab-0.1.0/src/quiverlab/modules/opposite.py +67 -0
  111. quiverlab-0.1.0/src/quiverlab/modules/qpa_module.py +186 -0
  112. quiverlab-0.1.0/src/quiverlab/modules/radtopsoc.py +121 -0
  113. quiverlab-0.1.0/src/quiverlab/modules/resolution.py +172 -0
  114. quiverlab-0.1.0/src/quiverlab/modules/tor.py +181 -0
  115. quiverlab-0.1.0/src/quiverlab/modules/yoneda.py +373 -0
  116. quiverlab-0.1.0/src/quiverlab/qpa/__init__.py +7 -0
  117. quiverlab-0.1.0/src/quiverlab/qpa/crosscheck.py +377 -0
  118. quiverlab-0.1.0/src/quiverlab/qpa/scripts.py +262 -0
  119. quiverlab-0.1.0/src/quiverlab/qpa/session.py +108 -0
  120. quiverlab-0.1.0/src/quiverlab/resolutions_cs/__init__.py +33 -0
  121. quiverlab-0.1.0/src/quiverlab/resolutions_cs/_fieldshim.py +22 -0
  122. quiverlab-0.1.0/src/quiverlab/resolutions_cs/aarith.py +49 -0
  123. quiverlab-0.1.0/src/quiverlab/resolutions_cs/ambiguities.py +59 -0
  124. quiverlab-0.1.0/src/quiverlab/resolutions_cs/build.py +17 -0
  125. quiverlab-0.1.0/src/quiverlab/resolutions_cs/cap.py +108 -0
  126. quiverlab-0.1.0/src/quiverlab/resolutions_cs/comparison.py +833 -0
  127. quiverlab-0.1.0/src/quiverlab/resolutions_cs/cup.py +106 -0
  128. quiverlab-0.1.0/src/quiverlab/resolutions_cs/diagonal.py +325 -0
  129. quiverlab-0.1.0/src/quiverlab/resolutions_cs/engine_facade.py +79 -0
  130. quiverlab-0.1.0/src/quiverlab/resolutions_cs/homology.py +173 -0
  131. quiverlab-0.1.0/src/quiverlab/resolutions_cs/pelt.py +69 -0
  132. quiverlab-0.1.0/src/quiverlab/resolutions_cs/products.py +113 -0
  133. quiverlab-0.1.0/src/quiverlab/resolutions_cs/resolution.py +247 -0
  134. quiverlab-0.1.0/src/quiverlab/resolutions_cs/terms.py +19 -0
  135. quiverlab-0.1.0/src/quiverlab/resolutions_cs/trace.py +42 -0
  136. quiverlab-0.1.0/src/quiverlab/trace/__init__.py +17 -0
  137. quiverlab-0.1.0/src/quiverlab/trace/events.py +249 -0
  138. quiverlab-0.1.0/src/quiverlab/trace/interpretations.py +292 -0
  139. quiverlab-0.1.0/src/quiverlab/trace/json_guide.py +221 -0
  140. quiverlab-0.1.0/src/quiverlab/trace/modules.py +876 -0
  141. quiverlab-0.1.0/src/quiverlab/trace/products.py +619 -0
  142. quiverlab-0.1.0/src/quiverlab/trace/provenance.py +88 -0
  143. quiverlab-0.1.0/src/quiverlab/trace/recorder.py +163 -0
  144. quiverlab-0.1.0/src/quiverlab/trace/render_html.py +2200 -0
  145. quiverlab-0.1.0/src/quiverlab/trace/render_json.py +123 -0
  146. quiverlab-0.1.0/src/quiverlab/trace/render_text.py +286 -0
  147. quiverlab-0.1.0/src/quiverlab/trace/results_html.py +661 -0
  148. quiverlab-0.1.0/src/quiverlab/trace/writer.py +176 -0
  149. quiverlab-0.1.0/src/quiverlab/viz/__init__.py +16 -0
  150. quiverlab-0.1.0/src/quiverlab/viz/draw.py +77 -0
  151. quiverlab-0.1.0/src/quiverlab/viz/layout.py +159 -0
  152. quiverlab-0.1.0/src/quiverlab/viz/tikz.py +40 -0
  153. quiverlab-0.1.0/src/quiverlab.egg-info/PKG-INFO +603 -0
  154. quiverlab-0.1.0/src/quiverlab.egg-info/SOURCES.txt +159 -0
  155. quiverlab-0.1.0/src/quiverlab.egg-info/dependency_links.txt +1 -0
  156. quiverlab-0.1.0/src/quiverlab.egg-info/entry_points.txt +2 -0
  157. quiverlab-0.1.0/src/quiverlab.egg-info/requires.txt +36 -0
  158. quiverlab-0.1.0/src/quiverlab.egg-info/top_level.txt +1 -0
  159. quiverlab-0.1.0/tests/test_errors.py +21 -0
  160. quiverlab-0.1.0/tests/test_no_floats.py +305 -0
  161. quiverlab-0.1.0/tests/test_quickstart.py +41 -0
@@ -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.
@@ -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
+ [![CI](https://github.com/MarcoArmenta/quiverlab/actions/workflows/ci.yml/badge.svg)](https://github.com/MarcoArmenta/quiverlab/actions/workflows/ci.yml)
59
+ [![Docs](https://github.com/MarcoArmenta/quiverlab/actions/workflows/docs.yml/badge.svg)](https://marcoarmenta.github.io/quiverlab/)
60
+ [![Tests](https://img.shields.io/badge/tests-2772_oracle--pinned-brightgreen)](https://marcoarmenta.github.io/quiverlab/verification/)
61
+ [![PyPI](https://img.shields.io/pypi/v/quiverlab.svg)](https://pypi.org/project/quiverlab/)
62
+ [![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://github.com/MarcoArmenta/quiverlab/blob/main/pyproject.toml)
63
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
64
+ <!-- [![DOI](https://joss.theoj.org/papers/<id>/status.svg)](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