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,139 @@
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 sequential cluster
23
+ """
24
+
25
+ # Standard imports
26
+
27
+ # Third party imports
28
+ from json_checker import Checker, Or
29
+
30
+ # CARS imports
31
+ from cars.orchestrator.cluster import abstract_cluster
32
+
33
+
34
+ @abstract_cluster.AbstractCluster.register_subclass("sequential")
35
+ class SequentialCluster(abstract_cluster.AbstractCluster):
36
+ """
37
+ SequentialCluster
38
+ """
39
+
40
+ def __init__(self, conf_cluster, out_dir, log_dir, launch_worker=True):
41
+ """
42
+ Init function of SequentialCluster
43
+
44
+ :param conf_cluster: configuration for cluster
45
+
46
+ """
47
+ # call parent init
48
+ super().__init__(
49
+ conf_cluster, out_dir, log_dir, launch_worker=launch_worker
50
+ )
51
+
52
+ # retrieve parameters
53
+ self.profiling = self.checked_conf_cluster["profiling"]
54
+ self.out_dir = out_dir
55
+ self.launch_worker = launch_worker
56
+
57
+ def check_conf(self, conf):
58
+ """
59
+ Check configuration
60
+
61
+ :param conf: configuration to check
62
+ :type conf: dict
63
+
64
+ :return: overloaded configuration
65
+ :rtype: dict
66
+
67
+ """
68
+
69
+ # init conf
70
+ if conf is not None:
71
+ overloaded_conf = conf.copy()
72
+ else:
73
+ conf = {}
74
+ overloaded_conf = {}
75
+
76
+ # Overload conf
77
+ overloaded_conf["mode"] = conf.get("mode", "sequential")
78
+ overloaded_conf["max_ram_per_worker"] = conf.get(
79
+ "max_ram_per_worker", 2000
80
+ )
81
+ overloaded_conf["profiling"] = conf.get("profiling", {})
82
+
83
+ cluster_schema = {
84
+ "mode": str,
85
+ "max_ram_per_worker": Or(float, int),
86
+ "profiling": dict,
87
+ }
88
+
89
+ # Check conf
90
+ checker = Checker(cluster_schema)
91
+ checker.validate(overloaded_conf)
92
+
93
+ return overloaded_conf
94
+
95
+ def get_delayed_type(self):
96
+ """
97
+ Get delayed type
98
+ """
99
+ return object
100
+
101
+ def cleanup(self, keep_shared_dir=False):
102
+ """
103
+ Cleanup cluster
104
+
105
+ """
106
+
107
+ def create_task_wrapped(self, func, nout=2):
108
+ """
109
+ Create task
110
+
111
+ :param func: function
112
+ :param nout: number of outputs
113
+ """
114
+ return func
115
+
116
+ def start_tasks(self, task_list):
117
+ """
118
+ Start all tasks
119
+
120
+ :param task_list: task list
121
+ """
122
+ return task_list
123
+
124
+ def scatter(self, data, broadcast=True): # pylint: disable=W0613
125
+ """
126
+ Distribute data through workers
127
+
128
+ :param data: task data
129
+ """
130
+ return data
131
+
132
+ def future_iterator(self, future_list, timeout=None):
133
+ """
134
+ Start all tasks
135
+
136
+ :param future_list: future_list list
137
+ """
138
+
139
+ yield from future_list
@@ -0,0 +1,234 @@
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 SLURM dask Cluster
23
+ """
24
+
25
+ import logging
26
+ import os
27
+ import warnings
28
+
29
+ from dask.distributed import Client
30
+ from json_checker import Or
31
+
32
+ with warnings.catch_warnings():
33
+ # Ignore some internal dask_jobqueue warnings
34
+ warnings.filterwarnings(
35
+ "ignore",
36
+ category=FutureWarning,
37
+ message=".*format_bytes is deprecated.*",
38
+ )
39
+ warnings.filterwarnings(
40
+ "ignore",
41
+ category=FutureWarning,
42
+ message=".*parse_bytes is deprecated.*",
43
+ )
44
+ warnings.filterwarnings(
45
+ "ignore",
46
+ category=FutureWarning,
47
+ message=".*tmpfile is deprecated.*",
48
+ )
49
+ from dask_jobqueue import SLURMCluster
50
+
51
+ from cars.orchestrator.cluster import ( # pylint: disable=C0412
52
+ abstract_cluster,
53
+ abstract_dask_cluster,
54
+ )
55
+ from cars.orchestrator.cluster.dask_cluster_tools import (
56
+ check_configuration,
57
+ create_checker_schema,
58
+ )
59
+ from cars.orchestrator.cluster.dask_jobqueue_utils import (
60
+ get_dashboard_link,
61
+ init_cluster_variables,
62
+ stop_cluster,
63
+ )
64
+
65
+
66
+ @abstract_cluster.AbstractCluster.register_subclass("slurm_dask")
67
+ class SlurmDaskCluster(abstract_dask_cluster.AbstractDaskCluster):
68
+ """
69
+ SlurmDaskCluster
70
+ """
71
+
72
+ def check_conf(self, conf):
73
+ """
74
+ Check configuration
75
+
76
+ :param conf: configuration to check
77
+ :type conf: dict
78
+
79
+ :return: overloaded configuration
80
+ :rtype: dict
81
+
82
+ """
83
+ # overload cluster schema
84
+ overloaded_conf, cluster_schema = create_checker_schema(conf)
85
+ if overloaded_conf["mode"] == "slurm_dask":
86
+ overloaded_conf["account"] = conf.get("account", None)
87
+ overloaded_conf["qos"] = conf.get("qos", None)
88
+ cluster_schema["account"] = Or(None, str)
89
+ cluster_schema["qos"] = Or(None, str)
90
+
91
+ if overloaded_conf["account"] is None:
92
+ error_msg = (
93
+ "'account' parameter must be set for slurm dask cluster"
94
+ )
95
+ logging.error(error_msg)
96
+ raise RuntimeError(error_msg)
97
+ return check_configuration(overloaded_conf, cluster_schema)
98
+
99
+ def start_dask_cluster(self):
100
+ """
101
+ Start dask cluster
102
+ """
103
+
104
+ return start_cluster(
105
+ self.nb_workers,
106
+ self.walltime,
107
+ self.out_dir,
108
+ activate_dashboard=self.activate_dashboard,
109
+ python=self.python,
110
+ account=self.account,
111
+ qos=self.qos,
112
+ )
113
+
114
+ def cleanup(self):
115
+ """
116
+ Cleanup cluster
117
+
118
+ """
119
+ stop_cluster(self.cluster, self.client)
120
+ logging.info("Dask cluster closed")
121
+
122
+
123
+ def start_cluster( # pylint: disable=too-many-positional-arguments
124
+ nb_workers,
125
+ walltime,
126
+ out_dir,
127
+ timeout=600,
128
+ activate_dashboard=False,
129
+ python=None,
130
+ account=None,
131
+ qos=None,
132
+ ):
133
+ """Create a Dask cluster.
134
+
135
+ Each worker will be spawned in an independent job with a single CPU
136
+ allocated to it, and will use a single process. This is done to maximize
137
+ CPU utilization and minimize scheduling delay.
138
+
139
+ The CARS_SLURM_QUEUE environment variable, if defined, is used
140
+ to specify the queue in which worker jobs are scheduled.
141
+
142
+ :param nb_workers: Number of dask workers
143
+ :type nb_workers: int
144
+ :param walltime: Walltime for each dask worker
145
+ :type walltime: string
146
+ :param out_dir: Output directory
147
+ :type out_dir: string
148
+ :param timeout: timeout of the cluster client
149
+ :type timeout: int
150
+ :param activate_dashboard: option to activate the dashborad server mode
151
+ :type activate_dashboard: bool
152
+ :param python: specfic python path
153
+ :type python: string
154
+ :param account: SLURM account
155
+ :type account: string
156
+ :param qos: Quality of Service parameter for TREX cluster
157
+ :type qos: string
158
+ :return: Dask cluster and dask client
159
+ :rtype: (dask_jobqueue.SLURMCluster, dask.distributed.Client) tuple
160
+ """
161
+ # Retrieve SLURM queue
162
+ slurm_queue = os.environ.get("CARS_SLURM_QUEUE")
163
+
164
+ # retrieve current python path if None
165
+ (
166
+ python,
167
+ nb_workers_per_job,
168
+ memory,
169
+ _,
170
+ stagger,
171
+ lifetime_with_margin,
172
+ scheduler_options,
173
+ envs,
174
+ log_directory,
175
+ local_directory,
176
+ ) = init_cluster_variables(
177
+ nb_workers,
178
+ walltime,
179
+ out_dir,
180
+ activate_dashboard,
181
+ python,
182
+ core_memory=7000,
183
+ cluster_name="SLURM",
184
+ )
185
+
186
+ with warnings.catch_warnings():
187
+ # Ignore some internal dask_jobqueue warnings
188
+ # TODO remove when Future warning do not exist anymore
189
+ warnings.filterwarnings(
190
+ "ignore",
191
+ category=FutureWarning,
192
+ message=".*extra has been renamed to worker_extra_args*",
193
+ )
194
+ warnings.filterwarnings(
195
+ "ignore",
196
+ category=FutureWarning,
197
+ message=".*job_extra has been renamed to job_extra_directives*",
198
+ )
199
+ warnings.filterwarnings(
200
+ "ignore",
201
+ category=FutureWarning,
202
+ message=".*env_extra has been renamed to job_script_prologue*",
203
+ )
204
+ if qos:
205
+ qos = ["--qos=" + qos]
206
+ logging.info("Quality of Service option: {}".format(qos[0]))
207
+ cluster = SLURMCluster(
208
+ processes=nb_workers_per_job,
209
+ cores=nb_workers_per_job,
210
+ memory="{}MiB".format(memory),
211
+ local_directory=local_directory,
212
+ account=account,
213
+ walltime=walltime,
214
+ interface="ib0",
215
+ queue=slurm_queue,
216
+ job_script_prologue=envs,
217
+ log_directory=log_directory,
218
+ python=python,
219
+ worker_extra_args=[
220
+ "--lifetime",
221
+ f"{int(lifetime_with_margin.total_seconds())}s",
222
+ "--lifetime-stagger",
223
+ f"{int(stagger.total_seconds())}s",
224
+ ],
225
+ scheduler_options=scheduler_options,
226
+ job_extra_directives=qos,
227
+ )
228
+ logging.info("Dask cluster started")
229
+ cluster.adapt(minimum=nb_workers, maximum=nb_workers)
230
+ client = Client(cluster, timeout=timeout)
231
+ logging.info(
232
+ "Dashboard started at {}".format(get_dashboard_link(cluster))
233
+ )
234
+ return cluster, client
@@ -0,0 +1,47 @@
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 ram tools
23
+ """
24
+
25
+ import psutil
26
+
27
+
28
+ def get_available_ram():
29
+ """
30
+ Get available ram
31
+
32
+ :return : available ram in Mb
33
+ """
34
+ ram = psutil.virtual_memory()
35
+ available_ram_mb = ram.available / (1024 * 1024)
36
+ return available_ram_mb
37
+
38
+
39
+ def get_total_ram():
40
+ """
41
+ Get total ram
42
+
43
+ :return : available ram in Mb
44
+ """
45
+ ram = psutil.virtual_memory()
46
+ total_ram_mb = ram.available / (1024 * 1024)
47
+ return total_ram_mb