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.
- insar_rs-0.2.0/PKG-INFO +71 -0
- insar_rs-0.2.0/README.md +49 -0
- insar_rs-0.2.0/geostat-rs/Cargo.toml +30 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/Cargo.toml +37 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/README.md +354 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/benches/engine.rs +79 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/examples/plan_bench.rs +20 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/examples/vecchia_grouping_bench.rs +112 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/examples/vecchia_scaling.rs +89 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/cokriging.rs +1173 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/collocated.rs +824 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/covariance.rs +208 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/data.rs +219 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/declustering.rs +228 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/error.rs +43 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/grid.rs +203 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/ik.rs +826 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/interpolation.rs +248 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/kriging.rs +1730 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/lib.rs +122 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/linalg.rs +314 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/optim.rs +415 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/parallel.rs +69 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/regression.rs +404 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/rng.rs +137 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/search.rs +446 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/simulation.rs +758 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/sis.rs +1141 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/tails.rs +248 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/tgs.rs +617 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/trans.rs +232 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/transform.rs +447 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/tuning.rs +195 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/validation.rs +1556 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/bessel.rs +167 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/cross.rs +79 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/experimental.rs +803 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/fit.rs +1038 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/map.rs +230 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/mod.rs +20 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/variogram/model.rs +1316 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/src/vecchia.rs +3000 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/tests/three_d.rs +436 -0
- insar_rs-0.2.0/geostat-rs/crates/geostat-core/tests/workflow.rs +119 -0
- insar_rs-0.2.0/insar-rs/Cargo.lock +1540 -0
- insar_rs-0.2.0/insar-rs/Cargo.toml +46 -0
- insar_rs-0.2.0/insar-rs/crates/core/Cargo.toml +41 -0
- insar_rs-0.2.0/insar-rs/crates/core/README.md +49 -0
- insar_rs-0.2.0/insar-rs/crates/core/benches/sbas.rs +120 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/atmosphere/mod.rs +577 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/decompose/mod.rs +507 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/error.rs +62 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/features/mod.rs +801 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/inversion/mod.rs +2126 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/io/isce/mod.rs +1442 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/io/mod.rs +968 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/lib.rs +29 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/network/mod.rs +335 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/pipeline/mod.rs +515 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/postprocess/mod.rs +247 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/ps/mod.rs +242 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/troposphere/era5.rs +613 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/troposphere/mod.rs +243 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/types.rs +313 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/unwrap/mod.rs +588 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/unwrap/snaphu.rs +378 -0
- insar_rs-0.2.0/insar-rs/crates/core/src/unwrap_error/mod.rs +621 -0
- insar_rs-0.2.0/insar-rs/crates/core/tests/pipeline_e2e.rs +280 -0
- insar_rs-0.2.0/insar-rs/crates/python/Cargo.toml +20 -0
- insar_rs-0.2.0/insar-rs/crates/python/README.md +49 -0
- insar_rs-0.2.0/insar-rs/crates/python/src/lib.rs +476 -0
- insar_rs-0.2.0/insar-rs/crates/python/tests/test_bindings.py +190 -0
- insar_rs-0.2.0/pyproject.toml +32 -0
- insar_rs-0.2.0/smelt/CHANGELOG.md +716 -0
- insar_rs-0.2.0/smelt/Cargo.lock +4117 -0
- insar_rs-0.2.0/smelt/Cargo.toml +59 -0
- insar_rs-0.2.0/smelt/LICENSE +21 -0
- insar_rs-0.2.0/smelt/README.md +393 -0
- insar_rs-0.2.0/smelt/benches/learners.rs +8 -0
- insar_rs-0.2.0/smelt/examples/ablation_study.rs +294 -0
- insar_rs-0.2.0/smelt/examples/accuracy_validation.rs +198 -0
- insar_rs-0.2.0/smelt/examples/basic_classification.rs +69 -0
- insar_rs-0.2.0/smelt/examples/bench_vectorization.rs +68 -0
- insar_rs-0.2.0/smelt/examples/benchmark_large.rs +329 -0
- insar_rs-0.2.0/smelt/examples/benchmark_prediction.rs +116 -0
- insar_rs-0.2.0/smelt/examples/case_study_king_county.rs +241 -0
- insar_rs-0.2.0/smelt/examples/case_study_spatial.rs +269 -0
- insar_rs-0.2.0/smelt/examples/catboost_categoricals.rs +70 -0
- insar_rs-0.2.0/smelt/examples/conformal_prediction.rs +85 -0
- insar_rs-0.2.0/smelt/examples/gis_workflow.rs +234 -0
- insar_rs-0.2.0/smelt/examples/mem_bench.rs +60 -0
- insar_rs-0.2.0/smelt/examples/pm25_spatial_loso.rs +200 -0
- insar_rs-0.2.0/smelt/examples/profile_catboost.rs +47 -0
- insar_rs-0.2.0/smelt/examples/profile_lightgbm.rs +41 -0
- insar_rs-0.2.0/smelt/examples/profile_scaling.rs +48 -0
- insar_rs-0.2.0/smelt/examples/regression_pipeline.rs +64 -0
- insar_rs-0.2.0/smelt/examples/spatial_ml.rs +88 -0
- insar_rs-0.2.0/smelt/examples/validate_geoxgboost.rs +251 -0
- insar_rs-0.2.0/smelt/examples/xgboost_tuning.rs +91 -0
- insar_rs-0.2.0/smelt/paper/replication/README.md +102 -0
- insar_rs-0.2.0/smelt/src/benchmark.rs +125 -0
- insar_rs-0.2.0/smelt/src/benchmark_design.rs +154 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/cross_fit.rs +191 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/dr_learner.rs +211 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/mod.rs +184 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/r_learner.rs +616 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/s_learner.rs +160 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/t_learner.rs +165 -0
- insar_rs-0.2.0/smelt/src/causal/meta_learners/x_learner.rs +239 -0
- insar_rs-0.2.0/smelt/src/causal/mod.rs +941 -0
- insar_rs-0.2.0/smelt/src/cluster/isolation_forest.rs +320 -0
- insar_rs-0.2.0/smelt/src/cluster/mod.rs +643 -0
- insar_rs-0.2.0/smelt/src/conformal/cqr.rs +164 -0
- insar_rs-0.2.0/smelt/src/conformal/localized.rs +380 -0
- insar_rs-0.2.0/smelt/src/conformal/mod.rs +336 -0
- insar_rs-0.2.0/smelt/src/data/mod.rs +293 -0
- insar_rs-0.2.0/smelt/src/data/parquet.rs +228 -0
- insar_rs-0.2.0/smelt/src/error.rs +73 -0
- insar_rs-0.2.0/smelt/src/importance/mod.rs +187 -0
- insar_rs-0.2.0/smelt/src/importance/shap.rs +389 -0
- insar_rs-0.2.0/smelt/src/learner/adaboost.rs +503 -0
- insar_rs-0.2.0/smelt/src/learner/adaptive_rf.rs +853 -0
- insar_rs-0.2.0/smelt/src/learner/auto_tuner.rs +878 -0
- insar_rs-0.2.0/smelt/src/learner/bagging.rs +316 -0
- insar_rs-0.2.0/smelt/src/learner/calibration.rs +769 -0
- insar_rs-0.2.0/smelt/src/learner/catboost.rs +1762 -0
- insar_rs-0.2.0/smelt/src/learner/cost_sensitive.rs +294 -0
- insar_rs-0.2.0/smelt/src/learner/deep_forest.rs +624 -0
- insar_rs-0.2.0/smelt/src/learner/des.rs +485 -0
- insar_rs-0.2.0/smelt/src/learner/ebm.rs +311 -0
- insar_rs-0.2.0/smelt/src/learner/elm.rs +690 -0
- insar_rs-0.2.0/smelt/src/learner/eval.rs +122 -0
- insar_rs-0.2.0/smelt/src/learner/gaussian_process.rs +422 -0
- insar_rs-0.2.0/smelt/src/learner/geo_xgboost.rs +1016 -0
- insar_rs-0.2.0/smelt/src/learner/hist_pool.rs +180 -0
- insar_rs-0.2.0/smelt/src/learner/histogram.rs +342 -0
- insar_rs-0.2.0/smelt/src/learner/hoeffding.rs +796 -0
- insar_rs-0.2.0/smelt/src/learner/kernel_svm.rs +640 -0
- insar_rs-0.2.0/smelt/src/learner/knn.rs +179 -0
- insar_rs-0.2.0/smelt/src/learner/kriging_hybrid.rs +1263 -0
- insar_rs-0.2.0/smelt/src/learner/lightgbm.rs +1820 -0
- insar_rs-0.2.0/smelt/src/learner/linear_regression.rs +207 -0
- insar_rs-0.2.0/smelt/src/learner/logistic_regression.rs +346 -0
- insar_rs-0.2.0/smelt/src/learner/math.rs +48 -0
- insar_rs-0.2.0/smelt/src/learner/mod.rs +178 -0
- insar_rs-0.2.0/smelt/src/learner/mondrian.rs +1326 -0
- insar_rs-0.2.0/smelt/src/learner/naive_bayes.rs +172 -0
- insar_rs-0.2.0/smelt/src/learner/oblique.rs +1033 -0
- insar_rs-0.2.0/smelt/src/learner/properties.rs +203 -0
- insar_rs-0.2.0/smelt/src/learner/quantile.rs +229 -0
- insar_rs-0.2.0/smelt/src/learner/quantile_forest.rs +706 -0
- insar_rs-0.2.0/smelt/src/learner/registry.rs +189 -0
- insar_rs-0.2.0/smelt/src/learner/regularized.rs +486 -0
- insar_rs-0.2.0/smelt/src/learner/stacking.rs +263 -0
- insar_rs-0.2.0/smelt/src/learner/svm.rs +323 -0
- insar_rs-0.2.0/smelt/src/learner/target_transform.rs +581 -0
- insar_rs-0.2.0/smelt/src/learner/threshold.rs +498 -0
- insar_rs-0.2.0/smelt/src/learner/tree/decision_tree.rs +242 -0
- insar_rs-0.2.0/smelt/src/learner/tree/extra_trees.rs +338 -0
- insar_rs-0.2.0/smelt/src/learner/tree/gradient_boosting.rs +694 -0
- insar_rs-0.2.0/smelt/src/learner/tree/mod.rs +1220 -0
- insar_rs-0.2.0/smelt/src/learner/tree/random_forest.rs +457 -0
- insar_rs-0.2.0/smelt/src/learner/xgboost.rs +2355 -0
- insar_rs-0.2.0/smelt/src/lib.rs +132 -0
- insar_rs-0.2.0/smelt/src/measure/mod.rs +922 -0
- insar_rs-0.2.0/smelt/src/multilabel/mod.rs +188 -0
- insar_rs-0.2.0/smelt/src/multioutput/mod.rs +166 -0
- insar_rs-0.2.0/smelt/src/prediction/mod.rs +134 -0
- insar_rs-0.2.0/smelt/src/preprocess/adasyn.rs +346 -0
- insar_rs-0.2.0/smelt/src/preprocess/encoder.rs +217 -0
- insar_rs-0.2.0/smelt/src/preprocess/filter.rs +994 -0
- insar_rs-0.2.0/smelt/src/preprocess/imputer.rs +128 -0
- insar_rs-0.2.0/smelt/src/preprocess/label_encoder.rs +76 -0
- insar_rs-0.2.0/smelt/src/preprocess/mod.rs +109 -0
- insar_rs-0.2.0/smelt/src/preprocess/mutual_info.rs +158 -0
- insar_rs-0.2.0/smelt/src/preprocess/pca.rs +369 -0
- insar_rs-0.2.0/smelt/src/preprocess/pipeline.rs +435 -0
- insar_rs-0.2.0/smelt/src/preprocess/rfe.rs +188 -0
- insar_rs-0.2.0/smelt/src/preprocess/scaler.rs +175 -0
- insar_rs-0.2.0/smelt/src/preprocess/smote.rs +206 -0
- insar_rs-0.2.0/smelt/src/preprocess/spatial_smote.rs +415 -0
- insar_rs-0.2.0/smelt/src/resample/mod.rs +456 -0
- insar_rs-0.2.0/smelt/src/resample/spatial.rs +254 -0
- insar_rs-0.2.0/smelt/src/resample/stratified.rs +248 -0
- insar_rs-0.2.0/smelt/src/resample/time_series.rs +254 -0
- insar_rs-0.2.0/smelt/src/serialize.rs +482 -0
- insar_rs-0.2.0/smelt/src/sparse.rs +184 -0
- insar_rs-0.2.0/smelt/src/stats.rs +1145 -0
- insar_rs-0.2.0/smelt/src/survival/cox.rs +645 -0
- insar_rs-0.2.0/smelt/src/survival/mod.rs +803 -0
- insar_rs-0.2.0/smelt/src/task/mod.rs +509 -0
- insar_rs-0.2.0/smelt/src/tuning/bayesian.rs +464 -0
- insar_rs-0.2.0/smelt/src/tuning/grid_search.rs +193 -0
- insar_rs-0.2.0/smelt/src/tuning/hyperband.rs +228 -0
- insar_rs-0.2.0/smelt/src/tuning/mod.rs +937 -0
- insar_rs-0.2.0/smelt/src/tuning/random_search.rs +237 -0
- insar_rs-0.2.0/smelt/src/tuning/terminator.rs +274 -0
- insar_rs-0.2.0/smelt/src/validate.rs +78 -0
- insar_rs-0.2.0/smelt/tests/catboost_perf.rs +95 -0
- insar_rs-0.2.0/smelt/tests/contract.rs +377 -0
- insar_rs-0.2.0/smelt/tests/integration.rs +8001 -0
- insar_rs-0.2.0/smelt/tests/lightgbm_perf.rs +93 -0
- insar_rs-0.2.0/smelt/tests/real_benchmark.rs +106 -0
- insar_rs-0.2.0/smelt/tests/serialize_all_variants.rs +254 -0
- insar_rs-0.2.0/smelt/tests/weights.rs +320 -0
- insar_rs-0.2.0/smelt/tests/weights_boosting.rs +738 -0
- insar_rs-0.2.0/smelt/tests/weights_linear.rs +567 -0
- insar_rs-0.2.0/smelt/tests/weights_trees.rs +748 -0
- insar_rs-0.2.0/smelt/tests/xgboost_perf.rs +102 -0
- insar_rs-0.2.0/smelt/tests/xgboost_vs_official.rs +280 -0
- insar_rs-0.2.0/surtgis/Cargo.toml +149 -0
- insar_rs-0.2.0/surtgis/crates/core/Cargo.toml +48 -0
- insar_rs-0.2.0/surtgis/crates/core/src/crs/mod.rs +189 -0
- insar_rs-0.2.0/surtgis/crates/core/src/cube.rs +411 -0
- insar_rs-0.2.0/surtgis/crates/core/src/error.rs +120 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/cog_writer.rs +997 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/gdal_io.rs +170 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/mod.rs +52 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/native.rs +2273 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/options.rs +59 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/strip_reader.rs +367 -0
- insar_rs-0.2.0/surtgis/crates/core/src/io/strip_writer.rs +455 -0
- insar_rs-0.2.0/surtgis/crates/core/src/lib.rs +85 -0
- insar_rs-0.2.0/surtgis/crates/core/src/mosaic.rs +314 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/any_raster.rs +317 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/complex.rs +251 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/element.rs +233 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/geotransform.rs +209 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/grid.rs +382 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/mod.rs +23 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/neighborhood.rs +200 -0
- insar_rs-0.2.0/surtgis/crates/core/src/raster/validate.rs +272 -0
- insar_rs-0.2.0/surtgis/crates/core/src/resample.rs +726 -0
- insar_rs-0.2.0/surtgis/crates/core/src/streaming.rs +201 -0
- insar_rs-0.2.0/surtgis/crates/core/src/tiling.rs +236 -0
- insar_rs-0.2.0/surtgis/crates/core/src/vector/geojson_reader.rs +533 -0
- insar_rs-0.2.0/surtgis/crates/core/src/vector/geoparquet.rs +756 -0
- insar_rs-0.2.0/surtgis/crates/core/src/vector/gpkg_reader.rs +814 -0
- insar_rs-0.2.0/surtgis/crates/core/src/vector/mod.rs +223 -0
- insar_rs-0.2.0/surtgis/crates/core/src/vector/rasterize.rs +613 -0
- insar_rs-0.2.0/surtgis/crates/core/src/vector/shapefile_reader.rs +252 -0
- insar_rs-0.2.0/surtgis/crates/core/tests/cube_geotiff.rs +55 -0
- insar_rs-0.2.0/surtgis/crates/core/tests/fixtures/oom_ifd_count.tif +0 -0
- insar_rs-0.2.0/surtgis/crates/core/tests/tiff_oom_regression.rs +17 -0
- insar_rs-0.2.0/swarm-abm/Cargo.toml +58 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/Cargo.toml +60 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/README.md +44 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/benches/engine.rs +280 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/agent.rs +641 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/batch.rs +216 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/continuous.rs +772 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/data.rs +371 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/experiment.rs +649 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/graph.rs +591 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/grid.rs +852 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/lib.rs +141 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/model.rs +39 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/rng.rs +184 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/schedule.rs +118 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/src/sim.rs +696 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/checkpoint.rs +269 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/decide_with_peers.rs +131 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/determinism.rs +84 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/experiment.rs +446 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/golden_values.rs +233 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/parallel_decide.rs +76 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/simultaneous.rs +137 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm/tests/staged.rs +216 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/Cargo.toml +21 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/src/lib.rs +178 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/compile_fail.rs +13 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_named_fields.rs +8 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_named_fields.stderr +5 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_two_fields.rs +8 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_two_fields.stderr +5 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_unit.rs +8 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/bad_variant_unit.stderr +5 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/empty_enum.rs +6 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/empty_enum.stderr +5 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/not_an_enum.rs +8 -0
- insar_rs-0.2.0/swarm-abm/crates/swarm-abm-derive/tests/ui/not_an_enum.stderr +7 -0
insar_rs-0.2.0/PKG-INFO
ADDED
|
@@ -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
|
+
|
insar_rs-0.2.0/README.md
ADDED
|
@@ -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
|
+
[](https://github.com/franciscoparrao/geostat-rs/actions/workflows/ci.yml)
|
|
4
|
+
[](#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
|
+
}
|