xarray-spatial 0.9.6__tar.gz → 0.9.8__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.
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/bench.md +6 -6
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/efficiency-audit.md +1 -1
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/release-major.md +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/release-minor.md +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/release-patch.md +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/rockout.md +5 -13
- xarray_spatial-0.9.8/.claude/commands/sweep-accuracy.md +296 -0
- xarray_spatial-0.9.8/.claude/commands/sweep-performance.md +325 -0
- xarray_spatial-0.9.8/.claude/commands/sweep-security.md +294 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/validate.md +1 -1
- xarray_spatial-0.9.8/.claude/sweep-accuracy-state.csv +19 -0
- xarray_spatial-0.9.8/.claude/sweep-performance-state.csv +46 -0
- xarray_spatial-0.9.8/.claude/sweep-security-state.csv +50 -0
- xarray_spatial-0.9.8/.efficiency-audit-baseline.json +171 -0
- xarray_spatial-0.9.8/.efficiency-audit-baseline.prev.json +138 -0
- xarray_spatial-0.9.8/.gitattributes +4 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/ISSUE_TEMPLATE/feature-proposal.md +0 -1
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/benchmarks.yml +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/test.yml +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.gitignore +1 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/CHANGELOG.md +99 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/CONTRIBUTING.md +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/PKG-INFO +21 -5
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/README.md +20 -4
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/PKG-INFO +21 -5
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/SOURCES.txt +20 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/__init__.py +5 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/_version.py +3 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/accessor.py +9 -1
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/aspect.py +4 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/balanced_allocation.py +2 -2
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/bilateral.py +13 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/bump.py +141 -49
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/classify.py +127 -43
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/contour.py +31 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/convolution.py +47 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/cost_distance.py +99 -6
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/curvature.py +8 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/dasymetric.py +92 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/diffusion.py +170 -29
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/edge_detection.py +6 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/emerging_hotspots.py +58 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/erosion.py +97 -23
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/experimental/min_observable_height.py +39 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/focal.py +53 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geodesic.py +49 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/__init__.py +176 -51
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_compression.py +0 -55
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_gpu_decode.py +99 -8
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_header.py +64 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_reader.py +99 -13
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_vrt.py +41 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_writer.py +128 -36
- xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_cog.py +379 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_features.py +229 -2
- xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_predictor_fp_write_1313.py +203 -0
- xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_predictor_multisample.py +398 -0
- xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_security.py +519 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/glcm.py +17 -4
- xarray_spatial-0.9.8/xrspatial/gpu_rtx/_memory.py +60 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/hillshade.py +4 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/viewshed.py +4 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hillshade.py +56 -25
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/basin_d8.py +89 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/fill_d8.py +88 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_accumulation_d8.py +89 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_accumulation_dinf.py +92 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_accumulation_mfd.py +91 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_length_d8.py +90 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_length_dinf.py +91 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_length_mfd.py +94 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/hand_d8.py +94 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/hand_dinf.py +95 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/hand_mfd.py +94 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_link_d8.py +93 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_link_dinf.py +95 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_link_mfd.py +94 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_order_d8.py +96 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_order_dinf.py +99 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_order_mfd.py +99 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_basin_d8.py +73 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_fill_d8.py +73 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_accumulation_d8.py +58 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_accumulation_dinf.py +58 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_accumulation_mfd.py +57 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_length_d8.py +69 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_length_dinf.py +75 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_length_mfd.py +74 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_hand_d8.py +84 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_hand_dinf.py +88 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_hand_mfd.py +84 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_link_d8.py +77 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_link_dinf.py +77 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_link_mfd.py +94 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_order_d8.py +77 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_order_dinf.py +80 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_order_mfd.py +92 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_watershed_d8.py +88 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_watershed_dinf.py +84 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_watershed_mfd.py +88 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/watershed_d8.py +89 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/watershed_dinf.py +90 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/watershed_mfd.py +89 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_kriging.py +74 -0
- xarray_spatial-0.9.8/xrspatial/kde.py +799 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mahalanobis.py +107 -2
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/combine.py +43 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/weights.py +15 -3
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/morphology.py +50 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/multispectral.py +89 -1
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/pathfinding.py +6 -2
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/perlin.py +10 -0
- xarray_spatial-0.9.8/xrspatial/polygon_clip.py +272 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/polygonize.py +560 -5
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/rasterize.py +37 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/__init__.py +45 -22
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_grid.py +11 -0
- xarray_spatial-0.9.8/xrspatial/resample.py +887 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/sieve.py +215 -114
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/sky_view_factor.py +79 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/slope.py +4 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/surface_distance.py +94 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/terrain_metrics.py +51 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_balanced_allocation.py +39 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_bilateral.py +40 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_bump.py +130 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_classify.py +44 -4
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_contour.py +38 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_cost_distance.py +194 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_curvature.py +12 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dasymetric.py +128 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_diffusion.py +177 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_edge_detection.py +27 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_emerging_hotspots.py +84 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_erosion.py +135 -1
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_focal.py +61 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_geodesic_aspect.py +35 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_geodesic_slope.py +41 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_glcm.py +42 -3
- xarray_spatial-0.9.8/xrspatial/tests/test_gpu_rtx_memory.py +175 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_hillshade.py +73 -20
- xarray_spatial-0.9.8/xrspatial/tests/test_hypsometric_integral.py +256 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_interpolation.py +89 -0
- xarray_spatial-0.9.8/xrspatial/tests/test_kde.py +499 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_mahalanobis.py +86 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_mcda.py +118 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_min_observable_height.py +56 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_morphology.py +51 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_multispectral.py +122 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_perlin.py +27 -0
- xarray_spatial-0.9.8/xrspatial/tests/test_polygon_clip.py +360 -0
- xarray_spatial-0.9.8/xrspatial/tests/test_polygonize.py +1070 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_rasterize.py +49 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_reproject.py +59 -0
- xarray_spatial-0.9.8/xrspatial/tests/test_resample.py +432 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_sieve.py +48 -22
- xarray_spatial-0.9.8/xrspatial/tests/test_sieve_gdal_parity.py +467 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_sky_view_factor.py +84 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_surface_distance.py +119 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_terrain_metrics.py +17 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_viewshed.py +42 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_visibility.py +14 -11
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_zonal.py +39 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/viewshed.py +20 -2
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/visibility.py +114 -56
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/zonal.py +203 -1
- xarray_spatial-0.9.6/.claude/accuracy-sweep-state.json +0 -9
- xarray_spatial-0.9.6/.claude/commands/accuracy-sweep.md +0 -158
- xarray_spatial-0.9.6/.claude/commands/sweep-performance.md +0 -494
- xarray_spatial-0.9.6/.claude/performance-sweep-state.json +0 -47
- xarray_spatial-0.9.6/.gitattributes +0 -2
- xarray_spatial-0.9.6/xrspatial/geotiff/tests/test_cog.py +0 -137
- xarray_spatial-0.9.6/xrspatial/tests/test_polygonize.py +0 -540
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/backend-parity.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/dask-notebook.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/new-issues.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/review-pr.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/user-guide-notebook.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/labeler.yml +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/pull_request_template.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/labeler.yml +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/pypi-publish.yml +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.readthedocs.yml +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/CODE_OF_CONDUCT.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/Citation-styles.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/LICENSE.txt +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/MANIFEST.in +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/RELEASE.md +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/codecov.yml +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/pyproject.toml +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/setup.cfg +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/setup.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/dependency_links.txt +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/entry_points.txt +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/not-zip-safe +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/requires.txt +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/top_level.txt +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/__main__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/analytics.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/corridor.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/dataset_support.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/blue_band.nc +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/green_band.nc +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/nir_band.nc +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/red_band.nc +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/swir1_band.nc +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/swir2_band.nc +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/diagnostics.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/experimental/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/fire.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/flood.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_dtypes.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_geotags.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/bench_vs_rioxarray.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/conftest.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_accessor_io.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_accuracy_1081.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_compression.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_compression_level.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_dtype_read.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_edge_cases.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_geotags.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_header.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_jpeg.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_jpeg2000.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_lerc.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_lz4.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_reader.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_streaming_write.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_vrt_write.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_writer.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/cuda_utils.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/mesh_utils.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/_boundary_store.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_direction_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_direction_dinf.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_direction_mfd.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_path_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_path_dinf.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_path_mfd.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/sink_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/snap_pour_point_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/conftest.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_direction_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_direction_dinf.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_direction_mfd.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_path_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_path_dinf.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_path_mfd.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_sink_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_snap_pour_point_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_twi_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/twi_d8.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_idw.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_spline.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_validation.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/constrain.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/sensitivity.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/standardize.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/normalize.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/preview.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/proximity.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_crs_utils.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_datum_grids.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_interpolate.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_itrf.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_lite_crs.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_merge.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_projections.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_projections_cuda.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_transform.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_vertical.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/at_bev_AT_GIS_GRID.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/au_icsm_A66_National_13_09_01.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/be_ign_bd72lb72_etrs89lb08.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/ch_swisstopo_CHENyx06_ETRS.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/de_adv_BETA2007.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/es_ign_SPED2ETV2.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/nl_nsgi_rdcorr2018.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/pt_dgt_D73_ETRS89_geo.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/uk_os_OSTN15_NTv2_OSGBtoETRS.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_nga_egm96_15.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_alaska.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_conus.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_hawaii.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_nadcon5_nad27_nad83_1986_conus.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_prvi.tif +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/terrain.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/__init__.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/bench_reproject_vs_rioxarray.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/conftest.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/general_checks.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_accessor.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_analytics.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_aspect.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_corridor.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dask_cupy_gaps.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dask_laziness.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dataset_support.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_datasets.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_diagnostics.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_fire.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_flood.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_fused_overlap.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_glcm_metric_order.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_lite_crs.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_morphology_derived.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_multi_overlap.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_normalize.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_northness_eastness.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_pathfinding.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_preview.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_proximity.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_rasterize_accuracy.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_rechunk_no_shuffle.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_slope.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_terrain.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_utils.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_validation.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/utils.py +0 -0
- {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/worley.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bench: Local Performance Comparison
|
|
2
2
|
|
|
3
|
-
Run ASV benchmarks for the current branch against
|
|
3
|
+
Run ASV benchmarks for the current branch against main and report regressions
|
|
4
4
|
and improvements. The prompt is: $ARGUMENTS
|
|
5
5
|
|
|
6
6
|
---
|
|
@@ -9,7 +9,7 @@ and improvements. The prompt is: $ARGUMENTS
|
|
|
9
9
|
|
|
10
10
|
1. If $ARGUMENTS names specific benchmark classes or functions (e.g. `Slope`,
|
|
11
11
|
`flow_accumulation`), use those directly.
|
|
12
|
-
2. If $ARGUMENTS is empty or says "auto", run `git diff origin/
|
|
12
|
+
2. If $ARGUMENTS is empty or says "auto", run `git diff origin/main --name-only`
|
|
13
13
|
to find changed source files under `xrspatial/`. Map each changed file to the
|
|
14
14
|
corresponding benchmark module in `benchmarks/benchmarks/`. Use the filename
|
|
15
15
|
and imports to match (e.g. changes to `slope.py` map to `benchmarks/benchmarks/slope.py`).
|
|
@@ -30,7 +30,7 @@ and improvements. The prompt is: $ARGUMENTS
|
|
|
30
30
|
Run ASV in continuous-comparison mode from the `benchmarks/` directory:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
cd benchmarks && asv continuous origin/
|
|
33
|
+
cd benchmarks && asv continuous origin/main HEAD -b "<regex>" -e
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
Where `<regex>` is a pattern matching the benchmark classes identified in Step 1
|
|
@@ -64,7 +64,7 @@ Parse the output and classify each result:
|
|
|
64
64
|
## Step 5 -- Generate the report
|
|
65
65
|
|
|
66
66
|
```
|
|
67
|
-
## Benchmark Report: <branch> vs
|
|
67
|
+
## Benchmark Report: <branch> vs main
|
|
68
68
|
|
|
69
69
|
### Changed files
|
|
70
70
|
- <list of changed source files>
|
|
@@ -74,7 +74,7 @@ Parse the output and classify each result:
|
|
|
74
74
|
|
|
75
75
|
### Results
|
|
76
76
|
|
|
77
|
-
| Benchmark |
|
|
77
|
+
| Benchmark | main | HEAD | Ratio | Status |
|
|
78
78
|
|------------------------------------|-----------|-----------|-------|------------|
|
|
79
79
|
| slope.Slope.time_numpy | 3.45 ms | 3.51 ms | 1.02x | UNCHANGED |
|
|
80
80
|
| slope.Slope.time_dask_numpy | 8.12 ms | 4.23 ms | 0.52x | IMPROVED |
|
|
@@ -124,4 +124,4 @@ Do NOT write benchmark files automatically. Report the gap and propose, then wai
|
|
|
124
124
|
analysis (unless the user explicitly asks for a benchmark to be written in
|
|
125
125
|
response to Step 6).
|
|
126
126
|
- If $ARGUMENTS says "compare <branch1> <branch2>", run
|
|
127
|
-
`asv continuous <branch1> <branch2>` instead of the default origin/
|
|
127
|
+
`asv continuous <branch1> <branch2>` instead of the default origin/main vs HEAD.
|
|
@@ -267,7 +267,7 @@ Thresholds: IMPROVED < 0.8x, REGRESSION > 1.2x, else UNCHANGED.
|
|
|
267
267
|
- If $ARGUMENTS includes a severity filter (e.g. "high only"), only report
|
|
268
268
|
findings at that severity level.
|
|
269
269
|
- If $ARGUMENTS includes "diff" or "changed", restrict the audit to files
|
|
270
|
-
changed on the current branch vs origin/
|
|
270
|
+
changed on the current branch vs origin/main.
|
|
271
271
|
- Baseline benchmark scripts are disposable. Clean up `/tmp/` scripts after
|
|
272
272
|
capturing results.
|
|
273
273
|
- The 512x512 array size is a default. If $ARGUMENTS includes a size like
|
|
@@ -16,7 +16,7 @@ $ARGUMENTS
|
|
|
16
16
|
## Step 2 -- Create a release branch
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
git checkout
|
|
19
|
+
git checkout main && git pull
|
|
20
20
|
git checkout -b release/vX.Y.Z
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -49,7 +49,7 @@ git push -u origin release/vX.Y.Z
|
|
|
49
49
|
|
|
50
50
|
## Step 5 -- Verify CI
|
|
51
51
|
|
|
52
|
-
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z major release."` to open a PR against
|
|
52
|
+
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z major release."` to open a PR against main.
|
|
53
53
|
2. Wait for CI:
|
|
54
54
|
```bash
|
|
55
55
|
gh pr checks <PR_NUMBER> --watch
|
|
@@ -65,7 +65,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
|
|
|
65
65
|
## Step 7 -- Tag the release
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
-
git checkout
|
|
68
|
+
git checkout main && git pull
|
|
69
69
|
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
|
70
70
|
git push origin vX.Y.Z
|
|
71
71
|
```
|
|
@@ -16,7 +16,7 @@ $ARGUMENTS
|
|
|
16
16
|
## Step 2 -- Create a release branch
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
git checkout
|
|
19
|
+
git checkout main && git pull
|
|
20
20
|
git checkout -b release/vX.Y.Z
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -49,7 +49,7 @@ git push -u origin release/vX.Y.Z
|
|
|
49
49
|
|
|
50
50
|
## Step 5 -- Verify CI
|
|
51
51
|
|
|
52
|
-
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z minor release."` to open a PR against
|
|
52
|
+
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z minor release."` to open a PR against main.
|
|
53
53
|
2. Wait for CI:
|
|
54
54
|
```bash
|
|
55
55
|
gh pr checks <PR_NUMBER> --watch
|
|
@@ -65,7 +65,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
|
|
|
65
65
|
## Step 7 -- Tag the release
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
-
git checkout
|
|
68
|
+
git checkout main && git pull
|
|
69
69
|
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
|
70
70
|
git push origin vX.Y.Z
|
|
71
71
|
```
|
|
@@ -16,7 +16,7 @@ $ARGUMENTS
|
|
|
16
16
|
## Step 2 -- Create a release branch
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
git checkout
|
|
19
|
+
git checkout main && git pull
|
|
20
20
|
git checkout -b release/vX.Y.Z
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -46,7 +46,7 @@ git push -u origin release/vX.Y.Z
|
|
|
46
46
|
|
|
47
47
|
## Step 5 -- Verify CI
|
|
48
48
|
|
|
49
|
-
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z patch release."` to open a PR against
|
|
49
|
+
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z patch release."` to open a PR against main.
|
|
50
50
|
2. Wait for CI:
|
|
51
51
|
```bash
|
|
52
52
|
gh pr checks <PR_NUMBER> --watch
|
|
@@ -62,7 +62,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
|
|
|
62
62
|
## Step 7 -- Tag the release
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
|
-
git checkout
|
|
65
|
+
git checkout main && git pull
|
|
66
66
|
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
|
67
67
|
git push origin vX.Y.Z
|
|
68
68
|
```
|
|
@@ -14,7 +14,8 @@ through all seven steps below. The prompt is: $ARGUMENTS
|
|
|
14
14
|
2. Pick labels from the repo's existing set. Always include the type label
|
|
15
15
|
(`enhancement`, `bug`, or `proposal`). Add topical labels when they fit
|
|
16
16
|
(e.g. `gpu`, `performance`, `focal tools`, `hydrology`, etc.).
|
|
17
|
-
3. Draft the title and body. Use the repo's issue templates as structure guides
|
|
17
|
+
3. Draft the title and body. Use the repo's issue templates as structure guides
|
|
18
|
+
(skip the "Author of Proposal" field -- GitHub already shows the author):
|
|
18
19
|
- Enhancement/proposal: follow `.github/ISSUE_TEMPLATE/feature-proposal.md`
|
|
19
20
|
- Bug: follow `.github/ISSUE_TEMPLATE/bug_report.md`
|
|
20
21
|
4. **Run the body text through the `/humanizer` skill** before creating the issue
|
|
@@ -70,20 +71,11 @@ through all seven steps below. The prompt is: $ARGUMENTS
|
|
|
70
71
|
|
|
71
72
|
## Step 6 -- Create a User Guide Notebook
|
|
72
73
|
|
|
73
|
-
The project has an `examples/user_guide/` directory with numbered notebooks.
|
|
74
|
-
|
|
75
|
-
1. Determine the next available notebook number by listing the directory.
|
|
76
|
-
2. Create a new `.ipynb` notebook following the established pattern:
|
|
77
|
-
- Markdown cell with title and explanation of the feature
|
|
78
|
-
- Import cell
|
|
79
|
-
- Synthetic data generation with visualization
|
|
80
|
-
- Demonstrate each mode/option of the feature
|
|
81
|
-
- Show a practical use case or comparison
|
|
82
|
-
3. Use `matplotlib` for plots, consistent with existing notebooks.
|
|
83
|
-
4. Keep the notebook self-contained (no external data dependencies).
|
|
84
|
-
|
|
85
74
|
**Skip this step** if the change is a pure bug fix with no new user-facing API.
|
|
86
75
|
|
|
76
|
+
Run the `/user-guide-notebook` skill to create the notebook. It handles structure,
|
|
77
|
+
plotting conventions, GIS alert boxes, preview images, and humanizer passes.
|
|
78
|
+
|
|
87
79
|
## Step 7 -- Update the README Feature Matrix
|
|
88
80
|
|
|
89
81
|
1. Open `README.md` and find the appropriate category section in the feature matrix.
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# Accuracy Sweep: Dispatch subagents to audit modules for numerical accuracy issues
|
|
2
|
+
|
|
3
|
+
Audit xrspatial modules for numerical accuracy issues: floating point
|
|
4
|
+
precision loss, incorrect NaN propagation, off-by-one errors in neighborhood
|
|
5
|
+
operations, missing or wrong Earth curvature corrections, and backend
|
|
6
|
+
inconsistencies (numpy vs cupy vs dask results differ). Subagents fix
|
|
7
|
+
findings via /rockout.
|
|
8
|
+
|
|
9
|
+
Optional arguments: $ARGUMENTS
|
|
10
|
+
(e.g. `--top 3`, `--exclude slope,aspect`, `--only-terrain`, `--reset-state`)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Step 1 -- Gather module metadata via git
|
|
15
|
+
|
|
16
|
+
Enumerate candidate modules:
|
|
17
|
+
|
|
18
|
+
**Single-file modules:** Every `.py` file directly under `xrspatial/`, excluding
|
|
19
|
+
`__init__.py`, `_version.py`, `__main__.py`, `utils.py`, `accessor.py`,
|
|
20
|
+
`preview.py`, `dataset_support.py`, `diagnostics.py`, `analytics.py`.
|
|
21
|
+
|
|
22
|
+
**Subpackage modules:** `geotiff/`, `reproject/`, and `hydro/` directories under
|
|
23
|
+
`xrspatial/`. Treat each as a single audit unit. List all `.py` files within
|
|
24
|
+
each (excluding `__init__.py`).
|
|
25
|
+
|
|
26
|
+
For every module, collect:
|
|
27
|
+
|
|
28
|
+
| Field | How |
|
|
29
|
+
|-------|-----|
|
|
30
|
+
| **last_modified** | `git log -1 --format=%aI -- <path>` (for subpackages, most recent file) |
|
|
31
|
+
| **total_commits** | `git log --oneline -- <path> \| wc -l` |
|
|
32
|
+
| **loc** | `wc -l < <path>` (for subpackages, sum all files) |
|
|
33
|
+
| **recent_accuracy_commits** | `git log --oneline --grep='accuracy\|precision\|numerical\|geodesic' -- <path>` |
|
|
34
|
+
|
|
35
|
+
Store results in memory -- do NOT write intermediate files.
|
|
36
|
+
|
|
37
|
+
## Step 2 -- Load inspection state
|
|
38
|
+
|
|
39
|
+
Read `.claude/sweep-accuracy-state.csv`.
|
|
40
|
+
|
|
41
|
+
If it does not exist, treat every module as never-inspected.
|
|
42
|
+
|
|
43
|
+
If `$ARGUMENTS` contains `--reset-state`, delete the file and treat
|
|
44
|
+
everything as never-inspected.
|
|
45
|
+
|
|
46
|
+
State file schema (one row per module):
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
module,last_inspected,issue,severity_max,categories_found,notes
|
|
50
|
+
slope,2026-03-28,1042,HIGH,1;3,"optional single-line notes"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
- `categories_found` is a semicolon-separated integer list (empty when null).
|
|
54
|
+
- `notes` is CSV-quoted; newlines must be flattened to spaces on write so
|
|
55
|
+
every module stays exactly one line.
|
|
56
|
+
|
|
57
|
+
The file is registered with `merge=union` in `.gitattributes`, so two
|
|
58
|
+
parallel sweeps touching different modules auto-merge without conflict.
|
|
59
|
+
A transient duplicate-row state can occur after a merge if both branches
|
|
60
|
+
modified the same module; the read-update-write cycle in step 5 keys rows
|
|
61
|
+
by `module` and last-write-wins, so the next write cleans up.
|
|
62
|
+
|
|
63
|
+
## Step 3 -- Score each module
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
days_since_inspected = (today - last_inspected).days # 9999 if never
|
|
67
|
+
days_since_modified = (today - last_modified).days
|
|
68
|
+
has_recent_accuracy_work = 1 if recent_accuracy_commits is non-empty, else 0
|
|
69
|
+
|
|
70
|
+
score = (days_since_inspected * 3)
|
|
71
|
+
+ (total_commits * 0.5)
|
|
72
|
+
- (days_since_modified * 0.2)
|
|
73
|
+
- (has_recent_accuracy_work * 500)
|
|
74
|
+
+ (loc * 0.05)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Rationale:
|
|
78
|
+
- Modules never inspected dominate (9999 * 3)
|
|
79
|
+
- More commits = more complex = more likely to have accuracy bugs
|
|
80
|
+
- Recently modified modules slightly deprioritized (someone just touched them)
|
|
81
|
+
- Modules with existing accuracy work heavily deprioritized
|
|
82
|
+
- Larger files have more surface area (0.05 per line)
|
|
83
|
+
|
|
84
|
+
## Step 4 -- Apply filters from $ARGUMENTS
|
|
85
|
+
|
|
86
|
+
- `--top N` -- only audit the top N modules (default: 3)
|
|
87
|
+
- `--exclude mod1,mod2` -- remove named modules from the list
|
|
88
|
+
- `--only-terrain` -- restrict to: slope, aspect, curvature, terrain,
|
|
89
|
+
terrain_metrics, hillshade, sky_view_factor
|
|
90
|
+
- `--only-focal` -- restrict to: focal, convolution, morphology, bilateral,
|
|
91
|
+
edge_detection, glcm
|
|
92
|
+
- `--only-hydro` -- restrict to: flood, cost_distance, geodesic,
|
|
93
|
+
surface_distance, viewshed, erosion, diffusion, hydro (subpackage)
|
|
94
|
+
- `--only-io` -- restrict to: geotiff, reproject, rasterize, polygonize
|
|
95
|
+
|
|
96
|
+
## Step 5 -- Print the ranked table and launch subagents
|
|
97
|
+
|
|
98
|
+
### 5a. Print the ranked table
|
|
99
|
+
|
|
100
|
+
Print a markdown table showing ALL scored modules (not just selected ones),
|
|
101
|
+
sorted by score descending:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
| Rank | Module | Score | Last Inspected | Last Modified | Commits | LOC |
|
|
105
|
+
|------|-----------------|--------|----------------|---------------|---------|------|
|
|
106
|
+
| 1 | viewshed | 30012 | never | 45 days ago | 23 | 800 |
|
|
107
|
+
| 2 | flood | 29998 | never | 120 days ago | 18 | 600 |
|
|
108
|
+
| ... | ... | ... | ... | ... | ... | ... |
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 5b. Launch subagents for the top N modules
|
|
112
|
+
|
|
113
|
+
For each of the top N modules (default 3), launch an Agent in parallel using
|
|
114
|
+
`isolation: "worktree"` and `mode: "auto"`. All N agents must be dispatched
|
|
115
|
+
in a single message so they run concurrently.
|
|
116
|
+
|
|
117
|
+
Each agent's prompt must be self-contained and follow this template (adapt
|
|
118
|
+
the module name, paths, and metadata):
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
You are auditing the xrspatial module "{module}" for numerical accuracy issues.
|
|
122
|
+
|
|
123
|
+
This module has {commits} commits and {loc} lines of code.
|
|
124
|
+
|
|
125
|
+
Read these files: {module_files}
|
|
126
|
+
|
|
127
|
+
Also read xrspatial/utils.py to understand _validate_raster() behavior and
|
|
128
|
+
xrspatial/tests/general_checks.py for the cross-backend comparison helpers.
|
|
129
|
+
|
|
130
|
+
**Your task:**
|
|
131
|
+
|
|
132
|
+
1. Read all listed files thoroughly, including the matching test file(s)
|
|
133
|
+
under xrspatial/tests/ so you understand expected behavior.
|
|
134
|
+
|
|
135
|
+
2. Audit for these 5 accuracy categories. For each, look for the specific
|
|
136
|
+
patterns described. Only flag issues ACTUALLY present in the code.
|
|
137
|
+
|
|
138
|
+
**Cat 1 — Floating Point Precision Loss**
|
|
139
|
+
- Accumulation loops that sum many small values into a large running
|
|
140
|
+
total without Kahan summation or compensated accumulation
|
|
141
|
+
- float32 used where float64 is required for stable intermediate results
|
|
142
|
+
(e.g. large grids, long gradients, iterative solvers)
|
|
143
|
+
- Subtraction of nearly-equal large quantities (catastrophic cancellation)
|
|
144
|
+
- Division by small numbers without a stability floor
|
|
145
|
+
Severity: HIGH if the result is visibly wrong on realistic inputs;
|
|
146
|
+
MEDIUM if only observable on adversarial inputs
|
|
147
|
+
|
|
148
|
+
**Cat 2 — NaN / Inf Propagation Errors**
|
|
149
|
+
- NaN input silently produces a finite output (masked, skipped, or
|
|
150
|
+
treated as zero without being documented)
|
|
151
|
+
- NaN check using `==` instead of `!= x` for NaN detection in numba
|
|
152
|
+
- Neighborhood operations that ignore NaN pixels but do not update the
|
|
153
|
+
normalization denominator, biasing the result
|
|
154
|
+
- Inf / -Inf inputs treated as numbers in comparisons without guards
|
|
155
|
+
- Divide-by-zero producing Inf that then corrupts downstream accumulation
|
|
156
|
+
Severity: HIGH if NaN input yields a wrong but finite output;
|
|
157
|
+
MEDIUM if the behavior is documented but still surprising
|
|
158
|
+
|
|
159
|
+
**Cat 3 — Off-by-One Errors in Neighborhood Operations**
|
|
160
|
+
- Loop bounds that exclude the last row/column (e.g. `range(H-1)` where
|
|
161
|
+
`range(H)` is intended)
|
|
162
|
+
- `map_overlap` depth that is smaller than the actual stencil radius
|
|
163
|
+
- Boundary handling that duplicates or skips edge pixels
|
|
164
|
+
- Asymmetric kernel indexing (one-sided rather than centered)
|
|
165
|
+
- CUDA kernel bounds guard that is `i > H` instead of `i >= H`
|
|
166
|
+
Severity: HIGH if it causes a silent wrong result at all chunk boundaries;
|
|
167
|
+
MEDIUM if it only affects a single-pixel edge
|
|
168
|
+
|
|
169
|
+
**Cat 4 — Missing or Wrong Earth Curvature / Projection Corrections**
|
|
170
|
+
- Geodesic calculations that assume a flat projection without curvature
|
|
171
|
+
correction (see slope.py, aspect.py, geodesic.py for the reference
|
|
172
|
+
pattern: `u += (e² + n²) / (2R)`)
|
|
173
|
+
- Haversine / great-circle distance using the wrong Earth radius
|
|
174
|
+
constant, or using a spherical approximation where WGS84 is needed
|
|
175
|
+
- Mixing projected and geographic coordinates in the same calculation
|
|
176
|
+
without a transform
|
|
177
|
+
- Using cell size in degrees as if it were meters
|
|
178
|
+
Severity: HIGH if the correction is missing entirely on a public API;
|
|
179
|
+
MEDIUM if the correction is present but uses a questionable constant
|
|
180
|
+
|
|
181
|
+
**Cat 5 — Backend Inconsistency (numpy vs cupy vs dask)**
|
|
182
|
+
- numpy and cupy paths use different algorithms that can diverge on
|
|
183
|
+
identical inputs (e.g. different boundary handling, different NaN
|
|
184
|
+
semantics, different numerical precision)
|
|
185
|
+
- dask path silently falls back to materializing the full array
|
|
186
|
+
- dask `map_overlap` chunk function returns a different shape than the
|
|
187
|
+
input, corrupting the reassembled array
|
|
188
|
+
- A backend raises on valid input that another backend accepts
|
|
189
|
+
- Result dtype differs across backends without documentation
|
|
190
|
+
Severity: HIGH if numerically different results on the same input;
|
|
191
|
+
MEDIUM if only metadata (dtype, coords) differs
|
|
192
|
+
|
|
193
|
+
3. For each real issue found, assign a severity (CRITICAL/HIGH/MEDIUM/LOW)
|
|
194
|
+
and note the exact file and line number.
|
|
195
|
+
|
|
196
|
+
4. If any CRITICAL or HIGH issue is found, run /rockout to fix it end-to-end
|
|
197
|
+
(GitHub issue, worktree branch, fix, tests, and PR).
|
|
198
|
+
For MEDIUM/LOW issues, document them but do not fix.
|
|
199
|
+
|
|
200
|
+
5. After finishing (whether you found issues or not), update the inspection
|
|
201
|
+
state file .claude/sweep-accuracy-state.csv. The file is row-per-module
|
|
202
|
+
CSV with header:
|
|
203
|
+
|
|
204
|
+
`module,last_inspected,issue,severity_max,categories_found,notes`
|
|
205
|
+
|
|
206
|
+
Use this Python pattern to read, update, and write it (do NOT hand-edit
|
|
207
|
+
the file -- always go through csv.DictReader / csv.DictWriter so quoting
|
|
208
|
+
stays consistent):
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
import csv
|
|
212
|
+
from pathlib import Path
|
|
213
|
+
|
|
214
|
+
path = Path(".claude/sweep-accuracy-state.csv")
|
|
215
|
+
header = ["module", "last_inspected", "issue", "severity_max",
|
|
216
|
+
"categories_found", "notes"]
|
|
217
|
+
|
|
218
|
+
rows = {}
|
|
219
|
+
if path.exists():
|
|
220
|
+
with path.open() as f:
|
|
221
|
+
for r in csv.DictReader(f):
|
|
222
|
+
rows[r["module"]] = r # last write wins on dupes
|
|
223
|
+
|
|
224
|
+
rows["{module}"] = {
|
|
225
|
+
"module": "{module}",
|
|
226
|
+
"last_inspected": "<today's ISO date, e.g. 2026-04-27>",
|
|
227
|
+
"issue": "<issue number from rockout, or empty string>",
|
|
228
|
+
"severity_max": "<HIGH|MEDIUM|LOW, or empty>",
|
|
229
|
+
"categories_found": "<semicolon-joined ints, e.g. 1;3, or empty>",
|
|
230
|
+
"notes": "<single-line notes (replace any newlines with spaces), or empty>",
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
with path.open("w", newline="") as f:
|
|
234
|
+
w = csv.DictWriter(f, fieldnames=header, quoting=csv.QUOTE_MINIMAL)
|
|
235
|
+
w.writeheader()
|
|
236
|
+
for m in sorted(rows):
|
|
237
|
+
w.writerow(rows[m])
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Use empty strings (not `null`) for missing values. Set `issue` to the
|
|
241
|
+
issue number when one was filed, otherwise leave it empty.
|
|
242
|
+
|
|
243
|
+
Then `git add .claude/sweep-accuracy-state.csv` and commit it to the
|
|
244
|
+
worktree branch so the state update is included in the PR.
|
|
245
|
+
|
|
246
|
+
Important:
|
|
247
|
+
- Only flag real accuracy issues. False positives waste time.
|
|
248
|
+
- Read the tests for this module to understand expected behavior before
|
|
249
|
+
flagging a result as wrong -- the test may codify the current behavior.
|
|
250
|
+
- For backend comparisons, check that the cross-backend tests in
|
|
251
|
+
xrspatial/tests/general_checks.py actually exercise the code path you
|
|
252
|
+
are suspicious of; missing test coverage is itself a finding.
|
|
253
|
+
- Do NOT flag the use of numba @jit itself as an accuracy issue. Focus on
|
|
254
|
+
what the JIT code does, not that it uses JIT.
|
|
255
|
+
- For the hydro subpackage: focus on one representative variant (d8) in
|
|
256
|
+
detail, then note which dinf/mfd files share the same pattern. Do not
|
|
257
|
+
read all 29 files line by line.
|
|
258
|
+
- This repo uses ArrayTypeFunctionMapping to dispatch across numpy/cupy/dask
|
|
259
|
+
backends. Check all backend paths, not just numpy.
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 5c. Print a status line
|
|
263
|
+
|
|
264
|
+
After dispatching, print:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
Launched {N} accuracy audit agents: {module1}, {module2}, {module3}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Step 6 -- State updates
|
|
271
|
+
|
|
272
|
+
State is updated by the subagents themselves (see agent prompt step 5).
|
|
273
|
+
After completion, verify state with:
|
|
274
|
+
|
|
275
|
+
```
|
|
276
|
+
column -t -s, .claude/sweep-accuracy-state.csv | less
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
To reset all tracking: `/sweep-accuracy --reset-state`
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## General Rules
|
|
284
|
+
|
|
285
|
+
- Do NOT modify any source files directly. Subagents handle fixes via /rockout.
|
|
286
|
+
- Keep the output concise -- the table and agent dispatch are the deliverables.
|
|
287
|
+
- If $ARGUMENTS is empty, use defaults: top 3, no category filter, no exclusions.
|
|
288
|
+
- State file (`.claude/sweep-accuracy-state.csv`) is tracked in git, with
|
|
289
|
+
`merge=union` set in `.gitattributes` so parallel sweeps touching
|
|
290
|
+
different modules auto-merge. Subagents must `git add` and commit it so
|
|
291
|
+
the state update lands in the PR.
|
|
292
|
+
- For subpackage modules (geotiff, reproject, hydro), the subagent should read
|
|
293
|
+
ALL `.py` files in the subpackage directory, not just `__init__.py`.
|
|
294
|
+
- Only flag patterns that are ACTUALLY present in the code. Do not report
|
|
295
|
+
hypothetical issues or patterns that "could" occur with imaginary inputs.
|
|
296
|
+
- False positives are worse than missed issues. When in doubt, skip.
|