halib 0.1.91__py3-none-any.whl → 0.2.21__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.
- halib/__init__.py +12 -6
- halib/common/__init__.py +0 -0
- halib/common/common.py +207 -0
- halib/common/rich_color.py +285 -0
- halib/common.py +53 -10
- halib/exp/__init__.py +0 -0
- halib/exp/core/__init__.py +0 -0
- halib/exp/core/base_config.py +167 -0
- halib/exp/core/base_exp.py +147 -0
- halib/exp/core/param_gen.py +189 -0
- halib/exp/core/wandb_op.py +117 -0
- halib/exp/data/__init__.py +0 -0
- halib/exp/data/dataclass_util.py +41 -0
- halib/exp/data/dataset.py +208 -0
- halib/exp/data/torchloader.py +165 -0
- halib/exp/perf/__init__.py +0 -0
- halib/exp/perf/flop_calc.py +190 -0
- halib/exp/perf/gpu_mon.py +58 -0
- halib/exp/perf/perfcalc.py +440 -0
- halib/exp/perf/perfmetrics.py +137 -0
- halib/exp/perf/perftb.py +778 -0
- halib/exp/perf/profiler.py +507 -0
- halib/exp/viz/__init__.py +0 -0
- halib/exp/viz/plot.py +754 -0
- halib/filetype/csvfile.py +3 -9
- halib/filetype/ipynb.py +61 -0
- halib/filetype/jsonfile.py +0 -3
- halib/filetype/textfile.py +0 -1
- halib/filetype/videofile.py +119 -3
- halib/filetype/yamlfile.py +16 -1
- halib/online/projectmake.py +7 -6
- halib/online/tele_noti.py +165 -0
- halib/research/base_exp.py +75 -18
- halib/research/core/__init__.py +0 -0
- halib/research/core/base_config.py +144 -0
- halib/research/core/base_exp.py +157 -0
- halib/research/core/param_gen.py +108 -0
- halib/research/core/wandb_op.py +117 -0
- halib/research/data/__init__.py +0 -0
- halib/research/data/dataclass_util.py +41 -0
- halib/research/data/dataset.py +208 -0
- halib/research/data/torchloader.py +165 -0
- halib/research/dataset.py +6 -7
- halib/research/flop_csv.py +34 -0
- halib/research/flops.py +156 -0
- halib/research/metrics.py +4 -0
- halib/research/mics.py +59 -1
- halib/research/perf/__init__.py +0 -0
- halib/research/perf/flop_calc.py +190 -0
- halib/research/perf/gpu_mon.py +58 -0
- halib/research/perf/perfcalc.py +363 -0
- halib/research/perf/perfmetrics.py +137 -0
- halib/research/perf/perftb.py +778 -0
- halib/research/perf/profiler.py +301 -0
- halib/research/perfcalc.py +60 -35
- halib/research/perftb.py +2 -1
- halib/research/plot.py +480 -218
- halib/research/viz/__init__.py +0 -0
- halib/research/viz/plot.py +754 -0
- halib/system/_list_pc.csv +6 -0
- halib/system/filesys.py +60 -20
- halib/system/path.py +106 -0
- halib/utils/dict.py +9 -0
- halib/utils/list.py +12 -0
- halib/utils/video.py +6 -0
- halib-0.2.21.dist-info/METADATA +192 -0
- halib-0.2.21.dist-info/RECORD +109 -0
- halib-0.1.91.dist-info/METADATA +0 -201
- halib-0.1.91.dist-info/RECORD +0 -61
- {halib-0.1.91.dist-info → halib-0.2.21.dist-info}/WHEEL +0 -0
- {halib-0.1.91.dist-info → halib-0.2.21.dist-info}/licenses/LICENSE.txt +0 -0
- {halib-0.1.91.dist-info → halib-0.2.21.dist-info}/top_level.txt +0 -0
halib/system/filesys.py
CHANGED
|
@@ -2,13 +2,16 @@ import glob
|
|
|
2
2
|
import os
|
|
3
3
|
import shutil
|
|
4
4
|
from distutils.dir_util import copy_tree
|
|
5
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
5
6
|
|
|
7
|
+
COMMON_IMG_EXT = ["jpg", "jpeg", "png", "bmp", "tiff", "gif"]
|
|
8
|
+
COMMON_VIDEO_EXT = ["mp4", "avi", "mov", "mkv", "flv", "wmv"]
|
|
6
9
|
|
|
7
10
|
def is_exist(path):
|
|
8
11
|
return os.path.exists(path)
|
|
9
12
|
|
|
10
13
|
|
|
11
|
-
def
|
|
14
|
+
def is_dir(path):
|
|
12
15
|
return os.path.isdir(path)
|
|
13
16
|
|
|
14
17
|
|
|
@@ -17,7 +20,7 @@ def get_current_dir():
|
|
|
17
20
|
|
|
18
21
|
|
|
19
22
|
def change_current_dir(new_dir):
|
|
20
|
-
if
|
|
23
|
+
if is_dir(new_dir):
|
|
21
24
|
os.chdir(new_dir)
|
|
22
25
|
|
|
23
26
|
|
|
@@ -64,27 +67,64 @@ def list_files(directory):
|
|
|
64
67
|
)
|
|
65
68
|
return files
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
def filter_files_by_extension(directory, ext=None, recursive=True, num_workers=0):
|
|
71
|
+
"""
|
|
72
|
+
Filters files using glob and multithreading.
|
|
73
|
+
If ext is None, returns ALL files.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
directory (str): Path to search.
|
|
77
|
+
ext (str, list, or None): Extension(s) to find. If None, return all files.
|
|
78
|
+
recursive (bool): Whether to search subdirectories.
|
|
79
|
+
num_workers (int): Number of threads for checking file existence.
|
|
80
|
+
"""
|
|
81
|
+
assert os.path.exists(directory) and os.path.isdir(
|
|
82
|
+
directory
|
|
83
|
+
), "Directory does not exist"
|
|
84
|
+
|
|
85
|
+
# 1. Normalize extensions to a tuple (only if ext is provided)
|
|
86
|
+
extensions = None
|
|
87
|
+
if ext is not None:
|
|
71
88
|
if isinstance(ext, list):
|
|
72
|
-
|
|
89
|
+
extensions = tuple(ext)
|
|
73
90
|
else:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
91
|
+
extensions = (ext,)
|
|
92
|
+
|
|
93
|
+
# 2. Define pattern
|
|
94
|
+
pattern = (
|
|
95
|
+
os.path.join(directory, "**", "*")
|
|
96
|
+
if recursive
|
|
97
|
+
else os.path.join(directory, "*")
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# 3. Helper function for the thread workers
|
|
101
|
+
def validate_file(path):
|
|
102
|
+
if os.path.isfile(path):
|
|
103
|
+
return path
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
result_files = []
|
|
107
|
+
if num_workers <= 0:
|
|
108
|
+
num_workers = os.cpu_count() or 4
|
|
109
|
+
# 4. Initialize ThreadPool with user-defined workers
|
|
110
|
+
with ThreadPoolExecutor(max_workers=num_workers) as executor:
|
|
111
|
+
# Step A: Get the iterator (lazy evaluation)
|
|
112
|
+
all_paths = glob.iglob(pattern, recursive=recursive)
|
|
113
|
+
|
|
114
|
+
# Step B: Apply Filter
|
|
115
|
+
if extensions is None:
|
|
116
|
+
# If ext is None, we skip the endswith check and pass everything
|
|
117
|
+
candidate_paths = all_paths
|
|
77
118
|
else:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
raise OSError("Directory not exists")
|
|
119
|
+
# Filter by extension string FIRST (Fast CPU op)
|
|
120
|
+
candidate_paths = (p for p in all_paths if p.endswith(extensions))
|
|
121
|
+
|
|
122
|
+
# Step C: Parallelize the disk check (Slow I/O op)
|
|
123
|
+
for result in executor.map(validate_file, candidate_paths):
|
|
124
|
+
if result:
|
|
125
|
+
result_files.append(result)
|
|
126
|
+
|
|
127
|
+
return result_files
|
|
88
128
|
|
|
89
129
|
|
|
90
130
|
def is_file(path):
|
halib/system/path.py
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
from ..common.common import *
|
|
2
|
+
from ..filetype import csvfile
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import platform
|
|
5
|
+
import re # <--- [FIX 1] Added missing import
|
|
6
|
+
import csv
|
|
7
|
+
from importlib import resources
|
|
8
|
+
|
|
9
|
+
PC_TO_ABBR = {}
|
|
10
|
+
ABBR_DISK_MAP = {}
|
|
11
|
+
pc_df = None
|
|
12
|
+
cPlatform = platform.system().lower()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def load_pc_meta_info():
|
|
16
|
+
# 1. Define the package where the file lives (dotted notation)
|
|
17
|
+
# Since the file is in 'halib/system/', the package is 'halib.system'
|
|
18
|
+
package_name = "halib.system"
|
|
19
|
+
file_name = "_list_pc.csv"
|
|
20
|
+
|
|
21
|
+
# 2. Locate the file
|
|
22
|
+
csv_path = resources.files(package_name).joinpath(file_name)
|
|
23
|
+
global PC_TO_ABBR, ABBR_DISK_MAP, pc_df
|
|
24
|
+
pc_df = pd.read_csv(csv_path, sep=';', encoding='utf-8')
|
|
25
|
+
PC_TO_ABBR = dict(zip(pc_df['pc_name'], pc_df['abbr']))
|
|
26
|
+
ABBR_DISK_MAP = dict(zip(pc_df['abbr'], pc_df['working_disk']))
|
|
27
|
+
# pprint("Loaded PC meta info:")
|
|
28
|
+
# pprint(ABBR_DISK_MAP)
|
|
29
|
+
# pprint(PC_TO_ABBR)
|
|
30
|
+
# ! must be called at the module load time
|
|
31
|
+
load_pc_meta_info()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def list_PCs(show=True):
|
|
35
|
+
global pc_df
|
|
36
|
+
if show:
|
|
37
|
+
csvfile.fn_display_df(pc_df)
|
|
38
|
+
return pc_df
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get_PC_name():
|
|
42
|
+
return platform.node()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_PC_abbr_name():
|
|
46
|
+
pc_name = get_PC_name()
|
|
47
|
+
return PC_TO_ABBR.get(pc_name, "Unknown")
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def get_os_platform():
|
|
51
|
+
return platform.system().lower()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def get_working_disk(abbr_disk_map=ABBR_DISK_MAP):
|
|
55
|
+
pc_abbr = get_PC_abbr_name()
|
|
56
|
+
return abbr_disk_map.get(pc_abbr, None)
|
|
57
|
+
|
|
58
|
+
cDisk = get_working_disk()
|
|
59
|
+
|
|
60
|
+
# ! This funcction search for full paths in the obj and normalize them according to the current platform and working disk
|
|
61
|
+
# ! E.g: "E:/zdataset/DFire", but working_disk: "D:", current_platform: "windows" => "D:/zdataset/DFire"
|
|
62
|
+
# ! E.g: "E:/zdataset/DFire", but working_disk: "D:", current_platform: "linux" => "/mnt/d/zdataset/DFire"
|
|
63
|
+
def normalize_paths(obj, working_disk=cDisk, current_platform=cPlatform):
|
|
64
|
+
# [FIX 3] Resolve defaults inside function to be safer/cleaner
|
|
65
|
+
if working_disk is None:
|
|
66
|
+
working_disk = get_working_disk()
|
|
67
|
+
if current_platform is None:
|
|
68
|
+
current_platform = get_os_platform()
|
|
69
|
+
|
|
70
|
+
# [FIX 2] If PC is unknown, working_disk is None. Return early to avoid crash.
|
|
71
|
+
if working_disk is None:
|
|
72
|
+
return obj
|
|
73
|
+
|
|
74
|
+
if isinstance(obj, dict):
|
|
75
|
+
for key, value in obj.items():
|
|
76
|
+
obj[key] = normalize_paths(value, working_disk, current_platform)
|
|
77
|
+
return obj
|
|
78
|
+
elif isinstance(obj, list):
|
|
79
|
+
for i, item in enumerate(obj):
|
|
80
|
+
obj[i] = normalize_paths(item, working_disk, current_platform)
|
|
81
|
+
return obj
|
|
82
|
+
elif isinstance(obj, str):
|
|
83
|
+
# Normalize backslashes to forward slashes for consistency
|
|
84
|
+
obj = obj.replace("\\", "/")
|
|
85
|
+
|
|
86
|
+
# Regex for Windows-style path: e.g., "E:/zdataset/DFire"
|
|
87
|
+
win_match = re.match(r"^([A-Z]):/(.*)$", obj)
|
|
88
|
+
# Regex for Linux-style path: e.g., "/mnt/e/zdataset/DFire"
|
|
89
|
+
lin_match = re.match(r"^/mnt/([a-z])/(.*)$", obj)
|
|
90
|
+
|
|
91
|
+
if win_match or lin_match:
|
|
92
|
+
rest = win_match.group(2) if win_match else lin_match.group(2)
|
|
93
|
+
|
|
94
|
+
if current_platform == "windows":
|
|
95
|
+
# working_disk is like "D:", so "D:/" + rest
|
|
96
|
+
new_path = f"{working_disk}/{rest}"
|
|
97
|
+
elif current_platform == "linux":
|
|
98
|
+
# Extract drive letter from working_disk (e.g., "D:" -> "d")
|
|
99
|
+
drive_letter = working_disk[0].lower()
|
|
100
|
+
new_path = f"/mnt/{drive_letter}/{rest}"
|
|
101
|
+
else:
|
|
102
|
+
return obj
|
|
103
|
+
return new_path
|
|
104
|
+
|
|
105
|
+
# For non-strings or non-path strings, return as is
|
|
106
|
+
return obj
|
halib/utils/dict.py
ADDED
halib/utils/list.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
def subtract(list_a, list_b):
|
|
2
|
+
return [item for item in list_a if item not in list_b]
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def union(list_a, list_b, no_duplicate=False):
|
|
6
|
+
if no_duplicate:
|
|
7
|
+
return list(set(list_a) | set(list_b))
|
|
8
|
+
else:
|
|
9
|
+
return list_a + list_b
|
|
10
|
+
|
|
11
|
+
def intersection(list_a, list_b):
|
|
12
|
+
return list(set(list_a) & set(list_b))
|
halib/utils/video.py
CHANGED
|
@@ -23,11 +23,17 @@ class VideoUtils:
|
|
|
23
23
|
# Get the FPS
|
|
24
24
|
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
25
25
|
|
|
26
|
+
# get frame size
|
|
27
|
+
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
28
|
+
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
29
|
+
|
|
26
30
|
# Release the video capture object
|
|
27
31
|
cap.release()
|
|
28
32
|
|
|
29
33
|
meta_dict = {
|
|
30
34
|
"video_path": video_path,
|
|
35
|
+
"width": width,
|
|
36
|
+
"height": height,
|
|
31
37
|
"frame_count": frame_count,
|
|
32
38
|
"fps": fps
|
|
33
39
|
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: halib
|
|
3
|
+
Version: 0.2.21
|
|
4
|
+
Summary: Small library for common tasks
|
|
5
|
+
Author: Hoang Van Ha
|
|
6
|
+
Author-email: hoangvanhauit@gmail.com
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Requires-Python: >=3.9
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
License-File: LICENSE.txt
|
|
13
|
+
Requires-Dist: arrow
|
|
14
|
+
Requires-Dist: click
|
|
15
|
+
Requires-Dist: dataclass-wizard
|
|
16
|
+
Requires-Dist: enlighten
|
|
17
|
+
Requires-Dist: itables
|
|
18
|
+
Requires-Dist: kaleido
|
|
19
|
+
Requires-Dist: loguru
|
|
20
|
+
Requires-Dist: matplotlib
|
|
21
|
+
Requires-Dist: more-itertools
|
|
22
|
+
Requires-Dist: moviepy
|
|
23
|
+
Requires-Dist: networkx
|
|
24
|
+
Requires-Dist: numpy
|
|
25
|
+
Requires-Dist: omegaconf
|
|
26
|
+
Requires-Dist: opencv-python
|
|
27
|
+
Requires-Dist: pandas
|
|
28
|
+
Requires-Dist: Pillow
|
|
29
|
+
Requires-Dist: plotly
|
|
30
|
+
Requires-Dist: Pyarrow
|
|
31
|
+
Requires-Dist: pycurl
|
|
32
|
+
Requires-Dist: pygwalker
|
|
33
|
+
Requires-Dist: python-telegram-bot
|
|
34
|
+
Requires-Dist: requests
|
|
35
|
+
Requires-Dist: rich
|
|
36
|
+
Requires-Dist: scikit-learn
|
|
37
|
+
Requires-Dist: seaborn
|
|
38
|
+
Requires-Dist: tabulate
|
|
39
|
+
Requires-Dist: timebudget
|
|
40
|
+
Requires-Dist: tqdm
|
|
41
|
+
Requires-Dist: tube_dl
|
|
42
|
+
Requires-Dist: wandb
|
|
43
|
+
Requires-Dist: ipynbname
|
|
44
|
+
Requires-Dist: typed-argument-parser
|
|
45
|
+
Dynamic: author
|
|
46
|
+
Dynamic: author-email
|
|
47
|
+
Dynamic: classifier
|
|
48
|
+
Dynamic: description
|
|
49
|
+
Dynamic: description-content-type
|
|
50
|
+
Dynamic: license-file
|
|
51
|
+
Dynamic: requires-dist
|
|
52
|
+
Dynamic: requires-python
|
|
53
|
+
Dynamic: summary
|
|
54
|
+
|
|
55
|
+
# 📦 Helper Package for Coding and Automation Changelog
|
|
56
|
+
|
|
57
|
+
## v0.2.x (Experiment & Core Updates)
|
|
58
|
+
|
|
59
|
+
### **v0.2.21**
|
|
60
|
+
- ✨ **New Feature:** Added `common.common.pprint_stack_trace` to print stack traces with optional custom messages and force stop capability.
|
|
61
|
+
|
|
62
|
+
- 🚀 **Improvement:** `exp.perf.profiler` - allow to export *report dict* as csv files for further analysis
|
|
63
|
+
|
|
64
|
+
### **v0.2.19**
|
|
65
|
+
- ✨ **New Feature:** Added `exp.core.param_gen` to facilitate fast generation of parameter combination sweeps (grid search) using YAML configurations.
|
|
66
|
+
|
|
67
|
+
### **v0.2.17**
|
|
68
|
+
- 🚀 **Improvement:** Updated `exp.perf.profiler` with an `enabled` flag for dynamic toggling.
|
|
69
|
+
- 🚀 **Improvement:** Added a `measure` context manager to simplify performance measuring of code blocks.
|
|
70
|
+
|
|
71
|
+
### **v0.2.13**
|
|
72
|
+
- ♻️ **Refactor:** Major reorganization of packages. Renamed `research` package to `exp` (Experiment Management).
|
|
73
|
+
- 🚀 **Improvement:** Updated `exp/perfcalc.py` to allow saving computed performance metrics to CSV without explicitly calling `calc_perfs`.
|
|
74
|
+
|
|
75
|
+
### **v0.2.1**
|
|
76
|
+
- ✨ **New Feature:** Added `eval_exp` method to `exp/base_exp` for running evaluations (e.g., model testing) after experiments conclude.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## v0.1.9x (Visualization & Generators)
|
|
81
|
+
|
|
82
|
+
### **v0.1.99**
|
|
83
|
+
- ✨ **New Feature:** Added `gen_ipynb_name` to `filetype/ipynb`. Generates filenames based on the current notebook name with optional timestamps.
|
|
84
|
+
|
|
85
|
+
### **v0.1.96**
|
|
86
|
+
- ✨ **New Feature:** Added `PlotHelper` class in `research/plot` for plotting training history and image grids (dataset samples or model outputs).
|
|
87
|
+
|
|
88
|
+
### **v0.1.91**
|
|
89
|
+
- ✨ **New Feature:** Added `ParamGen` class to `research/param_gen` for parsing YAML files into parameter lists for hyperparameter searches.
|
|
90
|
+
|
|
91
|
+
### **v0.1.90**
|
|
92
|
+
- ✨ **New Feature:** Added `zProfiler` class to `research/profiler` for measuring context/step execution time, supporting dynamic color scales in plots.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## v0.1.5x - v0.1.7x (Infrastructure & Utilities)
|
|
97
|
+
|
|
98
|
+
### **v0.1.77**
|
|
99
|
+
- ✨ **New Feature:** Added `BaseExp` class in `research/base_exp` to handle common experiment tasks (performance calculation, result saving).
|
|
100
|
+
|
|
101
|
+
### **v0.1.67**
|
|
102
|
+
- 🔧 **Maintenance:** Switched to **uv** for virtual environment management.
|
|
103
|
+
- 🚀 **Improvement:** Updated `research/perfcalc` to support both `torchmetrics` and custom metrics.
|
|
104
|
+
|
|
105
|
+
### **v0.1.61**
|
|
106
|
+
- ✨ **New Feature:** Added `VideoUtils` (`util/video`) for common video handling tasks.
|
|
107
|
+
- ✨ **New Feature:** Added `GPUMonitor` (`util/gpu_mon`) for tracking GPU usage and performance.
|
|
108
|
+
|
|
109
|
+
### **v0.1.59**
|
|
110
|
+
- 🔨 **Architecture:** Added `util/perfcalc` abstract base class. This requires implementation of specific performance calculation logic.
|
|
111
|
+
|
|
112
|
+
### **v0.1.55**
|
|
113
|
+
- ✨ **New Feature:** Added `util/dataclass_util` for dynamic creation of `dataclass` objects from dictionaries or YAML (supports nested structures).
|
|
114
|
+
|
|
115
|
+
### **v0.1.52**
|
|
116
|
+
- ✨ **New Feature:** Added `research/perftb` module for managing experiment performance tables (filtering by dataset, metric, etc.).
|
|
117
|
+
|
|
118
|
+
### **v0.1.50**
|
|
119
|
+
- ✨ **New Feature:** Added `pprint_local_path` to print clickable file URIs for local paths.
|
|
120
|
+
- ✨ **New Feature:** Added `research` package containing `benchquery` for dataframe benchmarking.
|
|
121
|
+
- ✨ **New Feature:** Added `wandb` module for offline syncing and batch clearing of Weights & Biases runs.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## v0.1.4x (Display & formatting)
|
|
126
|
+
|
|
127
|
+
### **v0.1.47**
|
|
128
|
+
- ✨ **New Feature:** Added `pprint_box` to print objects or strings inside a decorative box frame.
|
|
129
|
+
|
|
130
|
+
### **v0.1.46**
|
|
131
|
+
- 🐛 **Fix:** Filtered `UserWarning: Unable to import Axes3D`.
|
|
132
|
+
- 🚀 **Improvement:** Added `auto_wrap_text` to `fn_display_df` to prevent long text overflow in tables.
|
|
133
|
+
|
|
134
|
+
### **v0.1.42**
|
|
135
|
+
- ✨ **New Feature:** Added `rich_color.py` wrapper for basic color lists.
|
|
136
|
+
|
|
137
|
+
### **v0.1.41**
|
|
138
|
+
- ✨ **New Feature:** Added `rich_color.py` to support rich color information (palettes, strings) using the `rich` library.
|
|
139
|
+
|
|
140
|
+
### **v0.1.40**
|
|
141
|
+
- 🚀 **Improvement:** Updated `csvfile.py` to use `itables` and `pygwalker` for interactive dataframe display in Jupyter notebooks.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## v0.1.3x (Data & Loading)
|
|
146
|
+
|
|
147
|
+
### **v0.1.38**
|
|
148
|
+
- ✨ **New Feature:** Added `torchloader.py` to search for optimal `DataLoader` configurations (num_workers, batch_size, pin_memory).
|
|
149
|
+
|
|
150
|
+
### **v0.1.37**
|
|
151
|
+
- ✨ **New Feature:** Added `dataset.py` for splitting classification datasets into train/val/test sets.
|
|
152
|
+
|
|
153
|
+
### **v0.1.33**
|
|
154
|
+
- ✨ **New Feature:** Added `plot.py` for plotting Deep Learning training history (accuracy/loss) using `seaborn` and `matplotlib`.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## v0.1.0 - v0.1.2x (Early Utilities)
|
|
159
|
+
|
|
160
|
+
### **v0.1.29**
|
|
161
|
+
- 🐛 **Fix:** Pinned `kaleido==0.1.*` for `tele_noti` as version `0.2.*` caused image generation hangs.
|
|
162
|
+
|
|
163
|
+
### **v0.1.24**
|
|
164
|
+
- ♻️ **Refactor:** Renamed `sys` module to `system` to avoid conflicts with Python's built-in `sys`.
|
|
165
|
+
- ✨ **New Feature:** Added `tele_noti` module for Telegram notifications regarding training progress.
|
|
166
|
+
|
|
167
|
+
### **v0.1.22**
|
|
168
|
+
- ✨ **New Feature:** Added `cuda.py` to check CUDA availability for both PyTorch and TensorFlow.
|
|
169
|
+
|
|
170
|
+
### **v0.1.21**
|
|
171
|
+
- ✨ **New Feature:** Added YAML inheritance and overriding support using `networkx` and `omegaconf`.
|
|
172
|
+
|
|
173
|
+
### **v0.1.15**
|
|
174
|
+
- ✨ **New Feature:** Added common logging library and `@console_log` decorator for function tracing.
|
|
175
|
+
|
|
176
|
+
### **v0.1.10**
|
|
177
|
+
- 🐛 **Fix:** Fixed typo `is_exit` -> `is_exist` in `filesys`.
|
|
178
|
+
- 🚀 **Improvement:** Updated `gdrive` to support uploading to specific folders and returning direct shareable links.
|
|
179
|
+
|
|
180
|
+
### **v0.1.9**
|
|
181
|
+
- 🔧 **Maintenance:** Added `requirements.txt`.
|
|
182
|
+
|
|
183
|
+
### **v0.1.6 - v0.1.8**
|
|
184
|
+
- 🚀 **Performance:** Optimized table insertion by using an in-memory `row_pool_dict` before committing to the DataFrame.
|
|
185
|
+
- ✨ **New Feature:** Added `DFCreator` for manipulating DataFrames (create, insert, display, save).
|
|
186
|
+
|
|
187
|
+
### **v0.1.4 - v0.1.5**
|
|
188
|
+
- ✨ **New Feature:** Added `cmd` module.
|
|
189
|
+
- ✨ **New Feature:** Support for creating Bitbucket Projects from templates.
|
|
190
|
+
|
|
191
|
+
### **v0.1.2**
|
|
192
|
+
- ✨ **New Feature:** Added support for uploading local files to Google Drive.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
halib/__init__.py,sha256=F2Iq1I1ffjaXJ_LYEqE-MBeUJnwGGE5UHR6M5HVkFkU,1710
|
|
2
|
+
halib/common.py,sha256=9hn-IXOlGZODoBHy8U2A0aLgmPEnTeQjbzAVGwXAjwo,4242
|
|
3
|
+
halib/csvfile.py,sha256=Eoeni0NIbNG3mB5ESWAvNwhJxOjmCaPd1qqYRHImbvk,1567
|
|
4
|
+
halib/cuda.py,sha256=1bvtBY8QvTWdLaxalzK9wqXPl0Ft3AfhcrebupxGzEA,1010
|
|
5
|
+
halib/dataset.py,sha256=QU0Hr5QFb8_XlvnOMgC9QJGIpwXAZ9lDd0RdQi_QRec,6743
|
|
6
|
+
halib/filesys.py,sha256=r1SftGKM7nyw6QbY5UmcueZLkXEIleSzhui7dQsosPw,2907
|
|
7
|
+
halib/gdrive.py,sha256=p302rTv1H4gFsAlmmiUL0iKrbg09_3_dEhtm-N4WGvg,6277
|
|
8
|
+
halib/gdrive_mkdir.py,sha256=0Gq65i2YaWaGMdJqXX7zthhb0qZnNwrhdoHK6IBIVv8,1456
|
|
9
|
+
halib/gdrive_test.py,sha256=e8yOYB5MZhdHbeLzjvTcOXbJNKk_DKNWURIRkKxHBMs,1378
|
|
10
|
+
halib/jsonfile.py,sha256=9XfdFS1wcTdBRmpAGzVu2dVCcJp8RCpsSY16f6KUNts,480
|
|
11
|
+
halib/listop.py,sha256=Vpa8_2fI0wySpB2-8sfTBkyi_A4FhoFVVvFiuvW8N64,339
|
|
12
|
+
halib/plot.py,sha256=4pUJ5GeKQ1LzgiQXbAZlUqSydXSk5tt2_qsw78nSzA4,9445
|
|
13
|
+
halib/projectmake.py,sha256=8dNTxB2jgQlwvovaOnJcCKgHe5vM0nBwzm46Yc8INEI,4048
|
|
14
|
+
halib/rich_color.py,sha256=tyK5fl3Dtv1tKsfFzt_5Rco4Fj72QliA-w5aGXaVuqQ,6392
|
|
15
|
+
halib/tele_noti.py,sha256=xL8f889VFR65uVJTj1NNT3qSi3lJ7s_iDjcObwZ0-V0,5926
|
|
16
|
+
halib/textfile.py,sha256=EhVFrit-nRBJx18e6rtIqcE1cSbgsLnMXe_kdhi1EPI,399
|
|
17
|
+
halib/torchloader.py,sha256=-q9YE-AoHZE1xQX2dgNxdqtucEXYs4sQ22WXdl6EGfI,6500
|
|
18
|
+
halib/videofile.py,sha256=NTLTZ-j6YD47duw2LN2p-lDQDglYFP1LpEU_0gzHLdI,4737
|
|
19
|
+
halib/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
halib/common/common.py,sha256=iMoC5Wzj0gn_8GlxEGc0rA5r2HFJ2F1rKy0JpldGtro,5937
|
|
21
|
+
halib/common/rich_color.py,sha256=tyK5fl3Dtv1tKsfFzt_5Rco4Fj72QliA-w5aGXaVuqQ,6392
|
|
22
|
+
halib/exp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
halib/exp/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
halib/exp/core/base_config.py,sha256=Js2oVDt7qwT7eV_sOUWw6XXl569G1bX6ls-VYAx2gWY,5032
|
|
25
|
+
halib/exp/core/base_exp.py,sha256=fknJVmW6ubbapOggbkrbNWgc1ZXcUz_FE3wMyuIGX7M,5180
|
|
26
|
+
halib/exp/core/param_gen.py,sha256=_JjakBOr0UuJOxR11ZC-mrX7ye5kdc1SfGLZuYFmG1o,7385
|
|
27
|
+
halib/exp/core/wandb_op.py,sha256=powL2QyLBqF-6PUGAOqd60s1npHLLKJxPns3S4hKeNo,4160
|
|
28
|
+
halib/exp/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
+
halib/exp/data/dataclass_util.py,sha256=OPZzqmug0be4JEq0hJ68pKjnyl0PRYQMVJGhKw1kvyk,1382
|
|
30
|
+
halib/exp/data/dataset.py,sha256=hm7CDTmudo_KV21RF0TQknHsw44PKhlMoBs9i8WIq6k,6743
|
|
31
|
+
halib/exp/data/torchloader.py,sha256=oWUplXlGd1IB6CqdRd-mGe-DfMjjZxz9hQ7SWONb-0s,6519
|
|
32
|
+
halib/exp/perf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
+
halib/exp/perf/flop_calc.py,sha256=Kb3Gwqc7QtGALZzfyYXBA_9SioReJpTJdUX84kqj-Aw,6907
|
|
34
|
+
halib/exp/perf/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
|
35
|
+
halib/exp/perf/perfcalc.py,sha256=p7rhVShiie7DT_s50lbvbGftVCkrWE0tQGFLUEmTXi0,18326
|
|
36
|
+
halib/exp/perf/perfmetrics.py,sha256=qRiNiCKGUSTLY7gPMVMuVHGAAyeosfGWup2eM4490aw,5485
|
|
37
|
+
halib/exp/perf/perftb.py,sha256=IWElg3OB5dmhfxnY8pMZvkL2y_EnvLmEx3gJlpUR1Fs,31066
|
|
38
|
+
halib/exp/perf/profiler.py,sha256=Nx-Y1V3pCbaEOisY1sDT8s0yGFs3J6TUmutZslseoNI,19201
|
|
39
|
+
halib/exp/viz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
|
+
halib/exp/viz/plot.py,sha256=51FhD1mH4nthTrY3K4mrO5pxI5AzvHXpZy5_ToqkYHs,28580
|
|
41
|
+
halib/filetype/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
+
halib/filetype/csvfile.py,sha256=dwWM1LglQr1SaSWq2KDl93fYzQn1638JGo_l1GbBhbk,6460
|
|
43
|
+
halib/filetype/ipynb.py,sha256=pd2LgmPa7ZbF0YlQJbeQZEsl6jHQUSoyVtkCT7WhU5Q,1657
|
|
44
|
+
halib/filetype/jsonfile.py,sha256=2HcBqXYjLNvqFok3PHOgH59vlhDCZLZpt7ezvgx1TFM,474
|
|
45
|
+
halib/filetype/textfile.py,sha256=3koEFyVme1SEHdud7TnjArHndoiqfMGfMdYY3NIFegM,397
|
|
46
|
+
halib/filetype/videofile.py,sha256=h7FfOA212lgTbVrbrJYXMA1Chn3FYkXD_WEEt3odtn4,9097
|
|
47
|
+
halib/filetype/yamlfile.py,sha256=buvj016n3wmEBDfeDX9lbljqDk5R5OlKHuXDKSfIKK0,2411
|
|
48
|
+
halib/online/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
halib/online/gdrive.py,sha256=RmF4y6UPxektkKIctmfT-pKWZsBM9FVUeld6zZmJkp0,7787
|
|
50
|
+
halib/online/gdrive_mkdir.py,sha256=wSJkQMJCDuS1gxQ2lHQHq_IrJ4xR_SEoPSo9n_2WNFU,1474
|
|
51
|
+
halib/online/gdrive_test.py,sha256=hMWzz4RqZwETHp4GG4WwVNFfYvFQhp2Boz5t-DqwMo0,1342
|
|
52
|
+
halib/online/projectmake.py,sha256=-WhJNmM6RpAfnWcQeinDBFjRKig165l7uqBk-XQwcbA,4036
|
|
53
|
+
halib/online/tele_noti.py,sha256=ErR5ys8gHmdjjDfSfVJxBIbPxgH7QD0oNRQgZweGi4s,5941
|
|
54
|
+
halib/research/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
+
halib/research/base_config.py,sha256=AqZHZ0NNQ3WmUOfRzs36lf3o0FrehSdVLbdmgNpbV7A,2833
|
|
56
|
+
halib/research/base_exp.py,sha256=mC2bcG3M-dIvAkLw3d4O4Nu0HyvfrmvHvHX4iW8qurY,5749
|
|
57
|
+
halib/research/benchquery.py,sha256=FuKnbWQtCEoRRtJAfN-zaN-jPiO_EzsakmTOMiqi7GQ,4626
|
|
58
|
+
halib/research/dataset.py,sha256=X6lob-pcndC2aOP0fQ3z8aUnNVVR95ia4tiuxIAXppk,6734
|
|
59
|
+
halib/research/flop_csv.py,sha256=JeIUWgPFmhkPqvmhe-MLwwvAu9yR5F2k3qaViJCJJD4,1148
|
|
60
|
+
halib/research/flops.py,sha256=Us0VudX8QMOm7YenICGf-Tq57C_l9x9hj-MUGA8_hCg,5773
|
|
61
|
+
halib/research/metrics.py,sha256=qRiNiCKGUSTLY7gPMVMuVHGAAyeosfGWup2eM4490aw,5485
|
|
62
|
+
halib/research/mics.py,sha256=kFl7IsZP1N-qkogvuFojkDNr1Qf0kce9h--qOnJ_3gk,2637
|
|
63
|
+
halib/research/params_gen.py,sha256=GcTMlniL0iE3HalJY-gVRiYa8Qy8u6nX4LkKZeMkct8,4262
|
|
64
|
+
halib/research/perfcalc.py,sha256=gjQh1D7CyEjocX5rusAzygyGFrb_s9Ob3Lqs4lIDGxg,16228
|
|
65
|
+
halib/research/perftb.py,sha256=YlBXMeWn8S0LhsgxONEQZrKomRTju2T8QGGspUOy_6Y,31100
|
|
66
|
+
halib/research/plot.py,sha256=GBCXP1QnzRlNqjAl9UvGvW3I9II61DBStJNQThrLy38,28578
|
|
67
|
+
halib/research/profiler.py,sha256=GRAewTo0jGkOputjmRwtYVfJYBze_ivsOnrW9exWkPQ,11772
|
|
68
|
+
halib/research/torchloader.py,sha256=yqUjcSiME6H5W210363HyRUrOi3ISpUFAFkTr1w4DCw,6503
|
|
69
|
+
halib/research/wandb_op.py,sha256=YzLEqME5kIRxi3VvjFkW83wnFrsn92oYeqYuNwtYRkY,4188
|
|
70
|
+
halib/research/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
+
halib/research/core/base_config.py,sha256=FXYFFGKry-HwNrjlPlTeTB-ROhM1Bow5Xxems2fdW5k,4204
|
|
72
|
+
halib/research/core/base_exp.py,sha256=6CpuTP43NA7gE5JUN4V_-UAKHrlzLPJNI8piCBh3p1s,5734
|
|
73
|
+
halib/research/core/param_gen.py,sha256=I9JHrDCaep4CjvApDoX0QzFuw38zMC2PsDFueuA7pjM,4271
|
|
74
|
+
halib/research/core/wandb_op.py,sha256=powL2QyLBqF-6PUGAOqd60s1npHLLKJxPns3S4hKeNo,4160
|
|
75
|
+
halib/research/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
+
halib/research/data/dataclass_util.py,sha256=OPZzqmug0be4JEq0hJ68pKjnyl0PRYQMVJGhKw1kvyk,1382
|
|
77
|
+
halib/research/data/dataset.py,sha256=hm7CDTmudo_KV21RF0TQknHsw44PKhlMoBs9i8WIq6k,6743
|
|
78
|
+
halib/research/data/torchloader.py,sha256=oWUplXlGd1IB6CqdRd-mGe-DfMjjZxz9hQ7SWONb-0s,6519
|
|
79
|
+
halib/research/perf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
80
|
+
halib/research/perf/flop_calc.py,sha256=Kb3Gwqc7QtGALZzfyYXBA_9SioReJpTJdUX84kqj-Aw,6907
|
|
81
|
+
halib/research/perf/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
|
82
|
+
halib/research/perf/perfcalc.py,sha256=FSWDStz9f94dObyAHYHRtq4fuo0dIw7l9JH_x5Wd7cQ,16225
|
|
83
|
+
halib/research/perf/perfmetrics.py,sha256=qRiNiCKGUSTLY7gPMVMuVHGAAyeosfGWup2eM4490aw,5485
|
|
84
|
+
halib/research/perf/perftb.py,sha256=IWElg3OB5dmhfxnY8pMZvkL2y_EnvLmEx3gJlpUR1Fs,31066
|
|
85
|
+
halib/research/perf/profiler.py,sha256=5ZjES8kAqEsSV1mC3Yr_1ivFLwQDc_yv4HY7dKt_AS0,11782
|
|
86
|
+
halib/research/viz/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
87
|
+
halib/research/viz/plot.py,sha256=51FhD1mH4nthTrY3K4mrO5pxI5AzvHXpZy5_ToqkYHs,28580
|
|
88
|
+
halib/sys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
89
|
+
halib/sys/cmd.py,sha256=b2x7JPcNnFjLGheIESVYvqAb-w2UwBM1PAwYxMZ5YjA,228
|
|
90
|
+
halib/sys/filesys.py,sha256=ERpnELLDKJoTIIKf-AajgkY62nID4qmqmX5TkE95APU,2931
|
|
91
|
+
halib/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
|
+
halib/system/_list_pc.csv,sha256=r8RwxDWYEeNkPCQBs8dOC8cWgBpa3OULZobwb1feuWg,172
|
|
93
|
+
halib/system/cmd.py,sha256=b2x7JPcNnFjLGheIESVYvqAb-w2UwBM1PAwYxMZ5YjA,228
|
|
94
|
+
halib/system/filesys.py,sha256=102J2fkQhmH1_-HQVy2FQ4NOU8LTjMWV3hToT_APtq8,4401
|
|
95
|
+
halib/system/path.py,sha256=k_pveq41uXEzKPU2KTIdqjUSb4MVM-hCFXHGeO-6x6Q,3694
|
|
96
|
+
halib/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
97
|
+
halib/utils/dataclass_util.py,sha256=rj2IMLlUzbm2OlF5_B2dRTk9njZOaF7tTjYkOsq8uLY,1416
|
|
98
|
+
halib/utils/dict.py,sha256=wYE6Iw-_CnCWdMg9tpJ2Y2-e2ESkW9FxmdBkZkbUh80,299
|
|
99
|
+
halib/utils/dict_op.py,sha256=wYE6Iw-_CnCWdMg9tpJ2Y2-e2ESkW9FxmdBkZkbUh80,299
|
|
100
|
+
halib/utils/gpu_mon.py,sha256=vD41_ZnmPLKguuq9X44SB_vwd9JrblO4BDzHLXZhhFY,2233
|
|
101
|
+
halib/utils/list.py,sha256=BM-8sRhYyqF7bh4p7TQtV7P_gnFruUCA6DTUOombaZg,337
|
|
102
|
+
halib/utils/listop.py,sha256=Vpa8_2fI0wySpB2-8sfTBkyi_A4FhoFVVvFiuvW8N64,339
|
|
103
|
+
halib/utils/tele_noti.py,sha256=-4WXZelCA4W9BroapkRyIdUu9cUVrcJJhegnMs_WpGU,5928
|
|
104
|
+
halib/utils/video.py,sha256=zLoj5EHk4SmP9OnoHjO8mLbzPdtq6gQPzTQisOEDdO8,3261
|
|
105
|
+
halib-0.2.21.dist-info/licenses/LICENSE.txt,sha256=qZssdna4aETiR8znYsShUjidu-U4jUT9Q-EWNlZ9yBQ,1100
|
|
106
|
+
halib-0.2.21.dist-info/METADATA,sha256=cADukwK5Nxve5oqMTadeSYQUBOuEHUhkePS3i8dtqrs,7590
|
|
107
|
+
halib-0.2.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
108
|
+
halib-0.2.21.dist-info/top_level.txt,sha256=7AD6PLaQTreE0Fn44mdZsoHBe_Zdd7GUmjsWPyQ7I-k,6
|
|
109
|
+
halib-0.2.21.dist-info/RECORD,,
|