alggeom 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 (219) hide show
  1. alggeom-0.1.0/.github/workflows/benchmarks.yml +43 -0
  2. alggeom-0.1.0/.github/workflows/publish.yml +88 -0
  3. alggeom-0.1.0/.github/workflows/tests.yml +99 -0
  4. alggeom-0.1.0/LICENSE +674 -0
  5. alggeom-0.1.0/MANIFEST.in +12 -0
  6. alggeom-0.1.0/PKG-INFO +164 -0
  7. alggeom-0.1.0/README.md +138 -0
  8. alggeom-0.1.0/REFERENCES.md +27 -0
  9. alggeom-0.1.0/benchmarks/cases.py +306 -0
  10. alggeom-0.1.0/benchmarks/compare.py +84 -0
  11. alggeom-0.1.0/benchmarks/implicit_parameter_scaling.py +75 -0
  12. alggeom-0.1.0/benchmarks/run.py +169 -0
  13. alggeom-0.1.0/ci/backends.toml +5 -0
  14. alggeom-0.1.0/ci/minimum.txt +6 -0
  15. alggeom-0.1.0/ci/release-constraints.txt +7 -0
  16. alggeom-0.1.0/docs/absolute_factorization.md +45 -0
  17. alggeom-0.1.0/docs/api.md +5033 -0
  18. alggeom-0.1.0/docs/applications.md +127 -0
  19. alggeom-0.1.0/docs/backends.md +46 -0
  20. alggeom-0.1.0/docs/benchmarks.md +53 -0
  21. alggeom-0.1.0/docs/capabilities.md +87 -0
  22. alggeom-0.1.0/docs/certificate_audits.md +9 -0
  23. alggeom-0.1.0/docs/coefficient_fields.md +134 -0
  24. alggeom-0.1.0/docs/coefficient_fields_support.md +16 -0
  25. alggeom-0.1.0/docs/components.md +55 -0
  26. alggeom-0.1.0/docs/comprehensive_fibers.md +60 -0
  27. alggeom-0.1.0/docs/constructive_chevalley.md +36 -0
  28. alggeom-0.1.0/docs/conventions.md +11 -0
  29. alggeom-0.1.0/docs/curves.md +55 -0
  30. alggeom-0.1.0/docs/finite_fields.md +40 -0
  31. alggeom-0.1.0/docs/function_field_constants.md +66 -0
  32. alggeom-0.1.0/docs/geometric_constructions.md +96 -0
  33. alggeom-0.1.0/docs/geometry.md +139 -0
  34. alggeom-0.1.0/docs/groebner_covers.md +54 -0
  35. alggeom-0.1.0/docs/guide.md +72 -0
  36. alggeom-0.1.0/docs/images/application_curves.svg +2246 -0
  37. alggeom-0.1.0/docs/images/linkage-workspace.svg +2090 -0
  38. alggeom-0.1.0/docs/index.md +34 -0
  39. alggeom-0.1.0/docs/known_issues.md +20 -0
  40. alggeom-0.1.0/docs/local_geometry.md +52 -0
  41. alggeom-0.1.0/docs/methods.md +17 -0
  42. alggeom-0.1.0/docs/modules.md +36 -0
  43. alggeom-0.1.0/docs/nonlinear_families.md +41 -0
  44. alggeom-0.1.0/docs/normalization.md +74 -0
  45. alggeom-0.1.0/docs/number_fields.md +63 -0
  46. alggeom-0.1.0/docs/ownership.toml +11 -0
  47. alggeom-0.1.0/docs/package_ownership.md +20 -0
  48. alggeom-0.1.0/docs/parameter_ideals.md +48 -0
  49. alggeom-0.1.0/docs/quadratic_fields_and_linear_covers.md +68 -0
  50. alggeom-0.1.0/docs/quickstart.md +38 -0
  51. alggeom-0.1.0/docs/quotient_localization_and_groebner_backend.md +21 -0
  52. alggeom-0.1.0/docs/references.md +3 -0
  53. alggeom-0.1.0/docs/releasing.md +83 -0
  54. alggeom-0.1.0/docs/resolutions.md +48 -0
  55. alggeom-0.1.0/docs/results.md +57 -0
  56. alggeom-0.1.0/docs/schemes.md +80 -0
  57. alggeom-0.1.0/docs/testing.md +140 -0
  58. alggeom-0.1.0/docs/worked_applications.md +25 -0
  59. alggeom-0.1.0/examples/README.md +31 -0
  60. alggeom-0.1.0/examples/affine_normalization.py +26 -0
  61. alggeom-0.1.0/examples/algebraic_relations.py +18 -0
  62. alggeom-0.1.0/examples/catalog.json +140 -0
  63. alggeom-0.1.0/examples/coefficient_fields.py +36 -0
  64. alggeom-0.1.0/examples/curve_geometry.py +23 -0
  65. alggeom-0.1.0/examples/curve_normalization.py +22 -0
  66. alggeom-0.1.0/examples/curve_reparametrization.py +30 -0
  67. alggeom-0.1.0/examples/cusp_branch.py +32 -0
  68. alggeom-0.1.0/examples/finite_points.py +18 -0
  69. alggeom-0.1.0/examples/graded_resolution.py +19 -0
  70. alggeom-0.1.0/examples/linkage_workspace.py +32 -0
  71. alggeom-0.1.0/examples/local_geometry.py +20 -0
  72. alggeom-0.1.0/examples/module_arithmetic.py +21 -0
  73. alggeom-0.1.0/examples/module_rank.py +25 -0
  74. alggeom-0.1.0/examples/number_fields.py +22 -0
  75. alggeom-0.1.0/examples/parameter_families.py +17 -0
  76. alggeom-0.1.0/examples/primary_components.py +23 -0
  77. alggeom-0.1.0/examples/quadratic_fibers.py +35 -0
  78. alggeom-0.1.0/examples/quadratic_towers.py +21 -0
  79. alggeom-0.1.0/examples/rational_maps.py +19 -0
  80. alggeom-0.1.0/examples/real_branches.py +29 -0
  81. alggeom-0.1.0/examples/response_contours.py +26 -0
  82. alggeom-0.1.0/examples/scheme_fibers.py +26 -0
  83. alggeom-0.1.0/examples/solve_equation.py +24 -0
  84. alggeom-0.1.0/pyproject.toml +43 -0
  85. alggeom-0.1.0/setup.cfg +4 -0
  86. alggeom-0.1.0/src/alggeom/__init__.py +75 -0
  87. alggeom-0.1.0/src/alggeom/_algebra.py +57 -0
  88. alggeom-0.1.0/src/alggeom/_monomials.py +60 -0
  89. alggeom-0.1.0/src/alggeom/absolute_factorization.py +377 -0
  90. alggeom-0.1.0/src/alggeom/chevalley.py +166 -0
  91. alggeom-0.1.0/src/alggeom/components.py +316 -0
  92. alggeom-0.1.0/src/alggeom/comprehensive_strata.py +301 -0
  93. alggeom-0.1.0/src/alggeom/constructible.py +359 -0
  94. alggeom-0.1.0/src/alggeom/cover_proofs.py +495 -0
  95. alggeom-0.1.0/src/alggeom/curves.py +164 -0
  96. alggeom-0.1.0/src/alggeom/decomposition/__init__.py +23 -0
  97. alggeom-0.1.0/src/alggeom/decomposition/_api.py +97 -0
  98. alggeom-0.1.0/src/alggeom/decomposition/_validation.py +88 -0
  99. alggeom-0.1.0/src/alggeom/decomposition/algebraic.py +315 -0
  100. alggeom-0.1.0/src/alggeom/decomposition/chains.py +767 -0
  101. alggeom-0.1.0/src/alggeom/decomposition/common.py +84 -0
  102. alggeom-0.1.0/src/alggeom/decomposition/discovery.py +183 -0
  103. alggeom-0.1.0/src/alggeom/decomposition/factors.py +442 -0
  104. alggeom-0.1.0/src/alggeom/decomposition/parameters.py +556 -0
  105. alggeom-0.1.0/src/alggeom/decomposition/rational.py +358 -0
  106. alggeom-0.1.0/src/alggeom/decomposition/real.py +207 -0
  107. alggeom-0.1.0/src/alggeom/families.py +168 -0
  108. alggeom-0.1.0/src/alggeom/fields.py +23 -0
  109. alggeom-0.1.0/src/alggeom/function_field_constants.py +508 -0
  110. alggeom-0.1.0/src/alggeom/geometric.py +1061 -0
  111. alggeom-0.1.0/src/alggeom/graded.py +167 -0
  112. alggeom-0.1.0/src/alggeom/groebner_certificates.py +212 -0
  113. alggeom-0.1.0/src/alggeom/groebner_cover.py +445 -0
  114. alggeom-0.1.0/src/alggeom/ideals.py +602 -0
  115. alggeom-0.1.0/src/alggeom/linear_strata.py +134 -0
  116. alggeom-0.1.0/src/alggeom/local.py +234 -0
  117. alggeom-0.1.0/src/alggeom/localized_linear_cover.py +258 -0
  118. alggeom-0.1.0/src/alggeom/maps.py +323 -0
  119. alggeom-0.1.0/src/alggeom/modules.py +629 -0
  120. alggeom-0.1.0/src/alggeom/morphism_invariants.py +149 -0
  121. alggeom-0.1.0/src/alggeom/noether.py +224 -0
  122. alggeom-0.1.0/src/alggeom/nonlinear_strata.py +262 -0
  123. alggeom-0.1.0/src/alggeom/normalization.py +350 -0
  124. alggeom-0.1.0/src/alggeom/parameter_cover.py +186 -0
  125. alggeom-0.1.0/src/alggeom/parameter_fields.py +428 -0
  126. alggeom-0.1.0/src/alggeom/parameter_localization.py +222 -0
  127. alggeom-0.1.0/src/alggeom/points.py +114 -0
  128. alggeom-0.1.0/src/alggeom/projective_normalization.py +192 -0
  129. alggeom-0.1.0/src/alggeom/properties.py +80 -0
  130. alggeom-0.1.0/src/alggeom/rational_functions.py +391 -0
  131. alggeom-0.1.0/src/alggeom/resolutions.py +252 -0
  132. alggeom-0.1.0/src/alggeom/rings.py +296 -0
  133. alggeom-0.1.0/src/alggeom/schemes.py +971 -0
  134. alggeom-0.1.0/src/alggeom.egg-info/PKG-INFO +164 -0
  135. alggeom-0.1.0/src/alggeom.egg-info/SOURCES.txt +218 -0
  136. alggeom-0.1.0/src/alggeom.egg-info/dependency_links.txt +1 -0
  137. alggeom-0.1.0/src/alggeom.egg-info/requires.txt +15 -0
  138. alggeom-0.1.0/src/alggeom.egg-info/top_level.txt +1 -0
  139. alggeom-0.1.0/tests/_field_audit.py +41 -0
  140. alggeom-0.1.0/tests/certificate_fields.json +73 -0
  141. alggeom-0.1.0/tests/conftest.py +41 -0
  142. alggeom-0.1.0/tests/fixtures/groebner_examples.json +378 -0
  143. alggeom-0.1.0/tests/real/test_decisions.py +20 -0
  144. alggeom-0.1.0/tests/real/test_families.py +194 -0
  145. alggeom-0.1.0/tests/real/test_number_field_graphs.py +24 -0
  146. alggeom-0.1.0/tests/real/test_parameters.py +93 -0
  147. alggeom-0.1.0/tests/real/test_real_chains.py +150 -0
  148. alggeom-0.1.0/tests/real/test_real_graphs.py +59 -0
  149. alggeom-0.1.0/tests/real/test_real_multivariate.py +87 -0
  150. alggeom-0.1.0/tests/real/test_real_pairs.py +86 -0
  151. alggeom-0.1.0/tests/test_absolute_certificates.py +79 -0
  152. alggeom-0.1.0/tests/test_absolute_coordinate_components.py +41 -0
  153. alggeom-0.1.0/tests/test_absolute_factorization_engine.py +71 -0
  154. alggeom-0.1.0/tests/test_absolute_metamorphic.py +92 -0
  155. alggeom-0.1.0/tests/test_algebraic.py +118 -0
  156. alggeom-0.1.0/tests/test_algebraic_function_fields.py +29 -0
  157. alggeom-0.1.0/tests/test_algroots_adapter.py +181 -0
  158. alggeom-0.1.0/tests/test_api.py +155 -0
  159. alggeom-0.1.0/tests/test_applications.py +63 -0
  160. alggeom-0.1.0/tests/test_associated_splitting.py +32 -0
  161. alggeom-0.1.0/tests/test_basis_verification.py +62 -0
  162. alggeom-0.1.0/tests/test_benchmark_comparison.py +58 -0
  163. alggeom-0.1.0/tests/test_certificate_field_audit.py +86 -0
  164. alggeom-0.1.0/tests/test_chains.py +222 -0
  165. alggeom-0.1.0/tests/test_chevalley.py +110 -0
  166. alggeom-0.1.0/tests/test_chevalley_maps.py +35 -0
  167. alggeom-0.1.0/tests/test_common.py +65 -0
  168. alggeom-0.1.0/tests/test_components.py +123 -0
  169. alggeom-0.1.0/tests/test_comprehensive_strata.py +80 -0
  170. alggeom-0.1.0/tests/test_coordinate_transport.py +89 -0
  171. alggeom-0.1.0/tests/test_curves.py +73 -0
  172. alggeom-0.1.0/tests/test_discovery.py +155 -0
  173. alggeom-0.1.0/tests/test_documentation.py +67 -0
  174. alggeom-0.1.0/tests/test_documentation_tooling.py +90 -0
  175. alggeom-0.1.0/tests/test_example_catalog.py +66 -0
  176. alggeom-0.1.0/tests/test_finite_fields_points.py +110 -0
  177. alggeom-0.1.0/tests/test_function_field_constants.py +80 -0
  178. alggeom-0.1.0/tests/test_geometric_invariants.py +254 -0
  179. alggeom-0.1.0/tests/test_graded.py +92 -0
  180. alggeom-0.1.0/tests/test_graph_lifted_components.py +41 -0
  181. alggeom-0.1.0/tests/test_groebner_cover.py +53 -0
  182. alggeom-0.1.0/tests/test_groebner_proof_witnesses.py +103 -0
  183. alggeom-0.1.0/tests/test_groebner_proofs.py +112 -0
  184. alggeom-0.1.0/tests/test_ideals.py +110 -0
  185. alggeom-0.1.0/tests/test_imports.py +39 -0
  186. alggeom-0.1.0/tests/test_integral_closure.py +86 -0
  187. alggeom-0.1.0/tests/test_local_geometry.py +95 -0
  188. alggeom-0.1.0/tests/test_localized_linear_cover.py +79 -0
  189. alggeom-0.1.0/tests/test_macaulay2_primary_oracle.py +151 -0
  190. alggeom-0.1.0/tests/test_maps.py +105 -0
  191. alggeom-0.1.0/tests/test_module_maps.py +72 -0
  192. alggeom-0.1.0/tests/test_module_universal_maps.py +55 -0
  193. alggeom-0.1.0/tests/test_modules.py +116 -0
  194. alggeom-0.1.0/tests/test_mutations.py +257 -0
  195. alggeom-0.1.0/tests/test_noether.py +88 -0
  196. alggeom-0.1.0/tests/test_nonlinear_strata.py +47 -0
  197. alggeom-0.1.0/tests/test_number_fields.py +136 -0
  198. alggeom-0.1.0/tests/test_parameter_fields.py +112 -0
  199. alggeom-0.1.0/tests/test_parameter_localization.py +84 -0
  200. alggeom-0.1.0/tests/test_point_sets.py +33 -0
  201. alggeom-0.1.0/tests/test_polynomial_oracle.py +57 -0
  202. alggeom-0.1.0/tests/test_properties.py +63 -0
  203. alggeom-0.1.0/tests/test_quadratic_constants.py +59 -0
  204. alggeom-0.1.0/tests/test_rational.py +236 -0
  205. alggeom-0.1.0/tests/test_rational_functions.py +87 -0
  206. alggeom-0.1.0/tests/test_rational_proof_replay.py +49 -0
  207. alggeom-0.1.0/tests/test_resolutions.py +122 -0
  208. alggeom-0.1.0/tests/test_rings.py +86 -0
  209. alggeom-0.1.0/tests/test_schemes.py +109 -0
  210. alggeom-0.1.0/tests/test_singular_cover_oracle.py +102 -0
  211. alggeom-0.1.0/tests/test_specialization_and_separated_primes.py +112 -0
  212. alggeom-0.1.0/tests/test_tooling.py +78 -0
  213. alggeom-0.1.0/tools/check_backends.py +54 -0
  214. alggeom-0.1.0/tools/check_examples.py +144 -0
  215. alggeom-0.1.0/tools/check_installation.py +6 -0
  216. alggeom-0.1.0/tools/generate_api.py +145 -0
  217. alggeom-0.1.0/tools/install_backends.py +38 -0
  218. alggeom-0.1.0/tools/plot_applications.py +92 -0
  219. alggeom-0.1.0/tools/plot_linkage.py +62 -0
@@ -0,0 +1,43 @@
1
+ name: Benchmarks
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ ground:
7
+ description: SymPy coefficient backend
8
+ type: choice
9
+ options: [flint, python]
10
+ default: flint
11
+ suite:
12
+ description: Input sizes
13
+ type: choice
14
+ options: [standard, smoke]
15
+ default: standard
16
+
17
+ permissions:
18
+ contents: read
19
+
20
+ env:
21
+ PYTHONUTF8: '1'
22
+
23
+ jobs:
24
+ benchmark:
25
+ runs-on: ubuntu-latest
26
+ timeout-minutes: 20
27
+ env:
28
+ SYMPY_GROUND_TYPES: ${{ inputs.ground }}
29
+ MPLBACKEND: Agg
30
+ PYTHONDONTWRITEBYTECODE: '1'
31
+ steps:
32
+ - uses: actions/checkout@v6
33
+ - uses: actions/setup-python@v6
34
+ with:
35
+ python-version: '3.12'
36
+ - run: python tools/install_backends.py --published --profile real
37
+ - run: python -m pip install .
38
+ - run: python benchmarks/run.py --suite ${{ inputs.suite }} --real --repeat 5 --output benchmark.json
39
+ - uses: actions/upload-artifact@v6
40
+ if: always()
41
+ with:
42
+ name: benchmark-${{ inputs.ground }}-${{ inputs.suite }}
43
+ path: benchmark.json
@@ -0,0 +1,88 @@
1
+ name: Publish release
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ inputs:
7
+ publish:
8
+ description: Upload the validated artifacts to PyPI
9
+ type: boolean
10
+ default: false
11
+ permissions:
12
+ contents: read
13
+ env:
14
+ PYTHONUTF8: '1'
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+ timeout-minutes: 120
19
+ env:
20
+ MPLBACKEND: Agg
21
+ steps:
22
+ - uses: actions/checkout@v6
23
+ - uses: actions/setup-python@v6
24
+ with:
25
+ python-version: '3.12'
26
+ - name: Require the tag matching package metadata for publication
27
+ env:
28
+ PUBLISH: ${{ inputs.publish }}
29
+ run: |
30
+ python - <<'PY'
31
+ import os, tomllib
32
+ from pathlib import Path
33
+ metadata = tomllib.loads(Path('pyproject.toml').read_text(encoding='utf-8'))['project']
34
+ version = metadata.get('version', '0.1.0')
35
+ publishing = os.environ['GITHUB_EVENT_NAME'] == 'release' or os.environ['PUBLISH'] == 'true'
36
+ if publishing and os.environ['GITHUB_REF'] != 'refs/tags/v' + version:
37
+ raise RuntimeError('Publish from the tag matching project.version')
38
+ PY
39
+ - name: Install release and integration dependencies
40
+ run: python -m pip install build twine ruff '.[test,real,docs]'
41
+ - name: Lint and format
42
+ run: |
43
+ ruff check --no-cache .
44
+ ruff format --check --no-cache .
45
+ - name: Build release artifacts
46
+ run: python -m build
47
+ - name: Check metadata and install the candidate wheel
48
+ run: |
49
+ python -m twine check --strict dist/*
50
+ python -m pip install --force-reinstall --no-deps dist/*.whl
51
+ python -m pip check
52
+ - name: Verify the candidate and integrations
53
+ run: |
54
+ python tools/check_installation.py --profile real
55
+ python -m pytest -q -o pythonpath=
56
+ - uses: actions/upload-artifact@v6
57
+ with:
58
+ name: release-distributions
59
+ path: dist/*
60
+ if-no-files-found: error
61
+ publish:
62
+ if: github.event_name == 'release' || inputs.publish
63
+ needs: build
64
+ runs-on: ubuntu-latest
65
+ environment: pypi
66
+ permissions:
67
+ id-token: write
68
+ steps:
69
+ - uses: actions/download-artifact@v6
70
+ with:
71
+ name: release-distributions
72
+ path: dist
73
+ - uses: pypa/gh-action-pypi-publish@release/v1
74
+ - uses: actions/setup-python@v6
75
+ with:
76
+ python-version: '3.12'
77
+ - name: Verify the indexed version
78
+ run: |
79
+ python -m venv verify-index
80
+ verify-index/bin/python -m pip install alggeom==0.1.0
81
+ verify-index/bin/python -m pip check
82
+ verify-index/bin/python -c "import importlib.metadata as m; assert m.version('alggeom') == '0.1.0'"
83
+ verify-index/bin/python - <<'PY'
84
+ import sympy as sp
85
+ from alggeom.ideals import PolynomialRing
86
+ x = sp.Symbol('x')
87
+ assert PolynomialRing((x,), sp.QQ).ideal(x*x-1).normal_form(x**4-1) == 0
88
+ PY
@@ -0,0 +1,99 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ env:
12
+ PYTHONUTF8: '1'
13
+
14
+ jobs:
15
+ compatibility:
16
+ name: ${{ matrix.os }} / Python ${{ matrix.python }} / ${{ matrix.profile }} / ${{ matrix.ground }}
17
+ runs-on: ${{ matrix.os }}
18
+ timeout-minutes: 30
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ os: [ubuntu-latest, macos-latest, windows-latest]
23
+ python: ['3.11', '3.12', '3.13', '3.14']
24
+ profile: [core, real]
25
+ ground: [flint]
26
+ dependencies: [latest]
27
+ include:
28
+ - {os: ubuntu-latest, python: '3.11', profile: core, ground: flint, dependencies: minimum}
29
+ - {os: ubuntu-latest, python: '3.11', profile: real, ground: flint, dependencies: minimum}
30
+ - {os: ubuntu-latest, python: '3.11', profile: real, ground: python, dependencies: latest}
31
+ - {os: ubuntu-latest, python: '3.14', profile: real, ground: python, dependencies: latest}
32
+ - {os: macos-latest, python: '3.14', profile: real, ground: python, dependencies: latest}
33
+ - {os: windows-latest, python: '3.14', profile: real, ground: python, dependencies: latest}
34
+ env:
35
+ MPLBACKEND: Agg
36
+ PYTHONDONTWRITEBYTECODE: '1'
37
+ SYMPY_GROUND_TYPES: ${{ matrix.ground }}
38
+ CERTIFICATE_AUDIT_REPORT: certificate-audit.jsonl
39
+ steps:
40
+ - uses: actions/checkout@v6
41
+ - uses: actions/setup-python@v6
42
+ with:
43
+ python-version: ${{ matrix.python }}
44
+ - name: Select arithmetic floor
45
+ if: matrix.dependencies == 'minimum'
46
+ shell: bash
47
+ run: echo "PIP_CONSTRAINT=$GITHUB_WORKSPACE/ci/minimum.txt" >> "$GITHUB_ENV"
48
+ - name: Install matching backends
49
+ run: python tools/install_backends.py --published --profile ${{ matrix.profile }}
50
+ - name: Install package and test dependencies
51
+ run: python -m pip install ".[test]"
52
+ - name: Check dependency profile
53
+ run: python tools/check_backends.py --profile ${{ matrix.profile }} --ground-types ${{ matrix.ground }}
54
+ - name: Test core installation
55
+ if: matrix.profile == 'core'
56
+ run: python -m pytest --without-real -p no:cacheprovider --junitxml=results.xml
57
+ - name: Test real installation
58
+ if: matrix.profile == 'real'
59
+ run: python -m pytest -p no:cacheprovider --junitxml=results.xml
60
+ - uses: actions/upload-artifact@v6
61
+ if: always()
62
+ with:
63
+ name: tests-${{ matrix.os }}-${{ matrix.python }}-${{ matrix.profile }}-${{ matrix.ground }}-${{ matrix.dependencies }}
64
+ path: |
65
+ results.xml
66
+ certificate-audit.jsonl
67
+
68
+ quality:
69
+ runs-on: ubuntu-latest
70
+ timeout-minutes: 20
71
+ steps:
72
+ - uses: actions/checkout@v6
73
+ - uses: actions/setup-python@v6
74
+ with:
75
+ python-version: '3.12'
76
+ - run: python tools/install_backends.py --published --profile real
77
+ - run: python -m pip install ".[test,real,docs]" "twine>=6"
78
+ - run: ruff check --no-cache .
79
+ - run: ruff format --no-cache --check .
80
+ - run: python tools/generate_api.py --check
81
+ - run: python tools/plot_applications.py
82
+ - run: python benchmarks/run.py --suite smoke --repeat 1 --real --output benchmark.json
83
+ - run: python -m build
84
+ - run: python -m twine check dist/*
85
+ - run: python -m pip install --force-reinstall --no-deps --no-index --find-links dist alggeom
86
+ - run: python tools/check_installation.py --profile real
87
+ - run: python tools/generate_api.py --check
88
+ - name: Rebuild and verify the source distribution
89
+ run: |
90
+ python -m pip wheel --no-deps dist/*.tar.gz --wheel-dir rebuilt
91
+ python -m pip install --force-reinstall --no-deps --no-index --find-links rebuilt alggeom
92
+ python tools/check_installation.py --profile real
93
+ - uses: actions/upload-artifact@v6
94
+ if: always()
95
+ with:
96
+ name: distributions-and-benchmark
97
+ path: |
98
+ dist/*
99
+ benchmark.json