Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
9ca700a
Rename package to solweig, add UTCI/PET Rust modules
songololo Jan 20, 2026
4b42939
cleanup packages
songololo Jan 20, 2026
bd79063
Phase 1 complete: Testing infrastructure with UMEP Python ground truth
songololo Jan 21, 2026
75f0462
Add simplified SOLWEIG API with 100% parity to runner
songololo Jan 21, 2026
36d91f1
Update MODERNIZATION_PLAN with January 2026 progress
songololo Jan 23, 2026
3ac83ac
Phase 5 complete: API organization and legacy deletion
songololo Jan 23, 2026
915ada3
Clean up deprecated session summaries and old test files
songololo Jan 23, 2026
93c62b1
Add color preview images using matplotlib colormaps
songololo Jan 23, 2026
5b2318e
increment
songololo Feb 2, 2026
778c88a
iter
songololo Feb 3, 2026
d390cf2
iter
songololo Feb 3, 2026
3863a91
iter
songololo Feb 3, 2026
208c68d
Add golden test fixtures and comprehensive regression tests
songololo Feb 4, 2026
f945dbe
Phase E: API improvements - error handling, result methods, config pr…
songololo Feb 4, 2026
886777a
iter
songololo Feb 4, 2026
38ac7b9
Add ROADMAP.md tracking project development priorities
songololo Feb 4, 2026
b2d6334
scaffolds docs and QGIS.
songololo Feb 4, 2026
5fca476
low sun angles
songololo Feb 5, 2026
b8da467
cleanup
songololo Feb 5, 2026
bf7c6e2
Phase G steps 1-2: move cylindric_wedge and patch sum to Rust
songololo Feb 5, 2026
4455bbd
QGIS and Rust.
songololo Feb 5, 2026
35b6e33
tests
songololo Feb 6, 2026
3a8e3ea
Align poe verify_project and typecheck tasks with pre-commit hook cov…
songololo Feb 6, 2026
b75daca
Update roadmap: mark G.2 complete, clarify GPU buffer reuse scope
songololo Feb 6, 2026
989aad9
GPU buffer reuse: cache wgpu buffers across shadow calls (G.3.1)
songololo Feb 6, 2026
c170fa9
Add poe test/test_full tasks with pytest.mark.slow split
songololo Feb 6, 2026
f5749bd
Expand CI test coverage: all non-slow tests + fix ty check scope
songololo Feb 6, 2026
e79b889
Rename poe test to test_quick for clarity
songololo Feb 6, 2026
738a126
Add QGIS plugin tests: 40 tests for converters and base algorithm (Ph…
songololo Feb 6, 2026
39c8a87
Add orchestration unit tests (57 tests) and fix QGIS mock pollution
songololo Feb 6, 2026
473f9f4
Add mkdocstrings dependencies and fix docs build
songololo Feb 6, 2026
fe4f91c
Update roadmap: mark QGIS tests, orchestration tests, API reference c…
songololo Feb 6, 2026
a5271b4
Add field-data validation tests and UMEP met loader
songololo Feb 6, 2026
0eeedab
Update ROADMAP: Phase H field-data validation in progress
songololo Feb 6, 2026
e47f917
JSON parameter integration: bundled UMEP JSON as single source of truth
songololo Feb 6, 2026
8ec8840
Add wall_material parameter for scalar wall material selection
songololo Feb 6, 2026
dca406f
Add Montpellier Tmrt validation against INRAE PRESTI globe thermometers
songololo Feb 6, 2026
b0424f0
Add isotropic sky model validation test to Montpellier suite
songololo Feb 6, 2026
4610cb3
Use clear-sky GHI model and concrete wall material in Montpellier val…
songololo Feb 6, 2026
f62c4d3
qgis
songololo Feb 6, 2026
1a56008
QGIS and Rust.
songololo Feb 6, 2026
6da975b
rasters
songololo Feb 7, 2026
e48d89b
qgis and memory.
songololo Feb 7, 2026
662a9d6
Fix nested if statement and format code
songololo Feb 7, 2026
37a46c5
memory
songololo Feb 7, 2026
f0a3aaf
perf
songololo Feb 7, 2026
37b34e6
v0.1.0b2
songololo Feb 7, 2026
242f539
README.md update.
songololo Feb 7, 2026
9612a13
Mac Intel Runner
songololo Feb 7, 2026
bb4c0fe
README.md, edit.
songololo Feb 7, 2026
3238645
QGIS Plugin Bundle
songololo Feb 7, 2026
1801fbb
QGIS Plugin Repository compliance & v0.1.0-beta4
songololo Feb 8, 2026
caed378
Fix CI workflows & bump v0.1.0-beta5
songololo Feb 8, 2026
8c22d12
QGIS plugin: auto-detect outdated solweig & prompt upgrade
songololo Feb 8, 2026
9b06e4b
CI: gate publish on tests & bump v0.1.0-beta7
songololo Feb 8, 2026
09be439
Fix Montpellier validation tests: add missing compute_svf() call
songololo Feb 8, 2026
4f42049
CI: replace deprecated maturin upload with pypa/gh-action-pypi-publish
songololo Feb 8, 2026
c55a347
QGIS plugin: fix provider not registering in Processing Toolbox & bum…
songololo Feb 9, 2026
4a33c14
Fix QGIS numpy dtype crash: consolidate geospatial backend detection …
songololo Feb 9, 2026
6ae1c34
Auto-fill NaN in surface layers & improve QGIS height convention UX —…
songololo Feb 9, 2026
f49f00d
Fix PyPI sdist missing LICENSE file & bump v0.1.0-beta11
songololo Feb 9, 2026
f67fad1
CI: create GitHub Release with wheels on tag push & bump v0.1.0-beta12
songololo Feb 9, 2026
5790774
Prefer local pysrc solweig in dev and add API/version checks
songololo Feb 9, 2026
65fe069
Location.from_epw, anisotropic tiled sky, SVF cache fixes & bump v0.1…
songololo Feb 11, 2026
866f39c
Gate QGIS plugin release on tests & fix CI test failure — bump v0.1.0…
songololo Feb 12, 2026
59d36aa
Force GDAL backend in QGIS plugin & bump v0.1.0-beta15
songololo Feb 12, 2026
0be6a12
Catch all import exceptions in QGIS plugin & bump v0.1.0-beta16
songololo Feb 12, 2026
0079809
Install solweig --no-deps in QGIS plugin & bump v0.1.0-beta17
songololo Feb 12, 2026
8ed85dc
Anisotropic sky default, Rust Perez port, fix bitpacked shadows & veg…
songololo Feb 12, 2026
5430006
Formatting fixes, upgrade ruff & ty, add pre-commit hook — bump v0.1.…
songololo Feb 12, 2026
6a70091
QGIS timeseries progress, resource-aware tiling, expose GPU limits — …
songololo Feb 12, 2026
74ac938
Height-aware tile buffer, fix stale log & shadowed logger — bump v0.1…
songololo Feb 12, 2026
ec15e38
GPU pipelining tile split, opt-in timing instrumentation — bump v0.1.…
songololo Feb 12, 2026
b8b65be
Fix EPW hour-24 timestamp, default lat/lon to map canvas centre — bum…
songololo Feb 12, 2026
7191b6f
Skip tiling for nighttime timesteps, avoid GPU pipeline overhead — bu…
songololo Feb 12, 2026
3f5cff2
Fix 10 bugs from code review: GVF shadow, state mutation, NaN propaga…
songololo Feb 12, 2026
a0a9149
Apply psi to isotropic diffuse SVF, expose vegetation params in QGIS …
songololo Feb 12, 2026
e6867b6
Bump v0.1.0-beta30
songololo Feb 13, 2026
e07a282
Fix 4 tiling bugs: pipelining threshold, tile-size semantics, anisotr…
songololo Feb 13, 2026
e68aaf2
Configurable tile orchestration with backpressure, prefetch, telemetr…
songololo Feb 13, 2026
0827fba
fix(tiling): reuse precomputed SVF/shadow matrices in tiled timeseries
songololo Feb 13, 2026
0dd473b
Bump v0.1.0-beta31
songololo Feb 13, 2026
668e4ab
Bump v0.1.0-beta32
songololo Feb 13, 2026
944af81
Bump v0.1.0-beta33
songololo Feb 13, 2026
bdc42da
Bump v0.1.0-beta34
songololo Feb 13, 2026
aa02e88
fix(qgis-compat): fall back to Python logging/tqdm when QGIS importab…
songololo Feb 13, 2026
4e024ad
Bump v0.1.0-beta36
songololo Feb 13, 2026
c969c7a
Bump v0.1.0-beta37
songololo Feb 15, 2026
6106f9f
docs: add comprehensive academic citations, CITATION.cff, and data at…
songololo Feb 15, 2026
d330553
Bump v0.1.0-beta38
songololo Feb 15, 2026
137f231
refactor: remove deprecated Python physics, use fused Rust pipeline e…
songololo Feb 15, 2026
ce79df2
spec: enforce runtime SVF/anisotropic contract and align docs/tests
songololo Feb 15, 2026
ab46393
ci: add dedicated scientific spec and UMEP parity gate
songololo Feb 15, 2026
166e3e7
docs: align SVF/anisotropic rules and add consistency checks
songololo Feb 15, 2026
12fc43a
Bump v0.1.0-beta39
songololo Feb 15, 2026
35b3650
Bump v0.1.0-beta40
songololo Feb 15, 2026
55d0979
feat(qgis): configurable land cover materials table with UMEP-compati…
songololo Feb 15, 2026
0cc33cb
Bump v0.1.0-beta42
songololo Feb 15, 2026
78d8d27
Bump v0.1.0-beta43
songololo Feb 17, 2026
bee204e
Update QGIS plugin metadata for v0.1.0-beta43
songololo Feb 17, 2026
b981af6
feat: TimeseriesSummary with aggregated grids and inline thermal comfort
songololo Feb 17, 2026
e8440c5
feat(qgis): configurable UTCI thresholds, optional Tmrt output, summa…
songololo Feb 17, 2026
c85484f
feat: decouple shadow height/distance for mountainous terrain, bump v…
songololo Feb 17, 2026
9c915c5
feat(qgis): migrate plugin to QGIS 4 / Qt6, drop scipy runtime dep, b…
songololo Feb 19, 2026
37eaf23
chore: fix ruff lint warnings, bump v0.1.0-beta47
songololo Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "SOLWEIG",
"image": "mcr.microsoft.com/devcontainers/python:3.13",
"features": {
"ghcr.io/devcontainers/features/rust:1": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "/workspaces/solweig/.venv/bin/python"
},
"extensions": [
"ms-python.python",
"charliermarsh.ruff",
"rust-lang.rust-analyzer",
"ms-toolsai.jupyter",
"astral-sh.ty"
]
}
},
"postCreateCommand": "pip install uv && uv sync --dev && uv run maturin develop --release"
}
91 changes: 91 additions & 0 deletions .github/workflows/build-qgis-plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Build QGIS Plugin

on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
version:
description: "Version for the release"
required: true
default: "0.1.0"

jobs:
test:
uses: ./.github/workflows/test.yml

build-plugin:
name: Build QGIS Plugin
needs: test
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Get version
id: version
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
# Extract version from tag (e.g., v0.1.0 -> 0.1.0)
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
fi

- name: Build plugin package
run: python qgis_plugin/build_plugin.py --version ${{ steps.version.outputs.version }}

- name: Validate plugin ZIP
run: |
cd qgis_plugin
ZIP=$(ls solweig-qgis-*.zip | head -1)
echo "Validating $ZIP..."
unzip -l "$ZIP" | tee /tmp/bundle_contents.txt

# Check essential files exist
for file in metadata.txt __init__.py provider.py icon.png; do
if grep -q "solweig_qgis/$file" /tmp/bundle_contents.txt; then
echo " OK: $file found"
else
echo " MISSING: $file"
exit 1
fi
done

echo "Plugin validation passed."

- name: Upload plugin package
uses: actions/upload-artifact@v4
with:
name: qgis-plugin
path: qgis_plugin/solweig-qgis-*.zip

create-release:
name: Create Release
needs: build-plugin
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: write

steps:
- name: Download plugin
uses: actions/download-artifact@v4
with:
name: qgis-plugin
path: artifacts/

- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
artifacts/*.zip
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
55 changes: 55 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Deploy Documentation

on:
push:
branches: [main]
tags-ignore:
- "**"
paths:
- 'docs/**'
- 'mkdocs.yml'
- 'pysrc/**'
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install dependencies
run: |
pip install mkdocs-material mkdocstrings[python] pymdown-extensions

- name: Build documentation
run: mkdocs build --strict

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: site/

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
43 changes: 20 additions & 23 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,15 @@ name: publish package
on:
push:
tags-ignore:
- "*.*.*[a]*"
- "*.*.*[a]*" # Skip alpha tags (e.g. v0.1.0a1); beta/rc/release tags publish to PyPI
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}
test:
uses: ./.github/workflows/test.yml
linux:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
Expand All @@ -47,7 +37,7 @@ jobs:
path: dist
musllinux:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
Expand All @@ -74,7 +64,7 @@ jobs:
path: dist
windows:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
Expand All @@ -99,13 +89,13 @@ jobs:
path: dist
macos:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
- runner: macos-13
- runner: macos-15-intel # Intel x86_64 (GitHub's recommended replacement)
target: x86_64
- runner: macos-14
- runner: macos-14 # Apple Silicon ARM64
target: aarch64
steps:
- uses: actions/checkout@v4
Expand All @@ -125,7 +115,7 @@ jobs:
path: dist
sdist:
runs-on: ubuntu-latest
needs: check
needs: test
steps:
- uses: actions/checkout@v4
- name: Build sdist
Expand Down Expand Up @@ -156,9 +146,16 @@ jobs:
uses: actions/attest-build-provenance@v2
with:
subject-path: "wheels-*/*"
- name: Merge wheels into dist/
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: mkdir -p dist && cp wheels-*/* dist/
- name: Publish to PyPI
if: ${{ startsWith(github.ref, 'refs/tags/') }}
uses: PyO3/maturin-action@v1
uses: pypa/gh-action-pypi-publish@release/v1
- name: Create GitHub Release
if: ${{ startsWith(github.ref, 'refs/tags/') }}
uses: softprops/action-gh-release@v2
with:
command: upload
args: --non-interactive --skip-existing wheels-*/*
files: dist/*
generate_release_notes: true
prerelease: ${{ contains(github.ref, 'a') || contains(github.ref, 'b') || contains(github.ref, 'rc') }}
Loading
Loading