pysits 2.0.0.dev4__tar.gz → 2.0.0.dev5__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 (209) hide show
  1. pysits-2.0.0.dev5/.claude/settings.local.json +5 -0
  2. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/PKG-INFO +1 -1
  3. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pyproject.toml +1 -1
  4. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/common.py +27 -0
  5. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/tuning.py +106 -34
  6. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/templates/tuning.html +5 -65
  7. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_conversions.py +19 -0
  8. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_tuning.py +46 -11
  9. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/uv.lock +1 -1
  10. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/.gitattributes +0 -0
  11. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/.github/actions/setup-pysits/action.yml +0 -0
  12. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/.github/workflows/ruff.yaml +0 -0
  13. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/.github/workflows/tests.yaml +0 -0
  14. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/.gitignore +0 -0
  15. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/.pre-commit-config.yaml +0 -0
  16. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/LICENSE +0 -0
  17. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/README.md +0 -0
  18. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/conda/meta.yaml +0 -0
  19. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/__init__.py +0 -0
  20. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/backend/__init__.py +0 -0
  21. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/backend/arrow.py +0 -0
  22. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/backend/functions.py +0 -0
  23. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/backend/loaders.py +0 -0
  24. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/backend/pkgs.py +0 -0
  25. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/__init__.py +0 -0
  26. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/clojure.py +0 -0
  27. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/decorators.py +0 -0
  28. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/dsl/__init__.py +0 -0
  29. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/dsl/base.py +0 -0
  30. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/dsl/mask.py +0 -0
  31. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/dsl/tuning.py +0 -0
  32. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/stac.py +0 -0
  33. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/tibble.py +0 -0
  34. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/vector.py +0 -0
  35. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/conversions/xarray.py +0 -0
  36. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/__init__.py +0 -0
  37. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/impute_linear.md +0 -0
  38. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/impute_mean.md +0 -0
  39. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/impute_mean_window.md +0 -0
  40. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/impute_median.md +0 -0
  41. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/plot.md +0 -0
  42. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_accuracy.md +0 -0
  43. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_accuracy_summary.md +0 -0
  44. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_add_base_cube.md +0 -0
  45. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_apply.md +0 -0
  46. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_as_geopandas.md +0 -0
  47. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_bands.md +0 -0
  48. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_barlow_twins.md +0 -0
  49. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_bbox.md +0 -0
  50. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_classify.md +0 -0
  51. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_clean.md +0 -0
  52. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_cluster_clean.md +0 -0
  53. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_cluster_dendro.md +0 -0
  54. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_cluster_frequency.md +0 -0
  55. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_colors.md +0 -0
  56. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_colors_qgis.md +0 -0
  57. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_colors_reset.md +0 -0
  58. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_colors_set.md +0 -0
  59. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_colors_show.md +0 -0
  60. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_combine_predictions.md +0 -0
  61. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_confidence_sampling.md +0 -0
  62. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_config.md +0 -0
  63. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_config_show.md +0 -0
  64. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_config_user_file.md +0 -0
  65. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_contrastive_learning.md +0 -0
  66. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_cube.md +0 -0
  67. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_cube_copy.md +0 -0
  68. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_encode.md +0 -0
  69. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_formula_linear.md +0 -0
  70. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_formula_logref.md +0 -0
  71. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_geo_dist.md +0 -0
  72. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_get_class.md +0 -0
  73. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_get_data.md +0 -0
  74. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_get_probs.md +0 -0
  75. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_kfold_validate.md +0 -0
  76. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_label_classification.md +0 -0
  77. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_labels.md +0 -0
  78. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_labels_summary.md +0 -0
  79. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_lightgbm.md +0 -0
  80. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_lighttae.md +0 -0
  81. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_list_collections.md +0 -0
  82. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_lstm_fcn.md +0 -0
  83. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_merge.md +0 -0
  84. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_mixture_model.md +0 -0
  85. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_mlp.md +0 -0
  86. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_model_export.md +0 -0
  87. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_mosaic.md +0 -0
  88. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_parallel.md +0 -0
  89. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_patterns.md +0 -0
  90. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_pre_train.md +0 -0
  91. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_pred_features.md +0 -0
  92. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_pred_normalize.md +0 -0
  93. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_pred_references.md +0 -0
  94. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_pred_sample.md +0 -0
  95. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_predictors.md +0 -0
  96. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_random_sampling.md +0 -0
  97. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_reclassify.md +0 -0
  98. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_reduce.md +0 -0
  99. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_reduce_imbalance.md +0 -0
  100. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_regularize.md +0 -0
  101. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_resnet.md +0 -0
  102. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_rfor.md +0 -0
  103. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_roi_to_tiles.md +0 -0
  104. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_sample.md +0 -0
  105. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_sampling_design.md +0 -0
  106. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_sankey.md +0 -0
  107. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_segment.md +0 -0
  108. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_select.md +0 -0
  109. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_show_prediction.md +0 -0
  110. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_slic.md +0 -0
  111. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_smooth.md +0 -0
  112. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_snic.md +0 -0
  113. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_som_clean_samples.md +0 -0
  114. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_som_evaluate_cluster.md +0 -0
  115. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_som_map.md +0 -0
  116. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_som_remove_samples.md +0 -0
  117. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_ssl_lejepa.md +0 -0
  118. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_ssl_mae.md +0 -0
  119. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_ssl_vicreg.md +0 -0
  120. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_stats.md +0 -0
  121. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_stratified_sampling.md +0 -0
  122. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_svm.md +0 -0
  123. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_tae.md +0 -0
  124. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_tempcnn.md +0 -0
  125. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_texture.md +0 -0
  126. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_tiles_to_roi.md +0 -0
  127. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_timeline.md +0 -0
  128. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_timeseries_to_csv.md +0 -0
  129. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_to_csv.md +0 -0
  130. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_to_xlsx.md +0 -0
  131. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_train.md +0 -0
  132. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_tuning.md +0 -0
  133. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_tuning_hparams.md +0 -0
  134. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_uncertainty.md +0 -0
  135. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_uncertainty_sampling.md +0 -0
  136. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_validate.md +0 -0
  137. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_variance.md +0 -0
  138. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_view.md +0 -0
  139. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/sits_xgboost.md +0 -0
  140. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/content/summary.md +0 -0
  141. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/docs/decorators.py +0 -0
  142. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/extras/__init__.py +0 -0
  143. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/extras/earthdatalogin.py +0 -0
  144. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/extras/torch.py +0 -0
  145. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/jinja.py +0 -0
  146. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/__init__.py +0 -0
  147. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/base.py +0 -0
  148. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/__init__.py +0 -0
  149. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/accuracy.py +0 -0
  150. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/base.py +0 -0
  151. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/cube.py +0 -0
  152. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/frame.py +0 -0
  153. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/frame_accessor.py +0 -0
  154. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/matrix.py +0 -0
  155. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/table.py +0 -0
  156. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/ts.py +0 -0
  157. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/data/vector.py +0 -0
  158. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/frame.py +0 -0
  159. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/ml.py +0 -0
  160. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/resolver.py +0 -0
  161. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/models/visual.py +0 -0
  162. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/settings.py +0 -0
  163. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/__init__.py +0 -0
  164. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/colors.py +0 -0
  165. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/config.py +0 -0
  166. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/context.py +0 -0
  167. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/cube.py +0 -0
  168. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/data.py +0 -0
  169. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/exporters/__init__.py +0 -0
  170. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/exporters/files.py +0 -0
  171. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/exporters/sf.py +0 -0
  172. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/exporters/xarray.py +0 -0
  173. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/impute.py +0 -0
  174. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/ml.py +0 -0
  175. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/segment.py +0 -0
  176. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/tiles.py +0 -0
  177. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/ts.py +0 -0
  178. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/tuning.py +0 -0
  179. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/utils.py +0 -0
  180. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/sits/visualization.py +0 -0
  181. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/templates/cube.html +0 -0
  182. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/templates/plot.html +0 -0
  183. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/visualization/__init__.py +0 -0
  184. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/visualization/base.py +0 -0
  185. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/visualization/device.py +0 -0
  186. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/visualization/host.py +0 -0
  187. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/visualization/leaflet.py +0 -0
  188. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/pysits/visualization/options.py +0 -0
  189. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/conftest.py +0 -0
  190. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_classification.py +0 -0
  191. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_config.py +0 -0
  192. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_cube.py +0 -0
  193. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_data.py +0 -0
  194. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_dsl.py +0 -0
  195. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_embedding.py +0 -0
  196. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_exporters.py +0 -0
  197. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_exporters_geopandas.py +0 -0
  198. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_exporters_xarray.py +0 -0
  199. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_extras.py +0 -0
  200. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_indexing.py +0 -0
  201. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_ml_models.py +0 -0
  202. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_resolver.py +0 -0
  203. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_rl_models.py +0 -0
  204. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_som.py +0 -0
  205. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_tiles.py +0 -0
  206. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_utils.py +0 -0
  207. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_validation.py +0 -0
  208. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_visual_models.py +0 -0
  209. {pysits-2.0.0.dev4 → pysits-2.0.0.dev5}/tests/test_visualization.py +0 -0
@@ -0,0 +1,5 @@
1
+ {
2
+ "disabledMcpjsonServers": [
3
+ "geo-infrastructure"
4
+ ]
5
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pysits
3
- Version: 2.0.0.dev4
3
+ Version: 2.0.0.dev5
4
4
  Summary: Python wrapper for the sits R package
5
5
  Project-URL: Homepage, https://github.com/e-sensing/pysits
6
6
  Project-URL: Issue Tracker, https://github.com/e-sensing/pysits/issues
@@ -17,7 +17,7 @@
17
17
 
18
18
  [project]
19
19
  name = "pysits"
20
- version = "2.0.0.dev4"
20
+ version = "2.0.0.dev5"
21
21
  description = "Python wrapper for the sits R package"
22
22
  readme = "README.md"
23
23
  requires-python = ">=3.10,<4"
@@ -58,6 +58,12 @@ TYPE_CONVERSIONS = {
58
58
  EPOCH_START = date(1970, 1, 1)
59
59
 
60
60
 
61
+ #
62
+ # Prefixes of R expressions deparsed as text
63
+ #
64
+ R_DEPARSED_PREFIXES = ("c(", "list(")
65
+
66
+
61
67
  #
62
68
  # Base utilities
63
69
  #
@@ -197,6 +203,27 @@ def eval_r_language(obj):
197
203
  return obj
198
204
 
199
205
 
206
+ def eval_r_deparsed(obj):
207
+ """Evaluate a deparsed R expression.
208
+
209
+ Args:
210
+ obj: The R object to evaluate.
211
+
212
+ Returns:
213
+ The evaluated R object. Objects that are not deparsed R expressions are
214
+ returned unchanged.
215
+ """
216
+ value = obj
217
+
218
+ if isinstance(value, ro.StrVector) and len(value) == 1:
219
+ value = value[0]
220
+
221
+ if isinstance(value, str) and value.startswith(R_DEPARSED_PREFIXES):
222
+ return ro.r(value)
223
+
224
+ return obj
225
+
226
+
200
227
  def convert_to_python(obj, as_type="str"):
201
228
  """Convert an R object to a Python representation.
202
229
 
@@ -21,14 +21,65 @@ from collections.abc import Callable
21
21
  from typing import Any
22
22
 
23
23
  from rpy2.rinterface_lib.sexp import NULLType
24
- from rpy2.robjects.vectors import ListVector
25
-
26
- from pysits.conversions.common import convert_to_python, eval_r_language
24
+ from rpy2.robjects.vectors import (
25
+ BoolVector,
26
+ FloatVector,
27
+ IntVector,
28
+ ListVector,
29
+ StrVector,
30
+ )
31
+
32
+ from pysits.conversions.common import (
33
+ R_DEPARSED_PREFIXES,
34
+ convert_to_python,
35
+ eval_r_deparsed,
36
+ eval_r_language,
37
+ )
27
38
  from pysits.models.data.base import SITSData
28
39
  from pysits.models.data.matrix import SITSConfusionMatrix
29
40
  from pysits.models.data.ts import SITSTimeSeriesModel
30
41
 
42
+ #
43
+ # Python types associated with each R vector type
44
+ #
45
+ HPARAM_TYPES = {
46
+ BoolVector: "bool",
47
+ IntVector: "int",
48
+ FloatVector: "float",
49
+ StrVector: "str",
50
+ }
51
+
52
+
53
+ #
54
+ # Tuning results columns that are not hyper-parameters
55
+ #
56
+ TUNING_METRICS = ("accuracy", "kappa", "acc", "samples_validation")
57
+
58
+
59
+ #
60
+ # Utilities
61
+ #
62
+ def convert_hparam(value: Any) -> Any:
63
+ """Convert a hyper-parameter value from R to Python.
64
+
65
+ Args:
66
+ value: The hyper-parameter value to convert.
67
+
68
+ Returns:
69
+ Any: Converted Python object.
70
+ """
71
+ value = eval_r_deparsed(value)
72
+
73
+ for vector_type, as_type in HPARAM_TYPES.items():
74
+ if isinstance(value, vector_type):
75
+ return convert_to_python(value, as_type=as_type)
31
76
 
77
+ return convert_to_python(value)
78
+
79
+
80
+ #
81
+ # Classes
82
+ #
32
83
  class SITSTuningResults(SITSData):
33
84
  """Base class for sits accuracy results."""
34
85
 
@@ -62,14 +113,13 @@ class SITSTuningResults(SITSData):
62
113
  if isinstance(values, NULLType):
63
114
  return [None for i in range(len(self._instance.rx2("accuracy")))]
64
115
 
65
- # Check if value is a vector as string
116
+ # Check if value is a deparsed R expression (e.g., "c(128, 128, 128)")
66
117
  is_vector_as_string = any(
67
- isinstance(x, str) and (x.startswith("c(") or x.startswith("list("))
68
- for x in values
118
+ isinstance(x, str) and x.startswith(R_DEPARSED_PREFIXES) for x in values
69
119
  )
70
120
 
71
121
  if is_vector_as_string:
72
- return list(values)
122
+ return [transform_func(eval_r_deparsed(x)) for x in values]
73
123
 
74
124
  if isinstance(values, ListVector):
75
125
  return [
@@ -138,47 +188,47 @@ class SITSTuningResults(SITSData):
138
188
  ]
139
189
 
140
190
  @property
141
- def cnn_layers(self) -> list[float]:
191
+ def cnn_layers(self) -> list[list[float]]:
142
192
  """Get the CNN layer configurations from the tuning results.
143
193
 
144
194
  Returns:
145
- A list of float values representing the CNN layer configurations.
195
+ A list with the CNN layer configuration of each trial.
146
196
  """
147
197
  return self._convert_from_r_list("cnn_layers", "float")
148
198
 
149
199
  @property
150
- def cnn_kernels(self) -> list[float]:
200
+ def cnn_kernels(self) -> list[list[float]]:
151
201
  """Get the CNN kernel configurations from the tuning results.
152
202
 
153
203
  Returns:
154
- A list of float values representing the CNN kernel configurations.
204
+ A list with the CNN kernel configuration of each trial.
155
205
  """
156
206
  return self._convert_from_r_list("cnn_kernels", "float")
157
207
 
158
208
  @property
159
- def cnn_dropout_rates(self) -> list[float]:
209
+ def cnn_dropout_rates(self) -> list[list[float]]:
160
210
  """Get the CNN dropout rates from the tuning results.
161
211
 
162
212
  Returns:
163
- A list of float values representing the CNN dropout rates.
213
+ A list with the CNN dropout rates of each trial.
164
214
  """
165
215
  return self._convert_from_r_list("cnn_dropout_rates", "float")
166
216
 
167
217
  @property
168
- def dense_layer_nodes(self) -> list[float]:
218
+ def dense_layer_nodes(self) -> list[list[float]]:
169
219
  """Get the dense layer node configurations from the tuning results.
170
220
 
171
221
  Returns:
172
- A list of float values representing the dense layer node configurations.
222
+ A list with the dense layer node configuration of each trial.
173
223
  """
174
224
  return self._convert_from_r_list("dense_layer_nodes", "float")
175
225
 
176
226
  @property
177
- def dense_layer_dropout_rate(self) -> list[float]:
227
+ def dense_layer_dropout_rate(self) -> list[list[float]]:
178
228
  """Get the dense layer dropout rates from the tuning results.
179
229
 
180
230
  Returns:
181
- A list of float values representing the dense layer dropout rates.
231
+ A list with the dense layer dropout rates of each trial.
182
232
  """
183
233
  return self._convert_from_r_list("dense_layer_dropout_rate", "float")
184
234
 
@@ -219,40 +269,33 @@ class SITSTuningResults(SITSData):
219
269
  return [eval_r_language(x).rclass[0] for x in self._instance.rx2("optimizer")]
220
270
 
221
271
  @property
222
- def opt_hparams(self) -> list[dict[str, float]]:
272
+ def opt_hparams(self) -> list[dict[str, Any]]:
223
273
  """Get the optimizer hyperparameters from the tuning results.
224
274
 
225
275
  Returns:
226
276
  A list of dictionaries containing optimizer hyperparameters.
227
- Each dictionary maps parameter names to their float values.
277
+ Each dictionary maps parameter names to their values.
228
278
  """
229
- # Results
230
- results = []
231
-
232
- # Convert to Python
233
- values = self._convert_from_r_list("opt_hparams", "float")
234
-
235
- # Merge dict results
236
- for value in values:
237
- results.append({k: v for d in value for k, v in d.items()})
238
-
239
- return results
279
+ return self._convert_attribute(
280
+ "opt_hparams",
281
+ lambda x: {str(k): convert_hparam(v) for k, v in x.items()},
282
+ )
240
283
 
241
284
  @property
242
- def lr_decay_epochs(self) -> list[float]:
285
+ def lr_decay_epochs(self) -> list[list[float]]:
243
286
  """Get the learning rate decay epochs from the tuning results.
244
287
 
245
288
  Returns:
246
- A list of float values representing the learning rate decay epochs.
289
+ A list with the learning rate decay epochs of each trial.
247
290
  """
248
291
  return self._convert_from_r_list("lr_decay_epochs", "float")
249
292
 
250
293
  @property
251
- def lr_decay_rate(self) -> list[float]:
294
+ def lr_decay_rate(self) -> list[list[float]]:
252
295
  """Get the learning rate decay rates from the tuning results.
253
296
 
254
297
  Returns:
255
- A list of float values representing the learning rate decay rates.
298
+ A list with the learning rate decay rates of each trial.
256
299
  """
257
300
  return self._convert_from_r_list("lr_decay_rate", "float")
258
301
 
@@ -283,9 +326,38 @@ class SITSTuningResults(SITSData):
283
326
  """
284
327
  return self._convert_from_r_list("verbose", "bool")
285
328
 
329
+ @property
330
+ def hparams(self) -> dict[str, list[Any]]:
331
+ """Get all the hyper-parameters tuned, one value per trial.
332
+
333
+ Returns:
334
+ A dictionary mapping each hyper-parameter name to its values.
335
+ """
336
+ return {
337
+ name: getattr(self, name)
338
+ for name in self._instance.names
339
+ if name not in TUNING_METRICS
340
+ }
341
+
286
342
  #
287
343
  # Dunder methods
288
344
  #
345
+ def __getattr__(self, name: str) -> list[Any]:
346
+ """Get a hyper-parameter with no property associated with it.
347
+
348
+ Args:
349
+ name: The name of the hyper-parameter to get.
350
+
351
+ Returns:
352
+ A list with the hyper-parameter values, one per trial.
353
+ """
354
+ if name.startswith("_") or name not in self._instance.names:
355
+ raise AttributeError(
356
+ f"'{type(self).__name__}' object has no attribute '{name}'"
357
+ )
358
+
359
+ return self._convert_attribute(name, convert_hparam)
360
+
289
361
  def __str__(self):
290
362
  """String representation."""
291
363
  return str(self._instance)
@@ -93,6 +93,7 @@
93
93
  <div class="sits-accordion">
94
94
  {# Assuming number of accuracy is the same as number of runs #}
95
95
  {% set n_runs = tuning_obj.accuracy|length if tuning_obj.accuracy else 0 %}
96
+ {% set hparams = tuning_obj.hparams %}
96
97
  {% for i in range(n_runs) %}
97
98
  <div class="sits-accordion-item">
98
99
  <div class="sits-accordion-header" onclick="toggleAccordion(this)">
@@ -109,73 +110,12 @@
109
110
  <th>Value</th>
110
111
  </tr>
111
112
 
112
- {% if tuning_obj.cnn_layers %}
113
+ {% for name, values in hparams.items() %}
113
114
  <tr>
114
- <td>CNN Layers</td>
115
- {{ render_list_value(tuning_obj.cnn_layers[i]) }}
115
+ <td>{{ name }}</td>
116
+ {{ render_list_value(values[i]) }}
116
117
  </tr>
117
- <tr>
118
- <td>CNN Kernels</td>
119
- {{ render_list_value(tuning_obj.cnn_kernels[i]) }}
120
- </tr>
121
- <tr>
122
- <td>CNN Dropout Rates</td>
123
- {{ render_list_value(tuning_obj.cnn_dropout_rates[i]) }}
124
- </tr>
125
- {% endif %}
126
-
127
- {% if tuning_obj.dense_layer_nodes %}
128
- <tr>
129
- <td>Dense Layer Nodes</td>
130
- {{ render_list_value(tuning_obj.dense_layer_nodes[i]) }}
131
- </tr>
132
- <tr>
133
- <td>Dense Layer Dropout Rate</td>
134
- {{ render_list_value(tuning_obj.dense_layer_dropout_rate[i]) }}
135
- </tr>
136
- {% endif %}
137
-
138
- <tr>
139
- <td>Epochs</td>
140
- <td>{{ tuning_obj.epochs[i] }}</td>
141
- </tr>
142
- <tr>
143
- <td>Batch Size</td>
144
- <td>{{ tuning_obj.batch_size[i] }}</td>
145
- </tr>
146
- <tr>
147
- <td>Validation Split</td>
148
- <td>{{ tuning_obj.validation_split[i] }}</td>
149
- </tr>
150
-
151
- {% if tuning_obj.optimizer %}
152
- <tr>
153
- <td>Optimizer</td>
154
- <td>{{ tuning_obj.optimizer[i] }}</td>
155
- </tr>
156
- {% endif %}
157
-
158
- {% if tuning_obj.lr_decay_epochs %}
159
- <tr>
160
- <td>Learning Rate Decay Epochs</td>
161
- {{ render_list_value(tuning_obj.lr_decay_epochs[i]) }}
162
- </tr>
163
- <tr>
164
- <td>Learning Rate Decay Rate</td>
165
- {{ render_list_value(tuning_obj.lr_decay_rate[i]) }}
166
- </tr>
167
- {% endif %}
168
-
169
- {% if tuning_obj.patience %}
170
- <tr>
171
- <td>Patience</td>
172
- <td>{{ tuning_obj.patience[i] }}</td>
173
- </tr>
174
- <tr>
175
- <td>Minimum Delta</td>
176
- <td>{{ tuning_obj.min_delta[i] }}</td>
177
- </tr>
178
- {% endif %}
118
+ {% endfor %}
179
119
  </table>
180
120
  </div>
181
121
  </div>
@@ -29,6 +29,7 @@ from pysits.conversions.common import (
29
29
  convert_dict_like_to_r,
30
30
  convert_list_like_to_r,
31
31
  convert_to_python,
32
+ eval_r_deparsed,
32
33
  )
33
34
  from pysits.conversions.tibble import (
34
35
  _column_to_datetime,
@@ -330,3 +331,21 @@ def test_pandas_cube_to_tibble_empty():
330
331
  """Test conversion of a cube pandas DataFrame without tiles."""
331
332
  with pytest.raises(ValueError, match="at least one tile"):
332
333
  pandas_cube_to_tibble(PandasDataFrame())
334
+
335
+
336
+ def test_eval_r_deparsed():
337
+ """Test evaluation of deparsed R expressions."""
338
+ # Deparsed expression (e.g., as returned by ``sits_tuning`` hyper-parameters)
339
+ result = eval_r_deparsed("c(128, 128, 128)")
340
+ assert convert_to_python(result, as_type="float") == [128.0, 128.0, 128.0]
341
+
342
+ # Deparsed expression stored in a character vector
343
+ result = eval_r_deparsed(ro.StrVector(["c(0.9, 0.999)"]))
344
+ assert convert_to_python(result, as_type="float") == [0.9, 0.999]
345
+
346
+ # Values that are not deparsed expressions are returned unchanged
347
+ assert eval_r_deparsed("radial") == "radial"
348
+
349
+ values = ro.FloatVector([0.2])
350
+
351
+ assert eval_r_deparsed(values) is values
@@ -22,21 +22,19 @@ import pytest
22
22
  from pysits.conversions.dsl.tuning import hparam
23
23
  from pysits.models.data.tuning import SITSTuningResults
24
24
  from pysits.sits.context import samples_modis_ndvi
25
- from pysits.sits.ml import sits_tempcnn
25
+ from pysits.sits.ml import sits_rfor, sits_tempcnn
26
26
  from pysits.sits.tuning import sits_tuning, sits_tuning_hparams
27
27
 
28
28
  #
29
29
  # Hyper-parameters options available for tuning
30
30
  #
31
+ TRIALS = 2
32
+
31
33
  CNN_LAYERS = [[128.0, 128.0, 128.0], [64.0, 64.0, 64.0]]
32
34
  CNN_KERNELS = [[3.0, 3.0, 3.0], [5.0, 5.0, 5.0]]
33
35
  BETAS = [[0.9, 0.999], [0.85, 0.99]]
34
36
  OPTIMIZERS = ["optim_adamw", "optim_adam"]
35
-
36
- #
37
- # Number of trials used in the tests
38
- #
39
- TRIALS = 2
37
+ NUM_TREES = [50.0, 100.0]
40
38
 
41
39
 
42
40
  @pytest.fixture(scope="module")
@@ -60,6 +58,20 @@ def tuned_tempcnn() -> SITSTuningResults:
60
58
  )
61
59
 
62
60
 
61
+ @pytest.fixture(scope="module")
62
+ def tuned_rfor() -> SITSTuningResults:
63
+ """Tuning results of a ``sits_rfor`` model."""
64
+ return sits_tuning(
65
+ samples=samples_modis_ndvi,
66
+ ml_method=sits_rfor,
67
+ params=sits_tuning_hparams(
68
+ num_trees=hparam("choice", *NUM_TREES),
69
+ ),
70
+ trials=TRIALS,
71
+ multicores=1,
72
+ )
73
+
74
+
63
75
  def test_tuning_metrics(tuned_tempcnn):
64
76
  """Test tuning metrics results."""
65
77
  assert isinstance(tuned_tempcnn, SITSTuningResults)
@@ -81,9 +93,9 @@ def test_tuning_vector_hparams(tuned_tempcnn):
81
93
 
82
94
  def test_tuning_scalar_hparams(tuned_tempcnn):
83
95
  """Test tuning results of hyper-parameters defined as scalars."""
84
- assert tuned_tempcnn.epochs == [[1.0]] * TRIALS
85
- assert tuned_tempcnn.validation_split == [[0.2]] * TRIALS
86
- assert tuned_tempcnn.verbose == [[False]] * TRIALS
96
+ assert tuned_tempcnn.epochs == [1.0] * TRIALS
97
+ assert tuned_tempcnn.validation_split == [0.2] * TRIALS
98
+ assert tuned_tempcnn.verbose == [False] * TRIALS
87
99
 
88
100
 
89
101
  def test_tuning_optimizer_hparams(tuned_tempcnn):
@@ -98,9 +110,32 @@ def test_tuning_optimizer_hparams(tuned_tempcnn):
98
110
  assert opt_hparams["betas"] in BETAS
99
111
 
100
112
 
101
- def test_tuning_html_representation(tuned_tempcnn):
113
+ def test_tuning_generic_hparams(tuned_rfor):
114
+ """Test tuning results of models with no hyper-parameter properties."""
115
+ assert len(tuned_rfor.num_trees) == TRIALS
116
+
117
+ for num_trees in tuned_rfor.num_trees:
118
+ assert num_trees in NUM_TREES
119
+
120
+ # Dict accessor and property accessor must be equivalent
121
+ assert tuned_rfor.hparams["num_trees"] == tuned_rfor.num_trees
122
+
123
+ # Hyper-parameters with no value defined are returned as ``None``
124
+ assert tuned_rfor.mtry == [None] * TRIALS
125
+
126
+ # Hyper-parameters not tuned are not available
127
+ with pytest.raises(AttributeError):
128
+ tuned_rfor.unknown_hparam
129
+
130
+
131
+ def test_tuning_html_representation(tuned_tempcnn, tuned_rfor):
102
132
  """Test tuning HTML representation."""
133
+ # tempcnn representation
103
134
  html = tuned_tempcnn._repr_html_()
104
-
105
135
  for layers in tuned_tempcnn.cnn_layers:
106
136
  assert str(layers) in html
137
+
138
+ # rfor representation
139
+ html = tuned_rfor._repr_html_()
140
+ for num_trees in tuned_rfor.num_trees:
141
+ assert str(num_trees) in html
@@ -2266,7 +2266,7 @@ wheels = [
2266
2266
 
2267
2267
  [[package]]
2268
2268
  name = "pysits"
2269
- version = "2.0.0.dev4"
2269
+ version = "2.0.0.dev5"
2270
2270
  source = { editable = "." }
2271
2271
  dependencies = [
2272
2272
  { name = "geopandas" },
File without changes
File without changes
File without changes
File without changes
File without changes