Upload edit\Qwen3-TTS-test\.venv\Lib\site-packages\joblib\numpy_pickle_utils.py with huggingface_hub
Browse files
edit//Qwen3-TTS-test//.venv//Lib//site-packages//joblib//numpy_pickle_utils.py
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Utilities for fast persistence of big data, with optional compression."""
|
| 2 |
+
|
| 3 |
+
# Author: Gael Varoquaux <gael dot varoquaux at normalesup dot org>
|
| 4 |
+
# Copyright (c) 2009 Gael Varoquaux
|
| 5 |
+
# License: BSD Style, 3 clauses.
|
| 6 |
+
|
| 7 |
+
import contextlib
|
| 8 |
+
import io
|
| 9 |
+
import pickle
|
| 10 |
+
import sys
|
| 11 |
+
import warnings
|
| 12 |
+
|
| 13 |
+
from .compressor import _COMPRESSORS, _ZFILE_PREFIX
|
| 14 |
+
|
| 15 |
+
try:
|
| 16 |
+
import numpy as np
|
| 17 |
+
except ImportError:
|
| 18 |
+
np = None
|
| 19 |
+
|
| 20 |
+
Unpickler = pickle._Unpickler
|
| 21 |
+
Pickler = pickle._Pickler
|
| 22 |
+
xrange = range
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
try:
|
| 26 |
+
# The python standard library can be built without bz2 so we make bz2
|
| 27 |
+
# usage optional.
|
| 28 |
+
# see https://github.com/scikit-learn/scikit-learn/issues/7526 for more
|
| 29 |
+
# details.
|
| 30 |
+
import bz2
|
| 31 |
+
except ImportError:
|
| 32 |
+
bz2 = None
|
| 33 |
+
|
| 34 |
+
# Buffer size used in io.BufferedReader and io.BufferedWriter
|
| 35 |
+
_IO_BUFFER_SIZE = 1024**2
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
def _is_raw_file(fileobj):
|
| 39 |
+
"""Check if fileobj is a raw file object, e.g created with open."""
|
| 40 |
+
fileobj = getattr(fileobj, "raw", fileobj)
|
| 41 |
+
return isinstance(fileobj, io.FileIO)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
def _get_prefixes_max_len():
|
| 45 |
+
# Compute the max prefix len of registered compressors.
|
| 46 |
+
prefixes = [len(compressor.prefix) for compressor in _COMPRESSORS.values()]
|
| 47 |
+
prefixes += [len(_ZFILE_PREFIX)]
|
| 48 |
+
return max(prefixes)
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def _is_numpy_array_byte_order_mismatch(array):
|
| 52 |
+
"""Check if numpy array is having byte order mismatch"""
|
| 53 |
+
return (
|
| 54 |
+
sys.byteorder == "big"
|
| 55 |
+
and (
|
| 56 |
+
array.dtype.byteorder == "<"
|
| 57 |
+
or (
|
| 58 |
+
array.dtype.byteorder == "|"
|
| 59 |
+
and array.dtype.fields
|
| 60 |
+
and all(e[0].byteorder == "<" for e in array.dtype.fields.values())
|
| 61 |
+
)
|
| 62 |
+
)
|
| 63 |
+
) or (
|
| 64 |
+
sys.byteorder == "little"
|
| 65 |
+
and (
|
| 66 |
+
array.dtype.byteorder == ">"
|
| 67 |
+
or (
|
| 68 |
+
array.dtype.byteorder == "|"
|
| 69 |
+
and array.dtype.fields
|
| 70 |
+
and all(e[0].byteorder == ">" for e in array.dtype.fields.values())
|
| 71 |
+
)
|
| 72 |
+
)
|
| 73 |
+
)
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def _ensure_native_byte_order(array):
|
| 77 |
+
"""Use the byte order of the host while preserving values
|
| 78 |
+
|
| 79 |
+
Does nothing if array already uses the system byte order.
|
| 80 |
+
"""
|
| 81 |
+
if _is_numpy_array_byte_order_mismatch(array):
|
| 82 |
+
array = array.byteswap().view(array.dtype.newbyteorder("="))
|
| 83 |
+
return array
|
| 84 |
+
|
| 85 |
+
|
| 86 |
+
###############################################################################
|
| 87 |
+
# Cache file utilities
|
| 88 |
+
def _detect_compressor(fileobj):
|
| 89 |
+
"""Return the compressor matching fileobj.
|
| 90 |
+
|
| 91 |
+
Parameters
|
| 92 |
+
----------
|
| 93 |
+
fileobj: file object
|
| 94 |
+
|
| 95 |
+
Returns
|
| 96 |
+
-------
|
| 97 |
+
str in {'zlib', 'gzip', 'bz2', 'lzma', 'xz', 'compat', 'not-compressed'}
|
| 98 |
+
"""
|
| 99 |
+
# Read the magic number in the first bytes of the file.
|
| 100 |
+
max_prefix_len = _get_prefixes_max_len()
|
| 101 |
+
if hasattr(fileobj, "peek"):
|
| 102 |
+
# Peek allows to read those bytes without moving the cursor in the
|
| 103 |
+
# file which.
|
| 104 |
+
first_bytes = fileobj.peek(max_prefix_len)
|
| 105 |
+
else:
|
| 106 |
+
# Fallback to seek if the fileobject is not peekable.
|
| 107 |
+
first_bytes = fileobj.read(max_prefix_len)
|
| 108 |
+
fileobj.seek(0)
|
| 109 |
+
|
| 110 |
+
if first_bytes.startswith(_ZFILE_PREFIX):
|
| 111 |
+
return "compat"
|
| 112 |
+
else:
|
| 113 |
+
for name, compressor in _COMPRESSORS.items():
|
| 114 |
+
if first_bytes.startswith(compressor.prefix):
|
| 115 |
+
return name
|
| 116 |
+
|
| 117 |
+
return "not-compressed"
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def _buffered_read_file(fobj):
|
| 121 |
+
"""Return a buffered version of a read file object."""
|
| 122 |
+
return io.BufferedReader(fobj, buffer_size=_IO_BUFFER_SIZE)
|
| 123 |
+
|
| 124 |
+
|
| 125 |
+
def _buffered_write_file(fobj):
|
| 126 |
+
"""Return a buffered version of a write file object."""
|
| 127 |
+
return io.BufferedWriter(fobj, buffer_size=_IO_BUFFER_SIZE)
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
@contextlib.contextmanager
|
| 131 |
+
def _validate_fileobject_and_memmap(fileobj, filename, mmap_mode=None):
|
| 132 |
+
"""Utility function opening the right fileobject from a filename.
|
| 133 |
+
|
| 134 |
+
The magic number is used to choose between the type of file object to open:
|
| 135 |
+
* regular file object (default)
|
| 136 |
+
* zlib file object
|
| 137 |
+
* gzip file object
|
| 138 |
+
* bz2 file object
|
| 139 |
+
* lzma file object (for xz and lzma compressor)
|
| 140 |
+
|
| 141 |
+
Parameters
|
| 142 |
+
----------
|
| 143 |
+
fileobj: file object
|
| 144 |
+
filename: str
|
| 145 |
+
filename path corresponding to the fileobj parameter.
|
| 146 |
+
mmap_mode: str
|
| 147 |
+
memory map mode that should be used to open the pickle file. This
|
| 148 |
+
parameter is useful to verify that the user is not trying to one with
|
| 149 |
+
compression. Default: None.
|
| 150 |
+
|
| 151 |
+
Returns
|
| 152 |
+
-------
|
| 153 |
+
a tuple with a file like object, and the validated mmap_mode.
|
| 154 |
+
|
| 155 |
+
"""
|
| 156 |
+
# Detect if the fileobj contains compressed data.
|
| 157 |
+
compressor = _detect_compressor(fileobj)
|
| 158 |
+
validated_mmap_mode = mmap_mode
|
| 159 |
+
|
| 160 |
+
if compressor == "compat":
|
| 161 |
+
# Compatibility with old pickle mode: simply return the input
|
| 162 |
+
# filename "as-is" and let the compatibility function be called by the
|
| 163 |
+
# caller.
|
| 164 |
+
warnings.warn(
|
| 165 |
+
"The file '%s' has been generated with a joblib "
|
| 166 |
+
"version less than 0.10. "
|
| 167 |
+
"Please regenerate this pickle file." % filename,
|
| 168 |
+
DeprecationWarning,
|
| 169 |
+
stacklevel=2,
|
| 170 |
+
)
|
| 171 |
+
yield filename, validated_mmap_mode
|
| 172 |
+
else:
|
| 173 |
+
if compressor in _COMPRESSORS:
|
| 174 |
+
# based on the compressor detected in the file, we open the
|
| 175 |
+
# correct decompressor file object, wrapped in a buffer.
|
| 176 |
+
compressor_wrapper = _COMPRESSORS[compressor]
|
| 177 |
+
inst = compressor_wrapper.decompressor_file(fileobj)
|
| 178 |
+
fileobj = _buffered_read_file(inst)
|
| 179 |
+
|
| 180 |
+
# Checking if incompatible load parameters with the type of file:
|
| 181 |
+
# mmap_mode cannot be used with compressed file or in memory buffers
|
| 182 |
+
# such as io.BytesIO.
|
| 183 |
+
if mmap_mode is not None:
|
| 184 |
+
validated_mmap_mode = None
|
| 185 |
+
if isinstance(fileobj, io.BytesIO):
|
| 186 |
+
warnings.warn(
|
| 187 |
+
"In memory persistence is not compatible with "
|
| 188 |
+
'mmap_mode "%(mmap_mode)s" flag passed. '
|
| 189 |
+
"mmap_mode option will be ignored." % locals(),
|
| 190 |
+
stacklevel=2,
|
| 191 |
+
)
|
| 192 |
+
elif compressor != "not-compressed":
|
| 193 |
+
warnings.warn(
|
| 194 |
+
'mmap_mode "%(mmap_mode)s" is not compatible '
|
| 195 |
+
"with compressed file %(filename)s. "
|
| 196 |
+
'"%(mmap_mode)s" flag will be ignored.' % locals(),
|
| 197 |
+
stacklevel=2,
|
| 198 |
+
)
|
| 199 |
+
elif not _is_raw_file(fileobj):
|
| 200 |
+
warnings.warn(
|
| 201 |
+
'"%(fileobj)r" is not a raw file, mmap_mode '
|
| 202 |
+
'"%(mmap_mode)s" flag will be ignored.' % locals(),
|
| 203 |
+
stacklevel=2,
|
| 204 |
+
)
|
| 205 |
+
else:
|
| 206 |
+
validated_mmap_mode = mmap_mode
|
| 207 |
+
|
| 208 |
+
yield fileobj, validated_mmap_mode
|
| 209 |
+
|
| 210 |
+
|
| 211 |
+
def _write_fileobject(filename, compress=("zlib", 3)):
|
| 212 |
+
"""Return the right compressor file object in write mode."""
|
| 213 |
+
compressmethod = compress[0]
|
| 214 |
+
compresslevel = compress[1]
|
| 215 |
+
|
| 216 |
+
if compressmethod in _COMPRESSORS.keys():
|
| 217 |
+
file_instance = _COMPRESSORS[compressmethod].compressor_file(
|
| 218 |
+
filename, compresslevel=compresslevel
|
| 219 |
+
)
|
| 220 |
+
return _buffered_write_file(file_instance)
|
| 221 |
+
else:
|
| 222 |
+
file_instance = _COMPRESSORS["zlib"].compressor_file(
|
| 223 |
+
filename, compresslevel=compresslevel
|
| 224 |
+
)
|
| 225 |
+
return _buffered_write_file(file_instance)
|
| 226 |
+
|
| 227 |
+
|
| 228 |
+
# Utility functions/variables from numpy required for writing arrays.
|
| 229 |
+
# We need at least the functions introduced in version 1.9 of numpy. Here,
|
| 230 |
+
# we use the ones from numpy 1.10.2.
|
| 231 |
+
BUFFER_SIZE = 2**18 # size of buffer for reading npz files in bytes
|
| 232 |
+
|
| 233 |
+
|
| 234 |
+
def _read_bytes(fp, size, error_template="ran out of data"):
|
| 235 |
+
"""Read from file-like object until size bytes are read.
|
| 236 |
+
|
| 237 |
+
TODO python2_drop: is it still needed? The docstring mentions python 2.6
|
| 238 |
+
and it looks like this can be at least simplified ...
|
| 239 |
+
|
| 240 |
+
Raises ValueError if not EOF is encountered before size bytes are read.
|
| 241 |
+
Non-blocking objects only supported if they derive from io objects.
|
| 242 |
+
|
| 243 |
+
Required as e.g. ZipExtFile in python 2.6 can return less data than
|
| 244 |
+
requested.
|
| 245 |
+
|
| 246 |
+
This function was taken from numpy/lib/format.py in version 1.10.2.
|
| 247 |
+
|
| 248 |
+
Parameters
|
| 249 |
+
----------
|
| 250 |
+
fp: file-like object
|
| 251 |
+
size: int
|
| 252 |
+
error_template: str
|
| 253 |
+
|
| 254 |
+
Returns
|
| 255 |
+
-------
|
| 256 |
+
a bytes object
|
| 257 |
+
The data read in bytes.
|
| 258 |
+
|
| 259 |
+
"""
|
| 260 |
+
data = bytes()
|
| 261 |
+
while True:
|
| 262 |
+
# io files (default in python3) return None or raise on
|
| 263 |
+
# would-block, python2 file will truncate, probably nothing can be
|
| 264 |
+
# done about that. note that regular files can't be non-blocking
|
| 265 |
+
try:
|
| 266 |
+
r = fp.read(size - len(data))
|
| 267 |
+
data += r
|
| 268 |
+
if len(r) == 0 or len(data) == size:
|
| 269 |
+
break
|
| 270 |
+
except io.BlockingIOError:
|
| 271 |
+
pass
|
| 272 |
+
if len(data) != size:
|
| 273 |
+
msg = "EOF: reading %s, expected %d bytes got %d"
|
| 274 |
+
raise ValueError(msg % (error_template, size, len(data)))
|
| 275 |
+
else:
|
| 276 |
+
return data
|
| 277 |
+
|
| 278 |
+
|
| 279 |
+
def _reconstruct(*args, **kwargs):
|
| 280 |
+
# Wrapper for numpy._core.multiarray._reconstruct with backward compat
|
| 281 |
+
# for numpy 1.X
|
| 282 |
+
#
|
| 283 |
+
# XXX: Remove this function when numpy 1.X is not supported anymore
|
| 284 |
+
|
| 285 |
+
np_major_version = np.__version__[:2]
|
| 286 |
+
if np_major_version == "1.":
|
| 287 |
+
from numpy.core.multiarray import _reconstruct as np_reconstruct
|
| 288 |
+
elif np_major_version == "2.":
|
| 289 |
+
from numpy._core.multiarray import _reconstruct as np_reconstruct
|
| 290 |
+
|
| 291 |
+
return np_reconstruct(*args, **kwargs)
|