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.
Files changed (329) hide show
  1. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/bench.md +6 -6
  2. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/efficiency-audit.md +1 -1
  3. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/release-major.md +3 -3
  4. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/release-minor.md +3 -3
  5. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/release-patch.md +3 -3
  6. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/rockout.md +5 -13
  7. xarray_spatial-0.9.8/.claude/commands/sweep-accuracy.md +296 -0
  8. xarray_spatial-0.9.8/.claude/commands/sweep-performance.md +325 -0
  9. xarray_spatial-0.9.8/.claude/commands/sweep-security.md +294 -0
  10. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/validate.md +1 -1
  11. xarray_spatial-0.9.8/.claude/sweep-accuracy-state.csv +19 -0
  12. xarray_spatial-0.9.8/.claude/sweep-performance-state.csv +46 -0
  13. xarray_spatial-0.9.8/.claude/sweep-security-state.csv +50 -0
  14. xarray_spatial-0.9.8/.efficiency-audit-baseline.json +171 -0
  15. xarray_spatial-0.9.8/.efficiency-audit-baseline.prev.json +138 -0
  16. xarray_spatial-0.9.8/.gitattributes +4 -0
  17. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/ISSUE_TEMPLATE/feature-proposal.md +0 -1
  18. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/benchmarks.yml +3 -3
  19. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/test.yml +3 -3
  20. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.gitignore +1 -0
  21. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/CHANGELOG.md +99 -0
  22. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/CONTRIBUTING.md +3 -3
  23. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/PKG-INFO +21 -5
  24. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/README.md +20 -4
  25. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/PKG-INFO +21 -5
  26. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/SOURCES.txt +20 -3
  27. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/__init__.py +5 -0
  28. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/_version.py +3 -3
  29. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/accessor.py +9 -1
  30. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/aspect.py +4 -0
  31. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/balanced_allocation.py +2 -2
  32. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/bilateral.py +13 -0
  33. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/bump.py +141 -49
  34. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/classify.py +127 -43
  35. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/contour.py +31 -0
  36. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/convolution.py +47 -0
  37. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/cost_distance.py +99 -6
  38. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/curvature.py +8 -0
  39. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/dasymetric.py +92 -0
  40. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/diffusion.py +170 -29
  41. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/edge_detection.py +6 -0
  42. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/emerging_hotspots.py +58 -0
  43. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/erosion.py +97 -23
  44. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/experimental/min_observable_height.py +39 -0
  45. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/focal.py +53 -0
  46. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geodesic.py +49 -0
  47. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/__init__.py +176 -51
  48. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_compression.py +0 -55
  49. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_gpu_decode.py +99 -8
  50. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_header.py +64 -0
  51. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_reader.py +99 -13
  52. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_vrt.py +41 -3
  53. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_writer.py +128 -36
  54. xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_cog.py +379 -0
  55. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_features.py +229 -2
  56. xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_predictor_fp_write_1313.py +203 -0
  57. xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_predictor_multisample.py +398 -0
  58. xarray_spatial-0.9.8/xrspatial/geotiff/tests/test_security.py +519 -0
  59. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/glcm.py +17 -4
  60. xarray_spatial-0.9.8/xrspatial/gpu_rtx/_memory.py +60 -0
  61. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/hillshade.py +4 -0
  62. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/viewshed.py +4 -0
  63. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hillshade.py +56 -25
  64. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/basin_d8.py +89 -0
  65. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/fill_d8.py +88 -0
  66. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_accumulation_d8.py +89 -0
  67. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_accumulation_dinf.py +92 -0
  68. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_accumulation_mfd.py +91 -0
  69. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_length_d8.py +90 -0
  70. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_length_dinf.py +91 -0
  71. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_length_mfd.py +94 -0
  72. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/hand_d8.py +94 -0
  73. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/hand_dinf.py +95 -0
  74. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/hand_mfd.py +94 -0
  75. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_link_d8.py +93 -0
  76. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_link_dinf.py +95 -0
  77. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_link_mfd.py +94 -0
  78. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_order_d8.py +96 -0
  79. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_order_dinf.py +99 -0
  80. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/stream_order_mfd.py +99 -0
  81. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_basin_d8.py +73 -0
  82. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_fill_d8.py +73 -0
  83. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_accumulation_d8.py +58 -0
  84. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_accumulation_dinf.py +58 -0
  85. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_accumulation_mfd.py +57 -0
  86. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_length_d8.py +69 -0
  87. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_length_dinf.py +75 -0
  88. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_length_mfd.py +74 -0
  89. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_hand_d8.py +84 -0
  90. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_hand_dinf.py +88 -0
  91. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_hand_mfd.py +84 -0
  92. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_link_d8.py +77 -0
  93. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_link_dinf.py +77 -0
  94. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_link_mfd.py +94 -0
  95. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_order_d8.py +77 -0
  96. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_order_dinf.py +80 -0
  97. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_stream_order_mfd.py +92 -0
  98. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_watershed_d8.py +88 -0
  99. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_watershed_dinf.py +84 -0
  100. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_watershed_mfd.py +88 -0
  101. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/watershed_d8.py +89 -0
  102. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/watershed_dinf.py +90 -0
  103. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/watershed_mfd.py +89 -0
  104. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_kriging.py +74 -0
  105. xarray_spatial-0.9.8/xrspatial/kde.py +799 -0
  106. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mahalanobis.py +107 -2
  107. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/combine.py +43 -0
  108. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/weights.py +15 -3
  109. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/morphology.py +50 -0
  110. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/multispectral.py +89 -1
  111. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/pathfinding.py +6 -2
  112. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/perlin.py +10 -0
  113. xarray_spatial-0.9.8/xrspatial/polygon_clip.py +272 -0
  114. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/polygonize.py +560 -5
  115. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/rasterize.py +37 -0
  116. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/__init__.py +45 -22
  117. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_grid.py +11 -0
  118. xarray_spatial-0.9.8/xrspatial/resample.py +887 -0
  119. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/sieve.py +215 -114
  120. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/sky_view_factor.py +79 -0
  121. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/slope.py +4 -0
  122. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/surface_distance.py +94 -0
  123. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/terrain_metrics.py +51 -0
  124. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_balanced_allocation.py +39 -0
  125. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_bilateral.py +40 -0
  126. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_bump.py +130 -0
  127. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_classify.py +44 -4
  128. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_contour.py +38 -0
  129. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_cost_distance.py +194 -0
  130. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_curvature.py +12 -0
  131. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dasymetric.py +128 -0
  132. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_diffusion.py +177 -0
  133. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_edge_detection.py +27 -0
  134. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_emerging_hotspots.py +84 -0
  135. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_erosion.py +135 -1
  136. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_focal.py +61 -0
  137. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_geodesic_aspect.py +35 -0
  138. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_geodesic_slope.py +41 -0
  139. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_glcm.py +42 -3
  140. xarray_spatial-0.9.8/xrspatial/tests/test_gpu_rtx_memory.py +175 -0
  141. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_hillshade.py +73 -20
  142. xarray_spatial-0.9.8/xrspatial/tests/test_hypsometric_integral.py +256 -0
  143. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_interpolation.py +89 -0
  144. xarray_spatial-0.9.8/xrspatial/tests/test_kde.py +499 -0
  145. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_mahalanobis.py +86 -0
  146. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_mcda.py +118 -0
  147. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_min_observable_height.py +56 -0
  148. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_morphology.py +51 -0
  149. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_multispectral.py +122 -0
  150. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_perlin.py +27 -0
  151. xarray_spatial-0.9.8/xrspatial/tests/test_polygon_clip.py +360 -0
  152. xarray_spatial-0.9.8/xrspatial/tests/test_polygonize.py +1070 -0
  153. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_rasterize.py +49 -0
  154. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_reproject.py +59 -0
  155. xarray_spatial-0.9.8/xrspatial/tests/test_resample.py +432 -0
  156. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_sieve.py +48 -22
  157. xarray_spatial-0.9.8/xrspatial/tests/test_sieve_gdal_parity.py +467 -0
  158. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_sky_view_factor.py +84 -0
  159. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_surface_distance.py +119 -0
  160. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_terrain_metrics.py +17 -0
  161. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_viewshed.py +42 -0
  162. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_visibility.py +14 -11
  163. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_zonal.py +39 -0
  164. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/viewshed.py +20 -2
  165. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/visibility.py +114 -56
  166. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/zonal.py +203 -1
  167. xarray_spatial-0.9.6/.claude/accuracy-sweep-state.json +0 -9
  168. xarray_spatial-0.9.6/.claude/commands/accuracy-sweep.md +0 -158
  169. xarray_spatial-0.9.6/.claude/commands/sweep-performance.md +0 -494
  170. xarray_spatial-0.9.6/.claude/performance-sweep-state.json +0 -47
  171. xarray_spatial-0.9.6/.gitattributes +0 -2
  172. xarray_spatial-0.9.6/xrspatial/geotiff/tests/test_cog.py +0 -137
  173. xarray_spatial-0.9.6/xrspatial/tests/test_polygonize.py +0 -540
  174. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/backend-parity.md +0 -0
  175. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/dask-notebook.md +0 -0
  176. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/new-issues.md +0 -0
  177. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/review-pr.md +0 -0
  178. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.claude/commands/user-guide-notebook.md +0 -0
  179. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  180. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/labeler.yml +0 -0
  181. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/pull_request_template.md +0 -0
  182. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/labeler.yml +0 -0
  183. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.github/workflows/pypi-publish.yml +0 -0
  184. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/.readthedocs.yml +0 -0
  185. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/CODE_OF_CONDUCT.md +0 -0
  186. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/Citation-styles.md +0 -0
  187. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/LICENSE.txt +0 -0
  188. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/MANIFEST.in +0 -0
  189. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/RELEASE.md +0 -0
  190. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/codecov.yml +0 -0
  191. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/pyproject.toml +0 -0
  192. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/setup.cfg +0 -0
  193. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/setup.py +0 -0
  194. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/dependency_links.txt +0 -0
  195. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/entry_points.txt +0 -0
  196. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/not-zip-safe +0 -0
  197. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/requires.txt +0 -0
  198. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xarray_spatial.egg-info/top_level.txt +0 -0
  199. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/__main__.py +0 -0
  200. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/analytics.py +0 -0
  201. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/corridor.py +0 -0
  202. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/dataset_support.py +0 -0
  203. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/__init__.py +0 -0
  204. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/blue_band.nc +0 -0
  205. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/green_band.nc +0 -0
  206. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/nir_band.nc +0 -0
  207. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/red_band.nc +0 -0
  208. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/swir1_band.nc +0 -0
  209. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/datasets/sentinel-2/swir2_band.nc +0 -0
  210. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/diagnostics.py +0 -0
  211. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/experimental/__init__.py +0 -0
  212. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/fire.py +0 -0
  213. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/flood.py +0 -0
  214. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_dtypes.py +0 -0
  215. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/_geotags.py +0 -0
  216. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/__init__.py +0 -0
  217. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/bench_vs_rioxarray.py +0 -0
  218. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/conftest.py +0 -0
  219. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_accessor_io.py +0 -0
  220. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_accuracy_1081.py +0 -0
  221. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_compression.py +0 -0
  222. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_compression_level.py +0 -0
  223. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_dtype_read.py +0 -0
  224. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_edge_cases.py +0 -0
  225. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_geotags.py +0 -0
  226. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_header.py +0 -0
  227. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_jpeg.py +0 -0
  228. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_jpeg2000.py +0 -0
  229. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_lerc.py +0 -0
  230. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_lz4.py +0 -0
  231. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_reader.py +0 -0
  232. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_streaming_write.py +0 -0
  233. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_vrt_write.py +0 -0
  234. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/geotiff/tests/test_writer.py +0 -0
  235. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/__init__.py +0 -0
  236. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/cuda_utils.py +0 -0
  237. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/gpu_rtx/mesh_utils.py +0 -0
  238. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/__init__.py +0 -0
  239. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/_boundary_store.py +0 -0
  240. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_direction_d8.py +0 -0
  241. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_direction_dinf.py +0 -0
  242. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_direction_mfd.py +0 -0
  243. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_path_d8.py +0 -0
  244. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_path_dinf.py +0 -0
  245. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/flow_path_mfd.py +0 -0
  246. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/sink_d8.py +0 -0
  247. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/snap_pour_point_d8.py +0 -0
  248. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/__init__.py +0 -0
  249. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/conftest.py +0 -0
  250. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_direction_d8.py +0 -0
  251. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_direction_dinf.py +0 -0
  252. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_direction_mfd.py +0 -0
  253. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_path_d8.py +0 -0
  254. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_path_dinf.py +0 -0
  255. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_flow_path_mfd.py +0 -0
  256. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_sink_d8.py +0 -0
  257. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_snap_pour_point_d8.py +0 -0
  258. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/tests/test_twi_d8.py +0 -0
  259. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/hydro/twi_d8.py +0 -0
  260. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/__init__.py +0 -0
  261. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_idw.py +0 -0
  262. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_spline.py +0 -0
  263. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/interpolate/_validation.py +0 -0
  264. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/__init__.py +0 -0
  265. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/constrain.py +0 -0
  266. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/sensitivity.py +0 -0
  267. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/mcda/standardize.py +0 -0
  268. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/normalize.py +0 -0
  269. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/preview.py +0 -0
  270. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/proximity.py +0 -0
  271. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_crs_utils.py +0 -0
  272. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_datum_grids.py +0 -0
  273. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_interpolate.py +0 -0
  274. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_itrf.py +0 -0
  275. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_lite_crs.py +0 -0
  276. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_merge.py +0 -0
  277. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_projections.py +0 -0
  278. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_projections_cuda.py +0 -0
  279. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_transform.py +0 -0
  280. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/_vertical.py +0 -0
  281. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/at_bev_AT_GIS_GRID.tif +0 -0
  282. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/au_icsm_A66_National_13_09_01.tif +0 -0
  283. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/be_ign_bd72lb72_etrs89lb08.tif +0 -0
  284. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/ch_swisstopo_CHENyx06_ETRS.tif +0 -0
  285. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/de_adv_BETA2007.tif +0 -0
  286. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/es_ign_SPED2ETV2.tif +0 -0
  287. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/nl_nsgi_rdcorr2018.tif +0 -0
  288. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/pt_dgt_D73_ETRS89_geo.tif +0 -0
  289. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/uk_os_OSTN15_NTv2_OSGBtoETRS.tif +0 -0
  290. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_nga_egm96_15.tif +0 -0
  291. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_alaska.tif +0 -0
  292. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_conus.tif +0 -0
  293. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_hawaii.tif +0 -0
  294. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_nadcon5_nad27_nad83_1986_conus.tif +0 -0
  295. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/reproject/grids/us_noaa_prvi.tif +0 -0
  296. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/terrain.py +0 -0
  297. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/__init__.py +0 -0
  298. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/bench_reproject_vs_rioxarray.py +0 -0
  299. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/conftest.py +0 -0
  300. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/general_checks.py +0 -0
  301. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_accessor.py +0 -0
  302. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_analytics.py +0 -0
  303. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_aspect.py +0 -0
  304. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_corridor.py +0 -0
  305. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dask_cupy_gaps.py +0 -0
  306. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dask_laziness.py +0 -0
  307. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_dataset_support.py +0 -0
  308. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_datasets.py +0 -0
  309. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_diagnostics.py +0 -0
  310. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_fire.py +0 -0
  311. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_flood.py +0 -0
  312. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_fused_overlap.py +0 -0
  313. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_glcm_metric_order.py +0 -0
  314. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_lite_crs.py +0 -0
  315. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_morphology_derived.py +0 -0
  316. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_multi_overlap.py +0 -0
  317. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_normalize.py +0 -0
  318. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_northness_eastness.py +0 -0
  319. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_pathfinding.py +0 -0
  320. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_preview.py +0 -0
  321. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_proximity.py +0 -0
  322. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_rasterize_accuracy.py +0 -0
  323. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_rechunk_no_shuffle.py +0 -0
  324. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_slope.py +0 -0
  325. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_terrain.py +0 -0
  326. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_utils.py +0 -0
  327. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/tests/test_validation.py +0 -0
  328. {xarray_spatial-0.9.6 → xarray_spatial-0.9.8}/xrspatial/utils.py +0 -0
  329. {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 master and report regressions
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/master --name-only`
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/master HEAD -b "<regex>" -e
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 master
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 | master | HEAD | Ratio | Status |
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/master vs HEAD.
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/master.
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 master && git pull
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 master.
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 master && git pull
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 master && git pull
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 master.
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 master && git pull
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 master && git pull
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 master.
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 master && git pull
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.