BERATools 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.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.
Files changed (153) hide show
  1. beratools/__init__.py +1 -7
  2. beratools/core/algo_centerline.py +491 -351
  3. beratools/core/algo_common.py +497 -0
  4. beratools/core/algo_cost.py +192 -0
  5. beratools/core/{dijkstra_algorithm.py → algo_dijkstra.py} +503 -460
  6. beratools/core/algo_footprint_rel.py +577 -0
  7. beratools/core/algo_line_grouping.py +944 -0
  8. beratools/core/algo_merge_lines.py +214 -0
  9. beratools/core/algo_split_with_lines.py +304 -0
  10. beratools/core/algo_tiler.py +428 -0
  11. beratools/core/algo_vertex_optimization.py +469 -0
  12. beratools/core/constants.py +52 -86
  13. beratools/core/logger.py +76 -85
  14. beratools/core/tool_base.py +196 -133
  15. beratools/gui/__init__.py +11 -15
  16. beratools/gui/{beratools.json → assets/beratools.json} +2185 -2300
  17. beratools/gui/batch_processing_dlg.py +513 -463
  18. beratools/gui/bt_data.py +481 -487
  19. beratools/gui/bt_gui_main.py +710 -691
  20. beratools/gui/main.py +26 -0
  21. beratools/gui/map_window.py +162 -146
  22. beratools/gui/tool_widgets.py +725 -493
  23. beratools/tools/Beratools_r_script.r +1120 -1120
  24. beratools/tools/Ht_metrics.py +116 -116
  25. beratools/tools/__init__.py +7 -7
  26. beratools/tools/batch_processing.py +136 -132
  27. beratools/tools/canopy_threshold_relative.py +672 -670
  28. beratools/tools/canopycostraster.py +222 -222
  29. beratools/tools/centerline.py +136 -176
  30. beratools/tools/common.py +857 -885
  31. beratools/tools/fl_regen_csf.py +428 -428
  32. beratools/tools/forest_line_attributes.py +408 -408
  33. beratools/tools/line_footprint_absolute.py +213 -363
  34. beratools/tools/line_footprint_fixed.py +436 -282
  35. beratools/tools/line_footprint_functions.py +733 -720
  36. beratools/tools/line_footprint_relative.py +73 -64
  37. beratools/tools/line_grouping.py +45 -0
  38. beratools/tools/ln_relative_metrics.py +615 -615
  39. beratools/tools/r_cal_lpi_elai.r +24 -24
  40. beratools/tools/r_generate_pd_focalraster.r +100 -100
  41. beratools/tools/r_interface.py +79 -79
  42. beratools/tools/r_point_density.r +8 -8
  43. beratools/tools/rpy_chm2trees.py +86 -86
  44. beratools/tools/rpy_dsm_chm_by.py +81 -81
  45. beratools/tools/rpy_dtm_by.py +63 -63
  46. beratools/tools/rpy_find_cellsize.py +43 -43
  47. beratools/tools/rpy_gnd_csf.py +74 -74
  48. beratools/tools/rpy_hummock_hollow.py +85 -85
  49. beratools/tools/rpy_hummock_hollow_raster.py +71 -71
  50. beratools/tools/rpy_las_info.py +51 -51
  51. beratools/tools/rpy_laz2las.py +40 -40
  52. beratools/tools/rpy_lpi_elai_lascat.py +466 -466
  53. beratools/tools/rpy_normalized_lidar_by.py +56 -56
  54. beratools/tools/rpy_percent_above_dbh.py +80 -80
  55. beratools/tools/rpy_points2trees.py +88 -88
  56. beratools/tools/rpy_vegcoverage.py +94 -94
  57. beratools/tools/tiler.py +48 -206
  58. beratools/tools/tool_template.py +69 -54
  59. beratools/tools/vertex_optimization.py +61 -620
  60. beratools/tools/zonal_threshold.py +144 -144
  61. beratools-0.2.1.dist-info/METADATA +109 -0
  62. beratools-0.2.1.dist-info/RECORD +74 -0
  63. {beratools-0.2.0.dist-info → beratools-0.2.1.dist-info}/WHEEL +1 -1
  64. {beratools-0.2.0.dist-info → beratools-0.2.1.dist-info}/licenses/LICENSE +22 -22
  65. beratools/gui/cli.py +0 -18
  66. beratools/gui/gui.json +0 -8
  67. beratools/gui_tk/ASCII Banners.txt +0 -248
  68. beratools/gui_tk/__init__.py +0 -20
  69. beratools/gui_tk/beratools_main.py +0 -515
  70. beratools/gui_tk/bt_widgets.py +0 -442
  71. beratools/gui_tk/cli.py +0 -18
  72. beratools/gui_tk/img/BERALogo.png +0 -0
  73. beratools/gui_tk/img/closed.gif +0 -0
  74. beratools/gui_tk/img/closed.png +0 -0
  75. beratools/gui_tk/img/open.gif +0 -0
  76. beratools/gui_tk/img/open.png +0 -0
  77. beratools/gui_tk/img/tool.gif +0 -0
  78. beratools/gui_tk/img/tool.png +0 -0
  79. beratools/gui_tk/main.py +0 -14
  80. beratools/gui_tk/map_window.py +0 -144
  81. beratools/gui_tk/runner.py +0 -1481
  82. beratools/gui_tk/tooltip.py +0 -55
  83. beratools/third_party/pyqtlet2/__init__.py +0 -9
  84. beratools/third_party/pyqtlet2/leaflet/__init__.py +0 -26
  85. beratools/third_party/pyqtlet2/leaflet/control/__init__.py +0 -6
  86. beratools/third_party/pyqtlet2/leaflet/control/control.py +0 -59
  87. beratools/third_party/pyqtlet2/leaflet/control/draw.py +0 -52
  88. beratools/third_party/pyqtlet2/leaflet/control/layers.py +0 -20
  89. beratools/third_party/pyqtlet2/leaflet/core/Parser.py +0 -24
  90. beratools/third_party/pyqtlet2/leaflet/core/__init__.py +0 -2
  91. beratools/third_party/pyqtlet2/leaflet/core/evented.py +0 -180
  92. beratools/third_party/pyqtlet2/leaflet/layer/__init__.py +0 -5
  93. beratools/third_party/pyqtlet2/leaflet/layer/featuregroup.py +0 -34
  94. beratools/third_party/pyqtlet2/leaflet/layer/icon/__init__.py +0 -1
  95. beratools/third_party/pyqtlet2/leaflet/layer/icon/icon.py +0 -30
  96. beratools/third_party/pyqtlet2/leaflet/layer/imageoverlay.py +0 -18
  97. beratools/third_party/pyqtlet2/leaflet/layer/layer.py +0 -105
  98. beratools/third_party/pyqtlet2/leaflet/layer/layergroup.py +0 -45
  99. beratools/third_party/pyqtlet2/leaflet/layer/marker/__init__.py +0 -1
  100. beratools/third_party/pyqtlet2/leaflet/layer/marker/marker.py +0 -91
  101. beratools/third_party/pyqtlet2/leaflet/layer/tile/__init__.py +0 -2
  102. beratools/third_party/pyqtlet2/leaflet/layer/tile/gridlayer.py +0 -4
  103. beratools/third_party/pyqtlet2/leaflet/layer/tile/tilelayer.py +0 -16
  104. beratools/third_party/pyqtlet2/leaflet/layer/vector/__init__.py +0 -5
  105. beratools/third_party/pyqtlet2/leaflet/layer/vector/circle.py +0 -15
  106. beratools/third_party/pyqtlet2/leaflet/layer/vector/circlemarker.py +0 -18
  107. beratools/third_party/pyqtlet2/leaflet/layer/vector/path.py +0 -5
  108. beratools/third_party/pyqtlet2/leaflet/layer/vector/polygon.py +0 -14
  109. beratools/third_party/pyqtlet2/leaflet/layer/vector/polyline.py +0 -18
  110. beratools/third_party/pyqtlet2/leaflet/layer/vector/rectangle.py +0 -14
  111. beratools/third_party/pyqtlet2/leaflet/map/__init__.py +0 -1
  112. beratools/third_party/pyqtlet2/leaflet/map/map.py +0 -220
  113. beratools/third_party/pyqtlet2/mapwidget.py +0 -45
  114. beratools/third_party/pyqtlet2/web/custom.js +0 -43
  115. beratools/third_party/pyqtlet2/web/map.html +0 -23
  116. beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/layers-2x.png +0 -0
  117. beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/layers.png +0 -0
  118. beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-icon-2x.png +0 -0
  119. beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-icon.png +0 -0
  120. beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-shadow.png +0 -0
  121. beratools/third_party/pyqtlet2/web/modules/leaflet_193/leaflet.css +0 -656
  122. beratools/third_party/pyqtlet2/web/modules/leaflet_193/leaflet.js +0 -6
  123. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.codeclimate.yml +0 -14
  124. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.editorconfig +0 -4
  125. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.gitattributes +0 -22
  126. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.travis.yml +0 -43
  127. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/LICENSE +0 -20
  128. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/layers-2x.png +0 -0
  129. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/layers.png +0 -0
  130. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-icon-2x.png +0 -0
  131. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-icon.png +0 -0
  132. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-shadow.png +0 -0
  133. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet-2x.png +0 -0
  134. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet.png +0 -0
  135. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet.svg +0 -156
  136. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/leaflet.draw.css +0 -10
  137. beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/leaflet.draw.js +0 -10
  138. beratools/third_party/pyqtlet2/web/modules/leaflet_rotatedMarker_020/LICENSE +0 -22
  139. beratools/third_party/pyqtlet2/web/modules/leaflet_rotatedMarker_020/leaflet.rotatedMarker.js +0 -57
  140. beratools/tools/forest_line_ecosite.py +0 -216
  141. beratools/tools/lapis_all.py +0 -103
  142. beratools/tools/least_cost_path_from_chm.py +0 -152
  143. beratools-0.2.0.dist-info/METADATA +0 -63
  144. beratools-0.2.0.dist-info/RECORD +0 -142
  145. /beratools/gui/{img → assets}/BERALogo.png +0 -0
  146. /beratools/gui/{img → assets}/closed.gif +0 -0
  147. /beratools/gui/{img → assets}/closed.png +0 -0
  148. /beratools/{gui_tk → gui/assets}/gui.json +0 -0
  149. /beratools/gui/{img → assets}/open.gif +0 -0
  150. /beratools/gui/{img → assets}/open.png +0 -0
  151. /beratools/gui/{img → assets}/tool.gif +0 -0
  152. /beratools/gui/{img → assets}/tool.png +0 -0
  153. {beratools-0.2.0.dist-info → beratools-0.2.1.dist-info}/entry_points.txt +0 -0
beratools/core/logger.py CHANGED
@@ -1,85 +1,76 @@
1
- import logging
2
- import logging.handlers
3
- import sys
4
- from pathlib import Path
5
- from beratools.gui.bt_data import BTData
6
-
7
- bt = BTData()
8
-
9
-
10
- class NoParsingFilter(logging.Filter):
11
- def filter(self, record):
12
- return not record.getMessage().startswith("parsing")
13
-
14
-
15
- class Logger(object):
16
- def __init__(self, name, console_level=logging.INFO, file_level=logging.INFO):
17
- self.logger = logging.getLogger(name)
18
- self.name = name
19
- self.console_level = console_level
20
- self.file_level = file_level
21
-
22
- self.setup_logger()
23
-
24
- def get_logger(self):
25
- return self.logger
26
-
27
- def print(self, msg, flush=True):
28
- """
29
- This is for including print in logging
30
- Parameters
31
- ----------
32
- msg :
33
- flush :
34
-
35
- Returns
36
- -------
37
-
38
- """
39
- self.logger.info(msg)
40
- if flush:
41
- for handler in self.logger.handlers:
42
- handler.flush()
43
-
44
- def setup_logger(self):
45
- """
46
- # log = setup_logger('', r'PATH_TO_LOG_FILE')
47
- # log.debug("Debug message, should only appear in the file.")
48
-
49
- # for i in range(0, 10000):
50
- # print("From print(): Info message, should appear in file and stdout.")
51
- # log.info("Info message, should appear in file and stdout.")
52
- # log.warning("Warning message, should appear in file and stdout.")
53
- # log.error("Error message, should appear in file and stdout.")
54
- # log.error("parsing, should appear in file and stdout.")
55
- Parameters
56
- ----------
57
- name :
58
- console_level :
59
- file_level :
60
-
61
- Returns
62
- -------
63
-
64
- """
65
- # Change root logger level from WARNING (default) to NOTSET in order for all messages to be delegated.
66
- logging.getLogger().setLevel(logging.NOTSET)
67
- log_file = bt.get_logger_file_name(self.name)
68
-
69
- # Add stdout handler, with level INFO
70
- console_handler = logging.StreamHandler(sys.stdout)
71
- console_handler.setLevel(self.console_level)
72
- formatter = logging.Formatter("%(message)s")
73
- console_handler.setFormatter(formatter)
74
- logging.getLogger().addHandler(console_handler)
75
-
76
- # Add file rotating handler, 5MB size limit, 5 backups
77
- rotating_handler = logging.handlers.RotatingFileHandler(
78
- filename=log_file, maxBytes=5*1000*1000, backupCount=5
79
- )
80
-
81
- rotating_handler.setLevel(self.file_level)
82
- formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
83
- rotating_handler.setFormatter(formatter)
84
- logging.getLogger().addHandler(rotating_handler)
85
- logging.getLogger().addFilter(NoParsingFilter())
1
+ """
2
+ Copyright (C) 2025 Applied Geospatial Research Group.
3
+
4
+ This script is licensed under the GNU General Public License v3.0.
5
+ See <https://gnu.org/licenses/gpl-3.0> for full license details.
6
+
7
+ Author: Richard Zeng
8
+
9
+ Description:
10
+ This script is part of the BERA Tools.
11
+ Webpage: https://github.com/appliedgrg/beratools
12
+
13
+ The purpose of this script is to provide logger functions.
14
+ """
15
+ import logging
16
+ import logging.handlers
17
+ import sys
18
+
19
+ from beratools.gui.bt_data import BTData
20
+
21
+ bt = BTData()
22
+
23
+ class NoParsingFilter(logging.Filter):
24
+ def filter(self, record):
25
+ return not record.getMessage().startswith("parsing")
26
+
27
+
28
+ class Logger(object):
29
+ def __init__(self, name, console_level=logging.INFO, file_level=logging.INFO):
30
+ self.logger = logging.getLogger(name)
31
+ self.name = name
32
+ self.console_level = console_level
33
+ self.file_level = file_level
34
+
35
+ self.setup_logger()
36
+
37
+ def get_logger(self):
38
+ return self.logger
39
+
40
+ def print(self, msg, flush=True):
41
+ """
42
+ Re-define print in logging.
43
+
44
+ Args:
45
+ msg :
46
+ flush :
47
+
48
+ """
49
+ self.logger.info(msg)
50
+ if flush:
51
+ for handler in self.logger.handlers:
52
+ handler.flush()
53
+
54
+ def setup_logger(self):
55
+ # Change root logger level from WARNING (default) to NOTSET
56
+ # in order for all messages to be delegated.
57
+ logging.getLogger().setLevel(logging.NOTSET)
58
+ log_file = bt.get_logger_file_name(self.name)
59
+
60
+ # Add stdout handler, with level INFO
61
+ console_handler = logging.StreamHandler(sys.stdout)
62
+ console_handler.setLevel(self.console_level)
63
+ formatter = logging.Formatter("%(message)s")
64
+ console_handler.setFormatter(formatter)
65
+ logging.getLogger().addHandler(console_handler)
66
+
67
+ # Add file rotating handler, 5MB size limit, 5 backups
68
+ rotating_handler = logging.handlers.RotatingFileHandler(
69
+ filename=log_file, maxBytes=5*1000*1000, backupCount=5
70
+ )
71
+
72
+ rotating_handler.setLevel(self.file_level)
73
+ formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
74
+ rotating_handler.setFormatter(formatter)
75
+ logging.getLogger().addHandler(rotating_handler)
76
+ logging.getLogger().addFilter(NoParsingFilter())
@@ -1,133 +1,196 @@
1
- from multiprocessing.pool import Pool
2
- import multiprocessing
3
- import concurrent.futures
4
- import warnings
5
-
6
- import pandas as pd
7
- import geopandas as gpd
8
-
9
- from beratools.core.constants import *
10
-
11
- from dask.distributed import Client, as_completed
12
- from dask import config as cfg
13
- import dask.distributed
14
- # import ray
15
-
16
- # settings for dask
17
- cfg.set({'distributed.scheduler.worker-ttl': None})
18
- warnings.simplefilter("ignore", dask.distributed.comm.core.CommClosedError)
19
-
20
-
21
- class OperationCancelledException(Exception):
22
- pass
23
-
24
-
25
- class ToolBase(object):
26
- def __init__(self):
27
- pass
28
-
29
- def execute_multiprocessing(self):
30
- pass
31
-
32
-
33
- def result_is_valid(result):
34
- if type(result) is list or type(result) is tuple:
35
- if len(result) > 0:
36
- return True
37
- elif type(result) is pd.DataFrame or type(result) is gpd.GeoDataFrame:
38
- if not result.empty:
39
- return True
40
- elif result:
41
- return True
42
-
43
- return False
44
-
45
-
46
- def print_msg(app_name, step, total_steps):
47
- print(f' "PROGRESS_LABEL {app_name} {step} of {total_steps}" ', flush=True)
48
- print(f' %{step / total_steps * 100} ', flush=True)
49
-
50
-
51
- def execute_multiprocessing(in_func, in_data, app_name, processes, workers,
52
- mode=PARALLEL_MODE, verbose=False):
53
- out_result = []
54
- step = 0
55
- print("Using {} CPU cores".format(processes))
56
- total_steps = len(in_data)
57
-
58
- try:
59
- if mode == ParallelMode.MULTIPROCESSING:
60
- multiprocessing.set_start_method('spawn')
61
- print("Multiprocessing started...")
62
-
63
- with Pool(processes) as pool:
64
- print(multiprocessing.active_children())
65
- for result in pool.imap_unordered(in_func, in_data):
66
- if result_is_valid(result):
67
- out_result.append(result)
68
-
69
- step += 1
70
- print_msg(app_name, step, total_steps)
71
-
72
- pool.close()
73
- pool.join()
74
- elif mode == ParallelMode.SEQUENTIAL:
75
- for line in in_data:
76
- result_item = in_func(line)
77
- if result_is_valid(result_item):
78
- out_result.append(result_item)
79
-
80
- step += 1
81
- print_msg(app_name, step, total_steps)
82
- elif mode == ParallelMode.CONCURRENT:
83
- with concurrent.futures.ProcessPoolExecutor(max_workers=processes) as executor:
84
- futures = [executor.submit(in_func, line) for line in in_data]
85
- for future in concurrent.futures.as_completed(futures):
86
- result_item = future.result()
87
- if result_is_valid(result_item):
88
- out_result.append(result_item)
89
-
90
- step += 1
91
- print_msg(app_name, step, total_steps)
92
- elif mode == ParallelMode.DASK:
93
- dask_client = Client(threads_per_worker=1, n_workers=processes)
94
- print(dask_client)
95
- try:
96
- print('start processing')
97
- result = dask_client.map(in_func, in_data)
98
- seq = as_completed(result)
99
-
100
- for i in seq:
101
- if result_is_valid(result):
102
- out_result.append(i.result())
103
-
104
- step += 1
105
- print_msg(app_name, step, total_steps)
106
- except Exception as e:
107
- dask_client.close()
108
-
109
- dask_client.close()
110
-
111
- # ! important !
112
- # comment temporarily, man enable later if need to use ray
113
- # elif mode == ParallelMode.RAY:
114
- # ray.init(log_to_driver=False)
115
- # process_single_line_ray = ray.remote(in_func)
116
- # result_ids = [process_single_line_ray.remote(item) for item in in_data]
117
- #
118
- # while len(result_ids):
119
- # done_id, result_ids = ray.wait(result_ids)
120
- # result_item = ray.get(done_id[0])
121
- #
122
- # if result_is_valid(result_item):
123
- # out_result.append(result_item)
124
- #
125
- # step += 1
126
- # print_msg(app_name, step, total_steps)
127
-
128
- # ray.shutdown()
129
- except OperationCancelledException:
130
- print("Operation cancelled")
131
- return None
132
-
133
- return out_result
1
+ """
2
+ Copyright (C) 2025 Applied Geospatial Research Group.
3
+
4
+ This script is licensed under the GNU General Public License v3.0.
5
+ See <https://gnu.org/licenses/gpl-3.0> for full license details.
6
+
7
+ Author: Richard Zeng
8
+
9
+ Description:
10
+ This script is part of the BERA Tools.
11
+ Webpage: https://github.com/appliedgrg/beratools
12
+
13
+ The purpose of this script is to provide fundamental utilities for tools.
14
+ """
15
+ import concurrent.futures as con_futures
16
+ import warnings
17
+ from multiprocessing.pool import Pool
18
+
19
+ # import dask.distributed as dask_dist
20
+ import geopandas as gpd
21
+ import pandas as pd
22
+
23
+ # from dask import config as dask_cfg
24
+ from tqdm.auto import tqdm
25
+
26
+ # import ray
27
+ import beratools.core.constants as bt_const
28
+
29
+ # settings for dask
30
+ # dask_cfg.set({"distributed.scheduler.worker-ttl": None})
31
+ # warnings.simplefilter("ignore", dask_dist.comm.core.CommClosedError)
32
+ warnings.simplefilter(action="ignore", category=FutureWarning)
33
+
34
+
35
+ class ToolBase(object):
36
+ """Base class for tools."""
37
+
38
+ def __init__(self):
39
+ pass
40
+
41
+ def execute_multiprocessing(self):
42
+ pass
43
+
44
+
45
+ def result_is_valid(result):
46
+ if type(result) is list or type(result) is tuple:
47
+ if len(result) > 0:
48
+ return True
49
+ elif (
50
+ type(result) is pd.DataFrame
51
+ or type(result) is gpd.GeoDataFrame
52
+ or type(result) is pd.Series
53
+ or type(result) is gpd.GeoSeries
54
+ ):
55
+ if not result.empty:
56
+ return True
57
+ elif result:
58
+ return True
59
+
60
+ return False
61
+
62
+
63
+ def print_msg(app_name, step, total_steps):
64
+ print(f' "PROGRESS_LABEL {app_name} {step} of {total_steps}" ', flush=True)
65
+ print(f' %{step / total_steps * 100} ', flush=True)
66
+
67
+
68
+ def execute_multiprocessing(
69
+ in_func,
70
+ in_data,
71
+ app_name,
72
+ processes,
73
+ workers=1,
74
+ mode=bt_const.PARALLEL_MODE,
75
+ verbose=False,
76
+ scheduler_file="dask_scheduler.json",
77
+ ):
78
+ out_result = []
79
+ step = 0
80
+ total_steps = len(in_data)
81
+
82
+ try:
83
+ if mode == bt_const.ParallelMode.MULTIPROCESSING:
84
+ print("Multiprocessing started...", flush=True)
85
+ print("Using {} CPU cores".format(processes), flush=True)
86
+
87
+ with Pool(processes) as pool:
88
+ # print(multiprocessing.active_children())
89
+ with tqdm(total=total_steps, disable=verbose) as pbar:
90
+ for result in pool.imap_unordered(in_func, in_data):
91
+ if result_is_valid(result):
92
+ out_result.append(result)
93
+
94
+ step += 1
95
+ if verbose:
96
+ print_msg(app_name, step, total_steps)
97
+ else:
98
+ pbar.update()
99
+
100
+ pool.close()
101
+ pool.join()
102
+ elif mode == bt_const.ParallelMode.SEQUENTIAL:
103
+ print("Sequential processing started...", flush=True)
104
+ with tqdm(total=total_steps, disable=verbose) as pbar:
105
+ for line in in_data:
106
+ result_item = in_func(line)
107
+ if result_is_valid(result_item):
108
+ out_result.append(result_item)
109
+
110
+ step += 1
111
+ if verbose:
112
+ print_msg(app_name, step, total_steps)
113
+ else:
114
+ pbar.update()
115
+ elif mode == bt_const.ParallelMode.CONCURRENT:
116
+ print("Concurrent processing started...", flush=True)
117
+ print("Using {} CPU cores".format(processes), flush=True)
118
+ with con_futures.ProcessPoolExecutor(max_workers=processes) as executor:
119
+ futures = [executor.submit(in_func, line) for line in in_data]
120
+ with tqdm(total=total_steps, disable=verbose) as pbar:
121
+ for future in con_futures.as_completed(futures):
122
+ result_item = future.result()
123
+ if result_is_valid(result_item):
124
+ out_result.append(result_item)
125
+
126
+ step += 1
127
+ if verbose:
128
+ print_msg(app_name, step, total_steps)
129
+ else:
130
+ pbar.update()
131
+ # elif mode == bt_const.ParallelMode.DASK:
132
+ # print("Dask processing started...", flush=True)
133
+ # print("Using {} CPU cores".format(processes), flush=True)
134
+ # dask_client = dask_dist.Client(threads_per_worker=1, n_workers=processes)
135
+ # print(f"Local Dask client: {dask_client}")
136
+ # try:
137
+ # print('start processing')
138
+ # result = dask_client.map(in_func, in_data)
139
+ # seq = dask_dist.as_completed(result)
140
+
141
+ # with tqdm(total=total_steps, disable=verbose) as pbar:
142
+ # for i in seq:
143
+ # if result_is_valid(result):
144
+ # out_result.append(i.result())
145
+
146
+ # step += 1
147
+ # if verbose:
148
+ # print_msg(app_name, step, total_steps)
149
+ # else:
150
+ # pbar.update()
151
+ # except Exception as e:
152
+ # print(f'ParallelMode.DASK: {e}')
153
+ # dask_client.close()
154
+
155
+ # dask_client.close()
156
+ # elif mode == bt_const.ParallelMode.SLURM:
157
+ # print("Slurm Dask processing started...", flush=True)
158
+ # dask_client = dask_dist.Client(scheduler_file=scheduler_file)
159
+ # print(f"Slurm cluster Dask client: {dask_client}")
160
+ # try:
161
+ # print("start processing")
162
+ # result = dask_client.map(in_func, in_data)
163
+ # seq = dask_dist.as_completed(result)
164
+ # dask_dist.progress(result)
165
+
166
+ # for i in seq:
167
+ # if result_is_valid(result):
168
+ # out_result.append(i.result())
169
+ # except Exception as e:
170
+ # print(f'ParallelMode.SLURM: {e}')
171
+ # dask_client.close()
172
+
173
+ # dask_client.close()
174
+ # ! important !
175
+ # comment temporarily, man enable later if need to use ray
176
+ # elif mode == bt_const.ParallelMode.RAY:
177
+ # ray.init(log_to_driver=False)
178
+ # process_single_line_ray = ray.remote(in_func)
179
+ # result_ids = [process_single_line_ray.remote(item) for item in in_data]
180
+ #
181
+ # while len(result_ids):
182
+ # done_id, result_ids = ray.wait(result_ids)
183
+ # result_item = ray.get(done_id[0])
184
+ #
185
+ # if result_is_valid(result_item):
186
+ # out_result.append(result_item)
187
+ #
188
+ # step += 1
189
+ # print_msg(app_name, step, total_steps)
190
+
191
+ # ray.shutdown()
192
+ except Exception as e:
193
+ print(e)
194
+ return None
195
+
196
+ return out_result
beratools/gui/__init__.py CHANGED
@@ -1,15 +1,11 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- """Top-level package for BERA Tools."""
4
- import os
5
- import sys
6
- sys.path.append(os.path.dirname(os.path.realpath(__file__)))
7
-
8
- from bt_gui_main import *
9
-
10
- name = 'gui'
11
-
12
-
13
- def gui_main():
14
- runner()
15
-
1
+ # -*- coding: utf-8 -*-
2
+
3
+ """Top-level package for BERA Tools."""
4
+ from beratools.gui.bt_gui_main import *
5
+
6
+ name = 'gui'
7
+
8
+
9
+ def gui_main():
10
+ runner()
11
+