Skip to content

Commit e8ee745

Browse files
authored
Merge branch 'main' into feature/positions_threshold
2 parents 1c07544 + b585794 commit e8ee745

91 files changed

Lines changed: 3923 additions & 801 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/url_check.yml

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,16 @@ on:
44
push:
55
branches: [main]
66
pull_request:
7+
schedule:
8+
- cron: '0 4 * * 1' # Mondays 04:00 UTC
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
713

814
jobs:
9-
url_check:
15+
url_check_patterns:
16+
name: Offline regex guard
1017
runs-on: ubuntu-latest
1118
steps:
1219
- name: Checkout repo
@@ -21,3 +28,68 @@ jobs:
2128
path: PyAutoBuild
2229
- name: Run url_check.sh
2330
run: bash PyAutoBuild/autobuild/url_check.sh repo
31+
32+
url_check_live:
33+
name: Live HTTP audit (weekly)
34+
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
35+
runs-on: ubuntu-latest
36+
permissions:
37+
contents: read
38+
issues: write
39+
steps:
40+
- name: Checkout repo
41+
uses: actions/checkout@v4
42+
with:
43+
path: repo
44+
- name: Checkout PyAutoBuild
45+
uses: actions/checkout@v4
46+
with:
47+
repository: PyAutoLabs/PyAutoBuild
48+
ref: main
49+
path: PyAutoBuild
50+
- name: Set up Python
51+
uses: actions/setup-python@v5
52+
with:
53+
python-version: '3.12'
54+
- name: Install requests
55+
run: pip install --quiet requests
56+
- name: Run live URL audit
57+
id: audit
58+
run: |
59+
set +e
60+
body=$(bash PyAutoBuild/autobuild/url_check_live.sh repo)
61+
rc=$?
62+
printf '%s\n' "$body" > /tmp/url_audit_body.md
63+
echo "rc=$rc" >> "$GITHUB_OUTPUT"
64+
cat /tmp/url_audit_body.md
65+
exit 0
66+
- name: Open or update [url-check] tracking issue
67+
if: steps.audit.outputs.rc != '0'
68+
env:
69+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
70+
run: |
71+
cd repo
72+
existing=$(gh issue list --search '"[url-check]"' --state open --json number --jq '.[0].number // empty')
73+
if [ -n "$existing" ]; then
74+
echo "Updating existing tracking issue #$existing"
75+
gh issue comment "$existing" --body-file /tmp/url_audit_body.md
76+
else
77+
echo "Opening new tracking issue"
78+
gh issue create \
79+
--title "[url-check] New broken URLs detected" \
80+
--body-file /tmp/url_audit_body.md \
81+
--label url-check 2>/dev/null \
82+
|| gh issue create \
83+
--title "[url-check] New broken URLs detected" \
84+
--body-file /tmp/url_audit_body.md
85+
fi
86+
- name: Close stale tracking issue if audit is clean
87+
if: steps.audit.outputs.rc == '0'
88+
env:
89+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
90+
run: |
91+
cd repo
92+
for n in $(gh issue list --search '"[url-check]"' --state open --json number --jq '.[].number'); do
93+
echo "Closing now-clean tracking issue #$n"
94+
gh issue close "$n" --comment "Weekly URL audit is clean — closing automatically."
95+
done

.url_check_allowlist.txt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Known broken URLs grandfathered for url_check_live.sh.
2+
# Format: one URL per line. Lines starting with '#' and blank lines are ignored.
3+
# Sample location follows each URL as a trailing comment.
4+
#
5+
# This file is referenced by .github/workflows/url_check.yml (weekly cron).
6+
# url_check_live.sh fails CI when a URL is broken AND not in this file.
7+
# To accept new breakage: append the URL here. To force a fix: leave it out.
8+
9+
# Academic citations (paywall / DOI / journal)
10+
https://academic.oup.com/mnras/article-abstract/478/4/4738/5001434?redirectedFrom=fulltext # CITATIONS.md:11
11+
https://academic.oup.com/mnras/article-abstract/489/2/2049/5550746 # docs/index.md:35
12+
https://academic.oup.com/mnras/article/442/3/2017/1048278 # docs/index.md:36
13+
https://academic.oup.com/mnras/article/452/3/2940/1749640 # CITATIONS.md:11
14+
https://academic.oup.com/mnras/article/468/3/2590/3055701 # docs/index.md:37
15+
https://academic.oup.com/mnras/article/488/1/1387/5526256 # CITATIONS.md:22
16+
17+
# Code of Conduct boilerplate
18+
http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy # CODE_OF_CONDUCT.md:305
19+
20+
# Colab refs to notebooks no longer in HowTo/workspace
21+
https://colab.research.google.com/github/PyAutoLabs/HowToLens/blob/2026.5.14.2/notebooks/chapter_3_search_chaining/tutorial_4_complex_source.ipynb # docs/howtolens/chapter_3_search_chaining.md:20
22+
https://colab.research.google.com/github/PyAutoLabs/HowToLens/blob/2026.5.14.2/notebooks/chapter_4_pixelizations/tutorial_11_adapt_regularization.py.ipynb # docs/howtolens/chapter_4_pixelizations.md:37
23+
https://colab.research.google.com/github/PyAutoLabs/HowToLens/blob/2026.5.14.2/notebooks/chapter_optional/tutorial_sub_grids.ipynb # docs/howtolens/chapter_optional.md:7
24+
25+
# External dead / paywalled / departmental pages
26+
http://www.ita.uni-heidelberg.de/~massimo/sub/Lectures/gl_all.pdf # docs/howtolens/howtolens.md:36
27+
https://bitbucket.org/bdiemer/colossus/src/main/ # files/citations.md:12
28+
29+
# GitHub refs (workspaces / removed tutorials)
30+
https://github.com/PyAutoLabs/autolens_workspace/blob/main/notebooks/imaging/advanced/chaining/start_here.ipynb # docs/general/model_cookbook.md:384
31+
https://github.com/PyAutoLabs/autolens_workspace/blob/main/scripts/imaging/preprocess/gui/positions.py # docs/general/demagnified_solutions.md:73
32+
33+
# Internal PyAuto docs — pages renamed, need editorial fix
34+
https://pyautolens.readthedocs.io/en/latest/advanced/slam.html # docs/general/workspace.md:49
35+
https://pyautolens.readthedocs.io/en/latest/general/installation.html#installation-with-pip # docs/general/workspace.md:7
36+
https://pyautolens.readthedocs.io/en/latest/installation/numba.html # docs/installation/pip.md:86
37+
38+
# Internal image refs missing from main
39+
https://raw.githubusercontent.com/PyAutoLabs/PyAutoLens/main/docs/general/images/data.png # docs/general/demagnified_solutions.md:13
40+
https://raw.githubusercontent.com/PyAutoLabs/PyAutoLens/main/docs/general/images/lensed_source.png # docs/general/demagnified_solutions.md:67
41+
https://raw.githubusercontent.com/PyAutoLabs/PyAutoLens/main/docs/general/images/model_image.png # docs/general/demagnified_solutions.md:18
42+
https://raw.githubusercontent.com/PyAutoLabs/PyAutoLens/main/docs/overview/images/overview_3/g_image.png # docs/overview/overview_3_features.md:150
43+
https://raw.githubusercontent.com/PyAutoLabs/PyAutoLens/main/docs/overview/images/overview_3/r_image.png # docs/overview/overview_3_features.md:155

CITATIONS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# Citations & References
22

33
The bibtex entries for **PyAutoLens** and its affiliated software packages can be found
4-
[here](https://github.com/Jammy2211/PyAutoLens/blob/main/files/citations.bib), with example text for citing **PyAutoLens**
5-
in [.tex format here](https://github.com/Jammy2211/PyAutoLens/blob/main/files/citations.tex) format here and
6-
[.md format here](https://github.com/Jammy2211/PyAutoLens/blob/main/files/citations.md). As shown in the examples, we
4+
[here](https://github.com/PyAutoLabs/PyAutoLens/blob/main/files/citations.bib), with example text for citing **PyAutoLens**
5+
in [.tex format here](https://github.com/PyAutoLabs/PyAutoLens/blob/main/files/citations.tex) format here and
6+
[.md format here](https://github.com/PyAutoLabs/PyAutoLens/blob/main/files/citations.md). As shown in the examples, we
77
would greatly appreciate it if you mention **PyAutoLens** by name and include a link to our GitHub page!
88

99
**PyAutoLens** is published in the [Journal of Open Source Software](https://joss.theoj.org/papers/10.21105/joss.02825#) and its

CLAUDE.md

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ autolens/
8282
imaging/ FitImaging, AnalysisImaging
8383
interferometer/ FitInterferometer, AnalysisInterferometer
8484
point/ Point-source datasets, fits, and analysis
85-
quantity/ FitQuantity for arbitrary lensing quantities
8685
analysis/ Shared analysis base classes, adapt images
8786
aggregator/ Scraping results from autofit output directories
8887
plot/ Visualisation for all data types
@@ -156,26 +155,26 @@ When importing `autolens as al`:
156155
## Line Endings — Always Unix (LF)
157156

158157
All files **must use Unix line endings (LF, `\n`)**. Never write `\r\n` line endings.
159-
## Never rewrite history
160-
161-
NEVER perform these operations on any repo with a remote:
162-
163-
- `git init` in a directory already tracked by git
164-
- `rm -rf .git && git init`
165-
- Commit with subject "Initial commit", "Fresh start", "Start fresh", "Reset
166-
for AI workflow", or any equivalent message on a branch with a remote
167-
- `git push --force` to `main` (or any branch tracked as `origin/HEAD`)
168-
- `git filter-repo` / `git filter-branch` on shared branches
169-
- `git rebase -i` rewriting commits already pushed to a shared branch
170-
171-
If the working tree needs a clean state, the **only** correct sequence is:
172-
173-
git fetch origin
174-
git reset --hard origin/main
175-
git clean -fd
176-
177-
This applies equally to humans, local Claude Code, cloud Claude agents, Codex,
178-
and any other agent. The "Initial commit — fresh start for AI workflow" pattern
179-
that appeared independently on origin and local for three workspace repos is
180-
exactly what this rule prevents — it costs ~40 commits of redundant local work
181-
every time it happens.
158+
## Never rewrite history
159+
160+
NEVER perform these operations on any repo with a remote:
161+
162+
- `git init` in a directory already tracked by git
163+
- `rm -rf .git && git init`
164+
- Commit with subject "Initial commit", "Fresh start", "Start fresh", "Reset
165+
for AI workflow", or any equivalent message on a branch with a remote
166+
- `git push --force` to `main` (or any branch tracked as `origin/HEAD`)
167+
- `git filter-repo` / `git filter-branch` on shared branches
168+
- `git rebase -i` rewriting commits already pushed to a shared branch
169+
170+
If the working tree needs a clean state, the **only** correct sequence is:
171+
172+
git fetch origin
173+
git reset --hard origin/main
174+
git clean -fd
175+
176+
This applies equally to humans, local Claude Code, cloud Claude agents, Codex,
177+
and any other agent. The "Initial commit — fresh start for AI workflow" pattern
178+
that appeared independently on origin and local for three workspace repos is
179+
exactly what this rule prevents — it costs ~40 commits of redundant local work
180+
every time it happens.

CODE_OF_CONDUCT.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ the situation is not yet resolved.
301301

302302
## License
303303

304-
This code of conduct has been adapted from [*NUMFOCUS code of conduct*](https://github.com/numfocus/numfocus/blob/main/manual/numfocus-coc.md#the-short-version),
305-
which is adapted from numerous sources, including the [*Geek Feminism wiki, created by the Ada Initiative and other volunteers, which is under a Creative Commons Zero license*](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), the [*Contributor Covenant version 1.2.0*](http://contributor-covenant.org/version/1/2/0/), the [*Bokeh Code of Conduct*](https://github.com/bokeh/bokeh/blob/main/CODE_OF_CONDUCT.md), the [*SciPy Code of Conduct*](https://github.com/jupyter/governance/blob/main/conduct/enforcement.md), the [*Carpentries Code of Conduct*](https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html#enforcement-manual), and the [*NeurIPS Code of Conduct*](https://neurips.cc/public/CodeOfConduct).
304+
This code of conduct has been adapted from [*NUMFOCUS code of conduct*](https://numfocus.org/code-of-conduct),
305+
which is adapted from numerous sources, including the [*Geek Feminism wiki, created by the Ada Initiative and other volunteers, which is under a Creative Commons Zero license*](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), the [*Contributor Covenant version 1.2.0*](http://contributor-covenant.org/version/1/2/0/), the [*Bokeh Code of Conduct*](https://github.com/bokeh/bokeh/blob/main/docs/CODE_OF_CONDUCT.md), the [*SciPy Code of Conduct*](https://github.com/jupyter/governance/blob/main/conduct/enforcement.md), the [*Carpentries Code of Conduct*](https://docs.carpentries.org/topic_folders/policies/code-of-conduct.html#enforcement-manual), and the [*NeurIPS Code of Conduct*](https://neurips.cc/public/CodeOfConduct).
306306

307307
**PyAutoLens Code of Conduct is licensed under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).**

CONTRIBUTING.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ Contributions are welcome and greatly appreciated!
7474

7575
### Report Bugs
7676

77-
Report bugs at https://github.com/Jammy2211/PyAutoLens/issues
77+
Report bugs at https://github.com/PyAutoLabs/PyAutoLens/issues
7878

7979
If you are playing with the PyAutoLens library and find a bug, please
8080
reporting it including:
@@ -86,7 +86,7 @@ reporting it including:
8686
### Propose New Features
8787

8888
The best way to send feedback is to open an issue at
89-
https://github.com/Jammy2211/PyAutoLens
89+
https://github.com/PyAutoLabs/PyAutoLens
9090
with tag *enhancement*.
9191

9292
If you are proposing a nnew feature:

README.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# PyAutoLens-JAX: Open-Source Strong Lensing
22

3-
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob/2026.5.8.2/start_here.ipynb)
3+
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob/2026.5.29.4/notebooks/imaging/start_here.ipynb)
44
[![Documentation Status](https://readthedocs.org/projects/pyautolens/badge/?version=latest)](https://pyautolens.readthedocs.io/en/latest/?badge=latest)
5-
[![Tests](https://github.com/Jammy2211/PyAutoLens/actions/workflows/main.yml/badge.svg)](https://github.com/Jammy2211/PyAutoLens/actions)
5+
[![Tests](https://github.com/PyAutoLabs/PyAutoLens/actions/workflows/main.yml/badge.svg)](https://github.com/PyAutoLabs/PyAutoLens/actions)
66
[![Build](https://github.com/Jammy2211/PyAutoBuild/actions/workflows/release.yml/badge.svg)](https://github.com/Jammy2211/PyAutoBuild/actions)
77
[![Code Style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
88
[![JOSS](https://joss.theoj.org/papers/10.21105/joss.02825/status.svg)](https://doi.org/10.21105/joss.02825)
@@ -14,7 +14,7 @@
1414

1515
[Installation Guide](https://pyautolens.readthedocs.io/en/latest/installation/overview.html) |
1616
[readthedocs](https://pyautolens.readthedocs.io/en/latest/index.html) |
17-
[Introduction on Colab](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob/2026.5.8.2/start_here.ipynb) |
17+
[Introduction on Colab](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob/2026.5.29.4/notebooks/imaging/start_here.ipynb) |
1818
[HowToLens](https://pyautolens.readthedocs.io/en/latest/howtolens/howtolens.html)
1919

2020
<img src="https://github.com/Jammy2211/PyAutoLogo/blob/main/gifs/pyautolens.gif?raw=true" width="900" />
@@ -23,12 +23,14 @@ When two or more galaxies are aligned perfectly down our line-of-sight, the back
2323

2424
This is called strong gravitational lensing and **PyAutoLens** makes it **simple** to model strong gravitational lenses, using JAX to **accelerate lens modeling on GPUs**.
2525

26+
> 🤖 **Prototype:** [**autolens_assistant**](https://github.com/PyAutoLabs/autolens_assistant) is an early-stage AI assistant you talk to in natural language to do lens modeling end-to-end. It is experimental and **not the recommended starting point** — the readthedocs, autolens_workspace, and HowToLens below remain the canonical entry points. Try it if you'd like to drive PyAutoLens by conversation.
27+
2628
## Getting Started
2729

2830
The following links are useful for new starters:
2931

3032
- [The PyAutoLens readthedocs](https://pyautolens.readthedocs.io/en/latest): which includes [an overview of PyAutoLens's core features](https://pyautolens.readthedocs.io/en/latest/overview/overview_1_start_here.html), [a new user starting guide](https://pyautolens.readthedocs.io/en/latest/overview/overview_2_new_user_guide.html) and [an installation guide](https://pyautolens.readthedocs.io/en/latest/installation/overview.html).
31-
- [The introduction Jupyter Notebook on Google Colab](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob/2026.5.8.2/start_here.ipynb): try **PyAutoLens** in a web browser (without installation).
33+
- [The introduction Jupyter Notebook on Google Colab](https://colab.research.google.com/github/PyAutoLabs/autolens_workspace/blob/2026.5.29.4/notebooks/imaging/start_here.ipynb): try **PyAutoLens** in a web browser (without installation).
3234
- [The autolens_workspace GitHub repository](https://github.com/PyAutoLabs/autolens_workspace): example scripts covering every **PyAutoLens** use case.
3335
- [The HowToLens GitHub repository](https://github.com/PyAutoLabs/HowToLens): a Jupyter notebook lecture series teaching strong lensing and lens modeling from the ground up.
3436

@@ -39,7 +41,7 @@ gravitational lensing analysis, and helps troubleshoot problems.
3941

4042
Slack is invitation-only. If you'd like to join, please send an email requesting an invite.
4143

42-
For installation issues, bug reports, or feature requests, please raise an issue on the [GitHub issues page](https://github.com/Jammy2211/PyAutoLens/issues).
44+
For installation issues, bug reports, or feature requests, please raise an issue on the [GitHub issues page](https://github.com/PyAutoLabs/PyAutoLens/issues).
4345

4446
## HowToLens
4547

@@ -51,10 +53,10 @@ A complete overview of the lectures [is provided on the HowToLens readthedocs pa
5153

5254
## Citations
5355

54-
Information on how to cite **PyAutoLens** in publications can be found [on the citations page](https://github.com/Jammy2211/PyAutoLens/blob/main/CITATIONS.md).
56+
Information on how to cite **PyAutoLens** in publications can be found [on the citations page](https://github.com/PyAutoLabs/PyAutoLens/blob/main/CITATIONS.md).
5557

5658
## Contributing
5759

58-
Information on how to contribute to **PyAutoLens** can be found [on the contributing page](https://github.com/Jammy2211/PyAutoLens/blob/main/CONTRIBUTING.md).
60+
Information on how to contribute to **PyAutoLens** can be found [on the contributing page](https://github.com/PyAutoLabs/PyAutoLens/blob/main/CONTRIBUTING.md).
5961

6062
Hands on support for contributions is available via our Slack workspace, again please email to request an invite.

autolens/__init__.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,14 @@
6363
from autogalaxy.galaxy.galaxy_table import GalaxyTable
6464
from autogalaxy.galaxy.galaxy_table import galaxy_table_from_csv
6565
from autogalaxy.galaxy.galaxy_table import galaxy_table_to_csv
66+
from autogalaxy.galaxy.galaxy_model_csv import GalaxyModelRow
67+
from autogalaxy.galaxy.galaxy_model_csv import GalaxyModelTable
68+
from autogalaxy.galaxy.galaxy_model_csv import galaxy_models_from_csv
69+
from autogalaxy.galaxy.galaxy_model_csv import galaxy_models_to_csv
70+
from autogalaxy.galaxy.galaxy_model_csv import galaxies_from_csv_tables
71+
from autogalaxy.galaxy.galaxy_model_csv import galaxy_af_models_from_csv_tables
6672
from autogalaxy.galaxy.redshift import Redshift
6773

68-
from autogalaxy.quantity.dataset_quantity import DatasetQuantity
6974
from autogalaxy.profiles.geometry_profiles import EllProfile
7075
from autogalaxy.profiles import (
7176
point_sources as ps,
@@ -86,7 +91,6 @@
8691
from autogalaxy.profiles.light.linear import LightProfileLinearObjFuncList
8792
from autogalaxy.operate.image import OperateImage
8893
from autogalaxy.operate.lens_calc import LensCalc
89-
from autogalaxy.quantity.dataset_quantity import DatasetQuantity
9094
from autogalaxy import convert
9195

9296
from . import aggregator as agg
@@ -119,9 +123,8 @@
119123
from .point.model.analysis import AnalysisPoint
120124
from .point.solver import PointSolver
121125
from .point.solver.shape_solver import ShapeSolver
122-
from .quantity.fit_quantity import FitQuantity
123-
from .quantity.model.analysis import AnalysisQuantity
124126
from .weak.dataset import WeakDataset
127+
from .weak.fit import FitWeak
125128
from .weak.simulator import SimulatorShearYX
126129

127130
from . import exc
@@ -137,7 +140,7 @@
137140

138141
conf.instance.register(__file__)
139142

140-
__version__ = "2026.5.8.2"
143+
__version__ = "2026.5.29.4"
141144

142145
from autoconf import check_version
143146

autolens/analysis/analysis/lens.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
Lensing-specific mixin for all **PyAutoLens** ``Analysis`` classes.
33
44
``AnalysisLens`` is a mixin that adds lensing-specific behaviour to any analysis class.
5-
It is inherited (alongside dataset-specific base classes) by ``AnalysisDataset``,
6-
``AnalysisPoint``, and ``AnalysisQuantity``.
5+
It is inherited (alongside dataset-specific base classes) by ``AnalysisDataset``
6+
and ``AnalysisPoint``.
77
88
Key responsibilities:
99

0 commit comments

Comments
 (0)