{"name": "SOLWEIG", "package_name": "solweig_qgis", "version": "0.1.0-beta95", "experimental": true, "qgis_min": "4.0.0", "qgis_max": "4.99.0", "downloads": 75, "uploaded_by": "songololo", "upload_datetime": "2026-08-25T12:03:09.594444", "changelog": "0.1.0-beta95\n- Fixes a Qt6 compatibility issue flagged by the plugin repository validator (unscoped enum in the EPW download utility). No behaviour change.\n0.1.0-beta94\n- The SOLWEIG_NO_GPU environment variable is now honoured on calculation runs that load precomputed SVF; previously it silently left the GPU enabled on that path.\n- Missing EPW path in EPW weather mode now raises a clear error instead of an assert (which python -O would strip).\n- Documentation: tutorials overview page with instructions for running the notebooks locally; the site and README state the package's positioning as an experimental compatibility-focused implementation, with UMEP as the reference.\n0.1.0-beta93\n- Fixes plugin loading: unescaped % signs in this metadata file broke QGIS's parser, so the plugin failed to load with \"Errors parsing metadata.txt\".\n- Stale SVF caches are now caught at load time: a cache computed for a different raster is skipped (or reported with its path and both grid shapes) instead of surfacing later as a bare \"Grid shape mismatch\" error.\n0.1.0-beta92\n- Fixes an out-of-memory crash at the end of large tiled runs: the summary GeoTIFF export now caps in-flight write buffers at about 1 GB instead of writing all outputs at once.\n- Faster large-raster runs, with output unchanged on valid data: fully-nodata tiles skip computation, tiled GeoTIFF writes and next-tile reads overlap the computation, and the GVF geometry precompute runs on the GPU.\n- In tiled runs, shadow output over fully-nodata tiles is now NaN instead of a spurious sunlit value of 1.0.\n- Fixes a crash in isotropic mode when the valid-data crop was active.\n0.1.0-beta91\n- Library gains memory-bounded prepare() for large rasters (layer-sequential windowing; >50 Mpx cold-build peak RAM cut ~3x, from ~30 GB to ~10 GB on a 507 Mpx raster). No plugin UI or numerical change from b90.\n0.1.0-beta90\n- Library gains the opt-in UMEP 2026a ground-surface scheme (use_ground_scheme / use_outgoing_longwave; Python API only, not yet exposed in the plugin UI). Defaults off; plugin behaviour and numerical output unchanged from b89.\n- A field comparison of the opt-in scheme is documented in VALIDATION.md; the scheme is experimental and off by default.\n0.1.0-beta89\n- Correctness release from a full-repository review; numerical output changes for some runs (see VALIDATION.md).\n- Clearness-index pressure unit fixed (hPa was scaled as kPa): clear-sky irradiance was ~20-25% underestimated for EPW/values-driven runs.\n- GVF source area fixed at non-1 m pixel sizes (marched 144 m instead of 36 m at 2 m pixels); new UMEP parity gate at 0.5/1/2 m. 1 m runs unchanged.\n- Cached GVF sunwall mask unified with UMEP semantics (fully sunlit walls only).\n- Tiled SVF preprocessing fixed (crashed with NameError after computing all tiles); cancelling SVF preprocessing no longer persists a partial cache \u2014 the plugin now stops gracefully via solweig.ComputationCancelled.\n- Plugin loads cleanly when solweig is not installed (per-algorithm import isolation); anisotropic-sky hint points at the correct toolbox algorithm.\n- EPW parsing uses per-field missing codes (RH 99% and GHI 999 W/m2 are valid data again); ModelConfig.from_json actually reads legacy parameter files.\n- Stale shadow-matrix caches raise a clear error instead of aborting QGIS; SVF caches invalidate when the trunk layer changes; land-cover nodata maps to the nodata class instead of \"paved\".\n0.1.0-beta88\n- CI / test-categorisation only \u2014 zero plugin behaviour change.\n- Performance-timing benchmarks moved to a local-only `gpu_perf_gate` marker; CI keeps only the hardware-stable memory bench. Resolves a CI false positive on the aniso/iso ratio gate (calibrated against local M-series GPU; CI runs CPU-only Linux where the ratio is naturally ~3\u00d7).\n- Plugin functionality, public API, and numerical output unchanged from b87.\n0.1.0-beta87\n- Breaking: top-level solweig.extract_bounds / intersect_bounds / resample_to_grid / etc. (b85 DeprecationWarning shim) now raise AttributeError. Import from solweig.geospatial instead.\n- solweig.disable_gpu() now disables all three GPU paths (shadows, anisotropic sky, GVF) in a single call. Pre-b87 it only flipped shadows so \"CPU-only\" tests weren't actually CPU-only.\n- New solweig.enable_gpu() mirrors disable_gpu(). Fixed a lazy-init bug that silently re-enabled GPU after disable_gpu().\n- New GPU metrics: solweig.gpu_dispatch_count() / gpu_fallback_count() / reset_gpu_metrics(). Atomic counters at every Rust GPU dispatch site; lets tests assert \"GPU path actually ran\".\n- New shadow + SVF GPU/CPU parity tests + runtime-ratio benchmark. Documents a small known difference in svf_veg* edge pixels (<1%, propagates to <0.5 \u00b0C Tmrt).\n- Plugin: no functional change.\n0.1.0-beta86\n- No numerical change (golden tests byte-identical, validation site numbers unchanged)\n- Hot-file decomposition: io.py / summary.py / models/weather.py / models/precomputed.py split below 700-line threshold (every public symbol re-exported, no caller changes)\n- models/surface.py further extracted (1731 lines now, down from 3037 at b85): surface_loading, surface_compute, surface_svf_tiled, surface_serialization, surface_views\n- Test coverage 75% \u2192 81% (cleared the 80% target) via +117 focused unit tests\n- solweig.Settings + solweig.ThermalState added to the top-level public surface (mkdocs API docs follow)\n- QGIS plugin: 349 LOC of dead create_surface_from_parameters chain removed; production path uses SurfaceData.prepare() directly\n- QGIS plugin metadata changelog trimmed (254 \u2192 96 lines); older betas link to GitHub releases\n- Public docs: physics specs (SVF / shadows / GVF / radiation / ground temp / Tmrt / UTCI / PET) rendered in-site via mkdocs-include-markdown; dev docs (PRINCIPLES / INVARIANTS / ARCHITECTURE) moved to repo root; tutorial notebooks gain proper alt text via custom mkdocs hook\n- Audit script: 9th axis added (axis_canonical_docs) \u2014 validates that repo-root canonical docs exist, have inbound references, and have valid relative .md links\n- Performance gates tightened ~3\u201310\u00d7 (matrix budgets 1.5\u20134.0 s \u2192 0.5\u20130.85 s; ratio caps 5/4/6 \u2192 2/2.5/2)\n- Memory benchmark re-measured at 377 B/px (Feb baseline 370; b85 refactors added under 2%)\n0.1.0-beta85\n- Architecture stabilisation: no numerical change, golden tests byte-identical\n- Rust FFI bundling: compute_timestep drops from 43 args to 18 (SvfBundle + StateBundle)\n- StateBundle carries an FFI version field; mismatched Python/Rust pairings raise ValueError instead of silently mis-mapping\n- New solweig.geospatial submodule; top-level extract_bounds/intersect_bounds/resample_to_grid/etc emit DeprecationWarning\n- Settings dataclass replaces 50-line override block in calculate()\n- SurfaceData typed views (geometry/optical/auxiliary) used by the production compute path\n- Cache-key hardening: _arr_key includes witness bytes, catches in-place mutations\n- vegetation.rs panic surface 44 \u2192 14 sites via documented contiguity helper\n- surface.py decomposed: serialization helpers extracted to models/surface_serialization.py\n- poe audit task + AUDIT.md (8 measured axes); new CI jobs (audit, test-slow); test-spec now includes slow tests\n- Foundation docs: PRINCIPLES.md + INVARIANTS.md (repo root)\n0.1.0-beta84\n- Rust wall-aspect kernel: promote internal math to f64, switch to banker's rounding to match numpy's np.round (closer to UMEP numerics; input/output arrays stay f32 so data memory is unchanged)\n- Delete Python Goodwin fallback from wallalgorithms.py; Rust kernel is now the single code path (same numerical behaviour for QGIS and pip users)\n- Public API additions on solweig/__init__.py: extract_bounds, intersect_bounds, resample_to_grid, namespace_to_dict, pixel_size_tag, compute_max_tile_pixels, looks_like_relative, wallalgorithms\n- QGIS plugin now uses only solweig's public API (no reaching into models/utils/loaders/physics/tiling/cache internals)\n- Plugin error wrapping: QgsProcessingException messages now expose SolweigError structured attributes (field/expected/got/reason/...)\n- Small cleanups: remove duplicate MIN_SUN_ELEVATION_DEG constant, standardize logging in api.py, remove dead xy_to_lnglat/rotate_array/cart2pol/get_ders, remove unimplemented poi_coords parameter\n0.1.0-beta83\n- Fix PVGIS TMY reference period docs (2005-2020 -> 2005-2023 for v5.3)\n- Clarify that TMY row timestamps legitimately span multiple years (each month is a real historical month)\n0.1.0-beta82\n- Fix silent scale convention inversion in Rust shadow caster (tan_altitude_by_scale operator)\n- Add DEM stair-step smoothing (auto-detects int16 1m quantization)\n- Add prepare() warm-run fast-path (100x speedup on cache hit with detailed mismatch logs)\n- Fix tile sizer buffer accounting (removes spurious \"buffer exceeds limit\" warning)\n- Optimize GridAccumulator.update() with in-place numpy ufuncs\n- Plugin metadata consolidation: delegate metadata.json write to SurfaceData.save_cleaned()\n0.1.0-beta80\n- Add NVIDIA VRAM detection on Linux via NVML\n0.1.0-beta79\n- Fix Windows PermissionError on memmap temp dir cleanup\n- Fix rasterio create_empty_raster not initializing with nodata\n0.1.0-beta77\n- Fix GPU OOM on large rasters\n0.1.0-beta74\n- Fix rasterio resampling pixel drift (from_bounds back-computed inexact pixel size)\n- Fix phantom vegetation shadows: QGIS load path preserved CDSM NaN markers\n- Add SurfaceData.load() API; eliminate QGIS/core loading duplication\n- Remove duplicate root-level SVF/raster saves from QGIS preprocessing\n- Fix progress bar regression: wall computation now reports progress\n0.1.0-beta73\n- Fix CDSM/TDSM preprocessing tests for sub-threshold NaN behaviour\n0.1.0-beta72\n- Handle CDSM reconciliation with DEM to prevent shadow artefacts on hills\n\nOlder releases (0.1.0-beta1 .. 0.1.0-beta71):\n- See https://github.com/UMEP-dev/solweig/releases for the full version history.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/solweig_qgis/version/0.1.0-beta95/download/"}