cars 1.0.0rc1__cp313-cp313-musllinux_1_2_i686.whl

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.

Potentially problematic release.


This version of cars might be problematic. Click here for more details.

Files changed (202) hide show
  1. cars/__init__.py +74 -0
  2. cars/applications/__init__.py +37 -0
  3. cars/applications/application.py +117 -0
  4. cars/applications/application_constants.py +29 -0
  5. cars/applications/application_template.py +146 -0
  6. cars/applications/auxiliary_filling/__init__.py +29 -0
  7. cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +104 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +630 -0
  10. cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
  11. cars/applications/dem_generation/__init__.py +30 -0
  12. cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
  13. cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
  14. cars/applications/dem_generation/bulldozer_dem_app.py +655 -0
  15. cars/applications/dem_generation/bulldozer_memory.py +55 -0
  16. cars/applications/dem_generation/dem_generation_algo.py +107 -0
  17. cars/applications/dem_generation/dem_generation_constants.py +32 -0
  18. cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
  19. cars/applications/dense_match_filling/__init__.py +30 -0
  20. cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
  21. cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
  22. cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
  23. cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
  24. cars/applications/dense_match_filling/zero_padding_app.py +302 -0
  25. cars/applications/dense_matching/__init__.py +30 -0
  26. cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
  27. cars/applications/dense_matching/census_mccnn_sgm_app.py +1460 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-i386-linux-musl.so +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  31. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  32. cars/applications/dense_matching/cpp/meson.build +9 -0
  33. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  34. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  35. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  36. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  37. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  38. cars/applications/dense_matching/disparity_grid_algo.py +588 -0
  39. cars/applications/dense_matching/loaders/__init__.py +23 -0
  40. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  46. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  47. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  48. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  49. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  50. cars/applications/dsm_filling/__init__.py +32 -0
  51. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  52. cars/applications/dsm_filling/border_interpolation_app.py +270 -0
  53. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  54. cars/applications/dsm_filling/bulldozer_filling_app.py +279 -0
  55. cars/applications/dsm_filling/exogenous_filling_app.py +333 -0
  56. cars/applications/grid_generation/__init__.py +30 -0
  57. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  58. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  59. cars/applications/grid_generation/grid_correction_app.py +496 -0
  60. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  61. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  62. cars/applications/grid_generation/transform_grid.py +88 -0
  63. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  64. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  65. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  66. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  67. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  68. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  69. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  70. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  71. cars/applications/point_cloud_outlier_removal/small_components_app.py +527 -0
  72. cars/applications/point_cloud_outlier_removal/statistical_app.py +531 -0
  73. cars/applications/rasterization/__init__.py +30 -0
  74. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  75. cars/applications/rasterization/rasterization_algo.py +534 -0
  76. cars/applications/rasterization/rasterization_constants.py +38 -0
  77. cars/applications/rasterization/rasterization_wrappers.py +634 -0
  78. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  79. cars/applications/resampling/__init__.py +28 -0
  80. cars/applications/resampling/abstract_resampling_app.py +187 -0
  81. cars/applications/resampling/bicubic_resampling_app.py +762 -0
  82. cars/applications/resampling/resampling_algo.py +614 -0
  83. cars/applications/resampling/resampling_constants.py +36 -0
  84. cars/applications/resampling/resampling_wrappers.py +309 -0
  85. cars/applications/sparse_matching/__init__.py +30 -0
  86. cars/applications/sparse_matching/abstract_sparse_matching_app.py +498 -0
  87. cars/applications/sparse_matching/sift_app.py +735 -0
  88. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  89. cars/applications/sparse_matching/sparse_matching_constants.py +68 -0
  90. cars/applications/sparse_matching/sparse_matching_wrappers.py +238 -0
  91. cars/applications/triangulation/__init__.py +32 -0
  92. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  93. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  94. cars/applications/triangulation/pc_transform.py +552 -0
  95. cars/applications/triangulation/triangulation_algo.py +371 -0
  96. cars/applications/triangulation/triangulation_constants.py +38 -0
  97. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  98. cars/bundleadjustment.py +757 -0
  99. cars/cars.py +177 -0
  100. cars/conf/__init__.py +23 -0
  101. cars/conf/geoid/egm96.grd +0 -0
  102. cars/conf/geoid/egm96.grd.hdr +15 -0
  103. cars/conf/input_parameters.py +156 -0
  104. cars/conf/mask_cst.py +35 -0
  105. cars/core/__init__.py +23 -0
  106. cars/core/cars_logging.py +402 -0
  107. cars/core/constants.py +191 -0
  108. cars/core/constants_disparity.py +50 -0
  109. cars/core/datasets.py +140 -0
  110. cars/core/geometry/__init__.py +27 -0
  111. cars/core/geometry/abstract_geometry.py +1119 -0
  112. cars/core/geometry/shareloc_geometry.py +598 -0
  113. cars/core/inputs.py +568 -0
  114. cars/core/outputs.py +176 -0
  115. cars/core/preprocessing.py +722 -0
  116. cars/core/projection.py +843 -0
  117. cars/core/roi_tools.py +215 -0
  118. cars/core/tiling.py +774 -0
  119. cars/core/utils.py +164 -0
  120. cars/data_structures/__init__.py +23 -0
  121. cars/data_structures/cars_dataset.py +1541 -0
  122. cars/data_structures/cars_dict.py +74 -0
  123. cars/data_structures/corresponding_tiles_tools.py +186 -0
  124. cars/data_structures/dataframe_converter.py +185 -0
  125. cars/data_structures/format_transformation.py +297 -0
  126. cars/devibrate.py +689 -0
  127. cars/extractroi.py +264 -0
  128. cars/orchestrator/__init__.py +23 -0
  129. cars/orchestrator/achievement_tracker.py +125 -0
  130. cars/orchestrator/cluster/__init__.py +37 -0
  131. cars/orchestrator/cluster/abstract_cluster.py +244 -0
  132. cars/orchestrator/cluster/abstract_dask_cluster.py +375 -0
  133. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  134. cars/orchestrator/cluster/dask_config/README.md +94 -0
  135. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  136. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  137. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  138. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  139. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  140. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  141. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  142. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  143. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  144. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  145. cars/orchestrator/cluster/log_wrapper.py +1075 -0
  146. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  147. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  148. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  149. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  150. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  151. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +873 -0
  152. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  153. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  154. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  155. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  156. cars/orchestrator/orchestrator.py +905 -0
  157. cars/orchestrator/orchestrator_constants.py +29 -0
  158. cars/orchestrator/registry/__init__.py +23 -0
  159. cars/orchestrator/registry/abstract_registry.py +143 -0
  160. cars/orchestrator/registry/compute_registry.py +106 -0
  161. cars/orchestrator/registry/id_generator.py +116 -0
  162. cars/orchestrator/registry/replacer_registry.py +213 -0
  163. cars/orchestrator/registry/saver_registry.py +363 -0
  164. cars/orchestrator/registry/unseen_registry.py +118 -0
  165. cars/orchestrator/tiles_profiler.py +279 -0
  166. cars/pipelines/__init__.py +26 -0
  167. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  168. cars/pipelines/conf_resolution/conf_first_resolution.yaml +2 -0
  169. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  170. cars/pipelines/default/__init__.py +26 -0
  171. cars/pipelines/default/default_pipeline.py +786 -0
  172. cars/pipelines/parameters/__init__.py +0 -0
  173. cars/pipelines/parameters/advanced_parameters.py +417 -0
  174. cars/pipelines/parameters/advanced_parameters_constants.py +69 -0
  175. cars/pipelines/parameters/application_parameters.py +71 -0
  176. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  177. cars/pipelines/parameters/dsm_inputs.py +918 -0
  178. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  179. cars/pipelines/parameters/output_constants.py +52 -0
  180. cars/pipelines/parameters/output_parameters.py +454 -0
  181. cars/pipelines/parameters/sensor_inputs.py +842 -0
  182. cars/pipelines/parameters/sensor_inputs_constants.py +49 -0
  183. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  184. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  185. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  186. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  187. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  188. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  189. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  190. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  191. cars/pipelines/pipeline.py +119 -0
  192. cars/pipelines/pipeline_constants.py +31 -0
  193. cars/pipelines/pipeline_template.py +139 -0
  194. cars/pipelines/unit/__init__.py +26 -0
  195. cars/pipelines/unit/unit_pipeline.py +2850 -0
  196. cars/starter.py +167 -0
  197. cars-1.0.0rc1.dist-info/METADATA +292 -0
  198. cars-1.0.0rc1.dist-info/RECORD +202 -0
  199. cars-1.0.0rc1.dist-info/WHEEL +5 -0
  200. cars-1.0.0rc1.dist-info/entry_points.txt +8 -0
  201. cars.libs/libgcc_s-1257a076.so.1 +0 -0
  202. cars.libs/libstdc++-0530927c.so.6.0.32 +0 -0
cars/extractroi.py ADDED
@@ -0,0 +1,264 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ cars-extractroi: helper to extract region of interest from image product
23
+ """
24
+
25
+ import argparse
26
+ import os
27
+
28
+ import numpy as np
29
+ import rasterio as rio
30
+ from affine import Affine
31
+ from shapely.geometry import box
32
+ from shareloc.geomodels.rpc_writers import write_rio_rpc_as_rpb
33
+
34
+
35
+ def is_bbx_in_image(bbx, image_dataset):
36
+ """
37
+ Checks if the bounding box is within the image.
38
+
39
+ Parameters:
40
+ bbx (array): The bounding box of the image.
41
+ image_dataset (rio.DatasetReader): Opened image dataset.
42
+
43
+ """
44
+ image_box = box(0, 0, image_dataset.height, image_dataset.width)
45
+
46
+ return image_box.contains(bbx)
47
+
48
+
49
+ def get_slices_from_bbx(image_dataset, bbx, rpc_options):
50
+ """get slices from bounding box
51
+
52
+ Parameters:
53
+ image_dataset (rio.DatasetReader): Opened image dataset.
54
+ bbx (array): The bounding box of the image.
55
+ rpc_options (dict): Options for GDALCreateRPCTransformer.
56
+
57
+ Returns:
58
+ tuple: The slices from the bounding box.
59
+ """
60
+ transformer = rio.transform.RPCTransformer(
61
+ image_dataset.rpcs, **rpc_options
62
+ )
63
+ coordinates = [
64
+ transformer.rowcol(bbx[0], bbx[1]),
65
+ transformer.rowcol(bbx[2], bbx[1]),
66
+ transformer.rowcol(bbx[2], bbx[3]),
67
+ transformer.rowcol(bbx[0], bbx[3]),
68
+ ]
69
+ coordinates = np.array(coordinates)
70
+ (row_start, col_start) = np.amin(coordinates, axis=0)
71
+ (row_stop, col_stop) = np.amax(coordinates, axis=0)
72
+ rows = (row_start, row_stop)
73
+ cols = (col_start, col_stop)
74
+
75
+ return rows, cols
76
+
77
+
78
+ def process_image_file(
79
+ bbx, input_image_path, output_image_path, rpb_file_path, rpc_options
80
+ ):
81
+ """
82
+ Processes an image file by extracting a region based on the given geometry.
83
+
84
+ Parameters:
85
+ region_geometry (dict): GeoJSON-like dictionary defining the region.
86
+ input_image_path (str): Path to the input image file.
87
+ output_image_path (str): Path to save the output image.
88
+ rpb_file_path (str): Path to save the .RPB file.
89
+ rpc_options (dict): Options for GDALCreateRPCTransformer.
90
+ """
91
+
92
+ with rio.open(input_image_path) as image_dataset:
93
+ if not image_dataset.rpcs:
94
+ raise ValueError("Image dataset has no RPCs")
95
+ validate_bounding_box(bbx, image_dataset, rpc_options)
96
+ row, col = get_slices_from_bbx(image_dataset, bbx, rpc_options)
97
+ window = rio.windows.Window.from_slices(row, col)
98
+ array = image_dataset.read(window=window)
99
+ profile = image_dataset.profile
100
+ profile["driver"] = "GTiff"
101
+ profile["width"] = window.width
102
+ profile["height"] = window.height
103
+ profile["transform"] = Affine.translation(
104
+ window.col_off, window.row_off
105
+ )
106
+ if "crs" in profile:
107
+ del profile["crs"]
108
+ with rio.open(output_image_path, "w", **profile) as dst:
109
+ # write data
110
+ dst.write(array)
111
+ # copy rpc
112
+ dst.rpcs = image_dataset.rpcs
113
+
114
+ if rpb_file_path is not None:
115
+ create_rpb_file(image_dataset, rpb_file_path)
116
+
117
+
118
+ def get_human_readable_bbox(image_dataset, rpc_options):
119
+ """
120
+ Get the human-readable bounding box from an image dataset.
121
+
122
+ Parameters:
123
+ image_dataset (rio.DatasetReader): Opened image dataset.
124
+ rpc_options (dict): Options for GDALCreateRPCTransformer.
125
+
126
+ Returns:
127
+ tuple: The human-readable bounding box in the format
128
+ (min_x, max_x, min_y, max_y).
129
+ """
130
+
131
+ transformer = rio.transform.RPCTransformer(
132
+ image_dataset.rpcs, **rpc_options
133
+ )
134
+
135
+ human_readable_bbx = [
136
+ transformer.xy(0, 0),
137
+ transformer.xy(image_dataset.height, image_dataset.width),
138
+ ]
139
+ # fix coordinates to precision -7 for (x, y)
140
+ image_coords = [
141
+ (round(coord[0], 7), round(coord[1], 7)) for coord in human_readable_bbx
142
+ ]
143
+ [(x_1, y_1), (x_2, y_2)] = image_coords
144
+
145
+ min_x, max_x = min(x_1, x_2), max(x_1, x_2)
146
+ min_y, max_y = min(y_1, y_2), max(y_1, y_2)
147
+
148
+ return min_x, max_x, min_y, max_y
149
+
150
+
151
+ def validate_bounding_box(bbx, image_dataset, rpc_options):
152
+ """
153
+ Validate the bounding box coordinates.
154
+
155
+ Parameters:
156
+ bbx (array): The bounding box of the image.
157
+ image_dataset (rio.DatasetReader): Opened image dataset.
158
+ rpc_options (dict): Options for GDALCreateRPCTransformer.
159
+ """
160
+
161
+ transformer = rio.transform.RPCTransformer(
162
+ image_dataset.rpcs, **rpc_options
163
+ )
164
+ input_box = box(
165
+ *transformer.rowcol(bbx[0], bbx[1]), *transformer.rowcol(bbx[2], bbx[3])
166
+ )
167
+ if not is_bbx_in_image(input_box, image_dataset):
168
+ min_x, max_x, min_y, max_y = get_human_readable_bbox(
169
+ image_dataset, rpc_options
170
+ )
171
+ raise ValueError(
172
+ f"Coordinates must be between "
173
+ f"({min_x}, {min_y}) and ({max_x}, {max_y})"
174
+ )
175
+
176
+
177
+ def create_rpb_file(image_dataset, rpb_filename):
178
+ """
179
+ Create and save a .RPB file from a rasterio dataset
180
+
181
+ Parameters:
182
+ image_dataset (rio.DatasetReader): Opened image dataset.
183
+ rpb_filename (str): Path to save the .RPB file.
184
+ """
185
+ if not image_dataset.rpcs:
186
+ raise ValueError("Image dataset has no RPCs")
187
+ rpcs_as_dict = image_dataset.rpcs.to_dict()
188
+ write_rio_rpc_as_rpb(rpcs_as_dict, rpb_filename)
189
+
190
+
191
+ def main():
192
+ """
193
+ Main cars-extractroi entrypoint
194
+ """
195
+ parser = argparse.ArgumentParser(
196
+ "cars-extractroi", description="Helper to extract roi from bounding box"
197
+ )
198
+ parser.add_argument(
199
+ "-il",
200
+ type=str,
201
+ nargs="*",
202
+ help="Image products",
203
+ required=True,
204
+ )
205
+
206
+ parser.add_argument(
207
+ "-out",
208
+ type=str,
209
+ help="Extracts directory",
210
+ required=True,
211
+ )
212
+
213
+ parser.add_argument(
214
+ "-bbx",
215
+ type=float,
216
+ nargs=4,
217
+ help="Bounding box from two points (x1, y1) and (x2, y2)",
218
+ metavar=("x1", "y1", "x2", "y2"),
219
+ required=True,
220
+ )
221
+
222
+ parser.add_argument(
223
+ "--rpc_height",
224
+ type=float,
225
+ help="Constant height offset used for projection",
226
+ )
227
+
228
+ parser.add_argument(
229
+ "--rpc_dem",
230
+ type=str,
231
+ help="Digital Elevation Model used for projection",
232
+ )
233
+
234
+ parser.add_argument(
235
+ "--generate_rpb",
236
+ action="store_true",
237
+ help="Generate RPB file",
238
+ )
239
+
240
+ args = parser.parse_args()
241
+ if not os.path.exists(args.out):
242
+ os.makedirs(args.out)
243
+
244
+ rpc_options = {}
245
+
246
+ if args.rpc_height is not None:
247
+ rpc_options["rpc_height"] = args.rpc_height
248
+ if args.rpc_dem is not None:
249
+ rpc_options["rpc_dem"] = args.rpc_dem
250
+
251
+ # check first input in list to determine pipeline
252
+ for idx, image_path in enumerate(args.il):
253
+ output_image_path = os.path.join(args.out, "ext_%03d.tif" % idx)
254
+ rpb_file_path = None
255
+ if args.generate_rpb:
256
+ rpb_file_path = os.path.splitext(output_image_path)[0] + ".RPB"
257
+
258
+ process_image_file(
259
+ args.bbx, image_path, output_image_path, rpb_file_path, rpc_options
260
+ )
261
+
262
+
263
+ if __name__ == "__main__":
264
+ main()
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ Cars orchestrator module init file
23
+ """
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ this module contains the achievement tracker
23
+ """
24
+
25
+ import logging
26
+
27
+ import numpy as np
28
+
29
+ from cars.orchestrator.registry.abstract_registry import (
30
+ AbstractCarsDatasetRegistry,
31
+ )
32
+
33
+
34
+ class AchievementTracker:
35
+ """
36
+ AchievementTracker
37
+ """
38
+
39
+ def __init__(self):
40
+ """
41
+ Init function of AchievementTracker
42
+
43
+ """
44
+ self.tracked_cars_ds = []
45
+ self.cars_ds_ids = []
46
+ self.achievement = []
47
+
48
+ def track(self, cars_ds, cars_ds_id):
49
+ """
50
+ Track cars dataset
51
+
52
+ :param cars_ds: cars dataset to track
53
+ :type cars_ds: CarsDataset
54
+ :param cars_ds_id: id of cars dataset
55
+ :type cars_ds_id: int
56
+ """
57
+
58
+ if cars_ds not in self.tracked_cars_ds:
59
+ self.tracked_cars_ds.append(cars_ds)
60
+ self.cars_ds_ids.append(cars_ds_id)
61
+ self.achievement.append(np.zeros(cars_ds.shape, dtype=bool))
62
+
63
+ def add_tile(self, tile):
64
+ """
65
+ Add finished tile
66
+
67
+ :param tile: finished tile
68
+ :type tile: xarray Dataset or Pandas Dataframe
69
+ """
70
+
71
+ try:
72
+ self._add_tile(tile)
73
+ except RuntimeError:
74
+ logging.error("Error getting id in Achiement Tracker")
75
+
76
+ def _add_tile(self, tile):
77
+ """
78
+ Add finished tile
79
+
80
+ :param tile: finished tile
81
+ :type tile: xarray Dataset or Pandas Dataframe
82
+ """
83
+
84
+ # Get cars dataset id
85
+ cars_ds_id = AbstractCarsDatasetRegistry.get_future_cars_dataset_id(
86
+ tile
87
+ )
88
+ if cars_ds_id is None:
89
+ raise RuntimeError("No id in data")
90
+ if cars_ds_id not in self.cars_ds_ids:
91
+ raise RuntimeError("Cars ds not registered")
92
+ index = self.cars_ds_ids.index(cars_ds_id)
93
+
94
+ # Get position
95
+ row, col = AbstractCarsDatasetRegistry.get_future_cars_dataset_position(
96
+ tile
97
+ )
98
+ if None in (row, col):
99
+ logging.error("None in row, col in achievement tracker")
100
+ else:
101
+ # update
102
+ self.achievement[index][row, col] = 1
103
+
104
+ def get_remaining_tiles(self):
105
+ """
106
+ Get remaining tiles to compute
107
+
108
+ :return: remaining tiles
109
+ :rtype: list(delayed)
110
+ """
111
+
112
+ tiles = []
113
+
114
+ for cars_ds, achievement in zip( # noqa: B905
115
+ self.tracked_cars_ds, self.achievement
116
+ ):
117
+ for row in range(cars_ds.shape[0]):
118
+ for col in range(cars_ds.shape[1]):
119
+ if (
120
+ not achievement[row, col]
121
+ and cars_ds[row, col] is not None
122
+ ):
123
+ tiles.append(cars_ds[row, col])
124
+
125
+ return tiles
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ CARS cluster module init file
23
+ """
24
+ # flake8: noqa: F401
25
+
26
+ # CARS imports
27
+ from cars.orchestrator.cluster.abstract_cluster import AbstractCluster
28
+
29
+ from . import (
30
+ abstract_dask_cluster,
31
+ dask_cluster_tools,
32
+ local_dask_cluster,
33
+ mp_cluster,
34
+ pbs_dask_cluster,
35
+ sequential_cluster,
36
+ slurm_dask_cluster,
37
+ )
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ Contains abstract function for Abstract Cluster
23
+ """
24
+
25
+ # Standard imports
26
+ import logging
27
+ import os
28
+ from abc import ABCMeta, abstractmethod
29
+ from typing import Dict
30
+
31
+ # CARS imports
32
+ from cars.conf.input_parameters import ConfigType
33
+ from cars.orchestrator.cluster import log_wrapper
34
+
35
+
36
+ class AbstractCluster(metaclass=ABCMeta):
37
+ """
38
+ AbstractCluster
39
+ """
40
+
41
+ # Available cluster modes to instanciate AbstractCluster subclasses.
42
+ available_modes: Dict = {}
43
+
44
+ # Define abstract attributes
45
+
46
+ # profiling config parameter: mode, loop_testing, memray
47
+ profiling: ConfigType
48
+ # cluster mode output directory
49
+ out_dir: str
50
+
51
+ def __new__( # pylint: disable=too-many-positional-arguments
52
+ cls,
53
+ conf_cluster,
54
+ out_dir,
55
+ log_dir,
56
+ launch_worker=True,
57
+ data_to_propagate=None,
58
+ ):
59
+ """
60
+ Return the required cluster
61
+ :raises:
62
+ - KeyError when the required cluster is not registered
63
+
64
+ :param conf_cluster: configuration for cluster
65
+ :param out_dir: output directory for results
66
+ :param launch_worker: launcher of the new worker
67
+ :return: a cltser object
68
+ """
69
+
70
+ cluster_mode = "multiprocessing"
71
+ if "mode" not in conf_cluster:
72
+ logging.warning("Cluster mode not defined, default is used")
73
+ else:
74
+ cluster_mode = conf_cluster["mode"]
75
+
76
+ if cluster_mode not in cls.available_modes:
77
+ logging.error("No mode named {} registered".format(cluster_mode))
78
+ raise KeyError("No mode named {} registered".format(cluster_mode))
79
+
80
+ logging.info("The AbstractCluster {} will be used".format(cluster_mode))
81
+
82
+ return super(AbstractCluster, cls).__new__(
83
+ cls.available_modes[cluster_mode]
84
+ )
85
+
86
+ @classmethod
87
+ def register_subclass(cls, *short_names: str):
88
+ """
89
+ Allows to register the subclass with its short name
90
+ :param short_names: the subclasses to be registered
91
+ :type short_names: string
92
+ """
93
+
94
+ def decorator(subclass):
95
+ """
96
+ Registers the subclass in the available methods
97
+ :param subclass: the subclass to be registered
98
+ :type subclass: object
99
+ """
100
+ for short_name in short_names:
101
+ cls.available_modes[short_name] = subclass
102
+ return subclass
103
+
104
+ return decorator
105
+
106
+ def __init__( # pylint: disable=too-many-positional-arguments
107
+ self,
108
+ conf_cluster,
109
+ out_dir,
110
+ log_dir,
111
+ launch_worker=True,
112
+ data_to_propagate=None,
113
+ ): # pylint: disable=W0613
114
+ """
115
+ Init function of AbstractCluster
116
+
117
+ :param conf_cluster: configuration for cluster
118
+ :param data_to_propagate: data to propagate to new cluster if reset
119
+ :type data_to_propagate: dict
120
+
121
+ """
122
+ self.out_dir = out_dir
123
+
124
+ # data to propagate
125
+ self.data_to_propagate = data_to_propagate
126
+
127
+ self.worker_log_dir = os.path.join(log_dir, "workers_log")
128
+ if not os.path.exists(self.worker_log_dir):
129
+ os.makedirs(self.worker_log_dir)
130
+
131
+ self.log_level = logging.getLogger().getEffectiveLevel()
132
+ handlers = logging.getLogger().handlers
133
+ for hand in handlers:
134
+ if "stdout" == hand.get_name():
135
+ self.log_level = hand.level
136
+
137
+ # Check conf
138
+ self.checked_conf_cluster = self.check_conf(conf_cluster)
139
+
140
+ self.profiling_logger = (
141
+ log_wrapper.AbstractLogWrapper( # pylint: disable=E0110
142
+ self.checked_conf_cluster["profiling"], out_dir
143
+ )
144
+ )
145
+ self.checked_conf_cluster["profiling"] = (
146
+ self.profiling_logger.checked_conf_profiling
147
+ )
148
+
149
+ @abstractmethod
150
+ def get_delayed_type(self):
151
+ """
152
+ Get delayed type
153
+ """
154
+
155
+ @abstractmethod
156
+ def cleanup(self, **kwargs):
157
+ """
158
+ Cleanup cluster
159
+ """
160
+
161
+ @abstractmethod
162
+ def check_conf(self, conf):
163
+ """
164
+ Check configuration
165
+
166
+ :param conf: configuration to check
167
+ :type conf: dict
168
+
169
+ :return: overloaded configuration
170
+ :rtype: dict
171
+
172
+ """
173
+
174
+ def get_conf(self):
175
+ """
176
+ Get overriden configuration
177
+
178
+
179
+ :return: overriden configuration
180
+ """
181
+
182
+ return self.checked_conf_cluster
183
+
184
+ def create_task(self, func, nout=1):
185
+ """
186
+ Create task
187
+
188
+ :param func: function
189
+ :param nout: number of outputs
190
+ """
191
+
192
+ def create_task_builder(*argv, **kwargs):
193
+ """
194
+ Create task builder to select the type of log
195
+ according to the configured profiling mode
196
+
197
+ :param argv: list of input arguments
198
+ :param kwargs: list of named input arguments
199
+ """
200
+
201
+ (
202
+ wrapper_func,
203
+ additionnal_kwargs,
204
+ ) = self.profiling_logger.get_func_args_plus(func)
205
+
206
+ return self.create_task_wrapped(wrapper_func, nout=nout)(
207
+ *argv, **kwargs, **additionnal_kwargs
208
+ )
209
+
210
+ return create_task_builder
211
+
212
+ @abstractmethod
213
+ def create_task_wrapped(self, func, nout=1):
214
+ """
215
+ Create task
216
+
217
+ :param func: function
218
+ :param nout: number of outputs
219
+ """
220
+
221
+ @abstractmethod
222
+ def start_tasks(self, task_list):
223
+ """
224
+ Start all tasks
225
+
226
+ :param task_list: task list
227
+ """
228
+
229
+ @abstractmethod
230
+ def scatter(self, data, broadcast=True):
231
+ """
232
+ Distribute data through workers
233
+
234
+ :param data: task data
235
+ """
236
+
237
+ @abstractmethod
238
+ def future_iterator(self, future_list, timeout=None):
239
+ """
240
+ Iterator, iterating on computed futures
241
+
242
+ :param future_list: future_list list
243
+ :param timeout: time to wait for next job
244
+ """