insar-rs 0.2.0__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 (281) hide show
  1. insar_rs-0.2.0/PKG-INFO +71 -0
  2. insar_rs-0.2.0/README.md +49 -0
  3. insar_rs-0.2.0/geostat-rs/Cargo.toml +30 -0
  4. insar_rs-0.2.0/geostat-rs/crates/geostat-core/Cargo.toml +37 -0
  5. insar_rs-0.2.0/geostat-rs/crates/geostat-core/README.md +354 -0
  6. insar_rs-0.2.0/geostat-rs/crates/geostat-core/benches/engine.rs +79 -0
  7. insar_rs-0.2.0/geostat-rs/crates/geostat-core/examples/plan_bench.rs +20 -0
  8. insar_rs-0.2.0/geostat-rs/crates/geostat-core/examples/vecchia_grouping_bench.rs +112 -0
  9. insar_rs-0.2.0/geostat-rs/crates/geostat-core/examples/vecchia_scaling.rs +89 -0
  10. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/cokriging.rs +1173 -0
  11. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/collocated.rs +824 -0
  12. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/covariance.rs +208 -0
  13. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/data.rs +219 -0
  14. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/declustering.rs +228 -0
  15. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/error.rs +43 -0
  16. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/grid.rs +203 -0
  17. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/ik.rs +826 -0
  18. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/interpolation.rs +248 -0
  19. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/kriging.rs +1730 -0
  20. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/lib.rs +122 -0
  21. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/linalg.rs +314 -0
  22. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/optim.rs +415 -0
  23. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/parallel.rs +69 -0
  24. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/regression.rs +404 -0
  25. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/rng.rs +137 -0
  26. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/search.rs +446 -0
  27. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/simulation.rs +758 -0
  28. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/sis.rs +1141 -0
  29. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/tails.rs +248 -0
  30. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/tgs.rs +617 -0
  31. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/trans.rs +232 -0
  32. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/transform.rs +447 -0
  33. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/tuning.rs +195 -0
  34. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/validation.rs +1556 -0
  35. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/bessel.rs +167 -0
  36. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/cross.rs +79 -0
  37. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/experimental.rs +803 -0
  38. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/fit.rs +1038 -0
  39. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/map.rs +230 -0
  40. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/mod.rs +20 -0
  41. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/model.rs +1316 -0
  42. insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/vecchia.rs +3000 -0
  43. insar_rs-0.2.0/geostat-rs/crates/geostat-core/tests/three_d.rs +436 -0
  44. insar_rs-0.2.0/geostat-rs/crates/geostat-core/tests/workflow.rs +119 -0
  45. insar_rs-0.2.0/insar-rs/Cargo.lock +1540 -0
  46. insar_rs-0.2.0/insar-rs/Cargo.toml +46 -0
  47. insar_rs-0.2.0/insar-rs/crates/core/Cargo.toml +41 -0
  48. insar_rs-0.2.0/insar-rs/crates/core/README.md +49 -0
  49. insar_rs-0.2.0/insar-rs/crates/core/benches/sbas.rs +120 -0
  50. insar_rs-0.2.0/insar-rs/crates/core/src/atmosphere/mod.rs +577 -0
  51. insar_rs-0.2.0/insar-rs/crates/core/src/decompose/mod.rs +507 -0
  52. insar_rs-0.2.0/insar-rs/crates/core/src/error.rs +62 -0
  53. insar_rs-0.2.0/insar-rs/crates/core/src/features/mod.rs +801 -0
  54. insar_rs-0.2.0/insar-rs/crates/core/src/inversion/mod.rs +2126 -0
  55. insar_rs-0.2.0/insar-rs/crates/core/src/io/isce/mod.rs +1442 -0
  56. insar_rs-0.2.0/insar-rs/crates/core/src/io/mod.rs +968 -0
  57. insar_rs-0.2.0/insar-rs/crates/core/src/lib.rs +29 -0
  58. insar_rs-0.2.0/insar-rs/crates/core/src/network/mod.rs +335 -0
  59. insar_rs-0.2.0/insar-rs/crates/core/src/pipeline/mod.rs +515 -0
  60. insar_rs-0.2.0/insar-rs/crates/core/src/postprocess/mod.rs +247 -0
  61. insar_rs-0.2.0/insar-rs/crates/core/src/ps/mod.rs +242 -0
  62. insar_rs-0.2.0/insar-rs/crates/core/src/troposphere/era5.rs +613 -0
  63. insar_rs-0.2.0/insar-rs/crates/core/src/troposphere/mod.rs +243 -0
  64. insar_rs-0.2.0/insar-rs/crates/core/src/types.rs +313 -0
  65. insar_rs-0.2.0/insar-rs/crates/core/src/unwrap/mod.rs +588 -0
  66. insar_rs-0.2.0/insar-rs/crates/core/src/unwrap/snaphu.rs +378 -0
  67. insar_rs-0.2.0/insar-rs/crates/core/src/unwrap_error/mod.rs +621 -0
  68. insar_rs-0.2.0/insar-rs/crates/core/tests/pipeline_e2e.rs +280 -0
  69. insar_rs-0.2.0/insar-rs/crates/python/Cargo.toml +20 -0
  70. insar_rs-0.2.0/insar-rs/crates/python/README.md +49 -0
  71. insar_rs-0.2.0/insar-rs/crates/python/src/lib.rs +476 -0
  72. insar_rs-0.2.0/insar-rs/crates/python/tests/test_bindings.py +190 -0
  73. insar_rs-0.2.0/pyproject.toml +32 -0
  74. insar_rs-0.2.0/smelt/CHANGELOG.md +716 -0
  75. insar_rs-0.2.0/smelt/Cargo.lock +4117 -0
  76. insar_rs-0.2.0/smelt/Cargo.toml +59 -0
  77. insar_rs-0.2.0/smelt/LICENSE +21 -0
  78. insar_rs-0.2.0/smelt/README.md +393 -0
  79. insar_rs-0.2.0/smelt/benches/learners.rs +8 -0
  80. insar_rs-0.2.0/smelt/examples/ablation_study.rs +294 -0
  81. insar_rs-0.2.0/smelt/examples/accuracy_validation.rs +198 -0
  82. insar_rs-0.2.0/smelt/examples/basic_classification.rs +69 -0
  83. insar_rs-0.2.0/smelt/examples/bench_vectorization.rs +68 -0
  84. insar_rs-0.2.0/smelt/examples/benchmark_large.rs +329 -0
  85. insar_rs-0.2.0/smelt/examples/benchmark_prediction.rs +116 -0
  86. insar_rs-0.2.0/smelt/examples/case_study_king_county.rs +241 -0
  87. insar_rs-0.2.0/smelt/examples/case_study_spatial.rs +269 -0
  88. insar_rs-0.2.0/smelt/examples/catboost_categoricals.rs +70 -0
  89. insar_rs-0.2.0/smelt/examples/conformal_prediction.rs +85 -0
  90. insar_rs-0.2.0/smelt/examples/gis_workflow.rs +234 -0
  91. insar_rs-0.2.0/smelt/examples/mem_bench.rs +60 -0
  92. insar_rs-0.2.0/smelt/examples/pm25_spatial_loso.rs +200 -0
  93. insar_rs-0.2.0/smelt/examples/profile_catboost.rs +47 -0
  94. insar_rs-0.2.0/smelt/examples/profile_lightgbm.rs +41 -0
  95. insar_rs-0.2.0/smelt/examples/profile_scaling.rs +48 -0
  96. insar_rs-0.2.0/smelt/examples/regression_pipeline.rs +64 -0
  97. insar_rs-0.2.0/smelt/examples/spatial_ml.rs +88 -0
  98. insar_rs-0.2.0/smelt/examples/validate_geoxgboost.rs +251 -0
  99. insar_rs-0.2.0/smelt/examples/xgboost_tuning.rs +91 -0
  100. insar_rs-0.2.0/smelt/paper/replication/README.md +102 -0
  101. insar_rs-0.2.0/smelt/src/benchmark.rs +125 -0
  102. insar_rs-0.2.0/smelt/src/benchmark_design.rs +154 -0
  103. insar_rs-0.2.0/smelt/src/causal/meta_learners/cross_fit.rs +191 -0
  104. insar_rs-0.2.0/smelt/src/causal/meta_learners/dr_learner.rs +211 -0
  105. insar_rs-0.2.0/smelt/src/causal/meta_learners/mod.rs +184 -0
  106. insar_rs-0.2.0/smelt/src/causal/meta_learners/r_learner.rs +616 -0
  107. insar_rs-0.2.0/smelt/src/causal/meta_learners/s_learner.rs +160 -0
  108. insar_rs-0.2.0/smelt/src/causal/meta_learners/t_learner.rs +165 -0
  109. insar_rs-0.2.0/smelt/src/causal/meta_learners/x_learner.rs +239 -0
  110. insar_rs-0.2.0/smelt/src/causal/mod.rs +941 -0
  111. insar_rs-0.2.0/smelt/src/cluster/isolation_forest.rs +320 -0
  112. insar_rs-0.2.0/smelt/src/cluster/mod.rs +643 -0
  113. insar_rs-0.2.0/smelt/src/conformal/cqr.rs +164 -0
  114. insar_rs-0.2.0/smelt/src/conformal/localized.rs +380 -0
  115. insar_rs-0.2.0/smelt/src/conformal/mod.rs +336 -0
  116. insar_rs-0.2.0/smelt/src/data/mod.rs +293 -0
  117. insar_rs-0.2.0/smelt/src/data/parquet.rs +228 -0
  118. insar_rs-0.2.0/smelt/src/error.rs +73 -0
  119. insar_rs-0.2.0/smelt/src/importance/mod.rs +187 -0
  120. insar_rs-0.2.0/smelt/src/importance/shap.rs +389 -0
  121. insar_rs-0.2.0/smelt/src/learner/adaboost.rs +503 -0
  122. insar_rs-0.2.0/smelt/src/learner/adaptive_rf.rs +853 -0
  123. insar_rs-0.2.0/smelt/src/learner/auto_tuner.rs +878 -0
  124. insar_rs-0.2.0/smelt/src/learner/bagging.rs +316 -0
  125. insar_rs-0.2.0/smelt/src/learner/calibration.rs +769 -0
  126. insar_rs-0.2.0/smelt/src/learner/catboost.rs +1762 -0
  127. insar_rs-0.2.0/smelt/src/learner/cost_sensitive.rs +294 -0
  128. insar_rs-0.2.0/smelt/src/learner/deep_forest.rs +624 -0
  129. insar_rs-0.2.0/smelt/src/learner/des.rs +485 -0
  130. insar_rs-0.2.0/smelt/src/learner/ebm.rs +311 -0
  131. insar_rs-0.2.0/smelt/src/learner/elm.rs +690 -0
  132. insar_rs-0.2.0/smelt/src/learner/eval.rs +122 -0
  133. insar_rs-0.2.0/smelt/src/learner/gaussian_process.rs +422 -0
  134. insar_rs-0.2.0/smelt/src/learner/geo_xgboost.rs +1016 -0
  135. insar_rs-0.2.0/smelt/src/learner/hist_pool.rs +180 -0
  136. insar_rs-0.2.0/smelt/src/learner/histogram.rs +342 -0
  137. insar_rs-0.2.0/smelt/src/learner/hoeffding.rs +796 -0
  138. insar_rs-0.2.0/smelt/src/learner/kernel_svm.rs +640 -0
  139. insar_rs-0.2.0/smelt/src/learner/knn.rs +179 -0
  140. insar_rs-0.2.0/smelt/src/learner/kriging_hybrid.rs +1263 -0
  141. insar_rs-0.2.0/smelt/src/learner/lightgbm.rs +1820 -0
  142. insar_rs-0.2.0/smelt/src/learner/linear_regression.rs +207 -0
  143. insar_rs-0.2.0/smelt/src/learner/logistic_regression.rs +346 -0
  144. insar_rs-0.2.0/smelt/src/learner/math.rs +48 -0
  145. insar_rs-0.2.0/smelt/src/learner/mod.rs +178 -0
  146. insar_rs-0.2.0/smelt/src/learner/mondrian.rs +1326 -0
  147. insar_rs-0.2.0/smelt/src/learner/naive_bayes.rs +172 -0
  148. insar_rs-0.2.0/smelt/src/learner/oblique.rs +1033 -0
  149. insar_rs-0.2.0/smelt/src/learner/properties.rs +203 -0
  150. insar_rs-0.2.0/smelt/src/learner/quantile.rs +229 -0
  151. insar_rs-0.2.0/smelt/src/learner/quantile_forest.rs +706 -0
  152. insar_rs-0.2.0/smelt/src/learner/registry.rs +189 -0
  153. insar_rs-0.2.0/smelt/src/learner/regularized.rs +486 -0
  154. insar_rs-0.2.0/smelt/src/learner/stacking.rs +263 -0
  155. insar_rs-0.2.0/smelt/src/learner/svm.rs +323 -0
  156. insar_rs-0.2.0/smelt/src/learner/target_transform.rs +581 -0
  157. insar_rs-0.2.0/smelt/src/learner/threshold.rs +498 -0
  158. insar_rs-0.2.0/smelt/src/learner/tree/decision_tree.rs +242 -0
  159. insar_rs-0.2.0/smelt/src/learner/tree/extra_trees.rs +338 -0
  160. insar_rs-0.2.0/smelt/src/learner/tree/gradient_boosting.rs +694 -0
  161. insar_rs-0.2.0/smelt/src/learner/tree/mod.rs +1220 -0
  162. insar_rs-0.2.0/smelt/src/learner/tree/random_forest.rs +457 -0
  163. insar_rs-0.2.0/smelt/src/learner/xgboost.rs +2355 -0
  164. insar_rs-0.2.0/smelt/src/lib.rs +132 -0
  165. insar_rs-0.2.0/smelt/src/measure/mod.rs +922 -0
  166. insar_rs-0.2.0/smelt/src/multilabel/mod.rs +188 -0
  167. insar_rs-0.2.0/smelt/src/multioutput/mod.rs +166 -0
  168. insar_rs-0.2.0/smelt/src/prediction/mod.rs +134 -0
  169. insar_rs-0.2.0/smelt/src/preprocess/adasyn.rs +346 -0
  170. insar_rs-0.2.0/smelt/src/preprocess/encoder.rs +217 -0
  171. insar_rs-0.2.0/smelt/src/preprocess/filter.rs +994 -0
  172. insar_rs-0.2.0/smelt/src/preprocess/imputer.rs +128 -0
  173. insar_rs-0.2.0/smelt/src/preprocess/label_encoder.rs +76 -0
  174. insar_rs-0.2.0/smelt/src/preprocess/mod.rs +109 -0
  175. insar_rs-0.2.0/smelt/src/preprocess/mutual_info.rs +158 -0
  176. insar_rs-0.2.0/smelt/src/preprocess/pca.rs +369 -0
  177. insar_rs-0.2.0/smelt/src/preprocess/pipeline.rs +435 -0
  178. insar_rs-0.2.0/smelt/src/preprocess/rfe.rs +188 -0
  179. insar_rs-0.2.0/smelt/src/preprocess/scaler.rs +175 -0
  180. insar_rs-0.2.0/smelt/src/preprocess/smote.rs +206 -0
  181. insar_rs-0.2.0/smelt/src/preprocess/spatial_smote.rs +415 -0
  182. insar_rs-0.2.0/smelt/src/resample/mod.rs +456 -0
  183. insar_rs-0.2.0/smelt/src/resample/spatial.rs +254 -0
  184. insar_rs-0.2.0/smelt/src/resample/stratified.rs +248 -0
  185. insar_rs-0.2.0/smelt/src/resample/time_series.rs +254 -0
  186. insar_rs-0.2.0/smelt/src/serialize.rs +482 -0
  187. insar_rs-0.2.0/smelt/src/sparse.rs +184 -0
  188. insar_rs-0.2.0/smelt/src/stats.rs +1145 -0
  189. insar_rs-0.2.0/smelt/src/survival/cox.rs +645 -0
  190. insar_rs-0.2.0/smelt/src/survival/mod.rs +803 -0
  191. insar_rs-0.2.0/smelt/src/task/mod.rs +509 -0
  192. insar_rs-0.2.0/smelt/src/tuning/bayesian.rs +464 -0
  193. insar_rs-0.2.0/smelt/src/tuning/grid_search.rs +193 -0
  194. insar_rs-0.2.0/smelt/src/tuning/hyperband.rs +228 -0
  195. insar_rs-0.2.0/smelt/src/tuning/mod.rs +937 -0
  196. insar_rs-0.2.0/smelt/src/tuning/random_search.rs +237 -0
  197. insar_rs-0.2.0/smelt/src/tuning/terminator.rs +274 -0
  198. insar_rs-0.2.0/smelt/src/validate.rs +78 -0
  199. insar_rs-0.2.0/smelt/tests/catboost_perf.rs +95 -0
  200. insar_rs-0.2.0/smelt/tests/contract.rs +377 -0
  201. insar_rs-0.2.0/smelt/tests/integration.rs +8001 -0
  202. insar_rs-0.2.0/smelt/tests/lightgbm_perf.rs +93 -0
  203. insar_rs-0.2.0/smelt/tests/real_benchmark.rs +106 -0
  204. insar_rs-0.2.0/smelt/tests/serialize_all_variants.rs +254 -0
  205. insar_rs-0.2.0/smelt/tests/weights.rs +320 -0
  206. insar_rs-0.2.0/smelt/tests/weights_boosting.rs +738 -0
  207. insar_rs-0.2.0/smelt/tests/weights_linear.rs +567 -0
  208. insar_rs-0.2.0/smelt/tests/weights_trees.rs +748 -0
  209. insar_rs-0.2.0/smelt/tests/xgboost_perf.rs +102 -0
  210. insar_rs-0.2.0/smelt/tests/xgboost_vs_official.rs +280 -0
  211. insar_rs-0.2.0/surtgis/Cargo.toml +149 -0
  212. insar_rs-0.2.0/surtgis/crates/core/Cargo.toml +48 -0
  213. insar_rs-0.2.0/surtgis/crates/core/src/crs/mod.rs +189 -0
  214. insar_rs-0.2.0/surtgis/crates/core/src/cube.rs +411 -0
  215. insar_rs-0.2.0/surtgis/crates/core/src/error.rs +120 -0
  216. insar_rs-0.2.0/surtgis/crates/core/src/io/cog_writer.rs +997 -0
  217. insar_rs-0.2.0/surtgis/crates/core/src/io/gdal_io.rs +170 -0
  218. insar_rs-0.2.0/surtgis/crates/core/src/io/mod.rs +52 -0
  219. insar_rs-0.2.0/surtgis/crates/core/src/io/native.rs +2273 -0
  220. insar_rs-0.2.0/surtgis/crates/core/src/io/options.rs +59 -0
  221. insar_rs-0.2.0/surtgis/crates/core/src/io/strip_reader.rs +367 -0
  222. insar_rs-0.2.0/surtgis/crates/core/src/io/strip_writer.rs +455 -0
  223. insar_rs-0.2.0/surtgis/crates/core/src/lib.rs +85 -0
  224. insar_rs-0.2.0/surtgis/crates/core/src/mosaic.rs +314 -0
  225. insar_rs-0.2.0/surtgis/crates/core/src/raster/any_raster.rs +317 -0
  226. insar_rs-0.2.0/surtgis/crates/core/src/raster/complex.rs +251 -0
  227. insar_rs-0.2.0/surtgis/crates/core/src/raster/element.rs +233 -0
  228. insar_rs-0.2.0/surtgis/crates/core/src/raster/geotransform.rs +209 -0
  229. insar_rs-0.2.0/surtgis/crates/core/src/raster/grid.rs +382 -0
  230. insar_rs-0.2.0/surtgis/crates/core/src/raster/mod.rs +23 -0
  231. insar_rs-0.2.0/surtgis/crates/core/src/raster/neighborhood.rs +200 -0
  232. insar_rs-0.2.0/surtgis/crates/core/src/raster/validate.rs +272 -0
  233. insar_rs-0.2.0/surtgis/crates/core/src/resample.rs +726 -0
  234. insar_rs-0.2.0/surtgis/crates/core/src/streaming.rs +201 -0
  235. insar_rs-0.2.0/surtgis/crates/core/src/tiling.rs +236 -0
  236. insar_rs-0.2.0/surtgis/crates/core/src/vector/geojson_reader.rs +533 -0
  237. insar_rs-0.2.0/surtgis/crates/core/src/vector/geoparquet.rs +756 -0
  238. insar_rs-0.2.0/surtgis/crates/core/src/vector/gpkg_reader.rs +814 -0
  239. insar_rs-0.2.0/surtgis/crates/core/src/vector/mod.rs +223 -0
  240. insar_rs-0.2.0/surtgis/crates/core/src/vector/rasterize.rs +613 -0
  241. insar_rs-0.2.0/surtgis/crates/core/src/vector/shapefile_reader.rs +252 -0
  242. insar_rs-0.2.0/surtgis/crates/core/tests/cube_geotiff.rs +55 -0
  243. insar_rs-0.2.0/surtgis/crates/core/tests/fixtures/oom_ifd_count.tif +0 -0
  244. insar_rs-0.2.0/surtgis/crates/core/tests/tiff_oom_regression.rs +17 -0
  245. insar_rs-0.2.0/swarm-abm/Cargo.toml +58 -0
  246. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/Cargo.toml +60 -0
  247. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/README.md +44 -0
  248. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/benches/engine.rs +280 -0
  249. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/agent.rs +641 -0
  250. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/batch.rs +216 -0
  251. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/continuous.rs +772 -0
  252. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/data.rs +371 -0
  253. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/experiment.rs +649 -0
  254. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/graph.rs +591 -0
  255. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/grid.rs +852 -0
  256. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/lib.rs +141 -0
  257. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/model.rs +39 -0
  258. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/rng.rs +184 -0
  259. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/schedule.rs +118 -0
  260. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/sim.rs +696 -0
  261. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/checkpoint.rs +269 -0
  262. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/decide_with_peers.rs +131 -0
  263. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/determinism.rs +84 -0
  264. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/experiment.rs +446 -0
  265. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/golden_values.rs +233 -0
  266. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/parallel_decide.rs +76 -0
  267. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/simultaneous.rs +137 -0
  268. insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/staged.rs +216 -0
  269. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/Cargo.toml +21 -0
  270. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/src/lib.rs +178 -0
  271. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/compile_fail.rs +13 -0
  272. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_named_fields.rs +8 -0
  273. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_named_fields.stderr +5 -0
  274. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_two_fields.rs +8 -0
  275. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_two_fields.stderr +5 -0
  276. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_unit.rs +8 -0
  277. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_unit.stderr +5 -0
  278. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/empty_enum.rs +6 -0
  279. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/empty_enum.stderr +5 -0
  280. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/not_an_enum.rs +8 -0
  281. insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/not_an_enum.stderr +7 -0
@@ -0,0 +1,71 @@
1
+ Metadata-Version: 2.4
2
+ Name: insar-rs
3
+ Version: 0.2.0
4
+ Classifier: Programming Language :: Rust
5
+ Classifier: Programming Language :: Python :: 3
6
+ Classifier: Programming Language :: Python :: 3 :: Only
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: License :: OSI Approved :: Apache Software License
9
+ Classifier: Topic :: Scientific/Engineering :: GIS
10
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Dist: numpy>=1.23
13
+ Summary: Python bindings for the insar-rs InSAR time-series (SBAS) engine written in Rust
14
+ Keywords: insar,sar,sbas,deformation,remote-sensing,sentinel-1
15
+ Author-email: Francisco Parra <gran.huja@gmail.com>
16
+ License: MIT OR Apache-2.0
17
+ Requires-Python: >=3.9
18
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
19
+ Project-URL: Changelog, https://github.com/franciscoparrao/insar-rs/blob/main/CHANGELOG.md
20
+ Project-URL: Repository, https://github.com/franciscoparrao/insar-rs
21
+
22
+ # insar-rs (Python)
23
+
24
+ Bindings Python del motor SBAS de [insar-rs](../..) (Rust). Inversión de series
25
+ temporales InSAR rápida, consumible desde numpy.
26
+
27
+ ## Instalar (desarrollo)
28
+
29
+ ```bash
30
+ python3 -m venv .venv && source .venv/bin/activate
31
+ pip install maturin numpy
32
+ cd crates/python
33
+ maturin develop --release
34
+ ```
35
+
36
+ ## Uso
37
+
38
+ ```python
39
+ import insar_rs, numpy as np
40
+
41
+ # End-to-end desde interferogramas ISCE (.unw desenrollados). Referencia
42
+ # automáticamente al píxel de máxima coherencia media.
43
+ vel, vel_std, series, coherence, epochs = insar_rs.sbas_from_isce(
44
+ "merged/interferograms", baselines_dir="baselines")
45
+ # vel: (filas, cols) m/año ; vel_std: (filas, cols) m/año (error estándar)
46
+ # series: (épocas, filas, cols) m
47
+ # coherence: (filas, cols) coherencia temporal [0,1] (máscara de calidad)
48
+ # epochs: ['YYYY-MM-DD', ...]
49
+
50
+ # O sobre arrays propios de fase desenrollada (n_pares, filas, cols) en radianes:
51
+ ts = insar_rs.invert_sbas(phase, refs, secs, epoch_days, wavelength_m=0.0555)
52
+ vel = insar_rs.estimate_velocity(ts, epoch_days)
53
+
54
+ # Persistent Scatterers:
55
+ da = insar_rs.amplitude_dispersion(amp_stack) # (n_épocas, filas, cols) -> (filas, cols)
56
+
57
+ # Descomposición LOS asc+desc -> (Up, East); geometría escalar o por píxel:
58
+ up, east = insar_rs.decompose_asc_desc(los_asc, 39.0, 349.0, los_desc, 39.0, 191.0)
59
+ up, east = insar_rs.decompose_per_pixel([los_asc, los_desc], [inc_asc, inc_desc], [head_asc, head_desc])
60
+
61
+ # Descriptores por píxel para ML (dict de arrays, esquema determinista):
62
+ features = insar_rs.extract_features(series, epoch_days) # {"velocity": ..., "acceleration": ..., ...}
63
+
64
+ # Deramp (plano/cuadrática) y corrección de saltos 2π por cierre de fase:
65
+ flat = insar_rs.remove_ramp(vel, "linear")
66
+ corrected_phase, n_corrected, n_uncorrected = insar_rs.correct_unwrap_errors(phase, refs, secs)
67
+ ```
68
+
69
+ Convenciones: NoData = NaN; desplazamiento LOS `d = −λ/(4π)·φ`; serie relativa a
70
+ la primera época. Validado contra MintPy (ver `../../docs/validation.md`).
71
+
@@ -0,0 +1,49 @@
1
+ # insar-rs (Python)
2
+
3
+ Bindings Python del motor SBAS de [insar-rs](../..) (Rust). Inversión de series
4
+ temporales InSAR rápida, consumible desde numpy.
5
+
6
+ ## Instalar (desarrollo)
7
+
8
+ ```bash
9
+ python3 -m venv .venv && source .venv/bin/activate
10
+ pip install maturin numpy
11
+ cd crates/python
12
+ maturin develop --release
13
+ ```
14
+
15
+ ## Uso
16
+
17
+ ```python
18
+ import insar_rs, numpy as np
19
+
20
+ # End-to-end desde interferogramas ISCE (.unw desenrollados). Referencia
21
+ # automáticamente al píxel de máxima coherencia media.
22
+ vel, vel_std, series, coherence, epochs = insar_rs.sbas_from_isce(
23
+ "merged/interferograms", baselines_dir="baselines")
24
+ # vel: (filas, cols) m/año ; vel_std: (filas, cols) m/año (error estándar)
25
+ # series: (épocas, filas, cols) m
26
+ # coherence: (filas, cols) coherencia temporal [0,1] (máscara de calidad)
27
+ # epochs: ['YYYY-MM-DD', ...]
28
+
29
+ # O sobre arrays propios de fase desenrollada (n_pares, filas, cols) en radianes:
30
+ ts = insar_rs.invert_sbas(phase, refs, secs, epoch_days, wavelength_m=0.0555)
31
+ vel = insar_rs.estimate_velocity(ts, epoch_days)
32
+
33
+ # Persistent Scatterers:
34
+ da = insar_rs.amplitude_dispersion(amp_stack) # (n_épocas, filas, cols) -> (filas, cols)
35
+
36
+ # Descomposición LOS asc+desc -> (Up, East); geometría escalar o por píxel:
37
+ up, east = insar_rs.decompose_asc_desc(los_asc, 39.0, 349.0, los_desc, 39.0, 191.0)
38
+ up, east = insar_rs.decompose_per_pixel([los_asc, los_desc], [inc_asc, inc_desc], [head_asc, head_desc])
39
+
40
+ # Descriptores por píxel para ML (dict de arrays, esquema determinista):
41
+ features = insar_rs.extract_features(series, epoch_days) # {"velocity": ..., "acceleration": ..., ...}
42
+
43
+ # Deramp (plano/cuadrática) y corrección de saltos 2π por cierre de fase:
44
+ flat = insar_rs.remove_ramp(vel, "linear")
45
+ corrected_phase, n_corrected, n_uncorrected = insar_rs.correct_unwrap_errors(phase, refs, secs)
46
+ ```
47
+
48
+ Convenciones: NoData = NaN; desplazamiento LOS `d = −λ/(4π)·φ`; serie relativa a
49
+ la primera época. Validado contra MintPy (ver `../../docs/validation.md`).
@@ -0,0 +1,30 @@
1
+ [workspace]
2
+ resolver = "3"
3
+ members = [
4
+ "crates/geostat-core",
5
+ "crates/geostat-cli",
6
+ "crates/geostat-python",
7
+ "crates/geostat-wasm",
8
+ ]
9
+
10
+ [workspace.package]
11
+ version = "0.8.0"
12
+ edition = "2024"
13
+ license = "MIT OR Apache-2.0"
14
+ authors = ["Francisco Parra-O."]
15
+ repository = "https://github.com/franciscoparrao/geostat-rs"
16
+ rust-version = "1.88"
17
+
18
+ [workspace.dependencies]
19
+ ndarray = "0.16"
20
+ rayon = "1.10"
21
+ thiserror = "2"
22
+ serde = { version = "1", features = ["derive"] }
23
+ serde_json = "1"
24
+ anyhow = "1"
25
+ clap = { version = "4", features = ["derive"] }
26
+ csv = "1.3"
27
+
28
+ [profile.release]
29
+ lto = true
30
+ codegen-units = 1
@@ -0,0 +1,37 @@
1
+ [package]
2
+ name = "geostat-core"
3
+ description = "Geostatistics engine: variography, kriging and sequential Gaussian simulation"
4
+ version.workspace = true
5
+ edition.workspace = true
6
+ rust-version.workspace = true
7
+ license.workspace = true
8
+ authors.workspace = true
9
+ repository.workspace = true
10
+ keywords = ["geostatistics", "kriging", "variogram", "simulation", "spatial"]
11
+ categories = ["science", "mathematics"]
12
+ readme = "README.md"
13
+
14
+ [features]
15
+ default = ["parallel"]
16
+ # Parallel execution via rayon. Disable for single-threaded targets (wasm32).
17
+ parallel = ["dep:rayon"]
18
+
19
+ [package.metadata.docs.rs]
20
+ all-features = true
21
+
22
+ [dependencies]
23
+ ndarray = { workspace = true }
24
+ rayon = { workspace = true, optional = true }
25
+ thiserror = { workspace = true }
26
+ serde = { workspace = true }
27
+
28
+ [lib]
29
+ bench = false
30
+
31
+ [dev-dependencies]
32
+ criterion = "0.5"
33
+ proptest = "1"
34
+
35
+ [[bench]]
36
+ name = "engine"
37
+ harness = false
@@ -0,0 +1,354 @@
1
+ # geostat-rs
2
+
3
+ [![CI](https://github.com/franciscoparrao/geostat-rs/actions/workflows/ci.yml/badge.svg)](https://github.com/franciscoparrao/geostat-rs/actions/workflows/ci.yml)
4
+ [![License: MIT OR Apache-2.0](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](#license)
5
+
6
+ Geostatistics engine in pure Rust: variography, kriging and sequential
7
+ Gaussian/indicator simulation, plus a scalable Vecchia approximation for
8
+ large point sets. A modern, single-binary take on the GSLIB / gstat
9
+ feature set, with deterministic stochastic simulation and parallel
10
+ prediction out of the box, validated against gstat at machine precision.
11
+
12
+ Not yet published to crates.io/PyPI — build from source (see below).
13
+
14
+ ## Crates
15
+
16
+ | Crate | Description |
17
+ |---|---|
18
+ | `geostat-core` | Library: no I/O, no heavy dependencies. `parallel` feature (rayon, default on) — disable for wasm32. |
19
+ | `geostat-cli` | `geostat` command-line tool: CSV in, CSV/JSON out. |
20
+ | `geostat-python` | Python module `geostat_rs` (PyO3, abi3 ≥ 3.9). Build with maturin. |
21
+ | `geostat-wasm` | WebAssembly bindings (wasm-bindgen); demo in `examples/wasm-demo/`. |
22
+
23
+ ## Features (v0.7)
24
+
25
+ - **2-D and 3-D** — the engine is generic over dimension (`PointSet<2>` /
26
+ `PointSet<3>`); variography, kriging, CV and SGS all run in 3-D through
27
+ the same validated code paths.
28
+ - **Experimental variograms** — omnidirectional, directional (azimuth +
29
+ dip cone in 3-D, gstat/GSLIB convention) and cross-variograms.
30
+ - **Theoretical models** — spherical, exponential, Gaussian, Matérn with
31
+ **continuous ν** (Bessel-quadrature evaluation; ν = 3/2, 5/2 also have
32
+ closed forms), circular, stable (power-exponential), hole-effect and
33
+ wave (cardinal-sine), and **Power** (IRF-0, unbounded, kriged directly in
34
+ semivariogram form). Nested multi-structure models plus nugget, with
35
+ geometric anisotropy per structure — full 3-D rotation
36
+ (azimuth/dip/rake, GSLIB `setrot`) and zonal anisotropy.
37
+ - **Model fitting** — weighted least squares via Nelder–Mead
38
+ (log-parametrized, multi-start), with selectable weight schemes
39
+ (`N_j/h_j²` gstat default, `N_j`, Cressie `N_j/γ(h_j)²`, OLS); automatic
40
+ best-family selection; multi-structure nesting; joint `ν`/`α` fitting for
41
+ Matérn/stable; geometric-anisotropy auto-fit; N-variable-capable LMC
42
+ prediction (2-variable iterated Goulard–Voltz fit) with PSD projection.
43
+ - **Kriging** — simple, ordinary, universal (polynomial drift) and
44
+ **external drift** (KED); **ordinary co-kriging** (collocated or
45
+ **heterotopic**) and **collocated cokriging** (MM1/MM2, Journel 1999)
46
+ under a linear model of coregionalization; **block kriging** and **block
47
+ co-kriging** with explicit discretization; **lognormal kriging**
48
+ (unbiased back-transform); **median/ordinary indicator kriging** (local
49
+ ccdf, E-type estimate, conditional variance), with **Markov-Bayes**
50
+ calibration of soft secondary data (core-only); **regression kriging** (a
51
+ trend fitted separately — built-in OLS or any
52
+ external/ML model — plus kriging of its residuals); per-datum
53
+ **measurement error** (gstat `Err`); octant search (GSLIB `noct`) and
54
+ `min_neighbors` (`ndmin`); **anisotropic (rotated-ellipsoid) search**
55
+ (GSLIB `kt3d` `sang`/`sanis`, `--search-azimuth`/`--search-ratio` in the
56
+ CLI, `search_azimuth=`/`search_ratio=` in Python) instead of the
57
+ gstat/GSLIB-default Euclidean neighborhood; kd-tree moving neighborhoods;
58
+ parallel over targets; variance maps.
59
+ - **Vecchia approximation** — for point sets too large for exact kriging:
60
+ O(n log n) maxmin ordering, likelihood-based maximum-likelihood/REML
61
+ fitting (including external-drift REML and joint Matérn-`ν` MLE),
62
+ Guinness (2018) likelihood grouping, and joint prediction (Katzfuss &
63
+ Guinness 2021) that stays consistent across targets as `m` grows.
64
+ - **Simulation** — conditional sequential **Gaussian** simulation
65
+ (normal-score transform, GSLIB-style tail extrapolation, cell
66
+ declustering + weighted normal scores, multiple-grid path, separate
67
+ data/simulated-node neighbor quotas), sequential **indicator** simulation
68
+ (ccdf with order-relation corrections), and **truncated Gaussian
69
+ simulation** (TGS) for ordered categorical/facies data (thresholds from
70
+ global category proportions via the inverse-normal CDF; GSLIB `tgsim`-
71
+ equivalent — full plurigaussian simulation, with a flexible 2-D
72
+ truncation rule for non-ordered facies, is not implemented), all with a
73
+ deterministic, platform-independent RNG (xoshiro256++) and incremental
74
+ bucket-grid neighbor search: same seed, same realizations, anywhere.
75
+ - **Mathematical interpolators** — inverse-distance weighting and
76
+ k-nearest-neighbor averaging (k = 1 is nearest-neighbor / Voronoi), as
77
+ assumption-light baselines for fair method comparison.
78
+ - **Method comparison** — a leave-one-out harness that ranks ordinary
79
+ kriging, IDW, k-NN and NN by VEcv on the same data (`geostat compare` /
80
+ `compare_methods`), in the spirit of Li (2021): no method dominates, so
81
+ compare by predictive accuracy.
82
+ - **Hyperparameter tuning by accuracy** — choose the IDW power, the k-NN `k`
83
+ or the kriging neighborhood size by maximizing leave-one-out VEcv
84
+ (`geostat tune` / `tune_idw_power`, `tune_knn_k`, `tune_kriging_neighbors`),
85
+ i.e. by predictive accuracy rather than by a model fit.
86
+ - **GeoPackage I/O** — read point feature layers straight from an OGC
87
+ `.gpkg` and write kriging results back to one (pure Rust via bundled
88
+ SQLite — no GDAL): any CLI subcommand that only needs x/y/value accepts a
89
+ `.gpkg` input (drift/error/detrend covariate columns and 3-D mode still
90
+ require a CSV — they fail with a clear error on `.gpkg` for now),
91
+ `geostat gpkg-info` lists its layers, and `geostat krige -o out.gpkg`
92
+ writes a point layer (prediction + variance) — or, with `--raster`, a
93
+ single-band **2D-gridded-coverage** raster (16-bit PNG tile, values
94
+ preserved via scale/offset) — with a recorded CRS, readable by QGIS/GDAL.
95
+ - **Validation** — leave-one-out, k-fold and **spatial block**
96
+ cross-validation, with error measures (ME, MAE, MSE, RMSE, MSDR),
97
+ scale-free relative measures (RME, RMAE, RRMSE), predictive-accuracy
98
+ measures **VEcv** (Li 2016) and **E₁** (Legates–McCabe), and
99
+ **Deutsch (1997) accuracy plots** for checking whether kriging variances
100
+ are well calibrated, with or without external drift.
101
+ - **Benchmarks** — criterion suite (`cargo bench -p geostat-core`);
102
+ proptest property tests and `cargo-fuzz` targets for parser robustness.
103
+ - **Bindings** — Python (`import geostat_rs`: variography, kriging, CV,
104
+ SGS, SIS, IK, all with 3-D variants; zero-copy numpy outputs, GIL
105
+ released during computation, `.pyi` type stubs) and WebAssembly (browser
106
+ demo in `examples/wasm-demo/`).
107
+
108
+ ## Build
109
+
110
+ ```sh
111
+ cargo build --release # binary at target/release/geostat
112
+ cargo test --workspace # unit + integration tests
113
+ ```
114
+
115
+ ## CLI quickstart
116
+
117
+ Input is a CSV with named columns (defaults: `x`, `y`, `z`).
118
+
119
+ ```sh
120
+ # 1. Experimental variogram + automatic model fit
121
+ geostat variogram -i meuse.csv --value-col zinc \
122
+ --fit best --model-out model.json -o vario.csv
123
+
124
+ # 2. Leave-one-out cross-validation of the fitted model
125
+ geostat cv -i meuse.csv --value-col zinc -m model.json --max-neighbors 32
126
+
127
+ # 3. Ordinary kriging onto a 100x100 grid (+ kriging variance)
128
+ geostat krige -i meuse.csv --value-col zinc -m model.json \
129
+ --nx 100 --ny 100 --max-neighbors 32 -o kriged.csv
130
+
131
+ # 4. Conditional SGS, 100 realizations, reproducible
132
+ geostat sgs -i meuse.csv --value-col zinc \
133
+ --nx 100 --ny 100 -n 100 --seed 42 -o sims.csv
134
+
135
+ # 5. Kriging with external drift (covariates in data and targets CSVs)
136
+ geostat krige -i meuse.csv --value-col lzinc -m model.json \
137
+ --drift-cols sdist --targets grid_with_sdist.csv -o ked.csv
138
+
139
+ # 6. Ordinary co-kriging with a collocated secondary variable
140
+ geostat cokrige -i meuse.csv --value-col lzinc --secondary-col llead \
141
+ --nx 100 --ny 100 -o cokriged.csv # LMC auto-fitted (or --lmc lmc.json)
142
+
143
+ # 7. Sequential indicator simulation at the quartiles
144
+ geostat sis -i meuse.csv --value-col zinc --quantiles 0.25,0.5,0.75 \
145
+ --nx 100 --ny 100 -n 50 --seed 42 -o sis.csv
146
+
147
+ # 8. Indicator kriging: local ccdf, E-type estimate, conditional variance
148
+ geostat ik -i meuse.csv --value-col zinc --quantiles 0.25,0.5,0.75 \
149
+ --nx 100 --ny 100 -o ik.csv
150
+
151
+ # 9. 3-D ordinary kriging (z column + explicit targets CSV with x,y,z)
152
+ geostat krige -i drillholes.csv --z-col z --value-col grade -m model3d.json \
153
+ --targets blocks.csv -o kriged3d.csv
154
+
155
+ # 10. Heterotopic co-kriging (secondary at its own locations; needs --lmc)
156
+ geostat cokrige -i primary.csv --value-col lzinc --secondary-col llead \
157
+ --secondary-input secondary.csv --lmc lmc.json \
158
+ --nx 100 --ny 100 -o cokriged.csv
159
+
160
+ # 11. Regression kriging: OLS trend on covariates + kriging of residuals
161
+ # (residual variogram fitted automatically; targets carry the covariates)
162
+ geostat rk -i meuse.csv --value-col lzinc --covar-cols sdist \
163
+ --targets grid_with_sdist.csv -o rk.csv
164
+
165
+ # 12. Compare methods (OK / IDW / k-NN / NN) by leave-one-out VEcv
166
+ geostat compare -i meuse.csv --value-col zinc --max-neighbors 32 --knn-k 8
167
+
168
+ # 13. Tune a hyperparameter by leave-one-out VEcv (idw | knn | ok)
169
+ geostat tune -i meuse.csv --value-col zinc --method idw
170
+
171
+ # 14. GeoPackage I/O: read points from a .gpkg, write kriging to one
172
+ geostat gpkg-info -i meuse.gpkg # list layers
173
+ geostat cv -i meuse.gpkg --value-col lzinc -m model.json # any subcommand reads .gpkg
174
+ geostat krige -i meuse.gpkg --value-col lzinc -m model.json \
175
+ --nx 100 --ny 100 --srs 28992 -o kriged.gpkg # write a .gpkg point layer
176
+ geostat krige -i meuse.gpkg --value-col lzinc -m model.json \
177
+ --nx 200 --ny 200 --srs 28992 --raster -o kriged.gpkg # write a single-band raster
178
+
179
+ # 15. Vecchia: scalable ML covariance fitting + prediction for large n
180
+ # (O(n log n) plan; --trend for REML under a spatial trend)
181
+ geostat variogram -i drillholes.csv --value-col grade \
182
+ --mle --cond 20 --model-out model_ml.json
183
+ geostat krige -i drillholes.csv --value-col grade -m model_ml.json \
184
+ --vecchia 20 --nx 200 --ny 200 -o kriged_vecchia.csv
185
+
186
+ # 16. Spatial block CV + Deutsch accuracy plot (honest error under autocorrelation)
187
+ geostat cv -i meuse.csv --value-col zinc -m model.json --blocks 4,4 --accuracy
188
+
189
+ # 17. Collocated cokriging (MM1): one secondary value per target (e.g. a
190
+ # raster sampled with gpkg-sample), no cross-variogram needed
191
+ geostat collocated-cokrige -i meuse.csv --value-col lzinc --secondary-col llead \
192
+ -m model.json --targets grid_with_secondary.csv --target-secondary-col llead \
193
+ -o collocated.csv
194
+
195
+ # 18. Truncated Gaussian simulation: ordered facies from global proportions
196
+ # (--value-col holds integer category codes; model is of the
197
+ # underlying standard-Gaussian field, not auto-fitted)
198
+ geostat tgs -i drillholes.csv --value-col facies -m facies_model.json \
199
+ --nx 100 --ny 100 -n 50 --seed 42 -o facies_sims.csv
200
+ ```
201
+
202
+ Other useful flags: `--azimuth/--dip/--tolerance` (directional variograms,
203
+ dip for 3-D), `--method simple|ordinary|universal --degree 2` (kriging
204
+ flavor), `--block w,h --block-discr nx,ny` (block kriging),
205
+ `--bbox xmin,ymin,xmax,ymax --res <cell>` (grid control).
206
+
207
+ A fitted model is plain JSON and can be edited by hand:
208
+
209
+ ```json
210
+ {
211
+ "nugget": 0.05,
212
+ "structures": [{ "kind": "spherical", "sill": 0.59, "range": 897.0 }]
213
+ }
214
+ ```
215
+
216
+ ## Library quickstart
217
+
218
+ ```rust
219
+ use geostat_core::{
220
+ experimental_variogram, fit_best, Kriging, KrigingConfig, ModelKind,
221
+ PointSet, VariogramConfig,
222
+ };
223
+
224
+ let data = PointSet::from_xyz(&x, &y, &z)?;
225
+ let ev = experimental_variogram(&data, &VariogramConfig {
226
+ n_lags: 15, max_dist: 1500.0, direction: None,
227
+ })?;
228
+ let fit = fit_best(&ev, &ModelKind::ALL)?;
229
+ let kriging = Kriging::new(&data, &fit.model, KrigingConfig::default())?;
230
+ let est = kriging.predict([179_000.0, 330_000.0])?;
231
+ println!("prediction {} ± {}", est.value, est.variance.sqrt());
232
+ ```
233
+
234
+ ## Validation against gstat
235
+
236
+ Every deterministic method is cross-checked against **gstat** (R) at
237
+ machine precision on the Meuse and Walker Lake datasets; SGS is validated
238
+ distributionally. The full harness and result tables live in
239
+ [`validation/`](validation/README.md) — variography, OK/UK/SK/KED/co-kriging
240
+ (collocated and heterotopic), block kriging, 3-D kriging/CV and indicator
241
+ kriging, plus the SGS ensemble check.
242
+
243
+ Conventions intentionally match gstat where it matters: semivariance
244
+ estimator, `N_j/h_j²` fit weights, azimuth measured clockwise from north,
245
+ right-closed lag bins, nugget-free within-block covariance. The Matérn
246
+ parameterization is Rasmussen & Williams (`√(2ν)h/ρ` scaling), so ranges
247
+ are comparable across families.
248
+
249
+ ## Roadmap
250
+
251
+ - v0.1: ✅ variography, OK/UK/SK kriging, LOO CV, SGS. Validated against
252
+ gstat at machine precision (Meuse, Walker Lake) — see `validation/`.
253
+ - v0.2: ✅ co-kriging (LMC), KED, SIS, model anisotropy, kd-tree/bucket
254
+ neighbor search, criterion benchmarks. KED/anisotropy/co-kriging also
255
+ validated against gstat at machine precision.
256
+ - v0.3: ✅ Python bindings (PyO3, bit-identical with the CLI), WASM
257
+ bindings + browser demo, block kriging (validated vs gstat at machine
258
+ precision, including the nugget-free C̄(B,B) convention).
259
+ - v0.4: ✅ 3-D support (const-generic core), heterotopic co-kriging,
260
+ standalone indicator kriging — all validated against gstat at machine
261
+ precision; 3-D and IK exposed in the Python bindings.
262
+ - v0.5: ✅ lognormal (trans-Gaussian) kriging and block co-kriging.
263
+ Block co-kriging matches gstat to machine precision; simple lognormal
264
+ kriging matches gstat's SK back-transform to ~1e-9 (ordinary follows the
265
+ Journel & Huijbregts formula).
266
+ - v0.6: ✅ VEcv/E₁ and relative error measures in cross-validation (parity
267
+ with Li's spm::pred.acc); ✅ regression kriging (separate trend + residual
268
+ kriging), the bridge to an ML trend engine; ✅ IDW/k-NN/NN baselines + a
269
+ VEcv method-comparison harness; ✅ hyperparameter tuning by predictive
270
+ accuracy (IDW power, k-NN k, kriging neighborhood); ✅ GeoPackage I/O
271
+ (point reading + point-layer writing + single-band raster /
272
+ 2D-gridded-coverage output).
273
+ - v0.7: ✅ Vecchia approximation (O(n log n) plan, MLE/REML, Guinness
274
+ grouping, joint prediction) for large point sets; ✅ Matérn with
275
+ continuous ν, plus circular/stable/hole/wave/Power families, full 3-D
276
+ rotation and zonal anisotropy; ✅ cell declustering + weighted normal
277
+ scores; ✅ GSLIB tail extrapolation for SGS/SIS/IK back-transforms;
278
+ ✅ median/ordinary indicator kriging, collocated cokriging (MM1/MM2) and
279
+ Markov-Bayes soft-data calibration; ✅ per-datum measurement error,
280
+ octant search; ✅ spatial block CV and Deutsch accuracy plots;
281
+ ✅ public `Covariance` trait, zero-copy numpy bindings, proptest/fuzz
282
+ coverage. See `docs/AUDIT-2026-07.md` and `docs/AUDIT-2026-07-v2.md` for
283
+ the full audit trail behind this release.
284
+ - ML+geostatistics hybrids: regression kriging accepts an external trend, so
285
+ an ML model supplies the mean and geostat-rs kriges the residuals. See
286
+ `examples/hybrid_smelt_rk.py` for an RFOK-style hybrid built entirely from
287
+ the author's Rust engines — a Smelt random-forest trend + residual kriging
288
+ here — scored by VEcv.
289
+ - Next: paper draft (Mathematical Geosciences); publish to crates.io/PyPI.
290
+
291
+ ## Python quickstart
292
+
293
+ ```sh
294
+ pip install maturin
295
+ maturin develop -m crates/geostat-python/Cargo.toml --release
296
+ ```
297
+
298
+ ```python
299
+ import geostat_rs as gs
300
+
301
+ # 2-D
302
+ model = gs.fit_variogram(x, y, vals, n_lags=15, max_dist=1500.0)
303
+ pred, var = gs.krige_grid(x, y, vals, model, bbox=(0, 0, 100, 100),
304
+ nx=50, ny=50, max_neighbors=32)
305
+ sims = gs.sgs(x, y, vals, model_ns, bbox=(0, 0, 100, 100), nx=50, ny=50,
306
+ n_realizations=100, seed=42)
307
+
308
+ # Truncated Gaussian simulation: ordered facies from global proportions
309
+ # (facies_model is of the underlying standard-Gaussian field, sill ~ 1,
310
+ # not auto-fitted; proportions estimated from `facies` frequency if omitted)
311
+ facies_sims = gs.tgs(x, y, facies, facies_model, bbox=(0, 0, 100, 100),
312
+ nx=50, ny=50, n_realizations=50, seed=42)
313
+
314
+ # 3-D (drillhole-style data)
315
+ m3 = gs.fit_variogram_3d(x, y, z, grade, n_lags=12, max_dist=200.0)
316
+ pred, var = gs.krige_3d(x, y, z, grade, m3, bx, by, bz, max_neighbors=24)
317
+
318
+ # Indicator kriging → local ccdf + E-type estimate
319
+ ik = gs.indicator_kriging(x, y, vals, cutoffs, tx, ty)
320
+ ik["ccdf"], ik["e_type"], ik["cond_var"]
321
+
322
+ # Regression kriging: OLS trend on covariates + residual kriging.
323
+ # (Or pass trend_at_data / trend_at_targets from any external/ML model.)
324
+ rk = gs.regression_kriging(x, y, vals, covars, tx, ty, target_covars)
325
+ rk["prediction"], rk["variance"], rk["trend_coef"]
326
+
327
+ # Ordinary co-kriging with a correlated secondary (auto-fitted LMC;
328
+ # collocated or heterotopic; `ridge` stabilizes the system).
329
+ pred, var = gs.co_kriging(px, py, pv, sx, sy, sv, tx, ty)
330
+
331
+ # Collocated cokriging (MM1/MM2): one secondary value per target instead
332
+ # of a fitted cross-variogram -- the practical fit for an exhaustively
333
+ # sampled secondary (raster/seismic). `collocated_stats` estimates
334
+ # rho12/sigma1/sigma2 from collocated sample pairs when you don't already
335
+ # know the population values.
336
+ rho12, sigma1, sigma2 = gs.collocated_stats(pv, sv_at_primary)
337
+ pred, var = gs.collocated_cokriging(px, py, pv, model, tx, ty, secondary_at_targets,
338
+ mean1=pv.mean(), mean2=sv_at_primary.mean(),
339
+ rho12=rho12, sigma1=sigma1, sigma2=sigma2)
340
+
341
+ # Baselines + method comparison by leave-one-out VEcv.
342
+ idw_pred = gs.idw(x, y, vals, tx, ty, power=2.0, max_neighbors=16)
343
+ ranking = gs.compare_methods(x, y, vals, max_neighbors=32, knn_k=8)
344
+ # {"ordinary_kriging": {"rmse":..., "vecv":...}, "idw": {...}, ...}
345
+
346
+ # Tune a hyperparameter by predictive accuracy (VEcv).
347
+ best = gs.tune_idw_power(x, y, vals) # {"best":..., "best_vecv":..., "trace":[...]}
348
+ gs.tune_knn_k(x, y, vals); gs.tune_kriging_neighbors(x, y, vals)
349
+ ```
350
+
351
+ ## License
352
+
353
+ Dual-licensed under [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE), at
354
+ your option.
@@ -0,0 +1,79 @@
1
+ //! Criterion benchmarks for the core engine: variography, kriging and
2
+ //! sequential Gaussian simulation on synthetic data.
3
+
4
+ use criterion::{Criterion, criterion_group, criterion_main};
5
+ use std::hint::black_box;
6
+
7
+ use geostat_core::{
8
+ Grid2D, Kriging, KrigingConfig, ModelKind, PointSet, Rng, SgsConfig, Structure,
9
+ VariogramConfig, VariogramModel, experimental_variogram, sequential_gaussian_simulation,
10
+ };
11
+
12
+ fn synthetic(n: usize, seed: u64) -> PointSet {
13
+ let mut rng = Rng::new(seed);
14
+ let mut coords = Vec::with_capacity(n);
15
+ let mut values = Vec::with_capacity(n);
16
+ for _ in 0..n {
17
+ let x = rng.uniform() * 1000.0;
18
+ let y = rng.uniform() * 1000.0;
19
+ coords.push([x, y]);
20
+ values.push((x / 150.0).sin() + (y / 200.0).cos() + 0.1 * rng.normal());
21
+ }
22
+ PointSet::new(coords, values).unwrap()
23
+ }
24
+
25
+ fn model() -> VariogramModel {
26
+ VariogramModel::new(0.02, vec![Structure::new(ModelKind::Spherical, 1.0, 300.0)]).unwrap()
27
+ }
28
+
29
+ fn bench_variogram(c: &mut Criterion) {
30
+ let data = synthetic(2000, 1);
31
+ let cfg = VariogramConfig {
32
+ n_lags: 15,
33
+ max_dist: 500.0,
34
+ direction: None,
35
+ };
36
+ c.bench_function("variogram_2k_points", |b| {
37
+ b.iter(|| experimental_variogram(black_box(&data), black_box(&cfg)).unwrap())
38
+ });
39
+ }
40
+
41
+ fn bench_kriging(c: &mut Criterion) {
42
+ let data = synthetic(1000, 2);
43
+ let m = model();
44
+ let grid = Grid2D::from_bbox([0.0, 0.0], [1000.0, 1000.0], 50, 50).unwrap();
45
+ // `KrigingConfig` is `#[non_exhaustive]`: build from `Default::default()`
46
+ // and assign fields.
47
+ let mut cfg = KrigingConfig::default();
48
+ cfg.max_neighbors = Some(32);
49
+ c.bench_function("ok_2500_cells_1k_data_k32", |b| {
50
+ b.iter(|| {
51
+ let k = Kriging::new(black_box(&data), &m, cfg.clone()).unwrap();
52
+ black_box(k.predict_grid(&grid))
53
+ })
54
+ });
55
+ }
56
+
57
+ fn bench_sgs(c: &mut Criterion) {
58
+ let data = synthetic(300, 3);
59
+ let m = model();
60
+ let grid = Grid2D::from_bbox([0.0, 0.0], [1000.0, 1000.0], 50, 50).unwrap();
61
+ // `SgsConfig` is `#[non_exhaustive]`: build from `Default::default()`
62
+ // and assign fields.
63
+ let mut cfg = SgsConfig::default();
64
+ cfg.n_realizations = 1;
65
+ cfg.seed = 42;
66
+ cfg.max_neighbors = 16;
67
+ cfg.search_radius = None;
68
+ let mut group = c.benchmark_group("sgs");
69
+ group.sample_size(10);
70
+ group.bench_function("sgs_2500_cells_1_realization_k16", |b| {
71
+ b.iter(|| {
72
+ black_box(sequential_gaussian_simulation(black_box(&data), &m, &grid, &cfg).unwrap())
73
+ })
74
+ });
75
+ group.finish();
76
+ }
77
+
78
+ criterion_group!(benches, bench_variogram, bench_kriging, bench_sgs);
79
+ criterion_main!(benches);
@@ -0,0 +1,20 @@
1
+ //! Quick scaling check of vecchia_plan after the O(n log n) rewrite.
2
+ use geostat_core::rng::Rng;
3
+ use geostat_core::vecchia::vecchia_plan;
4
+ use std::time::Instant;
5
+
6
+ fn main() {
7
+ for &n in &[10_000usize, 50_000, 100_000, 200_000] {
8
+ let mut rng = Rng::new(42);
9
+ let coords: Vec<[f64; 2]> = (0..n)
10
+ .map(|_| [rng.uniform() * 1000.0, rng.uniform() * 1000.0])
11
+ .collect();
12
+ let t = Instant::now();
13
+ let plan = vecchia_plan(&coords, 20, None).unwrap();
14
+ println!(
15
+ "n = {n:>7}: plan built in {:>8.2?} (order len {})",
16
+ t.elapsed(),
17
+ plan.order.len()
18
+ );
19
+ }
20
+ }