gpjax 0.12.2__tar.gz → 0.13.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/auto-label.yml +34 -34
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/build_docs.yml +3 -3
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/commit-lint.yml +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/integration.yml +3 -3
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/pr_greeting.yml +3 -3
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/release.yml +15 -15
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/ruff.yml +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/security-analysis.yml +4 -4
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/test_docs.yml +2 -2
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/workflows/tests.yml +4 -4
- {gpjax-0.12.2 → gpjax-0.13.1}/PKG-INFO +18 -10
- {gpjax-0.12.2 → gpjax-0.13.1}/README.md +15 -6
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/installation.md +14 -2
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/stylesheets/extra.css +17 -4
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/__init__.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/approximations/rff.py +2 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/base.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/eigen.py +1 -15
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/non_euclidean/graph.py +7 -6
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/non_euclidean/utils.py +30 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/base.py +1 -30
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/matern12.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/matern32.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/matern52.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/mean_functions.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/variational_families.py +69 -5
- {gpjax-0.12.2 → gpjax-0.13.1}/mkdocs.yml +15 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/pyproject.toml +4 -5
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_base.py +3 -2
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_variational_families.py +59 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/uv.lock +312 -723
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/CODE_OF_CONDUCT.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/ISSUE_TEMPLATE/01_BUG_REPORT.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/ISSUE_TEMPLATE/02_FEATURE_REQUEST.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/ISSUE_TEMPLATE/03_CODEBASE_IMPROVEMENT.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/ISSUE_TEMPLATE/04_DOCS_IMPROVEMENT.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/codecov.yml +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/commitlint.config.js +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/dependabot.yml +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/labeler.yml +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/labels.yml +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/pull_request_template.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.github/release-drafter.yml +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/.gitignore +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/CITATION.bib +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/LICENSE.txt +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/Makefile +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/CODE_OF_CONDUCT.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/GOVERNANCE.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/contributing.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/design.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/index.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/index.rst +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/javascripts/katex.js +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/refs.bib +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/scripts/gen_examples.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/scripts/gen_pages.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/scripts/notebook_converter.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/scripts/sharp_bits_figure.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/sharp_bits.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/GP.pdf +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/GP.svg +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/bijector_figure.svg +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/css/gpjax_theme.css +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/favicon.ico +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/gpjax.mplstyle +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/gpjax_logo.pdf +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/gpjax_logo.svg +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/jaxkern/lato.ttf +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/jaxkern/logo.png +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/jaxkern/logo.svg +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/jaxkern/main.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/step_size_figure.png +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/static/step_size_figure.svg +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/docs/stylesheets/permalinks.css +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/backend.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/barycentres/barycentre_gp.gif +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/barycentres.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/classification.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/collapsed_vi.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/constructing_new_kernels.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/data/max_tempeature_switzerland.csv +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/data/yacht_hydrodynamics.data +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/deep_kernels.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/gpjax.mplstyle +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/graph_kernels.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/intro_to_gps/decomposed_mll.png +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/intro_to_gps/generating_process.png +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/intro_to_gps.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/intro_to_kernels.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/likelihoods_guide.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/oceanmodelling.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/poisson.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/regression.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/uncollapsed_vi.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/utils.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/examples/yacht.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/citation.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/dataset.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/distributions.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/fit.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/gps.py +1 -1
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/integrators.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/approximations/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/base.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/basis_functions.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/constant_diagonal.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/dense.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/computations/diagonal.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/non_euclidean/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/nonstationary/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/nonstationary/arccosine.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/nonstationary/linear.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/nonstationary/polynomial.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/periodic.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/powered_exponential.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/rational_quadratic.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/rbf.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/utils.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/kernels/stationary/white.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/likelihoods.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/linalg/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/linalg/operations.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/linalg/operators.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/linalg/utils.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/numpyro_extras.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/objectives.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/parameters.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/scan.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/gpjax/typing.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/static/CONTRIBUTING.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/static/paper.bib +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/static/paper.md +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/static/paper.pdf +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/conftest.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/integration_tests.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_citations.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_dataset.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_fit.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_gaussian_distribution.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_gps.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_imports.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_integrators.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/__init__.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_approximations.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_computation.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_non_euclidean.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_nonstationary.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_stationary.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_kernels/test_utils.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_likelihoods.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_linalg.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_markdown.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_mean_functions.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_numpyro_extras.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_objectives.py +0 -0
- {gpjax-0.12.2 → gpjax-0.13.1}/tests/test_parameters.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
name: "Automatic Labeling"
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
-
|
|
4
|
+
pull_request_target:
|
|
5
5
|
types: [opened, synchronize, reopened]
|
|
6
6
|
issues:
|
|
7
7
|
types: [opened, reopened]
|
|
@@ -13,14 +13,14 @@ jobs:
|
|
|
13
13
|
permissions:
|
|
14
14
|
issues: write
|
|
15
15
|
pull-requests: write
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout repository
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v5
|
|
20
20
|
|
|
21
21
|
- name: Auto-label based on files changed
|
|
22
22
|
if: github.event_name == 'pull_request'
|
|
23
|
-
uses: actions/labeler@
|
|
23
|
+
uses: actions/labeler@v6
|
|
24
24
|
with:
|
|
25
25
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
26
26
|
configuration-path: .github/labeler.yml
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
33
33
|
xs_label: 'size/xs'
|
|
34
34
|
xs_max_size: '10'
|
|
35
|
-
s_label: 'size/s'
|
|
35
|
+
s_label: 'size/s'
|
|
36
36
|
s_max_size: '100'
|
|
37
37
|
m_label: 'size/m'
|
|
38
38
|
m_max_size: '500'
|
|
@@ -45,68 +45,68 @@ jobs:
|
|
|
45
45
|
|
|
46
46
|
- name: Label ML-specific issues
|
|
47
47
|
if: github.event_name == 'issues'
|
|
48
|
-
uses: actions/github-script@
|
|
48
|
+
uses: actions/github-script@v8
|
|
49
49
|
with:
|
|
50
50
|
script: |
|
|
51
51
|
const title = context.payload.issue.title.toLowerCase();
|
|
52
52
|
const body = context.payload.issue.body?.toLowerCase() || '';
|
|
53
53
|
const text = title + ' ' + body;
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
const labels = [];
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
// GPU/Hardware related
|
|
58
|
-
if (text.includes('gpu') || text.includes('cuda') || text.includes('device') ||
|
|
58
|
+
if (text.includes('gpu') || text.includes('cuda') || text.includes('device') ||
|
|
59
59
|
text.includes('memory') || text.includes('jax.device')) {
|
|
60
60
|
labels.push('gpu-support');
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
// Performance related
|
|
64
64
|
if (text.includes('slow') || text.includes('performance') || text.includes('speed') ||
|
|
65
65
|
text.includes('memory usage') || text.includes('regression') || text.includes('benchmark')) {
|
|
66
66
|
labels.push('performance');
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
// Numerical stability
|
|
70
70
|
if (text.includes('numerical') || text.includes('instability') || text.includes('nan') ||
|
|
71
71
|
text.includes('inf') || text.includes('convergence') || text.includes('precision')) {
|
|
72
72
|
labels.push('numerical-stability');
|
|
73
73
|
}
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
// JAX compatibility
|
|
76
|
-
if (text.includes('jax') || text.includes('jit') || text.includes('vmap') ||
|
|
76
|
+
if (text.includes('jax') || text.includes('jit') || text.includes('vmap') ||
|
|
77
77
|
text.includes('pmap') || text.includes('xla')) {
|
|
78
78
|
labels.push('jax-compatibility');
|
|
79
79
|
}
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
// Component detection
|
|
82
82
|
if (text.includes('kernel') || text.includes('rbf') || text.includes('matern')) {
|
|
83
83
|
labels.push('kernels');
|
|
84
84
|
}
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
if (text.includes('gaussian process') || text.includes(' gp ') || text.includes('posterior') ||
|
|
87
87
|
text.includes('prior') || text.includes('inference')) {
|
|
88
88
|
labels.push('gps');
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
|
|
91
91
|
if (text.includes('variational') || text.includes('elbo') || text.includes('svgp')) {
|
|
92
92
|
labels.push('variational');
|
|
93
93
|
}
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
if (text.includes('likelihood') || text.includes('bernoulli') || text.includes('poisson')) {
|
|
96
96
|
labels.push('likelihoods');
|
|
97
97
|
}
|
|
98
|
-
|
|
98
|
+
|
|
99
99
|
if (text.includes('optimization') || text.includes('optimizer') || text.includes('fit') ||
|
|
100
100
|
text.includes('scipy') || text.includes('optax')) {
|
|
101
101
|
labels.push('optimization');
|
|
102
102
|
}
|
|
103
|
-
|
|
103
|
+
|
|
104
104
|
// Documentation related
|
|
105
105
|
if (text.includes('documentation') || text.includes('docs') || text.includes('example') ||
|
|
106
106
|
text.includes('tutorial') || text.includes('docstring')) {
|
|
107
107
|
labels.push('documentation');
|
|
108
108
|
}
|
|
109
|
-
|
|
109
|
+
|
|
110
110
|
// Bug vs Feature detection
|
|
111
111
|
if (text.includes('bug') || text.includes('error') || text.includes('fail') ||
|
|
112
112
|
text.includes('broken') || text.includes('issue') || text.includes('problem')) {
|
|
@@ -115,7 +115,7 @@ jobs:
|
|
|
115
115
|
text.includes('implement') || text.includes('support') || text.includes('new')) {
|
|
116
116
|
labels.push('enhancement');
|
|
117
117
|
}
|
|
118
|
-
|
|
118
|
+
|
|
119
119
|
// Difficulty assessment
|
|
120
120
|
if (text.includes('good first issue') || text.includes('beginner') || text.includes('easy')) {
|
|
121
121
|
labels.push('good first issue');
|
|
@@ -124,14 +124,14 @@ jobs:
|
|
|
124
124
|
} else if (text.includes('complex') || text.includes('advanced') || text.includes('expert')) {
|
|
125
125
|
labels.push('expert-level');
|
|
126
126
|
}
|
|
127
|
-
|
|
127
|
+
|
|
128
128
|
// Priority detection
|
|
129
129
|
if (text.includes('urgent') || text.includes('critical') || text.includes('blocking')) {
|
|
130
130
|
labels.push('priority/high');
|
|
131
131
|
} else if (text.includes('nice to have') || text.includes('low priority')) {
|
|
132
132
|
labels.push('priority/low');
|
|
133
133
|
}
|
|
134
|
-
|
|
134
|
+
|
|
135
135
|
// Apply labels
|
|
136
136
|
if (labels.length > 0) {
|
|
137
137
|
await github.rest.issues.addLabels({
|
|
@@ -144,57 +144,57 @@ jobs:
|
|
|
144
144
|
|
|
145
145
|
- name: Label PRs based on content
|
|
146
146
|
if: github.event_name == 'pull_request'
|
|
147
|
-
uses: actions/github-script@
|
|
147
|
+
uses: actions/github-script@v8
|
|
148
148
|
with:
|
|
149
149
|
script: |
|
|
150
150
|
const title = context.payload.pull_request.title.toLowerCase();
|
|
151
151
|
const body = context.payload.pull_request.body?.toLowerCase() || '';
|
|
152
152
|
const text = title + ' ' + body;
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
const labels = [];
|
|
155
|
-
|
|
155
|
+
|
|
156
156
|
// Breaking changes
|
|
157
157
|
if (text.includes('breaking') || text.includes('breaking change') ||
|
|
158
158
|
title.includes('!:') || body.includes('breaking change')) {
|
|
159
159
|
labels.push('breaking-change');
|
|
160
160
|
}
|
|
161
|
-
|
|
161
|
+
|
|
162
162
|
// Dependencies
|
|
163
163
|
if (title.includes('deps') || title.includes('dependenc') || title.includes('bump') ||
|
|
164
164
|
text.includes('requirements') || text.includes('pyproject.toml')) {
|
|
165
165
|
labels.push('dependencies');
|
|
166
166
|
}
|
|
167
|
-
|
|
168
|
-
// CI/Infrastructure
|
|
167
|
+
|
|
168
|
+
// CI/Infrastructure
|
|
169
169
|
if (text.includes('github actions') || text.includes('workflow') || text.includes('.yml') ||
|
|
170
170
|
text.includes('ci') || text.includes('pipeline')) {
|
|
171
171
|
labels.push('ci');
|
|
172
172
|
}
|
|
173
|
-
|
|
173
|
+
|
|
174
174
|
// Performance improvements
|
|
175
175
|
if (text.includes('performance') || text.includes('optimization') || text.includes('faster') ||
|
|
176
176
|
text.includes('efficient') || text.includes('benchmark')) {
|
|
177
177
|
labels.push('performance');
|
|
178
178
|
}
|
|
179
|
-
|
|
179
|
+
|
|
180
180
|
// Documentation
|
|
181
181
|
if (text.includes('docs') || text.includes('readme') || text.includes('docstring') ||
|
|
182
182
|
text.includes('example') || text.includes('.md') || text.includes('tutorial')) {
|
|
183
183
|
labels.push('documentation');
|
|
184
184
|
}
|
|
185
|
-
|
|
185
|
+
|
|
186
186
|
// Tests
|
|
187
187
|
if (text.includes('test') || text.includes('pytest') || text.includes('coverage') ||
|
|
188
188
|
title.startsWith('test:') || text.includes('testing')) {
|
|
189
189
|
labels.push('tests');
|
|
190
190
|
}
|
|
191
|
-
|
|
191
|
+
|
|
192
192
|
// Security
|
|
193
193
|
if (text.includes('security') || text.includes('vulnerability') || text.includes('cve') ||
|
|
194
194
|
text.includes('safety') || text.includes('bandit')) {
|
|
195
195
|
labels.push('security');
|
|
196
196
|
}
|
|
197
|
-
|
|
197
|
+
|
|
198
198
|
// Apply labels
|
|
199
199
|
if (labels.length > 0) {
|
|
200
200
|
await github.rest.issues.addLabels({
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
steps:
|
|
28
28
|
# Grap the latest commit from the branch
|
|
29
29
|
- name: Checkout the branch
|
|
30
|
-
uses: actions/checkout@
|
|
30
|
+
uses: actions/checkout@v5
|
|
31
31
|
with:
|
|
32
32
|
persist-credentials: false
|
|
33
33
|
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
|
|
41
41
|
# Install katex for math support
|
|
42
42
|
- name: Install NPM
|
|
43
|
-
uses: actions/setup-node@
|
|
43
|
+
uses: actions/setup-node@v6
|
|
44
44
|
with:
|
|
45
45
|
node-version: 16
|
|
46
46
|
- name: Install KaTeX
|
|
@@ -49,7 +49,7 @@ jobs:
|
|
|
49
49
|
|
|
50
50
|
# Install uv
|
|
51
51
|
- name: Install uv
|
|
52
|
-
uses: astral-sh/setup-uv@
|
|
52
|
+
uses: astral-sh/setup-uv@v7
|
|
53
53
|
with:
|
|
54
54
|
version: "latest"
|
|
55
55
|
|
|
@@ -13,11 +13,11 @@ jobs:
|
|
|
13
13
|
matrix:
|
|
14
14
|
# Select the Python versions to test against
|
|
15
15
|
os: ["ubuntu-latest", "macos-latest"]
|
|
16
|
-
python-version: ["3.
|
|
16
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
17
17
|
fail-fast: true
|
|
18
18
|
steps:
|
|
19
19
|
- name: Check out the code
|
|
20
|
-
uses: actions/checkout@
|
|
20
|
+
uses: actions/checkout@v5
|
|
21
21
|
with:
|
|
22
22
|
fetch-depth: 1
|
|
23
23
|
- name: Set up Python ${{ matrix.python-version }}
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
|
|
28
28
|
# Install uv
|
|
29
29
|
- name: Install uv
|
|
30
|
-
uses: astral-sh/setup-uv@
|
|
30
|
+
uses: astral-sh/setup-uv@v7
|
|
31
31
|
with:
|
|
32
32
|
version: "latest"
|
|
33
33
|
|
|
@@ -11,10 +11,10 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
|
|
13
13
|
steps:
|
|
14
|
-
- uses: actions/first-interaction@
|
|
14
|
+
- uses: actions/first-interaction@v3.1.0
|
|
15
15
|
with:
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
17
|
+
pr_message: >+
|
|
18
18
|
Thank you for opening your first PR into GPJax!
|
|
19
19
|
|
|
20
20
|
|
|
@@ -29,7 +29,7 @@ jobs:
|
|
|
29
29
|
|
|
30
30
|
steps:
|
|
31
31
|
- name: Checkout repository
|
|
32
|
-
uses: actions/checkout@
|
|
32
|
+
uses: actions/checkout@v5
|
|
33
33
|
with:
|
|
34
34
|
fetch-depth: 0
|
|
35
35
|
|
|
@@ -60,11 +60,11 @@ jobs:
|
|
|
60
60
|
fail-fast: false
|
|
61
61
|
matrix:
|
|
62
62
|
os: [ubuntu-latest, macos-latest]
|
|
63
|
-
python-version: ['3.
|
|
63
|
+
python-version: ['3.11', '3.12', '3.13']
|
|
64
64
|
exclude:
|
|
65
65
|
# Reduce matrix size - test all Python versions on Ubuntu, subset on others
|
|
66
66
|
- os: macos-latest
|
|
67
|
-
python-version: '3.
|
|
67
|
+
python-version: '3.11'
|
|
68
68
|
- os: macos-latest
|
|
69
69
|
python-version: '3.12'
|
|
70
70
|
|
|
@@ -72,7 +72,7 @@ jobs:
|
|
|
72
72
|
|
|
73
73
|
steps:
|
|
74
74
|
- name: Checkout repository
|
|
75
|
-
uses: actions/checkout@
|
|
75
|
+
uses: actions/checkout@v5
|
|
76
76
|
|
|
77
77
|
- name: Set up Python ${{ matrix.python-version }}
|
|
78
78
|
uses: actions/setup-python@v6
|
|
@@ -80,7 +80,7 @@ jobs:
|
|
|
80
80
|
python-version: ${{ matrix.python-version }}
|
|
81
81
|
|
|
82
82
|
- name: Install uv
|
|
83
|
-
uses: astral-sh/setup-uv@
|
|
83
|
+
uses: astral-sh/setup-uv@v7
|
|
84
84
|
|
|
85
85
|
- name: Install dependencies
|
|
86
86
|
run: |
|
|
@@ -108,7 +108,7 @@ jobs:
|
|
|
108
108
|
|
|
109
109
|
steps:
|
|
110
110
|
- name: Checkout repository
|
|
111
|
-
uses: actions/checkout@
|
|
111
|
+
uses: actions/checkout@v5
|
|
112
112
|
|
|
113
113
|
- name: Set up Python
|
|
114
114
|
uses: actions/setup-python@v6
|
|
@@ -116,7 +116,7 @@ jobs:
|
|
|
116
116
|
python-version: '3.11'
|
|
117
117
|
|
|
118
118
|
- name: Install uv
|
|
119
|
-
uses: astral-sh/setup-uv@
|
|
119
|
+
uses: astral-sh/setup-uv@v7
|
|
120
120
|
|
|
121
121
|
- name: Install dependencies
|
|
122
122
|
run: |
|
|
@@ -132,7 +132,7 @@ jobs:
|
|
|
132
132
|
uv run bandit -r gpjax/ -f json -o bandit-report.json || echo "Bandit scan completed with warnings"
|
|
133
133
|
|
|
134
134
|
- name: Upload security reports
|
|
135
|
-
uses: actions/upload-artifact@
|
|
135
|
+
uses: actions/upload-artifact@v5
|
|
136
136
|
with:
|
|
137
137
|
name: security-reports
|
|
138
138
|
path: |
|
|
@@ -146,7 +146,7 @@ jobs:
|
|
|
146
146
|
|
|
147
147
|
steps:
|
|
148
148
|
- name: Checkout repository
|
|
149
|
-
uses: actions/checkout@
|
|
149
|
+
uses: actions/checkout@v5
|
|
150
150
|
|
|
151
151
|
- name: Set up Python
|
|
152
152
|
uses: actions/setup-python@v6
|
|
@@ -154,7 +154,7 @@ jobs:
|
|
|
154
154
|
python-version: '3.11'
|
|
155
155
|
|
|
156
156
|
- name: Install uv
|
|
157
|
-
uses: astral-sh/setup-uv@
|
|
157
|
+
uses: astral-sh/setup-uv@v7
|
|
158
158
|
|
|
159
159
|
- name: Build package
|
|
160
160
|
run: |
|
|
@@ -166,7 +166,7 @@ jobs:
|
|
|
166
166
|
uv run twine check dist/*
|
|
167
167
|
|
|
168
168
|
- name: Upload build artifacts
|
|
169
|
-
uses: actions/upload-artifact@
|
|
169
|
+
uses: actions/upload-artifact@v5
|
|
170
170
|
with:
|
|
171
171
|
name: dist-packages
|
|
172
172
|
path: dist/
|
|
@@ -181,7 +181,7 @@ jobs:
|
|
|
181
181
|
|
|
182
182
|
steps:
|
|
183
183
|
- name: Checkout repository
|
|
184
|
-
uses: actions/checkout@
|
|
184
|
+
uses: actions/checkout@v5
|
|
185
185
|
with:
|
|
186
186
|
fetch-depth: 0
|
|
187
187
|
|
|
@@ -261,10 +261,10 @@ jobs:
|
|
|
261
261
|
|
|
262
262
|
steps:
|
|
263
263
|
- name: Checkout repository
|
|
264
|
-
uses: actions/checkout@
|
|
264
|
+
uses: actions/checkout@v5
|
|
265
265
|
|
|
266
266
|
- name: Download build artifacts
|
|
267
|
-
uses: actions/download-artifact@
|
|
267
|
+
uses: actions/download-artifact@v6
|
|
268
268
|
with:
|
|
269
269
|
name: dist-packages
|
|
270
270
|
path: dist/
|
|
@@ -294,7 +294,7 @@ jobs:
|
|
|
294
294
|
|
|
295
295
|
steps:
|
|
296
296
|
- name: Download build artifacts
|
|
297
|
-
uses: actions/download-artifact@
|
|
297
|
+
uses: actions/download-artifact@v6
|
|
298
298
|
with:
|
|
299
299
|
name: dist-packages
|
|
300
300
|
path: dist/
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
|
|
21
21
|
steps:
|
|
22
22
|
- name: Checkout repository
|
|
23
|
-
uses: actions/checkout@
|
|
23
|
+
uses: actions/checkout@v5
|
|
24
24
|
|
|
25
25
|
- name: Set up Python
|
|
26
26
|
uses: actions/setup-python@v6
|
|
@@ -28,7 +28,7 @@ jobs:
|
|
|
28
28
|
python-version: '3.11'
|
|
29
29
|
|
|
30
30
|
- name: Install uv
|
|
31
|
-
uses: astral-sh/setup-uv@
|
|
31
|
+
uses: astral-sh/setup-uv@v7
|
|
32
32
|
with:
|
|
33
33
|
version: "latest"
|
|
34
34
|
|
|
@@ -47,7 +47,7 @@ jobs:
|
|
|
47
47
|
uv run bandit -r gpjax/ -f json -o bandit-report.json || true
|
|
48
48
|
|
|
49
49
|
- name: Upload dependency scan results
|
|
50
|
-
uses: actions/upload-artifact@
|
|
50
|
+
uses: actions/upload-artifact@v5
|
|
51
51
|
if: always()
|
|
52
52
|
with:
|
|
53
53
|
name: security-scan-results
|
|
@@ -62,7 +62,7 @@ jobs:
|
|
|
62
62
|
|
|
63
63
|
steps:
|
|
64
64
|
- name: Checkout repository
|
|
65
|
-
uses: actions/checkout@
|
|
65
|
+
uses: actions/checkout@v5
|
|
66
66
|
with:
|
|
67
67
|
fetch-depth: 0 # Fetch full history for comprehensive scanning
|
|
68
68
|
|
|
@@ -18,7 +18,7 @@ jobs:
|
|
|
18
18
|
steps:
|
|
19
19
|
# Grap the latest commit from the branch
|
|
20
20
|
- name: Checkout the branch
|
|
21
|
-
uses: actions/checkout@
|
|
21
|
+
uses: actions/checkout@v5
|
|
22
22
|
with:
|
|
23
23
|
persist-credentials: false
|
|
24
24
|
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
|
|
33
33
|
# Install uv
|
|
34
34
|
- name: Install uv
|
|
35
|
-
uses: astral-sh/setup-uv@
|
|
35
|
+
uses: astral-sh/setup-uv@v7
|
|
36
36
|
with:
|
|
37
37
|
version: "latest"
|
|
38
38
|
|
|
@@ -11,12 +11,12 @@ jobs:
|
|
|
11
11
|
strategy:
|
|
12
12
|
matrix:
|
|
13
13
|
os: ["ubuntu-latest", "macos-latest"]
|
|
14
|
-
python-version: ["3.
|
|
14
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
15
15
|
fail-fast: true
|
|
16
16
|
runs-on: ${{ matrix.os }}
|
|
17
17
|
steps:
|
|
18
18
|
- name: Check out the code
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v5
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 1
|
|
22
22
|
- name: Set up Python ${{ matrix.python-version }}
|
|
@@ -26,7 +26,7 @@ jobs:
|
|
|
26
26
|
|
|
27
27
|
# Install uv
|
|
28
28
|
- name: Install uv
|
|
29
|
-
uses: astral-sh/setup-uv@
|
|
29
|
+
uses: astral-sh/setup-uv@v7
|
|
30
30
|
with:
|
|
31
31
|
version: "latest"
|
|
32
32
|
|
|
@@ -42,7 +42,7 @@ jobs:
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
- name: Upload code coverage
|
|
45
|
-
uses: codecov/codecov-action@
|
|
45
|
+
uses: codecov/codecov-action@v5
|
|
46
46
|
with:
|
|
47
47
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
48
48
|
file: ./coverage.xml
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gpjax
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.1
|
|
4
4
|
Summary: Gaussian processes in JAX.
|
|
5
5
|
Project-URL: Documentation, https://docs.jaxgaussianprocesses.com/
|
|
6
6
|
Project-URL: Issues, https://github.com/JaxGaussianProcesses/GPJax/issues
|
|
@@ -11,15 +11,14 @@ License-File: LICENSE.txt
|
|
|
11
11
|
Keywords: gaussian-processes jax machine-learning bayesian
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Programming Language :: Python
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
17
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
19
18
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
20
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.11
|
|
21
20
|
Requires-Dist: beartype>0.16.1
|
|
22
|
-
Requires-Dist: flax>=0.
|
|
21
|
+
Requires-Dist: flax>=0.12.0
|
|
23
22
|
Requires-Dist: jax>=0.5.0
|
|
24
23
|
Requires-Dist: jaxlib>=0.5.0
|
|
25
24
|
Requires-Dist: jaxtyping>0.2.10
|
|
@@ -80,6 +79,7 @@ Description-Content-Type: text/markdown
|
|
|
80
79
|
[](https://www.codefactor.io/repository/github/jaxgaussianprocesses/gpjax)
|
|
81
80
|
[](https://app.netlify.com/sites/endearing-crepe-c2d5fe/deploys)
|
|
82
81
|
[](https://badge.fury.io/py/GPJax)
|
|
82
|
+
[](https://anaconda.org/conda-forge/gpjax)
|
|
83
83
|
[](https://doi.org/10.21105/joss.04455)
|
|
84
84
|
[](https://pepy.tech/project/gpjax)
|
|
85
85
|
[](https://join.slack.com/t/gpjax/shared_invite/zt-3cesiykcx-nzajjRdnV3ohw7~~eMlCYA)
|
|
@@ -174,13 +174,21 @@ jupytext --to py:percent example.ipynb
|
|
|
174
174
|
|
|
175
175
|
## Stable version
|
|
176
176
|
|
|
177
|
-
The latest stable version of GPJax can be installed
|
|
178
|
-
pip:
|
|
177
|
+
The latest stable version of GPJax can be installed from [PyPI](https://pypi.org/project/gpjax/):
|
|
179
178
|
|
|
180
179
|
```bash
|
|
181
180
|
pip install gpjax
|
|
182
181
|
```
|
|
183
182
|
|
|
183
|
+
or from [conda-forge](https://github.com/conda-forge/gpjax-feedstock):
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# with Pixi
|
|
187
|
+
pixi add gpjax
|
|
188
|
+
# or with conda
|
|
189
|
+
conda install --channel conda-forge gpjax
|
|
190
|
+
```
|
|
191
|
+
|
|
184
192
|
> **Note**
|
|
185
193
|
>
|
|
186
194
|
> We recommend you check your installation version:
|
|
@@ -199,7 +207,7 @@ pip install gpjax
|
|
|
199
207
|
>
|
|
200
208
|
> We advise you create virtual environment before installing:
|
|
201
209
|
> ```
|
|
202
|
-
> conda create -n gpjax_experimental python=3.
|
|
210
|
+
> conda create -n gpjax_experimental python=3.11.0
|
|
203
211
|
> conda activate gpjax_experimental
|
|
204
212
|
> ```
|
|
205
213
|
|
|
@@ -209,14 +217,14 @@ configuration in development mode.
|
|
|
209
217
|
```bash
|
|
210
218
|
git clone https://github.com/JaxGaussianProcesses/GPJax.git
|
|
211
219
|
cd GPJax
|
|
212
|
-
|
|
213
|
-
|
|
220
|
+
uv venv
|
|
221
|
+
uv sync --extra dev
|
|
214
222
|
```
|
|
215
223
|
|
|
216
224
|
> We recommend you check your installation passes the supplied unit tests:
|
|
217
225
|
>
|
|
218
226
|
> ```python
|
|
219
|
-
>
|
|
227
|
+
> uv run poe all-tests
|
|
220
228
|
> ```
|
|
221
229
|
|
|
222
230
|
# Citing GPJax
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
[](https://www.codefactor.io/repository/github/jaxgaussianprocesses/gpjax)
|
|
9
9
|
[](https://app.netlify.com/sites/endearing-crepe-c2d5fe/deploys)
|
|
10
10
|
[](https://badge.fury.io/py/GPJax)
|
|
11
|
+
[](https://anaconda.org/conda-forge/gpjax)
|
|
11
12
|
[](https://doi.org/10.21105/joss.04455)
|
|
12
13
|
[](https://pepy.tech/project/gpjax)
|
|
13
14
|
[](https://join.slack.com/t/gpjax/shared_invite/zt-3cesiykcx-nzajjRdnV3ohw7~~eMlCYA)
|
|
@@ -102,13 +103,21 @@ jupytext --to py:percent example.ipynb
|
|
|
102
103
|
|
|
103
104
|
## Stable version
|
|
104
105
|
|
|
105
|
-
The latest stable version of GPJax can be installed
|
|
106
|
-
pip:
|
|
106
|
+
The latest stable version of GPJax can be installed from [PyPI](https://pypi.org/project/gpjax/):
|
|
107
107
|
|
|
108
108
|
```bash
|
|
109
109
|
pip install gpjax
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
+
or from [conda-forge](https://github.com/conda-forge/gpjax-feedstock):
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# with Pixi
|
|
116
|
+
pixi add gpjax
|
|
117
|
+
# or with conda
|
|
118
|
+
conda install --channel conda-forge gpjax
|
|
119
|
+
```
|
|
120
|
+
|
|
112
121
|
> **Note**
|
|
113
122
|
>
|
|
114
123
|
> We recommend you check your installation version:
|
|
@@ -127,7 +136,7 @@ pip install gpjax
|
|
|
127
136
|
>
|
|
128
137
|
> We advise you create virtual environment before installing:
|
|
129
138
|
> ```
|
|
130
|
-
> conda create -n gpjax_experimental python=3.
|
|
139
|
+
> conda create -n gpjax_experimental python=3.11.0
|
|
131
140
|
> conda activate gpjax_experimental
|
|
132
141
|
> ```
|
|
133
142
|
|
|
@@ -137,14 +146,14 @@ configuration in development mode.
|
|
|
137
146
|
```bash
|
|
138
147
|
git clone https://github.com/JaxGaussianProcesses/GPJax.git
|
|
139
148
|
cd GPJax
|
|
140
|
-
|
|
141
|
-
|
|
149
|
+
uv venv
|
|
150
|
+
uv sync --extra dev
|
|
142
151
|
```
|
|
143
152
|
|
|
144
153
|
> We recommend you check your installation passes the supplied unit tests:
|
|
145
154
|
>
|
|
146
155
|
> ```python
|
|
147
|
-
>
|
|
156
|
+
> uv run poe all-tests
|
|
148
157
|
> ```
|
|
149
158
|
|
|
150
159
|
# Citing GPJax
|