ztensor 0.1.2__py3-none-win32.whl → 0.1.4__py3-none-win32.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 ztensor might be problematic. Click here for more details.
- ztensor/__init__.py +108 -2
- ztensor/ztensor/ffi.py +4 -4
- ztensor/ztensor/ztensor.dll +0 -0
- {ztensor-0.1.2.dist-info → ztensor-0.1.4.dist-info}/METADATA +1 -1
- ztensor-0.1.4.dist-info/RECORD +8 -0
- {ztensor-0.1.2.dist-info → ztensor-0.1.4.dist-info}/WHEEL +1 -1
- ztensor-0.1.2.dist-info/RECORD +0 -8
- {ztensor-0.1.2.dist-info → ztensor-0.1.4.dist-info}/licenses/LICENSE +0 -0
ztensor/__init__.py
CHANGED
|
@@ -92,12 +92,23 @@ class TensorMetadata:
|
|
|
92
92
|
def __init__(self, meta_ptr):
|
|
93
93
|
self._ptr = ffi.gc(meta_ptr, lib.ztensor_metadata_free)
|
|
94
94
|
_check_ptr(self._ptr, "TensorMetadata constructor")
|
|
95
|
+
# Cache for properties to avoid repeated FFI calls
|
|
95
96
|
self._name = None
|
|
96
97
|
self._dtype_str = None
|
|
97
98
|
self._shape = None
|
|
99
|
+
self._offset = None
|
|
100
|
+
self._size = None
|
|
101
|
+
self._layout = None
|
|
102
|
+
self._encoding = None
|
|
103
|
+
self._endianness = "not_checked"
|
|
104
|
+
self._checksum = "not_checked"
|
|
105
|
+
|
|
106
|
+
def __repr__(self):
|
|
107
|
+
return f"<TensorMetadata name='{self.name}' shape={self.shape} dtype='{self.dtype_str}'>"
|
|
98
108
|
|
|
99
109
|
@property
|
|
100
110
|
def name(self):
|
|
111
|
+
"""The name of the tensor."""
|
|
101
112
|
if self._name is None:
|
|
102
113
|
name_ptr = lib.ztensor_metadata_get_name(self._ptr)
|
|
103
114
|
_check_ptr(name_ptr, "get_name")
|
|
@@ -107,6 +118,7 @@ class TensorMetadata:
|
|
|
107
118
|
|
|
108
119
|
@property
|
|
109
120
|
def dtype_str(self):
|
|
121
|
+
"""The zTensor dtype string (e.g., 'float32')."""
|
|
110
122
|
if self._dtype_str is None:
|
|
111
123
|
dtype_ptr = lib.ztensor_metadata_get_dtype_str(self._ptr)
|
|
112
124
|
_check_ptr(dtype_ptr, "get_dtype_str")
|
|
@@ -116,7 +128,7 @@ class TensorMetadata:
|
|
|
116
128
|
|
|
117
129
|
@property
|
|
118
130
|
def dtype(self):
|
|
119
|
-
"""
|
|
131
|
+
"""The numpy dtype for this tensor."""
|
|
120
132
|
dtype_str = self.dtype_str
|
|
121
133
|
dt = DTYPE_ZT_TO_NP.get(dtype_str)
|
|
122
134
|
if dt is None:
|
|
@@ -130,6 +142,7 @@ class TensorMetadata:
|
|
|
130
142
|
|
|
131
143
|
@property
|
|
132
144
|
def shape(self):
|
|
145
|
+
"""The shape of the tensor as a tuple."""
|
|
133
146
|
if self._shape is None:
|
|
134
147
|
shape_len = lib.ztensor_metadata_get_shape_len(self._ptr)
|
|
135
148
|
if shape_len > 0:
|
|
@@ -141,6 +154,64 @@ class TensorMetadata:
|
|
|
141
154
|
self._shape = tuple()
|
|
142
155
|
return self._shape
|
|
143
156
|
|
|
157
|
+
@property
|
|
158
|
+
def offset(self):
|
|
159
|
+
"""The on-disk offset of the tensor data in bytes."""
|
|
160
|
+
if self._offset is None:
|
|
161
|
+
self._offset = lib.ztensor_metadata_get_offset(self._ptr)
|
|
162
|
+
return self._offset
|
|
163
|
+
|
|
164
|
+
@property
|
|
165
|
+
def size(self):
|
|
166
|
+
"""The on-disk size of the tensor data in bytes (can be compressed size)."""
|
|
167
|
+
if self._size is None:
|
|
168
|
+
self._size = lib.ztensor_metadata_get_size(self._ptr)
|
|
169
|
+
return self._size
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def layout(self):
|
|
173
|
+
"""The tensor layout as a string (e.g., 'dense')."""
|
|
174
|
+
if self._layout is None:
|
|
175
|
+
layout_ptr = lib.ztensor_metadata_get_layout_str(self._ptr)
|
|
176
|
+
_check_ptr(layout_ptr, "get_layout_str")
|
|
177
|
+
self._layout = ffi.string(layout_ptr).decode('utf-8')
|
|
178
|
+
lib.ztensor_free_string(layout_ptr)
|
|
179
|
+
return self._layout
|
|
180
|
+
|
|
181
|
+
@property
|
|
182
|
+
def encoding(self):
|
|
183
|
+
"""The tensor encoding as a string (e.g., 'raw', 'zstd')."""
|
|
184
|
+
if self._encoding is None:
|
|
185
|
+
encoding_ptr = lib.ztensor_metadata_get_encoding_str(self._ptr)
|
|
186
|
+
_check_ptr(encoding_ptr, "get_encoding_str")
|
|
187
|
+
self._encoding = ffi.string(encoding_ptr).decode('utf-8')
|
|
188
|
+
lib.ztensor_free_string(encoding_ptr)
|
|
189
|
+
return self._encoding
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def endianness(self):
|
|
193
|
+
"""The data endianness ('little', 'big') if applicable, else None."""
|
|
194
|
+
if self._endianness == "not_checked":
|
|
195
|
+
endian_ptr = lib.ztensor_metadata_get_data_endianness_str(self._ptr)
|
|
196
|
+
if endian_ptr == ffi.NULL:
|
|
197
|
+
self._endianness = None
|
|
198
|
+
else:
|
|
199
|
+
self._endianness = ffi.string(endian_ptr).decode('utf-8')
|
|
200
|
+
lib.ztensor_free_string(endian_ptr)
|
|
201
|
+
return self._endianness
|
|
202
|
+
|
|
203
|
+
@property
|
|
204
|
+
def checksum(self):
|
|
205
|
+
"""The checksum string if present, else None."""
|
|
206
|
+
if self._checksum == "not_checked":
|
|
207
|
+
checksum_ptr = lib.ztensor_metadata_get_checksum_str(self._ptr)
|
|
208
|
+
if checksum_ptr == ffi.NULL:
|
|
209
|
+
self._checksum = None
|
|
210
|
+
else:
|
|
211
|
+
self._checksum = ffi.string(checksum_ptr).decode('utf-8')
|
|
212
|
+
lib.ztensor_free_string(checksum_ptr)
|
|
213
|
+
return self._checksum
|
|
214
|
+
|
|
144
215
|
|
|
145
216
|
class Reader:
|
|
146
217
|
"""A Pythonic context manager for reading zTensor files."""
|
|
@@ -157,6 +228,39 @@ class Reader:
|
|
|
157
228
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
158
229
|
self._ptr = None
|
|
159
230
|
|
|
231
|
+
def __len__(self):
|
|
232
|
+
"""Returns the number of tensors in the file."""
|
|
233
|
+
if self._ptr is None: raise ZTensorError("Reader is closed.")
|
|
234
|
+
return lib.ztensor_reader_get_metadata_count(self._ptr)
|
|
235
|
+
|
|
236
|
+
def __iter__(self):
|
|
237
|
+
"""Iterates over the metadata of all tensors in the file."""
|
|
238
|
+
if self._ptr is None: raise ZTensorError("Reader is closed.")
|
|
239
|
+
for i in range(len(self)):
|
|
240
|
+
yield self[i]
|
|
241
|
+
|
|
242
|
+
def __getitem__(self, index: int) -> TensorMetadata:
|
|
243
|
+
"""Retrieves metadata for a tensor by its index."""
|
|
244
|
+
if self._ptr is None: raise ZTensorError("Reader is closed.")
|
|
245
|
+
if index >= len(self):
|
|
246
|
+
raise IndexError("Tensor index out of range")
|
|
247
|
+
meta_ptr = lib.ztensor_reader_get_metadata_by_index(self._ptr, index)
|
|
248
|
+
_check_ptr(meta_ptr, f"get_metadata_by_index: {index}")
|
|
249
|
+
return TensorMetadata(meta_ptr)
|
|
250
|
+
|
|
251
|
+
def list_tensors(self) -> list[TensorMetadata]:
|
|
252
|
+
"""Returns a list of all TensorMetadata objects in the file."""
|
|
253
|
+
return list(self)
|
|
254
|
+
|
|
255
|
+
def get_tensor_names(self) -> list[str]:
|
|
256
|
+
"""Returns a list of all tensor names in the file."""
|
|
257
|
+
if self._ptr is None: raise ZTensorError("Reader is closed.")
|
|
258
|
+
c_array_ptr = lib.ztensor_reader_get_all_tensor_names(self._ptr)
|
|
259
|
+
_check_ptr(c_array_ptr, "get_all_tensor_names")
|
|
260
|
+
c_array_ptr = ffi.gc(c_array_ptr, lib.ztensor_free_string_array)
|
|
261
|
+
|
|
262
|
+
return [ffi.string(c_array_ptr.strings[i]).decode('utf-8') for i in range(c_array_ptr.len)]
|
|
263
|
+
|
|
160
264
|
def get_metadata(self, name: str) -> TensorMetadata:
|
|
161
265
|
"""Retrieves metadata for a tensor by its name."""
|
|
162
266
|
if self._ptr is None: raise ZTensorError("Reader is closed.")
|
|
@@ -177,6 +281,7 @@ class Reader:
|
|
|
177
281
|
Returns:
|
|
178
282
|
np.ndarray or torch.Tensor: The tensor data.
|
|
179
283
|
"""
|
|
284
|
+
if self._ptr is None: raise ZTensorError("Reader is closed.")
|
|
180
285
|
if to not in ['numpy', 'torch']:
|
|
181
286
|
raise ValueError(f"Unsupported format: '{to}'. Choose 'numpy' or 'torch'.")
|
|
182
287
|
|
|
@@ -238,6 +343,7 @@ class Writer:
|
|
|
238
343
|
if exc_type is None:
|
|
239
344
|
self.finalize()
|
|
240
345
|
else:
|
|
346
|
+
# If an error occurred, just free the handle without finalizing
|
|
241
347
|
lib.ztensor_writer_free(self._ptr)
|
|
242
348
|
self._ptr = None
|
|
243
349
|
|
|
@@ -294,7 +400,7 @@ class Writer:
|
|
|
294
400
|
"""Finalizes the zTensor file, writing the metadata index."""
|
|
295
401
|
if not self._ptr: raise ZTensorError("Writer is already closed or finalized.")
|
|
296
402
|
status = lib.ztensor_writer_finalize(self._ptr)
|
|
297
|
-
self._ptr = None
|
|
403
|
+
self._ptr = None # The writer is consumed in Rust
|
|
298
404
|
self._finalized = True
|
|
299
405
|
_check_status(status, "finalize")
|
|
300
406
|
|
ztensor/ztensor/ffi.py
CHANGED
|
@@ -3,8 +3,8 @@ import _cffi_backend
|
|
|
3
3
|
|
|
4
4
|
ffi = _cffi_backend.FFI('ffi',
|
|
5
5
|
_version = 0x2601,
|
|
6
|
-
_types = b'\x00\x00\
|
|
7
|
-
_globals = (b'\xFF\xFF\xFF\x1FALIGNMENT',64,b'\x00\x00\
|
|
8
|
-
_struct_unions = ((b'\x00\x00\x00\
|
|
9
|
-
_typenames = (b'\x00\x00\x00\
|
|
6
|
+
_types = b'\x00\x00\x33\x0D\x00\x00\x4B\x03\x00\x00\x00\x0F\x00\x00\x36\x0D\x00\x00\x4B\x03\x00\x00\x4A\x03\x00\x00\x00\x0F\x00\x00\x39\x0D\x00\x00\x01\x11\x00\x00\x4E\x03\x00\x00\x00\x0F\x00\x00\x39\x0D\x00\x00\x01\x11\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x04\x0D\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x1B\x0D\x00\x00\x09\x11\x00\x00\x00\x0F\x00\x00\x42\x0D\x00\x00\x05\x11\x00\x00\x00\x0F\x00\x00\x09\x0D\x00\x00\x00\x0F\x00\x00\x4F\x0D\x00\x00\x4C\x03\x00\x00\x00\x0F\x00\x00\x4F\x0D\x00\x00\x1B\x11\x00\x00\x09\x11\x00\x00\x50\x03\x00\x00\x1C\x01\x00\x00\x09\x11\x00\x00\x51\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x0D\x0D\x00\x00\x05\x11\x00\x00\x00\x0F\x00\x00\x0D\x0D\x00\x00\x01\x11\x00\x00\x00\x0F\x00\x00\x45\x0D\x00\x00\x05\x11\x00\x00\x00\x0F\x00\x00\x50\x0D\x00\x00\x05\x11\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x48\x03\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x49\x03\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x4A\x03\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x04\x11\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x1B\x11\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x4E\x03\x00\x00\x00\x0F\x00\x00\x53\x0D\x00\x00\x50\x03\x00\x00\x1C\x01\x00\x00\x00\x0F\x00\x00\x00\x09\x00\x00\x01\x09\x00\x00\x02\x09\x00\x00\x03\x09\x00\x00\x04\x09\x00\x00\x42\x03\x00\x00\x02\x01\x00\x00\x07\x01\x00\x00\x18\x01\x00\x00\x04\x01\x00\x00\x53\x03\x00\x00\x00\x01',
|
|
7
|
+
_globals = (b'\xFF\xFF\xFF\x1FALIGNMENT',64,b'\x00\x00\x41\x23ztensor_free_string',0,b'\x00\x00\x32\x23ztensor_free_string_array',0,b'\x00\x00\x35\x23ztensor_free_tensor_view',0,b'\x00\x00\x44\x23ztensor_free_u64_array',0,b'\x00\x00\x18\x23ztensor_last_error_message',0,b'\x00\x00\x38\x23ztensor_metadata_free',0,b'\x00\x00\x15\x23ztensor_metadata_get_checksum_str',0,b'\x00\x00\x15\x23ztensor_metadata_get_data_endianness_str',0,b'\x00\x00\x15\x23ztensor_metadata_get_dtype_str',0,b'\x00\x00\x15\x23ztensor_metadata_get_encoding_str',0,b'\x00\x00\x15\x23ztensor_metadata_get_layout_str',0,b'\x00\x00\x15\x23ztensor_metadata_get_name',0,b'\x00\x00\x2F\x23ztensor_metadata_get_offset',0,b'\x00\x00\x2C\x23ztensor_metadata_get_shape_data',0,b'\x00\x00\x26\x23ztensor_metadata_get_shape_len',0,b'\x00\x00\x2F\x23ztensor_metadata_get_size',0,b'\x00\x00\x3B\x23ztensor_reader_free',0,b'\x00\x00\x00\x23ztensor_reader_get_all_tensor_names',0,b'\x00\x00\x0B\x23ztensor_reader_get_metadata_by_index',0,b'\x00\x00\x07\x23ztensor_reader_get_metadata_by_name',0,b'\x00\x00\x29\x23ztensor_reader_get_metadata_count',0,b'\x00\x00\x0F\x23ztensor_reader_open',0,b'\x00\x00\x03\x23ztensor_reader_read_tensor_view',0,b'\x00\x00\x1D\x23ztensor_writer_add_tensor',0,b'\x00\x00\x12\x23ztensor_writer_create',0,b'\x00\x00\x1A\x23ztensor_writer_finalize',0,b'\x00\x00\x3E\x23ztensor_writer_free',0),
|
|
8
|
+
_struct_unions = ((b'\x00\x00\x00\x48\x00\x00\x00\x02CStringArray',b'\x00\x00\x4D\x11strings',b'\x00\x00\x0D\x11len'),(b'\x00\x00\x00\x49\x00\x00\x00\x02CTensorDataView',b'\x00\x00\x23\x11data',b'\x00\x00\x0D\x11len',b'\x00\x00\x52\x11_owner'),(b'\x00\x00\x00\x4A\x00\x00\x00\x10TensorMetadata',),(b'\x00\x00\x00\x4B\x00\x00\x00\x10ZTensorReader_BufReader_File',),(b'\x00\x00\x00\x4C\x00\x00\x00\x10ZTensorWriter_BufWriter_File',)),
|
|
9
|
+
_typenames = (b'\x00\x00\x00\x48CStringArray',b'\x00\x00\x00\x49CTensorDataView',b'\x00\x00\x00\x4ACTensorMetadata',b'\x00\x00\x00\x4BCZTensorReader',b'\x00\x00\x00\x4CCZTensorWriter',b'\x00\x00\x00\x4ATensorMetadata',b'\x00\x00\x00\x4BZTensorReader_BufReader_File',b'\x00\x00\x00\x4CZTensorWriter_BufWriter_File'),
|
|
10
10
|
)
|
ztensor/ztensor/ztensor.dll
CHANGED
|
Binary file
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
ztensor-0.1.4.dist-info/METADATA,sha256=Xs4X80I_5Ox-nP5Gx8Ng5vmhEi9lvYgJB8MdLl2pvu8,4530
|
|
2
|
+
ztensor-0.1.4.dist-info/WHEEL,sha256=CiLp0kI_D1SQdHfHt9BWsWFTRNd71UY0p9KVx6QjX7o,89
|
|
3
|
+
ztensor-0.1.4.dist-info/licenses/LICENSE,sha256=qxF7VFxBvMlfiDRJ5oXQuQYaloq0Tcbk95Pn0DFlnss,1084
|
|
4
|
+
ztensor/__init__.py,sha256=qs_Lg29u2jpA4fu01E0FV8rY4tVB-MdtwCAI6_vn6_A,16202
|
|
5
|
+
ztensor/ztensor/__init__.py,sha256=DDVvoEhcXithkluOJ4Dd7H6wIqKcxT6mm6vvPgrQMz4,138
|
|
6
|
+
ztensor/ztensor/ffi.py,sha256=ZBlZW--RXKUdoZZJJjtftY8H8hBmY_FvKcG6ab8jOTA,3611
|
|
7
|
+
ztensor/ztensor/ztensor.dll,sha256=JigXJYuOi0aRBHRKEMCwPceozaHCVgWWEJyu1neRd5M,891904
|
|
8
|
+
ztensor-0.1.4.dist-info/RECORD,,
|
ztensor-0.1.2.dist-info/RECORD
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
ztensor-0.1.2.dist-info/METADATA,sha256=4UODGfQ_vW4gGHCIunIBOFRA4aB_BrbymnQQNa87vi4,4530
|
|
2
|
-
ztensor-0.1.2.dist-info/WHEEL,sha256=v0atuDHRmBdo6voLOtYJ8NlQfECX5fZNHOXLlNqbhus,89
|
|
3
|
-
ztensor-0.1.2.dist-info/licenses/LICENSE,sha256=qxF7VFxBvMlfiDRJ5oXQuQYaloq0Tcbk95Pn0DFlnss,1084
|
|
4
|
-
ztensor/__init__.py,sha256=MHfJeuyHa9r1dJ-8ezqRX0wpR5EBwhjkMzg4HlnLFL4,11600
|
|
5
|
-
ztensor/ztensor/__init__.py,sha256=DDVvoEhcXithkluOJ4Dd7H6wIqKcxT6mm6vvPgrQMz4,138
|
|
6
|
-
ztensor/ztensor/ffi.py,sha256=5HqR7Szwsn6HmKARaYQqF0nJKEUWZsWpYD4ZiOaoWnk,2756
|
|
7
|
-
ztensor/ztensor/ztensor.dll,sha256=RfrdQFVVG9QGDXU9z4nGxviysq5BCfxrZXTrdQ7wJF4,871936
|
|
8
|
-
ztensor-0.1.2.dist-info/RECORD,,
|
|
File without changes
|