cars 1.0.0rc2__cp312-cp312-win_amd64.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 (225) hide show
  1. cars/__init__.py +86 -0
  2. cars/applications/__init__.py +40 -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 +105 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -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 +641 -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 +1461 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.dll.a +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
  31. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  32. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  33. cars/applications/dense_matching/cpp/meson.build +9 -0
  34. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  35. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  36. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  37. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  38. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  39. cars/applications/dense_matching/disparity_grid_algo.py +597 -0
  40. cars/applications/dense_matching/loaders/__init__.py +23 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  46. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  47. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  48. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  49. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  50. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  51. cars/applications/dsm_filling/__init__.py +32 -0
  52. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  53. cars/applications/dsm_filling/border_interpolation_app.py +278 -0
  54. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  55. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  56. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  57. cars/applications/dsm_merging/__init__.py +28 -0
  58. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  59. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  60. cars/applications/grid_correction/__init__.py +30 -0
  61. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  62. cars/applications/grid_correction/grid_correction_app.py +557 -0
  63. cars/applications/grid_generation/__init__.py +30 -0
  64. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  65. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  66. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  67. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  68. cars/applications/grid_generation/transform_grid.py +88 -0
  69. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  70. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  71. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  72. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  73. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  74. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  76. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  77. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  78. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  79. cars/applications/rasterization/__init__.py +30 -0
  80. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  81. cars/applications/rasterization/rasterization_algo.py +534 -0
  82. cars/applications/rasterization/rasterization_constants.py +38 -0
  83. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  84. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  85. cars/applications/resampling/__init__.py +28 -0
  86. cars/applications/resampling/abstract_resampling_app.py +187 -0
  87. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  88. cars/applications/resampling/resampling_algo.py +590 -0
  89. cars/applications/resampling/resampling_constants.py +36 -0
  90. cars/applications/resampling/resampling_wrappers.py +309 -0
  91. cars/applications/sensors_subsampling/__init__.py +32 -0
  92. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  93. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  94. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  95. cars/applications/sparse_matching/__init__.py +30 -0
  96. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  97. cars/applications/sparse_matching/sift_app.py +724 -0
  98. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  99. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  100. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  101. cars/applications/triangulation/__init__.py +32 -0
  102. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  103. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  104. cars/applications/triangulation/pc_transform.py +552 -0
  105. cars/applications/triangulation/triangulation_algo.py +371 -0
  106. cars/applications/triangulation/triangulation_constants.py +38 -0
  107. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  108. cars/bundleadjustment.py +750 -0
  109. cars/cars.py +179 -0
  110. cars/conf/__init__.py +23 -0
  111. cars/conf/geoid/egm96.grd +0 -0
  112. cars/conf/geoid/egm96.grd.hdr +15 -0
  113. cars/conf/input_parameters.py +156 -0
  114. cars/conf/mask_cst.py +35 -0
  115. cars/core/__init__.py +23 -0
  116. cars/core/cars_logging.py +402 -0
  117. cars/core/constants.py +191 -0
  118. cars/core/constants_disparity.py +50 -0
  119. cars/core/datasets.py +140 -0
  120. cars/core/geometry/__init__.py +27 -0
  121. cars/core/geometry/abstract_geometry.py +1119 -0
  122. cars/core/geometry/shareloc_geometry.py +598 -0
  123. cars/core/inputs.py +568 -0
  124. cars/core/outputs.py +176 -0
  125. cars/core/preprocessing.py +722 -0
  126. cars/core/projection.py +843 -0
  127. cars/core/roi_tools.py +215 -0
  128. cars/core/tiling.py +774 -0
  129. cars/core/utils.py +164 -0
  130. cars/data_structures/__init__.py +23 -0
  131. cars/data_structures/cars_dataset.py +1544 -0
  132. cars/data_structures/cars_dict.py +74 -0
  133. cars/data_structures/corresponding_tiles_tools.py +186 -0
  134. cars/data_structures/dataframe_converter.py +185 -0
  135. cars/data_structures/format_transformation.py +297 -0
  136. cars/devibrate.py +689 -0
  137. cars/extractroi.py +264 -0
  138. cars/orchestrator/__init__.py +23 -0
  139. cars/orchestrator/achievement_tracker.py +125 -0
  140. cars/orchestrator/cluster/__init__.py +37 -0
  141. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  142. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  143. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  144. cars/orchestrator/cluster/dask_config/README.md +94 -0
  145. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  146. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  147. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  152. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  153. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  154. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  155. cars/orchestrator/cluster/log_wrapper.py +728 -0
  156. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  160. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  162. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  163. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  164. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  165. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  166. cars/orchestrator/memory_tools.py +47 -0
  167. cars/orchestrator/orchestrator.py +755 -0
  168. cars/orchestrator/orchestrator_constants.py +29 -0
  169. cars/orchestrator/registry/__init__.py +23 -0
  170. cars/orchestrator/registry/abstract_registry.py +143 -0
  171. cars/orchestrator/registry/compute_registry.py +106 -0
  172. cars/orchestrator/registry/id_generator.py +116 -0
  173. cars/orchestrator/registry/replacer_registry.py +213 -0
  174. cars/orchestrator/registry/saver_registry.py +363 -0
  175. cars/orchestrator/registry/unseen_registry.py +118 -0
  176. cars/orchestrator/tiles_profiler.py +279 -0
  177. cars/pipelines/__init__.py +26 -0
  178. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  179. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  180. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  181. cars/pipelines/default/__init__.py +26 -0
  182. cars/pipelines/default/default_pipeline.py +1088 -0
  183. cars/pipelines/filling/__init__.py +26 -0
  184. cars/pipelines/filling/filling.py +981 -0
  185. cars/pipelines/formatting/__init__.py +26 -0
  186. cars/pipelines/formatting/formatting.py +186 -0
  187. cars/pipelines/merging/__init__.py +26 -0
  188. cars/pipelines/merging/merging.py +439 -0
  189. cars/pipelines/parameters/__init__.py +0 -0
  190. cars/pipelines/parameters/advanced_parameters.py +256 -0
  191. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  192. cars/pipelines/parameters/application_parameters.py +72 -0
  193. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  194. cars/pipelines/parameters/dsm_inputs.py +349 -0
  195. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  196. cars/pipelines/parameters/output_constants.py +52 -0
  197. cars/pipelines/parameters/output_parameters.py +438 -0
  198. cars/pipelines/parameters/sensor_inputs.py +859 -0
  199. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  200. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  202. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  204. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  206. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  207. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  208. cars/pipelines/pipeline.py +119 -0
  209. cars/pipelines/pipeline_constants.py +38 -0
  210. cars/pipelines/pipeline_template.py +135 -0
  211. cars/pipelines/subsampling/__init__.py +26 -0
  212. cars/pipelines/subsampling/subsampling.py +358 -0
  213. cars/pipelines/surface_modeling/__init__.py +26 -0
  214. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  215. cars/pipelines/tie_points/__init__.py +26 -0
  216. cars/pipelines/tie_points/tie_points.py +536 -0
  217. cars/starter.py +167 -0
  218. cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
  219. cars-1.0.0rc2.dist-info/METADATA +289 -0
  220. cars-1.0.0rc2.dist-info/RECORD +225 -0
  221. cars-1.0.0rc2.dist-info/WHEEL +4 -0
  222. cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
  223. cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
  224. cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
  225. cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
@@ -0,0 +1,505 @@
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 functions for wrapper disk
23
+ """
24
+
25
+ # Standard imports
26
+ import logging
27
+ import os
28
+ import pickle
29
+ import shutil
30
+ from abc import ABCMeta, abstractmethod
31
+ from multiprocessing.pool import ThreadPool
32
+
33
+ import pandas
34
+
35
+ # Third party imports
36
+ import xarray as xr
37
+
38
+ # CARS imports
39
+ from cars.core.utils import safe_makedirs
40
+ from cars.data_structures import cars_dataset, cars_dict
41
+ from cars.orchestrator.cluster.mp_cluster.mp_tools import replace_data
42
+
43
+ # Third party imports
44
+
45
+
46
+ DENSE_NAME = "DenseDO"
47
+ SPARSE_NAME = "SparseDO"
48
+ DICT_NAME = "DictDO"
49
+ SHARED_NAME = "SharedDO"
50
+
51
+
52
+ class AbstractWrapper(metaclass=ABCMeta):
53
+ """
54
+ AbstractWrapper
55
+ """
56
+
57
+ @abstractmethod
58
+ def get_obj(self, obj):
59
+ """
60
+ Get Object
61
+
62
+ :param obj: object to transform
63
+
64
+ :return: object
65
+ """
66
+
67
+ @abstractmethod
68
+ def get_function_and_kwargs(self, func, kwargs, nout=1):
69
+ """
70
+ Get function to apply and overloaded key arguments
71
+
72
+ :param func: function to run
73
+ :param kwargs: key arguments of func
74
+ :param nout: number of outputs
75
+
76
+ :return: function to apply, overloaded key arguments
77
+ """
78
+
79
+ @abstractmethod
80
+ def cleanup(self, **kwargs):
81
+ """
82
+ Cleanup tmp_dir
83
+ """
84
+
85
+ @abstractmethod
86
+ def cleanup_future_res(self, future_res):
87
+ """
88
+ Cleanup future result
89
+
90
+ :param future_res: future result to clean
91
+ """
92
+
93
+
94
+ class WrapperNone(AbstractWrapper):
95
+ """
96
+ AbstractWrapper
97
+ """
98
+
99
+ def __init__(self, tmp_dir):
100
+ """
101
+ Init function of WrapperDisk
102
+ :param tmp_dir: temporary directory
103
+ """
104
+
105
+ def get_obj(self, obj):
106
+ """
107
+ Get Object
108
+
109
+ :param obj: object to transform
110
+
111
+ :return: object
112
+ """
113
+ return obj
114
+
115
+ def get_function_and_kwargs(self, func, kwargs, nout=1):
116
+ """
117
+ Get function to apply and overloaded key arguments
118
+
119
+ :param func: function to run
120
+ :param kwargs: key arguments of func
121
+ :param nout: number of outputs
122
+
123
+ :return: function to apply, overloaded key arguments
124
+ """
125
+
126
+ # apply disk wrapper
127
+ new_func = none_wrapper_fun
128
+
129
+ # Get overloaded key arguments
130
+
131
+ new_kwargs = kwargs
132
+ new_kwargs["fun"] = func
133
+
134
+ return new_func, kwargs
135
+
136
+ def cleanup(self, **kwargs):
137
+ """
138
+ Cleanup tmp_dir
139
+ """
140
+
141
+ def cleanup_future_res(self, future_res):
142
+ """
143
+ Cleanup future result
144
+
145
+ :param future_res: future result to clean
146
+ """
147
+ del future_res
148
+
149
+
150
+ class WrapperDisk(AbstractWrapper):
151
+ """
152
+ WrapperDisk
153
+ """
154
+
155
+ def __init__(self, tmp_dir):
156
+ """
157
+ Init function of WrapperDisk
158
+ :param tmp_dir: temporary directory
159
+ """
160
+ # Directory for data passing from a wrapper to another
161
+ self.tmp_dir = os.path.join(tmp_dir, "tmp")
162
+ if not os.path.exists(self.tmp_dir):
163
+ os.makedirs(self.tmp_dir)
164
+
165
+ # Directory for data shared by multiple wrappers
166
+ self.shared_dir = os.path.join(tmp_dir, "shared")
167
+ if not os.path.exists(self.shared_dir):
168
+ os.makedirs(self.shared_dir)
169
+
170
+ self.current_object_id = 0
171
+
172
+ # Create a thead pool for removing data
173
+ self.removing_pool = ThreadPool(1)
174
+
175
+ def cleanup(self, keep_shared_dir=False):
176
+ """
177
+ Cleanup tmp_dir
178
+ :param keep_shared_dir: do not clean directory of shared objects
179
+ """
180
+
181
+ logging.info("Clean removing thread pool ...")
182
+ self.removing_pool.close()
183
+ self.removing_pool.join()
184
+
185
+ logging.info("Clean tmp directory ...")
186
+ removing_disk_data(self.tmp_dir)
187
+
188
+ if not keep_shared_dir:
189
+ logging.info("Clean shared directory ...")
190
+ removing_disk_data(self.shared_dir)
191
+
192
+ def cleanup_future_res(self, future_res):
193
+ """
194
+ Cleanup future result
195
+
196
+ :param future_res: future result to clean
197
+ """
198
+
199
+ if isinstance(future_res, tuple):
200
+ for future_res_i in future_res:
201
+ if is_dumped_object(future_res_i):
202
+ self.removing_pool.apply_async(
203
+ removing_disk_data, args=[future_res_i]
204
+ )
205
+
206
+ else:
207
+ if is_dumped_object(future_res):
208
+ self.removing_pool.apply_async(
209
+ removing_disk_data, args=[future_res]
210
+ )
211
+
212
+ def get_function_and_kwargs(self, func, kwargs, nout=1):
213
+ """
214
+ Get function to apply and overloaded key arguments
215
+
216
+ :param func: function to run
217
+ :param kwargs: key arguments of func
218
+ :param nout: number of outputs
219
+
220
+ :return: function to apply, overloaded key arguments
221
+ """
222
+
223
+ # apply disk wrapper
224
+ new_func = disk_wrapper_fun
225
+
226
+ # Get overloaded key arguments
227
+ # Create ids
228
+ id_list = []
229
+ for _ in range(nout):
230
+ id_list.append(self.current_object_id)
231
+ self.current_object_id += 1
232
+ new_kwargs = kwargs
233
+ new_kwargs["id_list"] = id_list
234
+ new_kwargs["fun"] = func
235
+ new_kwargs["tmp_dir"] = self.tmp_dir
236
+
237
+ return new_func, new_kwargs
238
+
239
+ def get_obj(self, obj):
240
+ """
241
+ Get Object
242
+
243
+ :param obj: object to transform
244
+
245
+ :return: object
246
+ """
247
+ res = load(obj)
248
+ return res
249
+
250
+ def scatter_obj(self, obj):
251
+ """
252
+ Distribute data through workers
253
+
254
+ :param obj: object to dump
255
+ """
256
+ directory = os.path.join(
257
+ self.shared_dir, SHARED_NAME + "_" + repr(self.current_object_id)
258
+ )
259
+ safe_makedirs(directory)
260
+ self.current_object_id += 1
261
+ path = os.path.join(directory, "obj")
262
+ with open(path, "wb") as handle:
263
+ pickle.dump(obj, handle, protocol=pickle.HIGHEST_PROTOCOL)
264
+ return path
265
+
266
+
267
+ def removing_disk_data(path):
268
+ """
269
+ Remove directory from disk
270
+
271
+ :param path: path to delete
272
+ """
273
+ shutil.rmtree(path)
274
+
275
+
276
+ def none_wrapper_fun(*argv, **kwargs):
277
+ """
278
+ Create a wrapper for functionn running it
279
+
280
+ :param argv: args of func
281
+ :param kwargs: kwargs of func
282
+
283
+ :return: path to results
284
+ """
285
+
286
+ func = kwargs["fun"]
287
+ kwargs.pop("fun")
288
+ return func(*argv, **kwargs)
289
+
290
+
291
+ def disk_wrapper_fun(*argv, **kwargs):
292
+ """
293
+ Create a wrapper for function
294
+
295
+ :param argv: args of func
296
+ :param kwargs: kwargs of func
297
+
298
+ :return: path to results
299
+ """
300
+
301
+ # Get function to wrap and id_list
302
+ try:
303
+ id_list = kwargs["id_list"]
304
+ func = kwargs["fun"]
305
+ tmp_dir = kwargs["tmp_dir"]
306
+ kwargs.pop("id_list")
307
+ kwargs.pop("fun")
308
+ kwargs.pop("tmp_dir")
309
+ except Exception as exc: # pylint: disable=W0702 # noqa: B001, E722
310
+ raise RuntimeError(
311
+ "Failed in unwrapping. \n Args: {}, \n Kwargs: {}\n".format(
312
+ argv, kwargs
313
+ )
314
+ ) from exc
315
+
316
+ # load args
317
+ loaded_argv = load_args_or_kwargs(argv)
318
+ loaded_kwargs = load_args_or_kwargs(kwargs)
319
+
320
+ # call function
321
+ res = func(*loaded_argv[:], **loaded_kwargs)
322
+
323
+ if res is not None:
324
+ to_disk_res = dump(res, tmp_dir, id_list)
325
+ else:
326
+ to_disk_res = res
327
+
328
+ return to_disk_res
329
+
330
+
331
+ def load_args_or_kwargs(args_or_kwargs):
332
+ """
333
+ Load args or kwargs from disk to memory
334
+
335
+ :param args_or_kwargs: args or kwargs of func
336
+
337
+ :return: new args
338
+
339
+ """
340
+
341
+ def transform_path_to_obj(obj):
342
+ """
343
+ Transform path to object
344
+
345
+ :param obj: object
346
+
347
+ """
348
+ res = obj
349
+ if is_dumped_object(obj):
350
+ res = load(obj)
351
+
352
+ return res
353
+
354
+ # replace data
355
+ return replace_data(args_or_kwargs, transform_path_to_obj)
356
+
357
+
358
+ def is_dumped_object(obj):
359
+ """
360
+ Check if a given object is dumped
361
+
362
+ :param obj: object
363
+
364
+ :return: is dumped
365
+ :rtype: bool
366
+ """
367
+
368
+ is_dumped = False
369
+ if isinstance(obj, str):
370
+ if (
371
+ DENSE_NAME in obj
372
+ or SPARSE_NAME in obj
373
+ or DICT_NAME in obj
374
+ or SHARED_NAME in obj
375
+ ):
376
+ is_dumped = True
377
+
378
+ return is_dumped
379
+
380
+
381
+ def load(path):
382
+ """
383
+ Load object from disk
384
+
385
+ :param path: path
386
+ :type path: str
387
+
388
+ :return: object
389
+ """
390
+
391
+ if path is not None:
392
+ obj = path
393
+ if DENSE_NAME in path:
394
+ obj = cars_dataset.CarsDataset("arrays").load_single_tile(path)
395
+ elif SPARSE_NAME in path:
396
+ obj = cars_dataset.CarsDataset("points").load_single_tile(path)
397
+ elif DICT_NAME in path:
398
+ obj = cars_dataset.CarsDataset("dict").load_single_tile(path)
399
+ elif SHARED_NAME in path:
400
+ obj = load_shared_data(path)
401
+
402
+ else:
403
+ logging.warning(
404
+ "Not a dumped arrays or points or dict or shared data"
405
+ )
406
+
407
+ else:
408
+ obj = None
409
+ return obj
410
+
411
+
412
+ def load_shared_data(path):
413
+ """
414
+ Load shared object from disk
415
+
416
+ :param path: path
417
+ :type path: str
418
+
419
+ :return: object
420
+ """
421
+ with open(path, "rb") as handle:
422
+ obj = pickle.load(handle)
423
+ return obj
424
+
425
+
426
+ def dump_single_object(obj, path):
427
+ """
428
+ Dump object to disk
429
+
430
+ :param path: path
431
+ :type path: str
432
+ """
433
+ if isinstance(obj, xr.Dataset):
434
+ # is from array
435
+ cars_dataset.CarsDataset("arrays").save_single_tile(obj, path)
436
+ elif isinstance(obj, pandas.DataFrame):
437
+ # is from points
438
+ cars_dataset.CarsDataset("points").save_single_tile(obj, path)
439
+ elif isinstance(obj, cars_dict.CarsDict):
440
+ # is from points
441
+ cars_dataset.CarsDataset("dict").save_single_tile(obj, path)
442
+ else:
443
+ raise TypeError("Not an arrays or points or dict")
444
+
445
+
446
+ def create_path(obj, tmp_dir, id_num):
447
+ """
448
+ Create path where to dump object
449
+
450
+ :param tmp_dir: tmp_dir
451
+ :param id_num: id of object
452
+
453
+ :return: path
454
+ """
455
+
456
+ path = None
457
+
458
+ if isinstance(obj, xr.Dataset):
459
+ # is from array
460
+ path = DENSE_NAME
461
+ elif isinstance(obj, pandas.DataFrame):
462
+ # is from points
463
+ path = SPARSE_NAME
464
+ elif isinstance(obj, cars_dict.CarsDict):
465
+ # is from dict
466
+ path = DICT_NAME
467
+ else:
468
+ logging.warning("Not an arrays or points or dict")
469
+ path = obj
470
+
471
+ path = os.path.join(tmp_dir, path + "_" + repr(id_num))
472
+
473
+ return path
474
+
475
+
476
+ def dump(res, tmp_dir, id_list):
477
+ """
478
+ Dump results to tmp_dir, according to ids
479
+
480
+ :param res: objects to dump
481
+ :param tmp_dir: tmp_dir
482
+ :param id_list: list of ids of objects
483
+
484
+ :return: path
485
+ """
486
+
487
+ paths = None
488
+
489
+ if len(id_list) > 1:
490
+ paths = []
491
+ for i, single_id in enumerate(id_list):
492
+ if res[i] is not None:
493
+ path = create_path(res[i], tmp_dir, single_id)
494
+ dump_single_object(res[i], path)
495
+ paths.append(path)
496
+ else:
497
+ paths.append(None)
498
+
499
+ paths = (*paths,)
500
+
501
+ else:
502
+ paths = create_path(res, tmp_dir, id_list[0])
503
+ dump_single_object(res, paths)
504
+
505
+ return paths