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.
- cars/__init__.py +74 -0
- cars/applications/__init__.py +37 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +104 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +630 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +655 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1460 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-i386-linux-musl.so +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +588 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +270 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +279 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +333 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_correction_app.py +496 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +527 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +531 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +634 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +762 -0
- cars/applications/resampling/resampling_algo.py +614 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +498 -0
- cars/applications/sparse_matching/sift_app.py +735 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +68 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +238 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +757 -0
- cars/cars.py +177 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1119 -0
- cars/core/geometry/shareloc_geometry.py +598 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1541 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +244 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +375 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +1075 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +873 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/orchestrator.py +905 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +2 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +786 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +417 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +69 -0
- cars/pipelines/parameters/application_parameters.py +71 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +918 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +454 -0
- cars/pipelines/parameters/sensor_inputs.py +842 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +49 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +31 -0
- cars/pipelines/pipeline_template.py +139 -0
- cars/pipelines/unit/__init__.py +26 -0
- cars/pipelines/unit/unit_pipeline.py +2850 -0
- cars/starter.py +167 -0
- cars-1.0.0rc1.dist-info/METADATA +292 -0
- cars-1.0.0rc1.dist-info/RECORD +202 -0
- cars-1.0.0rc1.dist-info/WHEEL +5 -0
- cars-1.0.0rc1.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s-1257a076.so.1 +0 -0
- cars.libs/libstdc++-0530927c.so.6.0.32 +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
|